Управление вопросами

API поддержки: FAQ / Help

База: https://api.bot-t.com

Все методы — POST, тело JSON, Content-Type: application/json.


Доступ (авторизация)

Для всех FAQ-методов нужны только:

ПараметрГдеОбязательностьОписание
bot_idтелодаID бота
token / botTokenquery или телода*Токен бота
secretKeyquery или телода*Секретный ключ бота (вместо токена)

* Достаточно либо token / botToken, либо secretKey.

Что не нужно

В отличие от тикетов, в FAQ не передавайте:

  • actor / lk_actor_user_id / lk_actor_ticket
  • implementer_id / manager_id
  • user_id / secret_user_key

Достаточно токена (или secretKey) и bot_id. Премиум-тариф не нужен.

POST https://api.bot-t.com/v1/support/question/<метод>?token=BOT_TOKEN
Content-Type: application/json

{ "bot_id": 1, ... }

Лимит: 120 запросов в минуту с одного IP.

Формат ответа

{ "result": true, "data": ... }
{ "result": false, "message": "текст ошибки" }

Булевы методы (delete, change-status, block-delete): data = "1".

Всегда проверяйте result === true перед использованием data.


Список методов

Чтение

МетодURLНазначение
indexPOST /v1/support/question/indexСписок siblings (корни или дети)
treePOST /v1/support/question/treeПолное дерево с блоками
getPOST /v1/support/question/getОдин вопрос + блоки + meta
get-by-aliasPOST /v1/support/question/get-by-aliasВопрос по alias
searchPOST /v1/support/question/searchПоиск по title/alias/status
block-indexPOST /v1/support/question/block-indexБлоки вопроса
exportPOST /v1/support/question/exportВыгрузка дерева JSON
export-htmlPOST /v1/support/question/export-htmlHTML как на сайте + SEO
analyzePOST /v1/support/question/analyzeСводка структуры
analyze-seoPOST /v1/support/question/analyze-seoSEO-аудит
promo-getPOST /v1/support/question/promo-getlanding_promo страницы
settings-getPOST /v1/support/question/settings-getНастройки веб-FAQ (alias, is_web)

Управление вопросами

МетодURLНазначение
createPOST /v1/support/question/createСоздать вопрос / подвопрос
updatePOST /v1/support/question/updatetitle / alias / page_type
meta-updatePOST /v1/support/question/meta-updateSEO meta
change-statusPOST /v1/support/question/change-statusВкл / выкл
deletePOST /v1/support/question/deleteАрхивировать (каскад, из каталога скрывается)
movePOST /v1/support/question/moveК родителю или в корень
sort-upPOST /v1/support/question/sort-upВыше среди siblings
sort-downPOST /v1/support/question/sort-downНиже среди siblings
promo-updatePOST /v1/support/question/promo-updateОбновить landing_promo
promo-clearPOST /v1/support/question/promo-clearСбросить landing_promo к дефолтам
settings-updatePOST /v1/support/question/settings-updateОбновить alias / is_web веб-FAQ

Управление блоками

МетодURLНазначение
block-createPOST /v1/support/question/block-createСоздать блок (+ text/title; фото — file/link)
block-change-typePOST /v1/support/question/block-change-typeСменить тип текст ↔ фото
block-updatePOST /v1/support/question/block-updateТекст / заголовок / is_faq
upload-photoPOST /v1/support/question/upload-photoЗагрузить фото в S3 (ссылка)
block-assign-photoPOST /v1/support/question/block-assign-photoКартинка фото-блока
block-deletePOST /v1/support/question/block-deleteУдалить блок
block-movePOST /v1/support/question/block-moveВ другой вопрос
block-sort-upPOST /v1/support/question/block-sort-upВыше в вопросе
block-sort-downPOST /v1/support/question/block-sort-downНиже в вопросе

Идентификаторы

ПолеЧто это
bot_idID бота (всегда)
id / support_idID поддержки (= model_id бота); можно не передавать
question_idID вопроса
where_question_idНовый родитель (null/0 — корень) или вопрос для block-move
block_idID блока
type1 текст, 2 фото
aliasURL-алиас вопроса
message_idID сообщения блока (в ответе)
photo_host / photo_urlФайл фото-блока в ответе (type: 2, после assign)
fileКартинка base64 (upload-photo, block-create, block-change-type)
nameИмя файла с расширением (с file, опционально)
linkПубличная URL / host для block-assign-photo, block-create, block-change-type
hostИмя файла в S3 после upload-photo (передавайте как link)
landing_promoPromo страницы: {ru:{url,title,text,button}, en:{…}}
page_typeТип публичной страницы: article (по умолчанию), collection_page или faq_page
is_faqУ блока: true/false — Q&A FAQPage (title = вопрос, text = ответ)
meta_descriptionSEO description; если непустой — перекрывает автотекст из блоков; на сайте обрезается до 160
alias (в settings)Alias веб-FAQ → /faq/{alias}
is_webВключена ли публичная веб-версия FAQ

Корень FAQ: question_id = null. Контент ответа — в блоках.


1. Чтение вопросов

Список siblings

POST /v1/support/question/index

curl -X POST "https://api.bot-t.com/v1/support/question/index?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1}'
ПолеОбязательноОписание
bot_idдаID бота
question_idнетРодитель; без / 0 — корни

Дерево

POST /v1/support/question/tree

curl -X POST "https://api.bot-t.com/v1/support/question/tree?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "status": 1}'
ПолеОбязательноОписание
bot_idдаID бота
statusнетФильтр 0 / 1

Получить один

POST /v1/support/question/get

curl -X POST "https://api.bot-t.com/v1/support/question/get?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'

data — вопрос + blocks[] + meta_*.

По alias

POST /v1/support/question/get-by-alias

curl -X POST "https://api.bot-t.com/v1/support/question/get-by-alias?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "alias": "kak-oplatit"}'

Поиск

POST /v1/support/question/search

curl -X POST "https://api.bot-t.com/v1/support/question/search?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "title": "оплат", "limit": 50, "offset": 0}'
ПолеОбязательноОписание
bot_idдаID бота
titleнетLIKE по названию
aliasнетLIKE по alias
statusнет0 / 1
limitнет1–200, по умолчанию 50
offsetнетпо умолчанию 0

2. Управление вопросами

Только token + bot_id (+ question_id где нужно). Без actor.

Создать

POST /v1/support/question/create

curl -X POST "https://api.bot-t.com/v1/support/question/create?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "title": "Как оплатить?", "question_id": null}'
ПолеОбязательноОписание
bot_idдаID бота
titleдаНазвание
question_idнетРодитель; без — корень

alias из translit(title).

Обновить title / alias / page_type

POST /v1/support/question/update

curl -X POST "https://api.bot-t.com/v1/support/question/update?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "title": "Оплата", "alias": "oplata", "page_type": "faq_page"}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос
titleнетНовое название
aliasнетНовый alias
page_typeнетarticle, collection_page или faq_page; если не передан — не меняется

faq_page — страница вопросов и ответов: на сайте блоки рендерятся аккордеоном, в schema.org — FAQPage (title блока = вопрос, text = ответ).
Отдельно у любого блока на article можно поставить is_faq: true — тогда он тоже попадает в FAQPage-разметку.
Рекомендация: блоки с is_faq лучше ставить в конец статьи (после основного текста), чтобы Q&A шли отдельным блоком внизу.

article — обычная статья (schema.org Article). collection_page — хаб: CollectionPage + ItemList из дочерних статей; у BreadcrumbList у текущего пункта есть item.

SEO meta

POST /v1/support/question/meta-update

Единственный API-метод для SEO Meta вопроса. В ЛК meta правятся в одной форме с title/alias/page_type; в API это отдельный вызов (не через update).

curl -X POST "https://api.bot-t.com/v1/support/question/meta-update?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "meta_title": "Оплата — FAQ", "meta_description": "Как оплатить…", "meta_keywords": "оплата, faq"}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос
meta_titleнетЕсли ключ не передан — старое значение. Если передан (в т.ч. "") — записывается как есть
meta_descriptionнетТо же
meta_keywordsнетТо же

Ответ: объект вопроса (QuestionDto) без blocks, с полями meta_title / meta_description / meta_keywords.
Ошибка: meta not found (битая связь meta_id).

Рекомендуемые лимиты хранения (как в ЛК; API их не валидирует): meta_title / meta_keywords ≤ 255, meta_description ≤ 1000.

На публичной FAQ-странице (/faq/HELP/…):

ПолеПоведение на сайте
meta_descriptionЕсли непустой — в <meta name="description"> и OG. Если пустой — автотекст из первого блока (или fallback «Развернутые ответы…»). На выводе всегда обрезается до 160 символов (по словам).
meta_titleЕсли непустой — в <title> / og:title; иначе title вопроса / логика блоков
meta_keywordsХранится в Meta; в head при наличии

OG / Twitter (отдельного API нет)

ТегОткуда
og:title / twitter titlemeta_title или title страницы
og:description / twitter descriptionтот же resolved meta_description
og:imageпервое подходящее фото из блоков (не из Meta); иначе дефолт help-og
og:locale, hreflangот URL (/en → en), не из Meta

Полей og_* в meta-update нет и не планируется.

i18n Meta / контента

Через API двуязычен только landing_promo (ru / en).
Title, блоки и Meta — один RU-источник в БД. EN на /faq/…/en — on-demand перевод (в т.ч. meta_description), как у title и текста блоков. Отдельного EN-meta endpoint нет.

Статус

POST /v1/support/question/change-status

Переключает status 0 ↔ 1.

curl -X POST "https://api.bot-t.com/v1/support/question/change-status?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос

Архивация (delete)

POST /v1/support/question/delete

Каскад по дереву: вопрос и все дочерние получают статус archived (status = 2).
Блоки и meta не удаляются — статья остаётся по прямому URL, но не попадает в публичный каталог / sitemap.

curl -X POST "https://api.bot-t.com/v1/support/question/delete?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаАрхивируемый вопрос

Ответ: { "result": true, "data": "1" }.

Перемещение

К родителю или в корень

POST /v1/support/question/move

curl -X POST "https://api.bot-t.com/v1/support/question/move?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "where_question_id": 5}'

В корень — where_question_id: null, 0 или не передавать:

curl -X POST "https://api.bot-t.com/v1/support/question/move?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "where_question_id": 0}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаКакой вопрос
where_question_idнетНовый родитель; null/0/нет — корень

Порядок среди siblings

POST /v1/support/question/sort-up
POST /v1/support/question/sort-down

curl -X POST "https://api.bot-t.com/v1/support/question/sort-up?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'
curl -X POST "https://api.bot-t.com/v1/support/question/sort-down?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос

Объект вопроса

{
  "id": 10,
  "support_id": 1,
  "question_id": null,
  "title": "Как оплатить?",
  "alias": "kak-oplatit",
  "status": 1,
  "sort": 0,
  "page_type": "article",
  "blocks_count": 2,
  "children_count": 1,
  "meta_title": "Как оплатить?",
  "meta_description": "",
  "meta_keywords": "",
  "blocks": [],
  "children": []
}

3. Управление блоками

Только token + bot_id (+ block_id / question_id). Без actor.

Список

POST /v1/support/question/block-index

curl -X POST "https://api.bot-t.com/v1/support/question/block-index?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'

Создать

POST /v1/support/question/block-create

# текстовый блок
curl -X POST "https://api.bot-t.com/v1/support/question/block-create?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "type": 1, "text": "Оплата картой…", "title": ""}'

# Q&A-блок FAQPage (title = вопрос, text = ответ)
curl -X POST "https://api.bot-t.com/v1/support/question/block-create?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "type": 1, "is_faq": true, "title": "Как оплатить?", "text": "Картой или через ЮKassa."}'

# фото-блок сразу с картинкой (file = base64)
curl -X POST "https://api.bot-t.com/v1/support/question/block-create?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "type": 2, "text": "Подпись", "name": "faq.jpg", "file": "<base64>"}'

# фото-блок, файл уже в S3 (host из upload-photo)
curl -X POST "https://api.bot-t.com/v1/support/question/block-create?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10, "type": 2, "link": "faq-pay_xxxxx.jpg"}'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос
typeда1 текст, 2 фото
text / titleнетСразу записать; при is_faq — ответ / вопрос
is_faqнетtrue/false/1/0 — блок как Q&A FAQPage; лучше размещать в конце статьи
fileнетBase64 картинки — только для type: 2 (загрузка + привязка)
nameнетИмя файла с расширением (с file)
linkнетhost из upload-photo или URL — только для type: 2

Если переданы и file, и link — берётся результат загрузки file.
Лимит блоков — по тарифу.
Блоки FAQ (is_faq) лучше писать в конце статьи — после обычных текстовых/фото-блоков.

Смена типа блока

POST /v1/support/question/block-change-type

Меняет type блока и тип связанного сообщения (текст ↔ фото). Можно сразу приложить картинку.

# текст → фото
curl -X POST "https://api.bot-t.com/v1/support/question/block-change-type?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55, "type": 2, "link": "faq-pay_xxxxx.jpg"}'

# или с загрузкой
curl -X POST "https://api.bot-t.com/v1/support/question/block-change-type?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55, "type": 2, "name": "faq.jpg", "file": "<base64>"}'

# фото → текст
curl -X POST "https://api.bot-t.com/v1/support/question/block-change-type?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55, "type": 1}'
ПолеОбязательноОписание
bot_idдаID бота
block_idдаБлок
typeдаНовый тип: 1 текст, 2 фото
file / name / linkнетКак у block-create — только вместе с type: 2

Тот же тип — no-op (блок без изменений). При смене фото → текст медиа сообщения сбрасывается.

Текст и заголовок

POST /v1/support/question/block-update

curl -X POST "https://api.bot-t.com/v1/support/question/block-update?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55, "text": "Обновлённый ответ", "title": "Заголовок"}'

# только пометить как Q&A FAQPage
curl -X POST "https://api.bot-t.com/v1/support/question/block-update?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55, "is_faq": true}'
ПолеОбязательноОписание
bot_idдаID бота
block_idдаБлок
textда*Текст / ответ (при is_faq)
titleда*Заголовок / вопрос (при is_faq)
is_faqда*true/false — блок как элемент FAQPage

* Нужен хотя бы один из text / title / is_faq.

В ответе блока есть поле is_faq (bool).

Загрузка фото в storage

POST /v1/support/question/upload-photo

Кладёт картинку в photos бота на S3. В ответе — публичная ссылка и имя файла для block-assign-photo.

curl -X POST "https://api.bot-t.com/v1/support/question/upload-photo?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "name": "faq-pay.jpg", "file": "<base64 или data:image/jpeg;base64,...>"}'
ПолеОбязательноОписание
bot_idдаID бота
fileдаСодержимое файла в base64 (можно data-URI)
nameнетИмя с расширением (jpg, jpeg, png, webp, …); без него — из data-URI или clipboard.png

Ответ:

{
  "result": true,
  "data": {
    "ok": true,
    "link": "https://storage.bot-t.com/bot/1/photos/faq-pay_xxxxx.jpg",
    "host": "faq-pay_xxxxx.jpg"
  }
}
ПолеОписание
linkПубличная URL файла
hostИмя в хранилище — передайте в block-assign-photo как link

Картинка (type = 2)

POST /v1/support/question/block-assign-photo

Файл уже в хранилище фото бота (см. upload-photo). link — имя файла (host) или полный путь/URL (берётся последний сегмент).

Для нового блока удобнее сразу block-create с type: 2 и file/link. Для существующего текстового — block-change-type с type: 2 и file/link.

curl -X POST "https://api.bot-t.com/v1/support/question/block-assign-photo?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 56, "link": "faq-pay_xxxxx.jpg"}'
ПолеОбязательноОписание
bot_idдаID бота
block_idдаБлок с type: 2
linkдаhost из upload-photo или URL / путь (последний сегмент)

В ответе у фото-блока будут photo_host и photo_url. Подпись — через block-update.

Удаление блока

POST /v1/support/question/block-delete

curl -X POST "https://api.bot-t.com/v1/support/question/block-delete?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55}'
ПолеОбязательноОписание
bot_idдаID бота
block_idдаБлок

Перемещение блоков

В другой вопрос

POST /v1/support/question/block-move

curl -X POST "https://api.bot-t.com/v1/support/question/block-move?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55, "where_question_id": 12}'
ПолеОбязательноОписание
bot_idдаID бота
block_idдаБлок
where_question_idдаЦелевой вопрос

Порядок внутри вопроса

POST /v1/support/question/block-sort-up
POST /v1/support/question/block-sort-down

curl -X POST "https://api.bot-t.com/v1/support/question/block-sort-up?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "block_id": 55}'
ПолеОбязательноОписание
bot_idдаID бота
block_idдаБлок

Объект блока

{
  "id": 55,
  "question_id": 10,
  "type": 2,
  "sort": 0,
  "message_id": 500,
  "is_faq": false,
  "title": "",
  "text": "Подпись к фото",
  "photo_host": "faq-pay_xxxxx.jpg",
  "photo_url": "https://storage.bot-t.com/bot/1/photos/faq-pay_xxxxx.jpg"
}

У текстового блока (type: 1) поля photo_* — null.
При is_faq: true на сайте блок — аккордеон Q&A, в schema.org — элемент FAQPage (title = вопрос, text = ответ).
Такие блоки лучше держать в конце статьи.


4. Выгрузка и анализ

JSON

POST /v1/support/question/export — пагинация по корням. limit / offset обязательны.

curl -X POST "https://api.bot-t.com/v1/support/question/export?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "limit": 20, "offset": 0}'

HTML (SEO)

POST /v1/support/question/export-html

curl -X POST "https://api.bot-t.com/v1/support/question/export-html?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "limit": 20, "offset": 0, "lang": "ru"}'
ПолеОбязательноОписание
bot_idдаID бота
limit / offsetдаПагинация по корням
statusнетФильтр статуса
langнетru / en — влияет на promo в HTML, не дублирует title/блоки

Элемент data[]:

ПолеОписание
id, support_id, alias, statusИдентификаторы
url, amphtmlКанон и AMP URL
title, description, keywords, h1SEO-поля (description ≤ 160, как на сайте)
landing_promoPromo с учётом lang
htmlПолный HTML-документ
seo{title_length, description_length, content_length, has_h1, has_description, issues[]}

Упрощённый OG в export-html: есть og:type / title / url; полный набор как на layout сайта не дублируется.

Анализ

Структура

POST /v1/support/question/analyze

curl -X POST "https://api.bot-t.com/v1/support/question/analyze?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1}'
ПолеОбязательноОписание
bot_idдаID бота
statusнетФильтр

data: questions_total, questions_active, questions_inactive, roots_total, max_depth, blocks_total, blocks_text, blocks_photo, questions_without_blocks, empty_leaves.

SEO-аудит

POST /v1/support/question/analyze-seo

Те же параметры, что у export-html (bot_id, limit/offset, опционально status / lang).

data: pages_total, with_issues, issues (счётчики кодов), samples (до 5 примеров {id, url} на код). Типичные коды: title_too_short / title_too_long, missing_description, description_too_short / description_too_long, missing_h1, empty_content, дубли title/description.


5. Настройки FAQ и landing_promo

Только token + bot_id. Без actor.

Два уровня настроек:

УровеньЧтоМетоды
Поддержка (весь FAQ-сайт)alias URL, is_websettings-get / settings-update
Вопрос (каждая страница)landing_promo ru/en, page_typepromo-*, update (page_type)

Также у вопроса: update (title/alias/page_type), meta-update (SEO) — см. раздел 2.


5.1. Веб-FAQ: alias и is_web

Публичный адрес: /faq/{alias}/…

Получить

POST /v1/support/question/settings-get

curl -X POST "https://api.bot-t.com/v1/support/question/settings-get?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1}'

Ответ data:

{
  "alias": "my-bot-help",
  "is_web": true,
  "faq_url": "/faq/my-bot-help"
}
Поле ответаОписание
aliasСегмент URL веб-FAQ
is_webВеб-версия FAQ включена
faq_urlОтносительный путь /faq/{alias}

Обновить

POST /v1/support/question/settings-update

Непереданные поля не затираются.

curl -X POST "https://api.bot-t.com/v1/support/question/settings-update?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "alias": "my-bot-help", "is_web": true}'
ПолеОбязательноОписание
bot_idдаID бота
aliasнетНовый alias веб-FAQ
is_webнетtrue / false / 1 / 0

Ответ — тот же объект, что у settings-get.


5.2. landing_promo вопроса

Рекламный блок внизу конкретной FAQ-страницы (не у всей поддержки).
Хранится в вопросе. Языки: ru, en.

Поля на язык:

ПолеОписание
urlСсылка: https://… или /…. javascript: / data: запрещены
titleЗаголовок
textОписание
buttonТекст кнопки

Пустые title / text / button → подставляются дефолты BOT-T.
Если promo не задан (promo-clear или никогда не сохраняли) — на сайте тоже дефолты; promo-get всё равно отдаёт заполненный объект с дефолтами.

landing_promo также приходит в get / tree / export у вопроса (если сохранён; иначе null).

Получить

POST /v1/support/question/promo-get

curl -X POST "https://api.bot-t.com/v1/support/question/promo-get?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'

Ответ data:

{
  "ru": {
    "url": "https://bot-t.com/",
    "title": "Создать бота:",
    "text": "бесплатно и без знаний программирования",
    "button": "BOT-T.COM"
  },
  "en": {
    "url": "https://bot-t.com/en",
    "title": "Create a bot:",
    "text": "free, no coding required",
    "button": "BOT-T.COM"
  }
}
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос / страница FAQ

Обновить

POST /v1/support/question/promo-update

Можно передать один язык или оба. Переданные языки мержатся с уже сохранёнными.

curl -X POST "https://api.bot-t.com/v1/support/question/promo-update?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "bot_id": 1,
    "question_id": 10,
    "landing_promo": {
      "ru": {
        "url": "https://bot-t.com/",
        "title": "Создать бота:",
        "text": "бесплатно и без знаний программирования",
        "button": "BOT-T.COM"
      },
      "en": {
        "url": "https://bot-t.com/en",
        "title": "Create a bot:",
        "text": "free, no coding required",
        "button": "BOT-T.COM"
      }
    }
  }'
ПолеОбязательноОписание
bot_idдаID бота
question_idдаВопрос
landing_promoдаОбъект {ru?:{…}, en?:{…}}; хотя бы один язык

Ошибки: landing_promo not found, landing_promo empty, landing_promo.ru.url invalid.

Сбросить

POST /v1/support/question/promo-clear

Удаляет сохранённый promo у вопроса → снова дефолты.

curl -X POST "https://api.bot-t.com/v1/support/question/promo-clear?token=BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"bot_id": 1, "question_id": 10}'

Ответ — как у promo-get (с дефолтами).


Типовой сценарий: полная настройка страницы FAQ

Публичный URL: /faq/{alias} (канон раздела — HELP → /faq/HELP/{question_alias}, EN — …/en).

  1. Веб-FAQ — settings-update: is_web: true, alias: "HELP" (проверка: settings-get).
  2. Создать страницу — create (title, опционально alias, question_id родителя). По умолчанию status=1, page_type=article. Meta создаётся с title вопроса; description/keywords пустые.
  3. Тип страницы — update с page_type: article | collection_page | faq_page (в create page_type нет).
  4. Контент — block-create (type: 1 текст или type: 2 + file/link); при необходимости block-update (text/title/is_faq), block-change-type, upload-photo → block-assign-photo. Для FAQPage: page_type=faq_page или блоки с is_faq: true (лучше в конце статьи).
  5. SEO — meta-update (meta_title, meta_description, meta_keywords). Не через update.
  6. Promo — promo-update (landing_promo.ru / .en). Сброс: promo-clear.
  7. Структура — move, sort-up / sort-down; блоки: block-move, block-sort-up / block-sort-down.
  8. Проверка — get / tree / search; export-html; analyze / analyze-seo.
  9. Публикация / скрытие — change-status (toggle 0 ↔ 1, не идемпотентный publish). Архив: delete (status=2 каскадом). Удаление блока: block-delete.

Краткий порядок API на одну новую статью:

settings-update → create → update(page_type) → block-create… → meta-update → promo-update → get / export-html.