Все ошибки следуют RFC 7807. Тело ответа — application/problem+json с полями type, title, status, detail, request_id и опционально reason или errors[].
{
"type": "https://www.kernelhost.com/en/reseller-api/errors/payment_required",
"title": "Payment required",
"status": 402,
"detail": "The order could not be paid.",
"request_id": "01HX7Z3K8Q...",
"reason": "insufficient_credit_and_no_card"
}
| HTTP | type | Значение |
|---|---|---|
| 400 | validation_failed | Валидация входных данных не прошла. См. errors[] для деталей по каждому полю. |
| 401 | auth_failed | Аутентификация не пройдена. reason указывает причину: missing_headers, bad_key, bad_timestamp, timestamp_out_of_window, bad_nonce, bad_signature, signature_mismatch, replay_detected, unknown_or_locked_key, ip_not_allowed. |
| 402 | payment_required | Требуется оплата. reason — см. ниже. |
| 403 | forbidden_scope | Нет разрешения. reason: missing_scope. |
| 404 | not_found | Ресурс не существует или не виден для этого ключа (защита от перечисления арендаторов). |
| 409 | idempotency_conflict | Idempotency-Key уже использовался с другим телом. |
| 429 | rate_limited | Превышено ограничение частоты. Соблюдайте заголовок Retry-After. |
| 500 | internal_error | Внутренняя ошибка сервера. При обращении в поддержку указывайте request_id для сопоставления с журналом аудита. |
Причины Payment Required (HTTP 402)
Если заказ невозможно оплатить, API возвращает HTTP 402 с машинно-читаемым reason в JSON теле.
insufficient_credit_and_no_card(Баланса недостаточно и карта не привязана. Решение: пополните баланс или добавьте карту в клиентском портале.)card_declined(Карта отклонена банком или платёжным шлюзом. Решение: попробуйте другую карту или свяжитесь с банком.)card_expired(Срок действия карты истёк. Решение: добавьте новую карту в клиентском портале.)client_not_found(Идентификатор аккаунта не найден (практически не должно происходить, обратитесь в поддержку).)

