Ошибки

Один формат отказа на все методы и номер запроса для поддержки.

Формат

Любой отказ выглядит одинаково:

{
  "error": {
    "code": "validation_failed",
    "message": "Request validation failed",
    "details": [{ "field": "limit", "message": "Must be an integer 1…100" }],
    "request_id": "9b1f2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d"
  }
}

Разбирайте code, а не текст. message написан для человека и может меняться; code — часть контракта.

Поле details есть не всегда. У ошибок проверки это список полей, у нехватки прав — название нужного права, у превышения лимита — какой именно лимит исчерпан.

Коды

HTTPcodeЧто произошло
401unauthorizedКлюча нет или он мёртв
402plan_requiredПубличный API не входит в тариф проекта
403insufficient_scopeУ ключа нет нужного права
404not_foundОбъекта нет или он в другом проекте
409conflictДействие противоречит текущему состоянию
422validation_failedНеверные параметры или тело запроса
422idempotency_mismatchТот же Idempotency-Key с другим телом
429rate_limitedПревышен лимит запросов
500internalНаша ошибка

Объекта из чужого проекта не существует — так и отвечаем, 404. Отдельного «нет доступа» нет: 403 означает нехватку права у ключа, а не чужой объект.

Номер запроса

Каждый ответ, удачный или нет, несёт заголовок X-Request-Id. Тот же номер лежит внутри тела ошибки. Назовите его в письме в поддержку — по нему мы найдём именно ваш запрос.

Как обрабатывать

  • 401 и 403 — ошибка настройки. Повторять бессмысленно, нужно чинить ключ или его права.
  • 404 — объекта нет. Для синхронизации это часто нормально: запись могли удалить.
  • 409 — состояние изменилось. Перечитайте объект и решите, что делать.
  • 422 — ошибка в запросе. Повторять с тем же телом бессмысленно.
  • 429 — подождите столько секунд, сколько указано в Retry-After, и повторите.
  • 500 и таймауты — повторяйте с растущей паузой. Если запрос был записывающим, повторяйте с тем же `Idempotency-Key`, чтобы не создать дубль.