Ошибки
Ошибки
Конверт ошибки, коды статусов и семантика сбоев
Конверт ошибки
Ошибки API возвращают стандартный JSON-конверт с читабельным полем detail и
стабильным, машиночитаемым code:
Разветвляйте обработку ошибок по code (стабильному), а не по detail (тексту
для человека, который может меняться).
Эндпоинт обмена токена (POST /api/v1/auth/token/client) использует более
простую форму для сбоев аутентификации: {"error": "Invalid credentials"} при
401. Каждый другой эндпоинт использует конверт detail / code, приведённый выше.
Коды статусов
Примеры
Ошибки при создании против асинхронных сбоев
Существует два разных вида «сбоя», и они проявляются в разных местах:
-
Ошибки при создании (HTTP) — запрос отклоняется, и ничего не списывается. Они возвращаются как
4xx/5xxс конвертом ошибки в момент, когда вы вызываетеPOST /api/v1/orders. Пример: товар, которого нет в наличии на момент создания, возвращает400 validation_error(«Item is not available»). -
Асинхронные сбои (терминальный статус) — заказ был принят (
201,status: "pending"), и ваш баланс был списан, но выполнение позже дало сбой или было успешным лишь частично. Это не HTTP-ошибка. Вместо этого заказ завершается терминальнымstatusfailed(сerror/error_message, напримерOUT_OF_STOCK, и полнымrefund_amount) илиpartial(сrefund_amountза недоставленные единицы). Вы узнаёте об этом из своего webhook илиGET /api/v1/orders/{id}.
Правило: если вы получили 201, заказ существует и был списан — следите за его
status, а не за HTTP-ответом, чтобы узнать результат. Если вы получили 4xx,
ничего не произошло, и вы можете безопасно исправить запрос и повторить попытку.
Безопасное повторение попыток
Всегда отправляйте уникальный merchant_order_id в POST /api/v1/orders. Он
уникален в пределах аккаунта, поэтому если повторная попытка (после таймаута или
5xx) использует то же значение, вы случайно не разместите дублированный заказ
— дубликат отклоняется с 400 validation_error.