PlatformМодель ошибок

Модель ошибок

Структура ответов с ошибками в 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}`);
  }
}

Когда повторять запрос

  • 5xx и сетевые сбои — повторяйте с экспоненциальной задержкой. Переводы повторяйте с тем же idempotencyKey, чтобы не задвоить платёж (см. Идемпотентность).
  • 400 / 422 — не повторяйте вслепую: исправьте запрос по details.
  • 403 — это решение Policy Engine. Смотрите reason и trace, чтобы понять, какая политика заблокировала (см. Policy Engine).

Что дальше