Коды ошибок
Любой ответ API с кодом 4xx или 5xx имеет одно и то же тело:
{ "error": { "code": "route_not_found", "message": "Route not found" } }
| Поле | Тип | Смысл |
|---|---|---|
error.code |
string | Машиночитаемый код из таблицы ниже. Коды не переименовываются и не удаляются; новые появляются в журнале изменений |
error.message |
string | Пояснение для человека на английском. Текст может меняться: не разбирайте его в коде |
error.details |
array | Только у validation_failed: список проблем, у каждой path — какое поле — и message |
Каждый ответ, включая ошибки, содержит заголовок X-Request-Id. Сообщайте его при обращении в поддержку: по нему находится запрос в логах. Если клиент сам передал X-Request-Id из латинских букв, цифр и символов ., _, :, - длиной до 128 символов, сервис использует его, иначе генерирует UUID.
Перечень
| HTTP | error.code |
Когда возникает | Что делать клиенту |
|---|---|---|---|
| 400 | validation_failed |
Тело, путь или параметры запроса не проходят проверку: поле отсутствует, лишнее или неверного формата. details перечисляет проблемы |
Исправить запрос. Повтор без изменений даст ту же ошибку |
| 400–499 | bad_request |
Запрос некорректен на уровне HTTP: неверный JSON, неподдерживаемый Content-Type, тело больше 16 КиБ. HTTP-код ответа уточняет причину |
Исправить запрос |
| 401 | unauthorized |
Нет заголовка X-Api-Key, ключ неверный, неизвестный или отозванный. В административном API и API кабинета — нет своего токена или он неверный |
Проверить ключ. Причина намеренно не уточняется |
| 403 | merchant_disabled |
Мерчант выключен — оператором или владельцем в кабинете | Включить проект в кабинете или обратиться к оператору |
| 403 | merchant_not_approved |
Проект ещё не одобрен после проверки или отклонён: POST /v1/invoices и POST /v1/addresses не принимают платежей. Ключи работают, чтение инвойсов тоже |
Дождаться проверки; причину отклонения владелец видит в кабинете. Повтор с order_id уже созданного инвойса возвращает этот инвойс |
| 404 | route_not_found |
Нет маршрута с таким методом и путём | Проверить метод и путь по документации |
| 404 | invoice_not_found |
Инвойса нет или он принадлежит другому мерчанту | Проверить идентификатор |
| 404 | payout_not_found |
Выплаты нет или она принадлежит другому мерчанту | Проверить идентификатор |
| 404 | merchant_not_found |
Только административный API и API кабинета: мерчанта нет, а в API кабинета — или он принадлежит другой учётной записи | Проверить идентификатор |
| 404 | api_key_not_found |
Только административный API и API кабинета: у мерчанта нет ключа с таким key_id |
Проверить идентификатор ключа и мерчанта |
| 404 | delivery_not_found |
Только административный API и API кабинета: доставки вебхука нет или она принадлежит проекту другой учётной записи | Проверить идентификатор |
| 404 | asset_not_found |
Только административный API: актива нет в каталоге | Проверить идентификатор актива |
| 409 | delivery_not_failed |
Только административный API: повторно отправляется только доставка в состоянии failed |
Дождаться окончания попыток; доставленное событие повторно не отправляется |
| 409 | asset_flag_locked |
Только административный API: каталог активов не разрешает операцию, которую пытаются переключить | Переключать можно только то, что разрешает каталог |
| 409 | address_mode_mismatch |
Операция не подходит к режиму адресации мерчанта, например постоянный адрес для мерчанта в режиме per_invoice |
Использовать операции своего режима |
| 409 | order_id_conflict |
Инвойс с этим order_id уже существует для другой суммы, актива или пользователя |
Проверить, не используется ли order_id повторно для другого заказа |
| 409 | reference_conflict |
Выплата с этим reference уже существует для другой суммы, актива или адреса |
Проверить, не используется ли reference повторно для другой выплаты |
| 422 | asset_not_supported |
Актив неизвестен или не принимается к оплате | Выбрать актив из списка assets |
| 422 | asset_not_payable |
В этом активе сервис не делает выплат: он неизвестен, отключён или предназначен только для приёма. В административном API — комиссия сети задаётся такому активу | Выбрать актив, в котором сервис платит |
| 422 | asset_payments_disabled |
Оператор временно выключил приём в этом активе | Повторить позже или предложить пользователю другой актив из списка assets. Повтор с order_id уже созданного инвойса возвращает этот инвойс |
| 422 | asset_disabled_by_merchant |
Приём в этом активе выключен в настройках проекта | Предложить пользователю другой актив из списка assets или включить актив в кабинете. Повтор с order_id уже созданного инвойса возвращает этот инвойс |
| 422 | asset_payouts_disabled |
Оператор временно выключил выплаты в этом активе | Повторить позже с тем же reference или обратиться к оператору. Выплаты, созданные раньше, исполняются как обычно |
| 422 | amount_below_minimum |
Сумма меньше минимального депозита актива | Увеличить сумму |
| 422 | network_fee_payer_not_supported |
Только API кабинета: network_fee_payer = customer. Отдельной комиссии сети у счёта нет: её затраты входят в комиссию сервиса, и покупатель её не несёт. Запрос отклоняется целиком, ничего не записывается |
Оставить merchant |
| 422 | service_fee_confirmation_required |
Только административный API: ставка комиссии сервиса выше 3% без confirm_high_rate: true |
Проверить ставку и повторить с подтверждением |
| 422 | service_fee_valid_from_in_past |
Только административный API: момент начала действия ставки уже прошёл | Указать момент в будущем или не указывать его — ставка начнёт действовать сразу |
| 422 | payout_fee_confirmation_required |
Только административный API: комиссия сети за выплату больше 5 единиц актива без confirm_high_amount: true |
Проверить сумму и повторить с подтверждением |
| 422 | payout_fee_valid_from_in_past |
Только административный API: момент начала действия комиссии сети за выплату уже прошёл | Указать момент в будущем или не указывать его — сумма начнёт действовать сразу |
| 422 | redirect_url_not_allowed |
return_url или cancel_url инвойса указаны, но у мерчанта нет адреса того же вида или origin переопределения отличается от него |
Использовать адрес на сайте, настроенном у мерчанта, или попросить оператора задать адрес — см. страницу оплаты |
| 422 | address_not_whitelisted |
Адреса нет в вайтлисте мерчанта по этому активу, либо задержка перед его первым использованием ещё не прошла. Сообщение называет, какой из двух случаев | Добавить адрес через оператора и дождаться окончания задержки. Ответ не зависит от суммы: без вайтлиста выплата невозможна |
| 429 | rate_limited |
Превышен лимит запросов по ключу или по IP-адресу | Повторить через время из заголовка Retry-After |
| 500 | internal_error |
Необработанная ошибка сервиса. Подробности пишутся в лог сервиса и в ответ не попадают | Повторить позже с тем же ключом идемпотентности; при повторении сообщить X-Request-Id |
| 503 | service_unavailable |
Сервис временно не может обслуживать запросы: например, недоступна база данных | Повторить позже с экспоненциальной задержкой |
| 503 | payouts_halted |
Выплаты остановлены — по этому активу или целиком. Причина остановки наружу не раскрывается | Повторить позже с тем же reference: повтор не создаёт вторую выплату. Если остановка длится, обратиться к оператору |
| 503 | addresses_exhausted |
Закончились индексы деривации адресов. Практически недостижимо | Сообщить оператору |
| 503 | network_fee_quote_unavailable |
У проекта осталась прежняя настройка «комиссию сети платит покупатель», а такой комиссии у инвойса нет: инвойс не создаётся. Повтор с order_id уже созданного инвойса возвращает этот инвойс |
Сохранить в кабинете настройки «Кто платит комиссии» или обратиться к оператору |
Если клиент получил код, которого нет в таблице, он должен обработать ответ по классу HTTP-статуса: 4xx — ошибка в запросе, 5xx — временная проблема сервиса.
Примеры
curl -s https://api.stons.io/v1/unknown
{"error":{"code":"route_not_found","message":"Route not found"}}
Ошибка проверки перечисляет все проблемные поля:
{
"error": {
"code": "validation_failed",
"message": "Request validation failed",
"details": [{ "path": "body.expires_in", "message": "Too small: expected number to be >=60" }]
}
}