Skip to content

Коды ошибок

Все эндпоинты публичного API отвечают одним и тем же конвертом — по нему можно писать общий обработчик ошибок один раз и переиспользовать на всех запросах. На этой странице — формат конверта и полный список кодов.

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

Успешный ответ оборачивается в data (плюс meta у списков — page, per_page, total):

json
{
  "data": { "id": 4821 },
  "meta": { "page": 1, "per_page": 20, "total": 187 }
}

Ошибка — в error, с машинным code, человекочитаемым message и опциональным fields:

json
{
  "error": {
    "code": "group_full",
    "message": "В группе нет свободных мест.",
    "fields": { "group_id": "переполнена" }
  }
}

fields присутствует не всегда — только когда ошибку можно привязать к конкретному полю запроса (ошибки валидации, reason у 401).

Список кодов

КодHTTPКогда возникаетЧто делать
unauthorized401Заголовка Authorization нет, ключ не начинается с bb_, неизвестен, отозван или истёк. fields.reasonmissing_or_malformed_key, unknown_key, revoked_key, expired_keyПроверить заголовок и статус ключа в разделе интеграций
insufficient_scope403Скоуп ключа не покрывает метод (например, read-ключ на write-эндпоинт)Выпустить ключ со скоупом write либо использовать ключ с нужным скоупом
rate_limit_exceeded429Превышен лимит 120 запросов в минуту на этот ключПодождать Retry-After секунд, см. «Лимиты запросов»
validation_failed422Тело или параметры запроса не прошли валидацию — на POST /leads, POST /demo-lessons, POST /students/{id}/groupsСмотреть fields, поправить запрос
not_found404GET /students/{id} — ученика с таким id нет в школе владельца ключаПроверить id
invalid_window422GET /lessonsto раньше fromПоменять даты местами или поправить
window_too_large422GET /lessons — окно from..to больше 92 днейСократить окно, запрашивать частями
student_not_found422POST /students/{id}/groups — ученик не принадлежит этой школеПроверить id ученика
group_not_found422POST /demo-lessons, POST /students/{id}/groups — группа не найдена или не принадлежит этой школеПроверить group_id
group_full409POST /demo-lessons, POST /students/{id}/groups — в группе нет свободных местВыбрать другую группу
already_enrolled422POST /students/{id}/groups — ученик уже состоит в этой группеНичего не делать — зачисление уже есть
funnel_not_found422POST /leadsfunnel_id не принадлежит этой школе или не существуетНе передавать funnel_id либо передать существующий
missing_idempotency_key422Любой write-метод без заголовка Idempotency-KeyДобавить заголовок
idempotency_in_progress409Повторный запрос с тем же Idempotency-Key ещё обрабатывается — первый ответ не успел появитьсяПовторить запрос чуть позже

Валидация полей

Когда тело запроса не проходит проверку, fields содержит сообщение по каждому полю. Например, для POST /demo-lessons без user_id и lead_id:

json
{
  "error": {
    "code": "validation_failed",
    "message": "Нужен student_id (user_id) или lead_id.",
    "fields": { "user_id": "обязателен, если не передан lead_id" }
  }
}

Идемпотентность

Idempotency-Key обязателен на всех write-методах (POST /leads, POST /demo-lessons, POST /students/{id}/groups) — подробнее в разделе конкретного запроса в справочнике API. Без заголовка запрос не выполняется:

json
{
  "error": {
    "code": "missing_idempotency_key",
    "message": "Заголовок Idempotency-Key обязателен для write-методов.",
    "fields": { "Idempotency-Key": "обязателен" }
  }
}

Если повторный запрос с тем же ключом идемпотентности приходит, пока первый ещё не завершился, и ответ не успевает появиться за короткое ожидание, платформа отвечает 409:

json
{
  "error": {
    "code": "idempotency_in_progress",
    "message": "Запрос с этим Idempotency-Key ещё обрабатывается, повторите чуть позже."
  }
}

Повтор в течение 24 часов

Запрос с тем же (ключ API, Idempotency-Key, эндпоинт) в течение 24 часов возвращает готовый результат первого выполнения — операция повторно не выполняется. Для новой операции используйте новый Idempotency-Key.