#Диагностика проблем бот-платформы

Если бот не отвечает на сообщения, начните с разделов ниже. Каждый сценарий — отдельный набор проверок с готовыми curl-командами и эталонными ответами от Вайбкод.

#Сценарии диагностики


#События не приходят

Симптом: пользователь пишет боту в чате Битрикс24, бот не отвечает, GET /v1/bots/:botId/events возвращает events: [].

#Чек-лист по порядку

  1. Бот зарегистрирован и активен. GET /v1/bots/:botId возвращает success: true с полями bot.id, bot.code, bot.eventMode. Если 404 — бот не зарегистрирован, выполните POST /v1/bots.
  2. eventMode: "fetch". Проверяется в ответе шага 1. Если webhook — события через polling не приходят, бот пушит их на webhookUrl.
  3. Тип бота соответствует сценарию. Бот типа bot получает только сообщения с @упоминанием и личные сообщения. Для приёма всех сообщений в чате нужен тип personal или supervisor — указывается при регистрации в поле type и не меняется потом. Если ожидаете все сообщения, а тип bot, события придут только при @упоминании.
  4. Бот добавлен в чат. Бот получает события только из чатов, где он состоит. Для личного диалога это происходит при первом обращении пользователя к боту. Для группового чата бота нужно добавить явно через POST /v1/bots/:botId/chats/:dialogId/users.
  5. Пользователь пишет именно этому боту. Если на портале есть несколько ботов, проверьте code бота, к которому идёт обращение в чате, и сравните с code в ответе GET /v1/bots/:botId. Сообщения другому боту в очередь этого бота не попадут.
  6. После 5+ пустых поллов проверьте поле hint в ответе GET /v1/bots/:botId/events. Платформа добавляет диагностическую подсказку, если очередь пуста подряд.

Если все 6 пунктов пройдены, а очередь по-прежнему пуста — это значит, что портал Битрикс24 не направляет события боту. Соберите данные по разделу Куда обратиться и отправьте тикет.


#TOKEN_MISSING при OAuth-ключе

Симптом:

JSON
{ "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 не нужен:

Terminal
curl https://vibecode.bitrix24.tech/v1/bots/42/events \
  -H "X-Api-Key: YOUR_API_KEY"

OAuth-ключ vibe_app_… — обязательно с Bearer:

Terminal
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 при опросе событий

Симптом:

JSON
{ "success": false, "error": { "code": "INTERNAL_ERROR", "message": "Internal server error" } }

#Что делать

  1. Не повторять запрос сразу. Частые повторы без паузы могут продлить состояние ошибки и сами стать причиной перегрузки.
  2. Использовать растущую паузу между попытками — старт 5 секунд, удвоение на каждой следующей неудаче, потолок 60 секунд. После успешного ответа интервал сбрасывается к рабочему значению (2-5 секунд между поллами).
  3. Не сбрасывать offset. Сохранённый курсор не пострадал — продолжайте с того же значения. Сброс приведёт к повторной обработке уже доставленных событий.
  4. Если ошибка не уходит после нескольких циклов задержки — отправьте тикет в поддержку с botId, временем первого появления, последним успешным nextOffset и интервалом между попытками. Не наращивайте частоту запросов «на всякий случай» — это ухудшит ситуацию.

#Готовый шаблон с растущей паузой

javascript
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)

Симптом:

JSON
{ "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}. Это сбрасывает счётчик ошибок авторизации.

Terminal
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_…) — без самого ключа;
  • скриншот чата с непрочитанным сообщением, если есть.

#Смотрите также