Документация для внешних разработчиков

Веб-модули BOT-T — инструкция для разработчиков

Документация для авторов внешних веб-модулей: как подключить модуль к платформе, какие endpoint'ы реализовать на своём сервере и какие запросы отправлять в API BOT-T.


Два раздела интеграции

РазделКто инициаторБазовый URLНазначение
Административные запросыBOT-T → ваш серверAdmin URL типа модуляПодключение, настройки, удаление, смена ключа
Запросы из APIваш модуль → BOT-Thttps://api.bot-t.comДанные бота, пользователей, баланс, магазин, рефералы, оплаты

Admin URL и host страницы модуля — разные адреса:

НазначениеОткуда берётсяПример
Admin URLURL типа модуля в каталоге BOT-Thttps://module.example.com/api/ — сюда идут ping, create, …
Host страницыdefault_host типа / поле host экземпляраhttps://module.example.com/app — сюда открывают пользователя

Admin URL должен заканчиваться на /: BOT-T склеивает путь без вставки слэша ({url}ping → https://module.example.com/api/ping).


Ключи и авторизация

public_key (публичный ключ)

  • Идентификатор конкретного экземпляра модуля, привязанного к боту.
  • Генерируется BOT-T при подключении модуля (хеш от bot_id и type_id типа модуля).
  • Не секрет — можно передавать в URL страницы модуля и в публичных API-методах.
  • В ссылке на веб-страницу модуля передаётся в query вместе с bot_id:
https://ваш-хост-модуля/?bot_id=1&public_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

private_key, secret_key, токен бота и Telegram ID в ссылку не передаются.

private_key (приватный ключ)

  • Секрет сервера модуля. Генерируется BOT-T (хеш от bot_id, type_id и токена бота).
  • Храните только на backend модуля. Не передавайте в браузер, мобильное приложение и публичный JS.
  • Обязателен вместе с public_key для:
    • административных запросов get, update, delete, rotatePrivateKey;
    • приватных методов API BOT-T (баланс, пользователи, Bot API, заказы и т.д.).
  • При компрометации — перевыпуск через rotatePrivateKey (см. ниже).

secret_key (секрет пользователя бота)

  • Отдельный от ключей модуля. Идентифицирует конкретного пользователя бота в контексте модуля.
  • Выдаётся в ответах API пользователя (secret_user_key в объекте пользователя) или формируется после авторизации через Telegram Web App (check-hash).
  • Нужен для операций от имени пользователя: списание/начисление баланса, создание заказа, вывод средств и т.п.
  • Передаётся в теле запроса вместе с user_id (Telegram ID пользователя).

Сводка по методам API BOT-T

Уровень доступаПоля в запросе
Публичный (только модуль)public_key (+ иногда type_id)
Приватный (сервер модуля)public_key + private_key
От имени пользователяpublic_key (+ private_key где требуется) + user_id (Telegram ID) + secret_key

Типичный flow Web App

sequenceDiagram
    participant User as Пользователь Telegram
    participant Page as Страница модуля
    participant ModBE as Backend модуля
    participant BOT as BOT-T API

    User->>Page: Открыл Web App / ссылку
    Note over Page: URL: host?bot_id=&public_key=
    Page->>Page: Telegram.WebApp.initData
    Page->>BOT: POST /v1/module/bot/check-hash
    BOT-->>Page: BotUserDto + secret_user_key
    Page->>ModBE: Запрос действия пользователя
    ModBE->>BOT: POST /v1/module/... с public_key + private_key + secret_key
    BOT-->>ModBE: result + data
  1. Пользователь открывает {host}?bot_id={bot_id}&public_key={public_key}.
  2. Фронтенд модуля читает Telegram.WebApp.initData.
  3. POST /v1/module/bot/check-hash с bot_id и сырой строкой userData → пользователь и secret_user_key.
  4. Дальнейшие операции с балансом, заказами и т.п. выполняет backend модуля: public_key + private_key + при необходимости user_id + secret_key.
  5. private_key никогда не попадает в браузер.

Жизненный цикл модуля

sequenceDiagram
    participant LK as ЛК владельца бота
    participant BOT as BOT-T
    participant MOD as Сервер модуля

    LK->>BOT: Подключить модуль к боту
    BOT->>MOD: GET ping
    MOD-->>BOT: result=true, data=OK
    BOT->>MOD: GET create (bot_id, public_key, private_key)
    MOD-->>BOT: result=true, data=настройки
    BOT->>BOT: Сохранить ключи и настройки

    Note over LK,MOD: Эксплуатация
    MOD->>BOT: POST /v1/module/... (API)
    LK->>BOT: Изменить настройки
    BOT->>MOD: POST update
    MOD-->>BOT: result=true, data=настройки

    LK->>BOT: Удалить модуль
    BOT->>MOD: GET delete (public_key, private_key)
    MOD-->>BOT: result=true, data=true
    BOT->>BOT: Удалить запись модуля

Часть 1. Административные запросы (ваш сервер)

Реализуйте на сервере модуля. BOT-T обращается к ним автоматически.

Базовый URL — Admin URL типа модуля в каталоге BOT-T (со слэшем на конце). К URL добавляется имя действия:

ДействиеМетодПример полного URL
pingGET{url}ping
createGET{url}create?bot_id=...&public_key=...&private_key=...
getGET{url}get?public_key=...&private_key=...
updatePOST{url}update?public_key=...&private_key=...
deleteGET{url}delete?public_key=...&private_key=...
rotatePrivateKeyGET{url}rotatePrivateKey?public_key=...&private_key=...&new_private_key=...

Общие требования к ответам

  • HTTP-код 200.
  • Заголовок Content-Type: application/json.
  • Тело — JSON:
{ "result": true, "data": ... }
{ "result": false, "message": "текст ошибки" }

При result: false BOT-T считает операцию неуспешной и показывает message пользователю.

Важно: для успешных ответов на GET-запросы BOT-T требует поле data. Без него подключение/удаление/синхронизация упадут с ошибкой. Для delete и rotatePrivateKey достаточно любого JSON-значения в data (например true).

Таймаут со стороны BOT-T: connect ~5 с, total ~20 с. Редиректы запрещены.


GET ping

Когда вызывается: перед созданием экземпляра модуля (проверка, что сервер доступен). Также перед recreate.

Параметры: нет.

Успешный ответ: в поле data должна быть строка OK (именно так, без пробелов и лишних символов). Сравнение строгое (!= 'OK' → ошибка).

{ "result": true, "data": "OK" }

GET create

Когда вызывается: один раз при подключении модуля к боту.

Query-параметры:

ПараметрОписание
bot_idID бота в BOT-T
public_keyПубличный ключ, сгенерированный BOT-T
private_keyПриватный ключ, сгенерированный BOT-T

Задача модуля: создать запись экземпляра (привязка bot_id + ключи) и вернуть начальные настройки в data.

Обязательные поля в data:

ПолеОписание
idID экземпляра на стороне модуля
versionВерсия схемы настроек (целое число)
bot_idДолжен совпадать с переданным
public_keyДолжен совпадать с переданным
private_keyДолжен совпадать с переданным

Дополнительно можно вернуть произвольные поля конфигурации (например balance, category_id). BOT-T сохранит их без bot_id, public_key, private_key.

Пример успешного ответа:

{
  "result": true,
  "data": {
    "id": 1,
    "version": 1,
    "bot_id": 42,
    "public_key": "a1b2c3...",
    "private_key": "f0e1d2...",
    "balance": 0
  }
}

GET get

Когда вызывается: синхронизация настроек из ЛК («получить с сервера»).

Query-параметры: public_key, private_key.

Ответ: объект настроек в том же формате, что при create (с обязательными полями id, version, bot_id, public_key, private_key).


POST update

Когда вызывается: сохранение настроек из ЛК.

Query-параметры: public_key, private_key.

Тело: application/x-www-form-urlencoded — пары «ключ → значение» настроек. В теле нет id, version, bot_id, public_key, private_key (BOT-T их не отправляет). Булевы значения приходят как 0 / 1.

Ответ: полный актуальный объект настроек в data (снова с обязательными полями, как у create).


GET delete

Когда вызывается: удаление модуля из бота в ЛК (и при recreate).

Query-параметры: public_key, private_key.

Задача модуля: удалить данные экземпляра на своей стороне.

Ответ (рекомендуемый):

{ "result": true, "data": true }

Поле data обязательно — иначе BOT-T отклонит успешный ответ.


GET rotatePrivateKey

Когда вызывается: перевыпуск приватного ключа из админки BOT-T.

Query-параметры:

ПараметрОписание
public_keyТекущий публичный ключ
private_keyТекущий приватный ключ
new_private_keyНовый ключ (сгенерирован BOT-T)

Задача модуля: атомарно заменить private_key в своей БД.

Ответ (рекомендуемый):

{ "result": true, "data": true }

Рекомендуется всегда возвращать data, чтобы формат ответов был единообразным.


Часть 2. Запросы из API (BOT-T)

Базовый URL: https://api.bot-t.com

Метод: все перечисленные endpoint'ы — POST.

Заголовки:

Content-Type: application/json

Допускается также application/x-www-form-urlencoded для части методов.

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

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

Лимит: 120 запросов в минуту с одного IP (при превышении — HTTP 429).

CSRF не требуется.


Сводная таблица endpoint'ов

URLАвторизацияНазначение
POST /v1/module/bot/get-by-public-keytype_id, public_keyДанные бота по публичному ключу модуля
POST /v1/module/bot/check-hashbot_id, userDataПроверка Telegram Web App / Login и получение пользователя
POST /v1/module/user/check-secretключи модуля + id (tg), secret_keyПроверка secret_key пользователя
POST /v1/module/user/getключи модуля + id (telegram_id)Пользователь бота по Telegram ID
POST /v1/module/user/get-creatorpublic_key, private_keyПользователь-создатель бота
POST /v1/module/user/add-balanceключи + user_id, secret_key, amount, comment, опционально currencyНачисление баланса
POST /v1/module/user/subtract-balanceключи + user_id, secret_key, amount, comment, опционально currencyСписание баланса
POST /v1/module/user/send-requestключи + user_tg_id, method, paramsВызов метода Telegram Bot API (sendMessage)
POST /v1/module/shop/order-createключи + user_id, secret_key, amount, count, category_id, productСоздание заказа магазина
POST /v1/module/shop/send-requestключи + order_id, method, paramsBot API для чата заказа (sendMessage)
POST /v1/module/replenishment/create-conclusionpublic_key + user_id, secret_key, amountЗаявка на вывод баланса
POST /v1/module/referral/get-by-public-keytype_id, public_keyНастройки реферальной системы
POST /v1/module/referral/withdrawal-historypublic_key + user_id, secret_key, limit, offsetИстория заявок на вывод
POST /v1/module/payment/history-createpublic_key, private_keyСоздать запись истории оплаты сообщения
POST /v1/module/payment/history-successpublic_key, private_keyЗасчитать оплату
POST /v1/module/payment/history-failpublic_key, private_keyОтменить оплату
POST /v1/module/payment/history-deletepublic_key, private_keyУдалить запись истории

Бот

POST /v1/module/bot/get-by-public-key

Получить информацию о боте, к которому привязан модуль.

ПолеТипОбяз.Описание
type_idintegerдаID типа модуля в каталоге BOT-T
public_keystringдаПубличный ключ экземпляра

POST /v1/module/bot/check-hash

Авторизация пользователя через данные Telegram (Web App, Login Widget).

ПолеТипОбяз.Описание
bot_idintegerдаID бота
userDatastringдаСтрока query-параметров от Telegram (с hash), например содержимое Telegram.WebApp.initData
bot_clone_idintegerнетID клона бота, если Web App открыт у клона

Ответ: объект пользователя бота (BotUserDto), включая secret_user_key для последующих запросов.


Пользователи

POST /v1/module/user/get

ПолеТипОбяз.Описание
idintegerдаTelegram ID пользователя
public_keystringда
private_keystringда

POST /v1/module/user/check-secret

Проверка, что переданный secret_key соответствует пользователю.

ПолеТипОбяз.Описание
idintegerдаTelegram ID
secret_keystringда
public_keystringда
private_keystringда

POST /v1/module/user/get-creator

Данные владельца/создателя бота. Только ключи модуля.

POST /v1/module/user/add-balance / subtract-balance

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
user_idintegerдаTelegram ID
secret_keystringда
amountnumberдаСумма в минимальных единицах (копейки)
commentstringдаКомментарий к операции (пустая строка не принимается)
currencystringнетISO-код валюты amount (USD, RUB…). Если отличается от валюты бота — конвертация перед операцией
operation_idstringнетИдемпотентный ключ (до 64 символов). Повтор с тем же ключом не меняет баланс. При timeout повторять только с тем же operation_id.

Ответ: обновлённый BotUserDto (поле money — в копейках).

POST /v1/module/user/send-request

Прокси к Telegram Bot API от имени бота модуля.

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
user_tg_idintegerдаTelegram ID получателя
methodstringдаСейчас разрешён только sendMessage
paramsobjectдаПараметры метода; chat_id подставится автоматически

Ответ: { "response": { ... } } — ответ Telegram.


Магазин

POST /v1/module/shop/order-create

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
user_idintegerдаTelegram ID
secret_keystringда
amountnumberдаСумма заказа
countintegerдаКоличество
category_idintegerдаID категории/товара
productstringдаНазвание/описание товара

POST /v1/module/shop/send-request

ПолеТипОбяз.Описание
public_keystringда
private_keystringда
order_idintegerдаID заказа
methodstringдаСейчас разрешён только sendMessage
paramsobjectдаПараметры метода

Вывод средств и рефералы

POST /v1/module/replenishment/create-conclusion

Создание заявки на вывод. Только public_key (без private_key).

ПолеТипОбяз.Описание
public_keystringда
user_idintegerдаTelegram ID
secret_keystringда
amountintegerдаСумма списания в копейках

Требуется включённая в боте система выводов с обратной связью (feedback).

POST /v1/module/referral/get-by-public-key

ПолеТипОбяз.Описание
type_idintegerда
public_keystringда

Ответ: referral_id, is_active, bonus_source, levels[] с процентами.

POST /v1/module/referral/withdrawal-history

ПолеТипОбяз.Описание
public_keystringда
user_idintegerдаTelegram ID
secret_keystringда
limitintegerнетПо умолчанию 20, макс. 100
offsetintegerнетПагинация

Оплаты сообщений (кратко)

Методы /v1/module/payment/* управляют историей оплаты сообщения-оплаты (MessagePaymentHistory).

URLНазначение
history-createСоздать запись со статусом pending
history-successЗасчитать оплату
history-failОтменить оплату
history-deleteУдалить запись

Нюансы:

  • во всех методах нужны public_key + private_key;
  • в history-create поле id — это MessagePayment; в success/fail/delete — ID истории из ответа create;
  • amount в payment передаётся в основных единицах валюты (рубли/доллары), BOT-T умножает на 100; это отличается от баланса/вывода, где amount уже в копейках.

Объект пользователя бота (BotUserDto)

Ключевые поля для интеграции:

ПолеОписание
idID пользователя в контексте бота
user.telegram_idTelegram ID
moneyБаланс в копейках (делить на 100 для отображения)
secret_user_keyСекрет для запросов от имени пользователя (secret_key в API)
statusСтатус пользователя (активен, бан и т.д.)

Рекомендации по безопасности

  1. private_key — только на сервере модуля, никогда в frontend.
  2. secret_key пользователя — не логировать, передавать по HTTPS.
  3. Запросы к API BOT-T с балансом и заказами выполняйте только с backend модуля.
  4. При ошибках административных запросов возвращайте понятный message — он показывается владельцу бота в ЛК.
  5. Endpoint ping должен быть максимально лёгким и не требовать авторизации.
  6. Admin URL и host страницы должны быть доступны по HTTPS с серверов BOT-T.

Типичные ошибки

СитуацияЧто проверить
Модуль не подключаетсяping возвращает data: "OK"; Admin URL со слэшем на конце и доступен с серверов BOT-T
«public_key not found» / «private_key not found»Поля переданы в теле POST (JSON)
«secret key not valid»secret_key соответствует Telegram ID и боту; пользователь есть в боте
«comment not found»В add/subtract-balance передан непустой comment
create отклонёнВ ответе data совпадают bot_id, public_key, private_key с query; есть id и version
delete / get падает при result: trueВ успешном JSON есть поле data
send-request отклонёнmethod равен ровно sendMessage
429 / лимитНе более 120 запросов/мин к /v1/module/* с одного IP

Чек-лист перед публикацией типа модуля

  • Реализованы ping, create, get, update, delete, rotatePrivateKey
  • Admin URL заканчивается на /
  • Все административные ответы — JSON, HTTP 200, поля result и при успехе data
  • ping возвращает data: "OK"
  • create возвращает обязательные поля настроек и эхо ключей/bot_id
  • Ключи модуля хранятся на backend, не утекают в клиент
  • Страница модуля открывается по {host}?bot_id=&public_key=
  • Авторизация пользователя через check-hash или check-secret
  • Запросы к API BOT-T идут с сервера по HTTPS
  • Обработаны ошибки result: false и показ сообщений пользователю

Связанные материалы