Любая ошибка в формате JSON соответствует одному и тому же объекту. Сначала смотрите код HTTP, затем разбор полей ниже.
Ниже — единственный допустимый набор полей. Других корневых ключей в ответах с ошибкой для интеграции не закладывайте.
message ( string) — обязательно, если тело JSON; человекочитаемое описание для логов и UI.code (string) — опционально; стабильный машинный код (аутентификация, бизнес-конфликт и т.п.). Если ключа нет — опирайтесь на message и HTTP.errors (object) — опционально; только при ошибке валидации полей: ключ — имя поля, значение — массив строк сообщений. Если ключа нет — это не ошибка «по полям».Опциональные поля не присылаются как null для «пустого случая» — ключ просто отсутствует в JSON.
Любой ответ с ошибкой — это подмножество следующей схемы (все три ключа показаны вместе для ясности; в реальном ответе присутствует только нужное подмножество):
{
"message": "<строка — всегда, если есть JSON-тело ошибки>",
"code": "<строка — только если API вернул код>",
"errors": { "<поле>": ["<сообщение>", "..."] }
}Минимальный валидный ответ: { "message": "…" }.
Структурированная ошибка (есть code, нет errors):
{
"message": "Неверная подпись запроса.",
"code": "signature_invalid"
}Ошибка валидации (есть errors, поле code может отсутствовать):
{
"message": "The given data was invalid.",
"errors": {
"orderId": ["The order id field is required."]
}
}errors при наличии).idempotency_key_conflict).