Документация
API и MCP
Всё, что доступно в панели, можно сделать программно: через REST API
api.tuqo.ru
и через MCP-сервер для нейросетей
mcp.tuqo.ru.
Любая внешняя ИИ-модель может создавать сайты, деплоить и настраивать домены —
авторизация по одному ключу проекта.
Быстрый старт
- 1
Создайте проект в панели и получите ключ на вкладке API-ключи. Ключ формата
tqk_…показывается один раз. - 2
Подключите Tuqo как MCP-коннектор в нейросети — или работайте напрямую через REST.
- 3
Создайте сайт, загрузите архив исходников — он соберётся автоматически и опубликуется на
<поддомен>.tuqo.ru.
API-ключ проекта
Все запросы авторизуются заголовком
Authorization: Bearer tqk_….
Ключ привязан к конкретному проекту — операции скоупятся только в его пределах.
В базе хранится лишь argon2-хеш ключа и публичный префикс для отображения; сам ключ
восстановить нельзя — при потере выпустите новый.
Уровни доступа
-
readтолько чтение: списки и статусы -
editorсоздавать сайты, деплоить, привязывать домены, откатывать — без удаления -
fullполный доступ, включая удаление сайтов и доменов
MCP для нейросетей
Tuqo поднимает MCP-сервер (JSON-RPC 2.0) по адресу
https://mcp.tuqo.ru/mcp.
Подключите его как коннектор в вашей ИИ-модели — и агент управляет деплоем на естественном языке.
Подключение
URL и заголовок авторизации (для MCP-клиентов с HTTP-транспортом и поддержкой заголовков):
{
"mcpServers": {
"tuqo": {
"url": "https://mcp.tuqo.ru/mcp",
"headers": { "Authorization": "Bearer tqk_xxx_yyy" }
}
}
} Инструменты
-
whoami(—)project_id, название проекта и доступные scopes — ориентир в начале сессии
-
list_sites(—)список сайтов проекта (каждый сайт содержит url и form_endpoint)
-
create_site(name, subdomain)создать сайт (поддомен ≥9 символов на бесплатном тарифе)
-
get_site(site_id)получить сайт (в ответе url, form_endpoint для форм и recommendations — что стоит улучшить по последней публикации, если есть)
-
update_site(site_id, name)переименовать сайт
-
delete_site(site_id, confirm)мягко удалить сайт (корзина 24 ч)
-
restore_site(site_id)вернуть сайт из корзины
-
list_trashed(—)сайты в корзине
-
set_site_enabled(site_id, enabled)включить/выключить раздачу сайта
-
deploy_files(site_id, files)выложить файлы как есть (рекомендуется для статики) — публикуется мгновенно; в ответе recommendations: советы по файлам (не ошибки)
-
deploy_site(site_id, source_base64)загрузить tar.gz/zip исходников (base64) и запустить сборку
-
get_manifest(site_id)файлы активного деплоя {path, sha256} — для правки без перезаливки медиа
-
get_deploy_status(deploy_id)статус сборки: queued → building → ready → active / failed
-
list_deploys(site_id)история деплоев сайта
-
get_logs(deploy_id)логи сборки
-
activate_deploy(deploy_id)опубликовать готовый деплой (так же откат на прошлую версию)
-
get_preview_url(deploy_id)секретная ссылка предпросмотра сборки: открывается без пароля даже у закрытого сайта, выключается в любой момент. Опубликованной версии не выдаётся — её контент и так на адресе сайта (с тарифа «Старт»)
-
delete_deploy(deploy_id)удалить файлы сборки, которая не пойдёт в публикацию (освобождает место и слот хранения). Опубликованную нельзя — сайт погаснет
-
set_custom_domain(site_id, domain)привязать домен — в ответе TXT-запись _tuqo-verify
-
verify_domain(domain_id)подтвердить владение доменом после TXT + диагностика A-записи (a_record)
-
list_domains(site_id)кастомные домены сайта
-
delete_domain(domain_id, confirm)отвязать домен
-
get_forms_overview(—)сводка по формам: квота заявок, использовано, баланс, число закрытых сверх лимита, сайты, счётчики
-
get_form_submissions(site_id?, status?, limit?, offset?)заявки (лиды) с форм проекта
-
get_autoreply(site_id)настройки автоответа сайта + счётчики (писем за месяц, скачиваний файла)
-
set_autoreply(site_id, enabled?, subject?, body?, email_field?)автоответ письмом на заявку (с тарифа «Старт»)
-
add_autoreply_file(site_id, file_name, content_base64, label?)файл лид-магнита на выдачу (до трёх; PDF, картинки, zip, txt, до 50 МБ)
-
remove_autoreply_file(site_id, file_id)убрать файл с выдачи (id — в get_autoreply)
-
set_autoreply_delivery(site_id, link_ttl_days?, page_title?, upsell_text?, logo_base64?, logo_framed?, logo_rounded?)оформление страницы выдачи и срок ссылки; патч-семантика, заголовок и описание — только вместе
-
get_site_stats(site_id, days?, from?, to?)серверная аналитика сайта (days: 1–365 от сегодня, либо свой период from/to): просмотры и посетители (отдельно «похоже на людей»), трафик, топы страниц и источников, скачивания, 404, устройства, заявки по дням. Без cookie и скриптов — считает раздача
-
get_site_access(site_id)состояние замка: закрыт ли сайт, чем, срок, лимит и счётчик открытий; для «Платного доступа» — продаёт ли витрина и чего не хватает (настройка продаж — в панели)
-
set_site_password(site_id, level? | password?)закрыть сайт паролем или сменить пароль (level: easy|medium|strong)
-
reveal_site_password(site_id)показать текущий пароль сайта владельцу
-
open_site_access(site_id)снять замок — сайт снова открыт всем (пароль удаляется, срок и счётчик сбрасываются)
-
set_site_email_access(site_id)перевести сайт на вход по коду из письма (по списку адресов)
-
set_site_subscribers_access(site_id, channel_ids)закрыть сайт для подписчиков Telegram/MAX-каналов владельца (1–3 канала)
-
list_messenger_channels(—)каналы владельца проекта для режима «для подписчиков» (добавляются в профиле панели)
-
list_site_access_emails(site_id)список адресов: имена, устройства, кто и когда входил, попытки с чужих адресов
-
add_site_access_email(site_id, email, label?)добавить адрес в список доступа
-
add_site_access_emails(site_id, emails)добавить адреса списком (строки, запятые, точки с запятой)
-
set_site_access_email_label(site_id, email_id, label)подписать адрес именем для журнала
-
remove_site_access_email(site_id, email_id)убрать один адрес — доступ пропадает сразу
-
remove_site_access_emails(site_id, emails? | all?, confirm)убрать адреса списком или очистить список целиком
-
set_site_access_expiry(site_id, days? | until? | clear?)срок доступа: продлить, поставить дату или снять (не для «Платного доступа» — там срок продаж в панели)
-
set_site_access_opens(site_id, max_opens?, reset_counter?)лимит числа открытий (считаются устройства) и обнуление счётчика; в «Регистрации» и «Платном доступе» вместо него max_seats
-
set_site_access_brand(site_id, title?, text?, logo_base64?, logo_framed?, favicon_mode?, favicon_base64?)экран входа: заголовок, описание, логотип и фавикон вкладки (null стирает поле; подложка — logo_framed)
-
set_site_members_access(site_id, moderation?, ask_name?, name_label?, consent_mode?, form_style?, max_seats?)режим «Регистрация»: посетители регистрируются сами по коду на почту (имя и согласие — после кода); настройки — в том же вызове, max_seats — количество доступов
-
get_site_members(site_id, q?)участники: список с поиском, счётчики по статусам, занято мест, настройки и документы; в «Платном доступе» — когда и сколько оплатил
-
moderate_site_member(site_id, member_id, action, confirm?)approve | reject | block | unblock | delete — заявки, блокировки и удаление данных (delete только с confirm:true; письмо участнику уходит от имени сайта)
-
set_site_documents(site_id, documents)документы владельца на экране входа (0–3, https, полная замена списка); request_reconsent — запросить согласие заново
Пример запроса вручную (JSON-RPC tools/call):
curl -X POST https://mcp.tuqo.ru/mcp \
-H "Authorization: Bearer tqk_xxx_yyy" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "create_site",
"arguments": { "name": "Лендинг", "subdomain": "myproject" }
}
}' REST API
Базовый адрес — https://api.tuqo.ru.
Тело и ответы — JSON (кроме загрузки деплоя архивом: там тело — бинарный
tar.gz или
zip).
Машиночитаемая спецификация — OpenAPI 3.1
(tuqo.ru/openapi.json): подходит для генераторов клиентов,
ChatGPT Actions и проверки схем. Карточка MCP-сервера с полным списком инструментов —
mcp.tuqo.ru/.well-known/mcp.json.
- GET
/api/v1/whoamiпроверить ключ: project_id, имя, scopesread - GET
/api/v1/sitesсписок сайтовread - POST
/api/v1/sitesсоздать сайтeditor - GET
/api/v1/sites/{id}получить сайтread - PATCH
/api/v1/sites/{id}переименовать сайтeditor - DELETE
/api/v1/sites/{id}удалить сайтfull - POST
/api/v1/sites/{id}/deploysдеплой архивом (tar.gz или zip в теле, до 50 МБ)editor - POST
/api/v1/sites/{id}/deploy-filesдеплой набором файлов (JSON, тело до 50 МБ, до 2000 файлов)editor - POST
/api/v1/sites/{id}/deploys/checkманифест → какие блобы догрузитьeditor - PUT
/api/v1/blobs/{sha256}загрузить один блоб (сырые байты)editor - POST
/api/v1/sites/{id}/deploys/manifestсобрать деплой из блобов (потолок — квота хранилища тарифа)editor - GET
/api/v1/deploys/{id}статус деплояread - POST
/api/v1/deploys/{id}/activateопубликовать деплой / откатитьсяeditor - POST
/api/v1/deploys/{id}/previewссылка предпросмотра сборки (идемпотентно; опубликованной версии — 409)editor - DELETE
/api/v1/deploys/{id}/previewпогасить ссылку предпросмотраeditor - DELETE
/api/v1/deploys/{id}удалить файлы сборки (опубликованную нельзя — 409)editor - POST
/api/v1/sites/{id}/domainsпривязать доменeditor - POST
/api/v1/domains/{id}/verifyподтвердить домен (+ диагностика A-записи a_record)editor - DELETE
/api/v1/domains/{id}отвязать доменfull - GET
/api/v1/forms/overview/сводка по формам проектаread - GET
/api/v1/forms/submissions/заявки: ?site=&status=verified|spam|archive&limit=&offset=read - GET
/api/v1/sites/{id}/autoreplyнастройки автоответа сайта + счётчикиread - GET
/api/v1/sites/{id}/statsсерверная аналитика сайта: суточный ряд + сводка (просмотры, посетители, байты; human_* — после фильтра ботов), заявки и публикации по дням; ?days=1..365 либо ?from=&to= (московские даты)read - GET
/api/v1/sites/{id}/stats/topsтопы за период: страницы, источники, скачивания, 404, устройства + причины отсева ботов; строки реже 5 обращений скрытыread - PUT
/api/v1/sites/{id}/autoreplyавтоответ: enabled, subject, body ≤4096 (разметка **жирный**/списки/[ссылки], подстановки {{поле}} из заявки), email_field; включение — с тарифа «Старт»editor - POST
/api/v1/sites/{id}/autoreply/files?name=&label=файл лид-магнита (сырые байты в теле; до трёх файлов, до 50 МБ)editor - DELETE
/api/v1/sites/{id}/autoreply/files/{fid}убрать файл с выдачиeditor - PUT
/api/v1/sites/{id}/autoreply/files/{fid}/labelподпись файла на странице выдачи: {label}editor - PUT
/api/v1/sites/{id}/autoreply/deliveryоформление выдачи: link_ttl_days (1–60), page_title + upsell_text (только вместе), page_logo_framed/roundededitor - PUT
/api/v1/sites/{id}/autoreply/page-logoлоготип страницы выдачи (сырые байты картинки; требует заполненного оформления)editor - DELETE
/api/v1/sites/{id}/autoreply/page-logoубрать логотипeditor - GET
/api/v1/sites/{id}/accessсостояние замка сайта + счётчики входовread - PUT
/api/v1/sites/{id}/accessзакрыть сайт паролем или сменить парольeditor - DELETE
/api/v1/sites/{id}/accessснять замок — сайт снова открыт всемeditor - GET
/api/v1/sites/{id}/access/passwordпоказать текущий пароль (ответ не кэшируется)editor - PATCH
/api/v1/sites/{id}/access/expiryсрок доступа: days | until | cleareditor - PATCH
/api/v1/sites/{id}/access/opensлимит открытий и обнуление счётчикаeditor - PATCH
/api/v1/sites/{id}/access/brandэкран входа: заголовок, описание, логотипeditor - POST
/api/v1/sites/{id}/access/email-modeвход по коду из письма вместо пароляeditor - POST
/api/v1/sites/{id}/access/subscribers-modeдоступ подписчикам Telegram/MAX-каналов (channel_ids)editor - POST
/api/v1/sites/{id}/access/members-modeвключить режим «Регистрация» (настройки — PATCH members-settings)editor - GET
/api/v1/sites/{id}/membersучастники: список, поиск (q), счётчики, настройки, документыread - POST
/api/v1/sites/{id}/members/{member_id}/moderateapprove | reject | block | unblockeditor - PATCH
/api/v1/sites/{id}/members-settingsнастройки режима: модерация, имя, согласия, вид формы, местаeditor - POST
/api/v1/sites/{id}/members/reconsentзапросить согласие с документами зановоeditor - PUT
/api/v1/sites/{id}/documentsдокументы владельца на экране входа (полная замена, 0–3)editor - GET
/api/v1/sites/{id}/access/emailsсписок адресов доступа и журнал входовread - POST
/api/v1/sites/{id}/access/emailsдобавить адресeditor - POST
/api/v1/sites/{id}/access/emails/bulkдобавить адреса списком (поле raw)editor - PATCH
/api/v1/sites/{id}/access/emails/{email_id}подписать адрес именемeditor - DELETE
/api/v1/sites/{id}/access/emails/{email_id}убрать один адресeditor - POST
/api/v1/sites/{id}/access/emails/removeубрать адреса списком или все (confirm)editor
Деплой: форматы и статусы
Загрузите архив .tar.gz или .zip (до 50 МБ). Варианты содержимого:
- Исходники npm-проекта — Tuqo соберёт на
Node 20:
npm ci && npm run build, артефакт берётся изdist/,build/илиout/(нуженpackage-lock.json). - Готовая статика — положите файлы (с
index.html) в корень архива. Так публикуется вывод любого стека/языка, собранного локально.
Поддерживаемые стеки
Авто-сборка из коробки (вывод в dist/build/out):
Только статика — SSR и серверные функции не выполняются.
Артефакт ищется по порядку: dist,
build, out,
.vitepress/dist,
.output/public,
_site, public,
site,
storybook-static — так что Gatsby и Eleventy
собираются автоматически. Стеки, где статику даёт отдельная команда (Nuxt →
nuxi generate, Storybook), вложенный вывод
(Angular) и не-Node инструменты (Hugo, Jekyll, MkDocs) — соберите локально и залейте готовую
статику (вариант «Готовая статика» выше). Так работает любой стек.
Деплой через REST (тело — бинарный архив):
curl -X POST https://api.tuqo.ru/api/v1/sites/$SITE/deploys \
-H "Authorization: Bearer tqk_xxx_yyy" \
-H "Content-Type: application/gzip" \
--data-binary @dist.tar.gz
В MCP тот же архив передаётся как base64 в аргументе
source_base64 инструмента deploy_site.
При успешной сборке деплой активируется автоматически.
Статусы деплоя
-
queuedдеплой в очереди на сборку -
buildingидёт сборка (npm ci && npm run build) -
readyсобран, но ещё не активирован -
activeбоевой — отдаётся на поддомене сайта -
failedошибка сборки (текст — в get_logs / поле error) -
supersededзаменён более новым активным деплоем
Большие сайты: манифест-деплой
Один запрос ограничен размером тела (архив — до 50 МБ, набор файлов — до 20 МБ). Для тяжёлых сайтов (много фото/видео) и эффективных повторных деплоев — манифест-деплой: файлы грузятся поштучно по содержимому (sha256), без гигантского запроса, а совпадающие между деплоями файлы не перезаливаются (правка текста не трогает картинки).
Проще всего — CLI
Делает все шаги сам; байты читаются с диска (для агентов — без расхода токенов на base64).
Ключ — через env TUQO_API_KEY (не светится в истории шелла);
--wait дождётся публикации и напечатает боевой URL:
TUQO_API_KEY=tqk_xxx_yyy npx @tuqo/cli deploy ./dist --site $SITE --wait
Несколько сайтов из одного репозитория (локали, бренды) — файл
tuqo.json в корне
({"sites": {"site/com": "<site_id>", "site/ru": "<site_id>"}})
и одна команда npx @tuqo/cli deploy. Ключ API в
tuqo.json хранить нельзя — CLI откажется работать.
Или напрямую — 3 шага REST
- Манифест → недостающие блобы.
POST /api/v1/sites/{id}/deploys/checkс телом{"files":[{"path":"index.html","sha256":"…"},…]}→{"missing":["sha256",…]}. - Загрузка блобов. Для каждого недостающего —
PUT /api/v1/blobs/{sha256}, тело — сырые байты файла (sha256 тела должен совпадать с путём). До 50 МБ на файл. - Сборка деплоя.
POST /api/v1/sites/{id}/deploys/manifestс тем же манифестом (path+sha256) → сервер соберёт сайт из блобов и опубликует. До 2000 файлов; суммарный объём ограничен только квотой хранилища вашего тарифа.
Нужен index.html в корне. Дедуп блобов — в пределах проекта.
Путь /__tuqo/ зарезервирован платформой (страницы входа, выдача файлов) — файлы в нём при деплое отфильтровываются, как и служебные .git/.env.
Для агента в браузерном чате (без файловой системы) тяжёлые медиа-сайты собираются именно так
через CLI на машине пользователя; чистый веб-чат подходит для лёгких сайтов и правок текста.
Правка существующего сайта без перезаливки медиа
Чтобы изменить текст, не пересылая картинки заново (важно для веб-агента без файлов):
GET /api/v1/sites/{id}/manifest(или MCPget_manifest) → массив{path, sha256}текущих файлов.- Сначала показать, потом опубликовать. Передайте
"activate": falseв теле деплоя — сборка не встанет на боевой адрес; ссылку дастPOST /api/v1/deploys/{id}/preview(в MCP —get_preview_url), публикацию —/activate. Подробно — предпросмотр сборки. - Деплой через
deploy_files//deploy-files: неизменные файлы передайте ссылкой{"path":…,"sha256":…}(безcontent— байты не пересылаются), изменённые — обычнымcontent.
Сослаться по sha256 можно только на блоб своего проекта.
Лимиты deploy_files: до 500 файлов и 20 МБ суммарно инлайн-контентом;
файл, переданный ссылкой на блоб, — до 50 МБ.
Раздача: маршруты, 404.html и кэш
Как edge резолвит запрос /P (путь без расширения), если файла
P нет — по порядку:
- Clean URL:
/about→ отдаётсяabout.html. - Индекс каталога: есть
about/index.html→ 301 на/about/(чтобы работали относительные ссылки), затем отдаётся индекс. Путь со слэшем (/about/) сразу отдаётabout/index.html. - Кастомный 404: положите
404.htmlв корень деплоя — при промахе он отдаётся со статусом 404 (честный код для SEO). - SPA-fallback: если
404.htmlнет — отдаётсяindex.htmlсо статусом 200 (клиентский роутинг React/Vue).
Запрос файла с расширением, которого нет
(/app.js), возвращает честный 404 — ассеты не подменяются на index.html.
Кэш-заголовки
*.html—no-cache: обновления видны сразу.- Файлы с контент-хэшем в имени
(
app.4f3a2b1c.js, вывод Vite/Astro, каталог_astro/) —max-age=31536000, immutable: год в кэше, инвалидация — новым именем файла. - Остальная статика (
hero.jpgсо стабильным именем) —max-age=300: обновление файла с тем же именем доедет за ~5 минут. Отдельно управлять заголовками нельзя — хотите immutable, используйте хэш в имени (сборщики делают это сами).
Формы (приём заявок)
Любой сайт проекта может принимать заявки без своего бэкенда — формы работают на всех тарифах, включая бесплатный (10 заявок в месяц); выше тариф — больше месячная квота, и на любом тарифе можно докупить пакет заявок. Форма отправляет данные на публичный эндпоинт, заявки копятся в панели проекта (вкладка «Формы»), приходят в колокольчик и, по настройке, на email.
Эндпоинт
POST https://api.tuqo.ru/f/{site_id} —
принимает application/json,
application/x-www-form-urlencoded и
multipart/form-data — то есть обычный submit HTML-формы
и new FormData() работают наравне с JSON. Другой
Content-Type → 415
(явная ошибка, а не молчаливый 200). Авторизация
не нужна — эндпоинт публичный, привязан к домену сайта.
Где взять эндпоинт через MCP: ответы
create_site, get_site и
list_sites содержат поле
form_endpoint — готовый URL для встраивания. Он
детерминирован: https://api.tuqo.ru/f/<site_id>.
Встраивание формы
Готовый сниппет с анти-спам-полями всегда есть в панели (вкладка «Формы»). Минимальный вид:
<form onsubmit="event.preventDefault();
const f=event.target, d=Object.fromEntries(new FormData(f));
d._submit_time=f.dataset.t; d._request_id=crypto.randomUUID();
fetch('https://api.tuqo.ru/f/SITE_ID', {
method:'POST', headers:{'Content-Type':'application/json'},
body: JSON.stringify(d)
}).then(()=>{ f.reset(); alert('Заявка отправлена'); });" data-t="">
<input name="name" placeholder="Имя" required>
<input name="email" type="email" placeholder="Email" required>
<textarea name="message" placeholder="Сообщение"></textarea>
<input name="_hp_xxx" style="display:none" tabindex="-1" autocomplete="off">
<button type="submit">Отправить</button>
<script>document.currentScript.closest('form').dataset.t=Date.now()</script>
</form> Служебные поля и анти-спам
_submit_time— момент показа формы (мс,Date.now()). Отправка быстрее ~3 секунд после показа считается спамом. Верхней границы нет — вкладку можно держать открытой сколько угодно._request_id— UUID запроса: повторная отправка с тем же id не задваивает заявку (идемпотентность). Необязательно.- honeypot — скрытое поле с именем вида
_hp_xxx(точное имя — в сниппете панели или вget_forms_overview). Можно не добавлять — без поля заявка проходит нормально; оно режет только если заполнено (бот). Если добавили — оставляйте пустым. - Origin — запрос должен идти с домена сайта (его
*.tuqo.ruили подтверждённого кастомного домена), иначе403. Поэтому форма работает на самом сайте, а не с произвольного origin. - Лимиты: тело ≤ 50 КБ, до 30 полей, не более 30 заявок/мин на сайт и 10/мин на IP.
Ответы
-
200заявка принята (или молча отклонена honeypot/повтором — наружу одинаковый ответ) -
400тело не распарсилось при верном Content-Type (reason: invalid_body) -
402приём приостановлен: лимит исчерпан и накоплен предел закрытых заявок (reason: quota_exhausted), либо проект приостановлен (reason: suspended) -
403запрос не с домена сайта (origin не в списке разрешённых; reason: origin_required / origin_not_allowed) -
415неподдерживаемый Content-Type — шлите JSON, urlencoded или multipart (reason: unsupported_content_type) -
429превышен лимит частоты
Сверх месячного лимита тарифа заявки не теряются: содержимое сохраняется скрытым и открывается при сбросе лимита, докупке пакета заявок или повышении тарифа. Лимиты по тарифам — на странице тарифов, обзор — на странице Формы.
Чтение заявок (для ИИ-агентов и автоматизаций)
Заявки можно не только принимать, но и читать программно — для отчётов, авто-ответов и дашбордов.
Скоуп — проект из API-ключа, нужен уровень read.
- MCP:
get_forms_overview(квоты, баланс, сайты, счётчики) иget_form_submissions(site_id?,status?= verified|spam|archive,limit?,offset?). - REST:
GET /api/v1/forms/overviewиGET /api/v1/forms/submissions?site=&status=&limit=&offset=. - Автоответ (письмо заявителю, с тарифа «Старт»): MCP
get_autoreply/set_autoreply, RESTGET|PUT /api/v1/sites/{id}/autoreply. Текст поддерживает разметку (**жирный**, списки, цитаты, ссылки) и подстановки{{имя_поля}}из заявки. Файл лид-магнита и настройки страницы выдачи — в панели. Подробнее — Автоответ и лид-магнит.
Закрытый доступ к сайту
Сайт можно закрыть от посторонних: паролем на весь сайт либо входом по коду из письма для адресов из вашего списка. Проверка стоит в раздаче и накрывает все файлы, а не только HTML. Полный разбор — на странице «Закрытый доступ»; здесь — то, что нужно агенту и скрипту.
Это платная возможность: пароль — с тарифа
«Старт», код на почту — с «Профи». На бесплатном тарифе вызовы включения вернут
402 с объяснением, какой тариф нужен.
Снятие замка бесплатно на любом тарифе — ослабление собственных ограничений мы не гейтим.
Что важно знать
- — Пароль возвращается в ответе на установку; посмотреть его позже —
GET /api/v1/sites/{id}/access/password(ответ идёт сno-store). - — Смена пароля и снятие замка выкидывают всех, кто уже вошёл.
- — Список адресов — до 1000 на сайт; удаление адреса гасит его доступ немедленно.
- — Срок доступа продлевается от текущей даты окончания, а не от «сейчас».
- — Логотип экрана входа принимается любого размера до 1 МБ и ужимается на нашей стороне.
Полный список эндпоинтов — в таблице REST выше (строки /access),
инструменты MCP — в группе «Закрытый доступ» на странице
MCP.
Кастомные домены
Привязка домена — в два шага:
- 1
set_custom_domain(илиPOST /api/v1/sites/{id}/domains) — в ответе придёт токен. Добавьте в DNS домена A-запись на IP платформы и TXT-запись_tuqo-verifyс этим токеном. - 2
verify_domain(илиPOST /api/v1/domains/{id}/verify) — после распространения DNS. Владение подтверждается по TXT; в ответе также диагностика A-записи (a_record: ok / found / expected / message) — если A ведёт не на платформу, сайт по домену не откроется. Повторный вызов на уже подтверждённом домене перепроверяет A-запись. HTTPS-сертификат выпускается автоматически.
DNS обновляется не мгновенно — от нескольких минут до нескольких часов. Точные значения A- и TXT-записей всегда показываются в панели на вкладке «Домены» сайта.