#Диагностика проблем бот-платформы
Если бот не отвечает на сообщения, начните с разделов ниже. Каждый сценарий — отдельный набор проверок с готовыми curl-командами и эталонными ответами от Вайбкод.
#Сценарии диагностики
- События не приходят — пользователь пишет боту, но
GET /v1/bots/:botId/eventsвозвращает пустой массив - TOKEN_MISSING при OAuth-ключе —
vibe_app_…отправлен безAuthorization: Bearer - Пустые events подряд —
success: true, ноnextOffsetне двигается - BITRIX_ERROR: User is not subscribed —
withUserEvents=trueбез предварительной подписки - INTERNAL_ERROR при опросе событий — временная ошибка прокси и схема повтора с растущей паузой
- Бот отключён (BOT_DISABLED) — автоматическое отключение по
AUTH_FAILURESилиPORTAL_DELETED - Куда обратиться — что приложить к тикету в поддержку
#События не приходят
Симптом: пользователь пишет боту в чате Битрикс24, бот не отвечает, GET /v1/bots/:botId/events возвращает events: [].
#Чек-лист по порядку
- Бот зарегистрирован и активен.
GET /v1/bots/:botIdвозвращаетsuccess: trueс полямиbot.id,bot.code,bot.eventMode. Если 404 — бот не зарегистрирован, выполнитеPOST /v1/bots. eventMode: "fetch". Проверяется в ответе шага 1. Еслиwebhook— события через polling не приходят, бот пушит их наwebhookUrl.- Тип бота соответствует сценарию. Бот типа
botполучает только сообщения с@упоминаниеми личные сообщения. Для приёма всех сообщений в чате нужен типpersonalилиsupervisor— указывается при регистрации в полеtypeи не меняется потом. Если ожидаете все сообщения, а типbot, события придут только при@упоминании. - Бот добавлен в чат. Бот получает события только из чатов, где он состоит. Для личного диалога это происходит при первом обращении пользователя к боту. Для группового чата бота нужно добавить явно через
POST /v1/bots/:botId/chats/:dialogId/users. - Пользователь пишет именно этому боту. Если на портале есть несколько ботов, проверьте
codeбота, к которому идёт обращение в чате, и сравните сcodeв ответеGET /v1/bots/:botId. Сообщения другому боту в очередь этого бота не попадут. - После 5+ пустых поллов проверьте поле
hintв ответеGET /v1/bots/:botId/events. Платформа добавляет диагностическую подсказку, если очередь пуста подряд.
Если все 6 пунктов пройдены, а очередь по-прежнему пуста — это значит, что портал Битрикс24 не направляет события боту. Соберите данные по разделу Куда обратиться и отправьте тикет.
#TOKEN_MISSING при OAuth-ключе
Симптом:
{ "success": false, "error": { "code": "TOKEN_MISSING", "message": "API key has no tokens configured." } }
#Причина
Ключ vibe_app_… отправлен без заголовка Authorization: Bearer <session_token>. OAuth-ключ работает в паре с токеном пользовательской сессии — без Bearer у запроса нет контекста, от чьего имени обращаться к Битрикс24.
#Решение
Личный ключ vibe_api_… — Bearer не нужен:
curl https://vibecode.bitrix24.tech/v1/bots/42/events \
-H "X-Api-Key: YOUR_API_KEY"
OAuth-ключ vibe_app_… — обязательно с Bearer:
curl https://vibecode.bitrix24.tech/v1/bots/42/events \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
Получение USER_SESSION_TOKEN для OAuth-приложения — см. Ключи и авторизация.
#Пустые events подряд
Симптом: ответ корректный, ошибок нет, но events: [], nextOffset === storedOffset, persisted: false.
#Что значат поля ответа
persisted: false— курсорlastOffsetв базе Вайбкод не сдвинулся, потому что Битрикс24 не отдал ни одного события.nextOffset === storedOffset— нечего обрабатывать.hintпоявляется после 5+ пустых поллов подряд — диагностическая подсказка.
#Это нормально, если
- бот только что зарегистрирован — никто ещё не писал;
- очередь пуста — клиенты прочитали все сообщения;
- между поллами нет активности в чатах с ботом.
#Когда нужно перейти к диагностике
Если выполняется хотя бы одно условие — возвращайтесь к разделу События не приходят:
- в чате есть непрочитанные сообщения боту;
- прошло больше минуты с момента отправки сообщения;
- появилось поле
hint.
#BITRIX_ERROR: User is not subscribed
Симптом: GET /v1/bots/:botId/events?withUserEvents=true отдаёт 502 с этим сообщением.
#Причина
User-события (типы ONIMV2* — изменения в чатах, реакции пользователей) требуют отдельной подписки. Без подписки параметр withUserEvents=true не активирует доставку.
#Решение
Подписаться один раз перед использованием withUserEvents=true. Полный порядок настройки и список событий — в разделе User-события.
После подписки GET /v1/bots/:botId/events?withUserEvents=true начинает отдавать user-события вместе с bot-событиями в одном массиве.
#INTERNAL_ERROR при опросе событий
Симптом:
{ "success": false, "error": { "code": "INTERNAL_ERROR", "message": "Internal server error" } }
#Что делать
- Не повторять запрос сразу. Частые повторы без паузы могут продлить состояние ошибки и сами стать причиной перегрузки.
- Использовать растущую паузу между попытками — старт 5 секунд, удвоение на каждой следующей неудаче, потолок 60 секунд. После успешного ответа интервал сбрасывается к рабочему значению (2-5 секунд между поллами).
- Не сбрасывать
offset. Сохранённый курсор не пострадал — продолжайте с того же значения. Сброс приведёт к повторной обработке уже доставленных событий. - Если ошибка не уходит после нескольких циклов задержки — отправьте тикет в поддержку с
botId, временем первого появления, последним успешнымnextOffsetи интервалом между попытками. Не наращивайте частоту запросов «на всякий случай» — это ухудшит ситуацию.
#Готовый шаблон с растущей паузой
const BOT_ID = 42
const API_KEY = 'YOUR_API_KEY'
const BASE = 'https://vibecode.bitrix24.tech/v1'
let backoffMs = 5000
while (true) {
try {
const res = await fetch(`${BASE}/bots/${BOT_ID}/events`, {
headers: { 'X-Api-Key': API_KEY },
})
const json = await res.json()
if (!json.success && json.error?.code === 'INTERNAL_ERROR') {
console.warn(`INTERNAL_ERROR — пауза ${backoffMs} мс`)
await new Promise(r => setTimeout(r, backoffMs))
backoffMs = Math.min(backoffMs * 2, 60000)
continue
}
backoffMs = 5000
for (const event of json.data?.events ?? []) {
// обработка события
}
} catch {
await new Promise(r => setTimeout(r, backoffMs))
backoffMs = Math.min(backoffMs * 2, 60000)
}
await new Promise(r => setTimeout(r, 3000))
}
#Бот отключён (BOT_DISABLED)
Симптом:
{ "success": false, "error": { "code": "BOT_DISABLED", "message": "Bot is disabled (reason: …)" } }
HTTP-код — 410 Gone. Затронуты все эндпоинты бота: события, сообщения, чаты, команды, обновление, удаление.
#Возможные причины (поле `reason`)
AUTH_FAILURES— 10 подряд401 INVALID_CREDENTIALSот Битрикс24. Платформа защищает портал от шумных запросов и автоматически отключает бота со сломанной авторизацией.PORTAL_DELETED— портал Битрикс24 удалён или подтверждён недоступным.
#Решение
AUTH_FAILURES — владелец бота включает обратно через PATCH /v1/bots/:botId с body {"disabled": false}. Это сбрасывает счётчик ошибок авторизации.
curl -X PATCH https://vibecode.bitrix24.tech/v1/bots/42 \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"disabled": false}'
PORTAL_DELETED — бот восстанавливается автоматически, когда портал возвращается к статусу ACTIVE. Принудительное включение через PATCH для этой причины не требуется.
PATCH … {"disabled": true} запрещён — вернётся 400 DISABLE_NOT_ALLOWED. Отключение системное, для удаления используйте DELETE /v1/bots/:botId.
#Куда обратиться
Если ни один из разделов выше не помог — оставьте тикет в разделе Обратная связь. К тикету приложите:
botId(число);- ответ
GET /v1/bots/:botIdцеликом; - последние 3 ответа
GET /v1/bots/:botId/eventsс полямиnextOffset,storedOffset,persisted,hint; - время первого появления симптома (UTC);
- тип ключа (
vibe_api_…илиvibe_app_…) — без самого ключа; - скриншот чата с непрочитанным сообщением, если есть.
#Смотрите также
- Бот-платформа — обзор и быстрый старт
- Получить события (polling) — параметры и формат ответа
- User-события — настройка подписки для
withUserEvents - Зарегистрировать бота — порядок установки приложения и регистрации
- Ключи и авторизация —
vibe_api_…противvibe_app_…, передача Bearer - Лимиты и оптимизация — ограничения частоты запросов