Модель ошибок
Структура ответов с ошибками в V3 Custody — конверт error/message/code/details, HTTP-статусы и машиночитаемые коды.
API возвращает стандартные HTTP-статусы с единым JSON-конвертом ошибки. Ошибки валидации несут детали по полям, доменные ошибки — машиночитаемый код.
Конверт ошибки
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{ "field": "email", "message": "Invalid email format" }
]
}
error— краткое имя ошибки (Bad Request,Unauthorized,Not Found…).message— человекочитаемое описание.code— HTTP-статус числом.details— ошибки по полям (для валидации400):field+message.
HTTP-статусы
| Статус | Значение |
|---|---|
200 / 201 | Успех |
202 | Поставлено в очередь — создана заявка на подтверждение |
400 | Некорректный запрос (валидация; см. details) |
401 | Не аутентифицирован |
403 | Запрещено политикой (deny/block; default-deny) |
404 | Не найдено |
410 | Ресурс больше не действителен (например, отозванное/принятое приглашение) |
422 | Невозможно обработать |
Машиночитаемые коды
У доменных ошибок помимо HTTP-статуса есть машиночитаемый код — по нему удобно ветвить логику:
| Код | Когда |
|---|---|
INSUFFICIENT_BALANCE | Недостаточно средств для перевода |
AMOUNT_EXCEEDED | Превышен лимит политики |
REPORT_PERIOD_TOO_LARGE | Результат отчёта слишком большой — сузьте фильтры |
REPORT_UNSUPPORTED_FORMAT | Формат экспорта пока не поддержан (xlsx/pdf) |
Расположение машиночитаемого кода различается по эндпоинтам: где-то это строковый code, где-то вложенный error.code, а у Policy Engine — reason в решении (с trace сработавших политик). Точную форму смотрите в Справочнике API.
Обработка ошибок
Проверяйте статус ответа и читайте code/details:
const res = await fetch(url, { headers });
if (!res.ok) {
const err = await res.json();
console.error(`${err.code} ${err.error}: ${err.message}`);
for (const d of err.details ?? []) {
console.error(` ${d.field}: ${d.message}`);
}
}
res = requests.post(url, headers=headers, json=body)
if not res.ok:
err = res.json()
print(f"{err['code']} {err['error']}: {err['message']}")
for d in err.get("details", []):
print(f" {d['field']}: {d['message']}")
Когда повторять запрос
- 5xx и сетевые сбои — повторяйте с экспоненциальной задержкой. Переводы повторяйте с тем же
idempotencyKey, чтобы не задвоить платёж (см. Идемпотентность). 400/422— не повторяйте вслепую: исправьте запрос поdetails.403— это решение Policy Engine. Смотритеreasonиtrace, чтобы понять, какая политика заблокировала (см. Policy Engine).
Что дальше
Was this page helpful?