Перейти к содержимому
CalabДокументация

Ошибки и лимиты

Формат ошибок REST, частые коды для ботов и что с ними делать, лимиты частоты и тарифа, повторы и идемпотентность.

Формат ошибки

Любой ответ не из диапазона 2xx несёт тело ApiError:

JSON
{
  "code": "ERROR_CODE_FORBIDDEN",
  "message": "not available for bots",
  "field": "",
  "reason": "BOT_NOT_ALLOWED"
}
ПолеЧто это
codeкод из перечисления ErrorCode — по нему ветвитесь
messageтекст для логов, не для разбора: формулировка может меняться
fieldполе запроса (lowerCamelCase) для ERROR_CODE_VALIDATION и некоторых конфликтов
reasonуточнение, когда у кода несколько причин: BOT_NOT_ALLOWED, PLAN_LIMIT, FEATURE_DISABLED…
used · limitсчётчик и предел, если ошибка про лимит

Полный список кодов — Коды ошибок.

Частые ошибки ботов

HTTPcode / reasonЧто значитЧто делать
400ERROR_CODE_BAD_REQUESTбитый JSON или параметрыисправить запрос
401ERROR_CODE_UNAUTHENTICATEDтокена нет, он неверный, отозван или перевыпущеностановиться, получить новый токен
403ERROR_CODE_FORBIDDEN, reason: "BOT_NOT_ALLOWED"маршрут только для людейне повторять — см. что закрыто ботам
403ERROR_CODE_FORBIDDENне хватает права; message называет какоговыдать боту роль или переопределение
403ERROR_CODE_BOT_BLOCKEDчеловек заблокировал ботане писать этому человеку
403ERROR_CODE_WORKSPACE_SUSPENDEDпространство приостановлено: писать нельзя, читать можнождать снятия
404ERROR_CODE_NOT_FOUNDобъекта нет — или он скрыт от ботапроверить VIEW_ROOM / VIEW_BOARD и переопределения
409ERROR_CODE_CONFLICT, reason: "PLAN_LIMIT"лимит тарифа (used / limit)освободить место или сменить тариф
409ERROR_CODE_CONFLICT, reason: "REACTION_LIMIT"не больше 3 разных реакций одного участника на сообщениеубрать реакцию
409ERROR_CODE_CONFLICT, reason: "FEATURE_DISABLED" (field)функция доски выключена, а запрос ставит её полене передавать поле или включить функцию
409ERROR_CODE_ROOM_FULLголосовая комната заполненаподождать
413ERROR_CODE_FILE_TOO_LARGE · …_FILE_QUOTA_EXCEEDED · …_PAYLOAD_TOO_LARGEразмер или квотауменьшить файл
422ERROR_CODE_VALIDATION (field)неверное значение поляисправить поле
429ERROR_CODE_RATE_LIMITED + Retry-Afterпревышен лимит частотыподождать Retry-After секунд и повторить с тем же nonce
503ERROR_CODE_UNAVAILABLEвременный сбойповторить с задержкой

Лимиты

ЧтоЗначение
Запросы бота30 в секунду (всплеск — 30)
Сообщения бота20 в минуту по всем комнатам и DM, плюс общий лимит 5 сообщений за 5 с на комнату
Новые DM10 сразу, 30 в час
Загрузка файлов30 сразу, 120 в час; размер и квота — по тарифу
Сообщениедо 4000 символов, до 20 вложений, nonce — до 64 символов
Командыдо 100, имя до 32 символов, описание до 256
Gateway1 сокет на токен, кадр до 64 КиБ
Ботов в пространствепо тарифу: Free — 1, Team — 5, Business — 20; бот занимает и место участника

Запросов в секунду и сообщений в минуту хватает для интеграций, но не для массовых рассылок. На своём сервере оператор может поменять лимиты бота переменными BOT_RATE_PER_SEC и BOT_MESSAGES_PER_MIN. Все лимиты — Лимиты.

Повторы и идемпотентность

  • 429 — ждите Retry-After секунд и повторяйте. SDK делает это сам до maxRetries раз.
  • 5xx и обрывы сети — повторяйте с экспоненциальной задержкой.
  • Сообщения отправляйте с nonce: повтор с тем же nonce вернёт уже созданное сообщение (200) вместо дубля.
  • Формы отправляйте с постоянным UUID-nonce: одинаковые отправки создают одну задачу.
  • События (gateway, вебхук) могут прийти повторно — дедуплицируйте по id доставки, seq или id нажатия.
  • 4xx кроме 429 не повторяйте без изменения запроса.
async function call(url, init, tries = 5) {
  for (let i = 0; ; i++) {
    const res = await fetch(url, init);
    if (res.status !== 429 && res.status < 500) return res;
    if (i === tries - 1) return res;
    const wait = Number(res.headers.get('Retry-After')) || 2 ** i;
    await new Promise((r) => setTimeout(r, wait * 1000));
  }
}

Частые вопросы

Бот не видит комнату или сообщения. Нет VIEW_ROOM: комната приватная, закрытая (только через переопределение на ней) или роль бота не даёт доступа. Проверьте роли и переопределения комнаты.

Бот не отвечает на /cmd. Команду никто не зарегистрировал, или её зарегистрировали несколько ботов комнаты — пишите /cmd@username. Сообщения ботов командами не бывают.

Нужен ли gateway, если есть вебхук? Нет. Бот на вебхуке работает через REST и вебхук и считается в сети, пока делает запросы. Но события голоса приходят только через gateway.

Два процесса с одним токеном? Нельзя — второй вытесняет первый. Для масштабирования — вебхук с обработкой по id или несколько ботов.

Слышит ли бот себя в звонке? Нет: LiveKit не отправляет участнику его собственные дорожки. SDK по умолчанию пропускает собственные сообщения и реакции бота (receiveOwn: true включает их).