Помилки

Конверт помилки, коди статусів і семантика збоїв

View as Markdown

Конверт помилки

Помилки API повертають стандартний JSON-конверт із читабельним полем detail та стабільним, машинозчитуваним code:

Відповідь із помилкою
1{
2 "detail": "Insufficient balance",
3 "code": "insufficient_balance"
4}

Розгалужуйте обробку помилок за code (стабільним), а не за detail (текстом для людини, який може змінюватися).

Ендпоінт обміну токена (POST /api/v1/auth/token/client) використовує простішу форму для збоїв автентифікації: {"error": "Invalid credentials"} при 401. Кожен інший ендпоінт використовує конверт detail / code, наведений вище.

Коди статусів

HTTPcodeКоли
400validation_errorНекоректне або відсутнє поле, невідомий/недоступний товар (зокрема відсутність у наявності на момент створення), дубльований merchant_order_id або кількість поза діапазоном.
400insufficient_balanceБаланс вашого акаунта не покриває замовлення.
401not_authenticatedВідсутній, недійсний або прострочений токен доступу. Повторно обміняйте свій API-ключ.
404not_foundЗамовлення не існує або не належить вашому акаунту.
409already_existsКонфлікт з наявним ресурсом.
5xxПомилка бекенду. Повторюйте з відстрочкою; використовуйте merchant_order_id, щоб повторні спроби залишалися ідемпотентними.

Приклади

400 — помилка валідації
1{ "detail": "Item is not available", "code": "validation_error" }
400 — недостатній баланс
1{ "detail": "Insufficient balance", "code": "insufficient_balance" }
401 — не автентифіковано
1{ "detail": "Authentication credentials were not provided.", "code": "not_authenticated" }
404 — не знайдено
1{ "detail": "Not found.", "code": "not_found" }

Помилки під час створення проти асинхронних збоїв

Існує два різні види «збою», і вони проявляються в різних місцях:

  • Помилки під час створення (HTTP) — запит відхиляється, і нічого не списується. Вони повертаються як 4xx/5xx із конвертом помилки в момент, коли ви викликаєте POST /api/v1/orders. Приклад: товар, якого немає в наявності на момент створення, повертає 400 validation_error («Item is not available»).

  • Асинхронні збої (термінальний статус) — замовлення було прийнято (201, status: "pending"), і ваш баланс було списано, але виконання пізніше дало збій або було успішним лише частково. Це не HTTP-помилка. Натомість замовлення завершується термінальним status failederror / error_message, наприклад OUT_OF_STOCK, і повним refund_amount) або partialrefund_amount за недоставлені одиниці). Ви дізнаєтеся про це зі свого webhook або GET /api/v1/orders/{id}.

Правило: якщо ви отримали 201, замовлення існує та було списано — слідкуйте за його status, а не за HTTP-відповіддю, щоб дізнатися результат. Якщо ви отримали 4xx, нічого не сталося, і ви можете безпечно виправити запит і повторити спробу.

Безпечне повторення спроб

Завжди надсилайте унікальний merchant_order_id у POST /api/v1/orders. Він унікальний у межах акаунта, тож якщо повторна спроба (після таймауту чи 5xx) використає те саме значення, ви випадково не розмістите дубльоване замовлення — дублікат відхиляється з 400 validation_error.