Перейти до основного вмісту

Помилки

Кожна відповідь не з класу 2xx на /v1 має один і той самий конверт. Розгалужуйте логіку за errors[0].code, а не за текстом повідомлення: повідомлення призначені для людей і можуть змінюватися, а коди стабільні.

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

{
"status": "error",
"data": null,
"errors": [
{
"code": "IDEMPOTENCY_KEY_CONFLICT",
"message": "Idempotency-Key was already used with a different request body",
"parameter": "idempotency-key"
}
]
}
  • status завжди "error", а data завжди null.
  • errors містить щонайменше один запис. code — одне зі значень таблиці нижче; parameter називає поле чи заголовок, через який виникла помилка, якщо його можна визначити, інакше — null.

Ідентифікатори запитів​

Кожна відповідь містить заголовок x-request-id. Якщо ви надішлете коректний x-request-id у запиті, його буде повернуто назад; інакше його згенерують. Записуйте його в журнал разом із кожним викликом і називайте, коли звертаєтеся до підтримки: hello@leeri.ai.

Як реагувати​

СитуаціяЩо робити
429 з RATE_LIMIT_EXCEEDED або PROVIDER_CAPACITY_EXCEEDEDЗачекайте кількість секунд із заголовка Retry-After, потім повторіть той самий запит. Див. Обмеження частоти запитів і ліміти.
503 з REPORT_RENDERINGПовторіть через інтервал із Retry-After; посилання на звіт залишається чинним.
503 з RULESET_UNAVAILABLE, RATE_LIMIT_STORE_UNAVAILABLE, SERVICE_DRAINING або UPSTREAM_UNAVAILABLERetry-After не надсилається. Повторюйте з експоненційною затримкою та випадковим розкидом (jitter). За відхилений запит нічого не стягується.
500 з INTERNAL_ERRORПовторіть із затримкою й тим самим Idempotency-Key; якщо збій повторюється, напишіть у підтримку з x-request-id.
409 з IDEMPOTENCY_REQUEST_IN_FLIGHTПерший запит із цим ключем ще виконується. Повторіть той самий запит після короткої паузи. Див. Ідемпотентність.
409 з IDEMPOTENCY_LEASE_LOSTІнший повторний запит перехопив ключ, поки цей виконувався. Надішліть той самий запит ще раз, щоб прочитати записаний результат.
422 з PROVIDER_CAPACITY_REQUEST_TOO_LARGEНіколи не повторюйте без змін: запит більший за ємність, яку можна коли-небудь виділити. Розбийте його на менші запити.
402 з INSUFFICIENT_BALANCEЛіміт і попередньо поповнений баланс вичерпано. Повтор не допоможе, доки баланс не поповнять.
Будь-яка інша 4xxПомилка в самому запиті (VALIDATION_ERROR, ADDRESS_REQUIRED, UNSUPPORTED_ASSET, NOT_FOUND, SCOPE_ERROR тощо). Виправте його; повтор без змін поверне ту саму помилку.

Запит, що завершився статусом 4xx або 5xx, не записується під його Idempotency-Key, тож повторний запит виконається знову.

Коди помилок​

Таблицю згенеровано з контракту API, до якого прив'язана ця документація, тож вона завжди містить рівно ті коди, які може повернути API. Кожен код є ціллю посилання: наприклад, ./errors.mdx#ADDRESS_REQUIRED веде до його рядка.

КодHTTP-статусУмова
VALIDATION_ERROR400Тіло запиту, параметри або заголовок не пройшли валідацію Zod: невідоме поле, значення поза заявленими межами або структура, яку ендпоінт не може розібрати.
AUTH_ERROR401Заголовок Authorization відсутній, має неправильний формат або не відповідає активному ключу API з чинним строком дії.
SCOPE_ERROR403Ключ API пройшов автентифікацію, але не має scope, потрібного для цього маршруту.
TENANT_BOUNDARY403Читання або запис на рівні даних виявили посилання на дані іншого клієнта (tenant) — це відмова самого захисту RLS на рівні платформи, а не перевірка на рівні маршруту.
NOT_FOUND404Ресурсу з таким id немає для автентифікованого клієнта та середовища ключа (live/sandbox). Це стосується й id іншого клієнта або іншого середовища: відповідь свідомо така сама, як для неіснуючого id.
IDEMPOTENCY_KEY_CONFLICT422Той самий Idempotency-Key уже використовувався для цього ендпоінта з іншим тілом запиту.
INSUFFICIENT_BALANCE402Клієнт вичерпав і залишок ліміту (квоти), і попередньо поповнений баланс за поточний розрахунковий період.
PROVIDER_CAPACITY_EXCEEDED429Глобальна або клієнтська ємність для роботи зі сторонніми джерелами даних заповнена. Жодну перевірку чи резервування коштів не прийнято; повторіть запит через інтервал із Retry-After. У стійкому режимі роботи з джерелами кожна live-перевірка займає до 10 слотів, доки її запити не зафіксовано; типова ємність клієнта — 1000 слотів, тобто 100 live-перевірок, що одночасно чекають на джерела; цього завжди вистачає на один повний пакет зі 100 елементів.
PROVIDER_CAPACITY_REQUEST_TOO_LARGE422Цей один запит потребує більше слотів, ніж ємність клієнта чи глобальна ємність містить загалом, тому його не можна прийняти ніколи: повтор не допоможе, а Retry-After не надсилається. Жодну перевірку чи резервування коштів не прийнято; розбийте запит на менші.
RULESET_UNAVAILABLE503Під час перевірки жоден опублікований набір правил оцінювання не був досяжним — за такої відповіді перевірку ніколи не тарифікують.
RATE_LIMIT_STORE_UNAVAILABLE503Сховище лічильників обмеження частоти запитів недосяжне. Запит відхилено, а не обслужено без обмежень узагалі (fail-closed).
RATE_LIMIT_EXCEEDED429Перевищено обмеження частоти запитів: за IP, за викликачем, за невдалою автентифікацією, окреме обмеження на клієнта для rederive чи звітів про адреси або окреме обмеження для документації. Повторіть запит після вікна, названого в Retry-After.
SERVICE_DRAINING503Екземпляр завершує роботу й відмовляється від нової роботи; повторіть запит до іншого екземпляра.
UPSTREAM_UNAVAILABLE503Залежність, яку цей запит викликає синхронно (DNS-розв'язання URL вебхука, запит до стороннього джерела даних), не відповіла або перевищила час очікування.
REPORT_RENDERING503PDF доказового звіту ще генерується й не був готовий за відведений час очікування. Повторіть запит через інтервал із Retry-After; посилання залишається чинним.
REPORT_RENDER_FAILED503Не вдалося згенерувати PDF доказового звіту. У повідомленні є короткий ідентифікатор звіту, який слід назвати підтримці; повторне відкриття посилання після короткої паузи ще раз запускає генерацію.
UNSUPPORTED_ASSET422Символу активу немає у реєстрі активів, які підтримує рушій скринінгу.
ADDRESS_REQUIRED422У перевірці транзакції не вказано address для активу, який не може його визначити (будь-який, крім TRX, ETH, BNB і BASE), або ключ sandbox не вказав його в жодній перевірці транзакції. Передайте адресу вашого клієнта в цій транзакції.
TRANSACTION_UNRESOLVED422У перевірці транзакції не вказано address, а транзакцію не вдалося прочитати з її мережі (такої транзакції немає в цій мережі, неможливо розкодувати одержувача депозиту або джерело даних мережі не відповіло вчасно). Нічого не прийнято й не тарифіковано; перевірте хеш і мережу, повторіть запит або передайте адресу.
PAYLOAD_TOO_LARGE413Тіло запиту перевищує налаштований ліміт розміру.
IDEMPOTENCY_REQUEST_IN_FLIGHT409Запит із цим Idempotency-Key уже обробляється іншим запитом; повторіть невдовзі.
IDEMPOTENCY_LEASE_LOST409Оренду ідемпотентності цього запиту перехопив одночасний повторний запит, поки він ще не завершився; повторіть, щоб прочитати записаний, опублікований результат.
CHECK_FAILED422Рушій скринінгу відпрацював до кінця, але сама перевірка завершилася помилкою (наприклад, невиправна помилка стороннього джерела даних).
INTERNAL_ERROR500Некласифікована серверна помилка. Кожна 5xx, яку ця таксономія не називає окремо (і кожен суто внутрішній код), зводиться до цього коду; сире повідомлення ніколи не залишає журнал сервера.

AMLBot-сумісний ендпоінт​

AMLBot-сумісний ендпоінт зберігає конвенцію API, яке відтворює: він завжди відповідає HTTP 200, а збої повідомляє у власному конверті result: false; див. Відповіді у посібнику з міграції. Конверт і коди вище стосуються /v1.