Ошибки
Форматы ответов с ошибкой, все коды и что с ними делать.
Два формата
Ошибки приходят в одном из двух форматов — в зависимости от того, где запрос остановился.
Проверка подписи и лимитов — до разбора запроса. Код в поле error:
{
"error": "unauthorized",
"message": "unauthorized: X-Timestamp is outside the ±5 minute window — check the server clock"
}Обработка запроса — RFC 9457, Content-Type: application/problem+json. Код в errors[0].value:
{
"title": "Payment Required",
"status": 402,
"detail": "partner_balance_exhausted",
"errors": [
{ "message": "balance_exhausted", "location": "error.code", "value": "balance_exhausted" }
]
}Ветвитесь по коду, а не по тексту. message, detail и title — для людей и могут меняться. Код читается одной строкой:
const code = body?.error ?? body?.errors?.[0]?.value ?? `http_${status}`;code = body.get("error") or (body.get("errors") or [{}])[0].get("value") or f"http_{status}"$code = $body['error'] ?? ($body['errors'][0]['value'] ?? "http_$status");Ошибки схемы
Если тело или параметры не соответствуют схеме (нет обязательного поля, неверный тип, нет заголовка Idempotency-Key), ответ — 422 без кода; что не так, написано в errors[].location и errors[].message:
{
"title": "Unprocessable Entity",
"status": 422,
"detail": "validation failed",
"errors": [
{
"message": "expected required property email to be present",
"location": "body",
"value": { "external_id": "cust-42", "first_name": "Ivan", "last_name": "Petrov" }
}
]
}Коды подписи и лимитов
Формат с полем error.
| HTTP | error | Что значит | Что делать |
|---|---|---|---|
| 401 | unauthorized | Нет заголовков подписи, время вне окна ±5 минут, неизвестный ключ или подпись не совпала | См. частые ошибки подписи |
| 401 | partner_replay | Эта подпись уже использовалась | Подписать запрос заново |
| 403 | partner_suspended | Аккаунт приостановлен | Связаться с менеджером |
| 403 | partner_ip_not_allowed | Запрос с адреса вне списка разрешённых для ключа | Связаться с менеджером |
| 429 | rate_limited | Превышен лимит запросов ключа в минуту | Подождать и повторить |
Коды обработки
Формат RFC 9457, код в errors[0].value.
| HTTP | Код | Что значит | Повторять? |
|---|---|---|---|
| 400 | validation_failed | Значения не прошли бизнес-проверку — подробности в detail | Нет, исправить запрос |
| 400 | idempotency_key_required | Idempotency-Key пустой | Нет, передать ключ |
| 402 | balance_exhausted | available не покрывает операцию | После пополнения счёта |
| 403 | forbidden | У ключа нет нужного scope | Нет |
| 403 | card_secret_not_allowed | Нет scope cards:secret или доступа к реквизитам | Нет |
| 404 | not_found | Объекта нет в вашем аккаунте | Нет |
| 404 | tariff_not_available | Тариф неизвестен, выключен или снят | Нет, взять тариф из GET /tariffs |
| 404 | wallet_missing | Счёт аккаунта не настроен | Связаться с менеджером |
| 422 | amount_below_limit | Сумма на карту ниже min_topup | Нет, увеличить сумму |
| 422 | amount_above_limit | Сумма выше max_topup или лимита аккаунта на операцию | Нет, уменьшить сумму |
| 422 | card_not_active | Карта не в состоянии active | После того как карта станет active |
| 429 | daily_issue_limit | Достигнут суточный лимит выпусков | Завтра или после повышения лимита |
| 429 | card_secret_rate_limited | Превышен лимит запросов реквизитов | Через минуту |
| 503 | maintenance | Технические работы на направлении; деньги не двигались | Позже, с тем же Idempotency-Key |
| 503 | card_secret_reveal_disabled | Выдача реквизитов временно выключена | Позже |
| 500 | — | Внутренняя ошибка | Да, с тем же Idempotency-Key |
Код error в формате RFC 9457 означает ошибку без отдельного кода: ориентируйтесь на HTTP-статус и detail.
Коды неудачной операции
Если операция завершилась failed или needs_review, причина — в error_code операции и события.
error_code | Значит | Повторять? |
|---|---|---|
provider_unavailable | Эмитент не ответил, деньги не двигались | Да, с новым ключом |
maintenance | Направление закрыто на работы | Да, позже, с новым ключом |
provider_rejected | Эмитент отклонил запрос | Не сразу — сначала разобраться |
tariff_not_available | На тарифе больше нельзя выпускать | Нет, другой тариф |
order_expired | Операция не завершилась вовремя | Да, с новым ключом |
refunded | Средства возвращены | По ситуации |
issue_not_started | Выпуск не начался | Да, с новым ключом |
unknown_order_status | Итог не удалось определить | Нет, обратитесь в поддержку |
needs_review | Средства ушли эмитенту, а карта не появилась | Нет. Мы разбираемся |