Ошибка приходит с кодом HTTP и телом { "error": "код" }.
КодHTTPЧто случилось
api_off401у бота нет ключа: выдайте его в студии
bad_key401ключ неверный, заменен или не указан
not_found404нет такого бота, адреса или подписки
disconnected409бот не подключен к телеграму
no_client400не указан client или chat
no_query400в /clients/find не указано, что искать
unknown_client404клиент не писал этому боту
bad_text400текст пустой или длиннее 4096 знаков
bad_buttons400у кнопки нет названия или адрес не https:// или tg://
no_step400в /run не указан step
bad_step400такого шага нет на схеме
bad_var:<имя>400имя переменной пустое или слишком длинное
bad_value:<имя>400значение переменной не строка, не число и не да/нет
bad_stage400у бота нет такого этапа
busy409клиент в эту секунду отвечает боту: повторите запрос
bad_url400адрес подписки не https
bad_events400в подписке нет известных событий
too_many409уже 20 подписок: удалите ненужную
telegram502телеграм не принял сообщение, например клиент остановил бота
rate_limited429больше 120 запросов в минуту: подождите
События
Подписка получает событие сразу, как оно случилось. Тело - JSON, тот же, что у вебхука бота.
lead новая заявка или запись
question вопрос клиента
client новый клиент написал боту
message сообщение клиента
stage сменился этап клиента
tags сменились метки клиента
blocked клиент остановил бота
Во всех событиях подписок chat_id - чат клиента и client_number - его номер из «Диалогов»: по любому из них можно сразу ответить через /messages. У message в data kind (text - текст, press - нажатие кнопки) и text, у client - start, у stage - from и to, у tags - added и removed. У lead и question вместо data - what и details (вопросы и ответы клиента). Примеры - message и lead:
Если у бота задан секрет WEBHOOK_SECRET («Интеграции» → «Вебхук»), каждое событие приходит с заголовком x-rilmo-signature: sha256=<HMAC-SHA256 тела этим секретом в hex>.
Проверяйте подпись по телу как оно пришло, до разбора JSON:
import crypto from "node:crypto";
// raw - тело запроса как есть, до JSON.parse
const sig = "sha256=" + crypto.createHmac("sha256", process.env.WEBHOOK_SECRET).update(raw).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(req.headers["x-rilmo-signature"] ?? ""));
Пределы
120 запросов в минуту с одного IP.
Текст сообщения до 4096 знаков, до 10 кнопок.
До 20 подписок на бота.
Клиенты - до 500 за запрос, с переменными до 100. Заявки - до 500. Поиск - до 20 среди 500 последних клиентов.
Make, n8n, Albato
Make и n8n: модуль HTTP: адрес метода, заголовок Authorization: Bearer <ключ>, тело JSON. События - вебхук Make или n8n в POST /hooks.
Albato: приложение Askora в каталоге Albato готовим. Пока подойдет HTTP-запрос и вебхук Albato так же, как в Make.