Todos los errores siguen el RFC 7807. El cuerpo es application/problem+json con los campos type, title, status, detail, request_id y, opcionalmente, reason o 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 | Significado |
|---|---|---|
| 400 | validation_failed | Validación de entrada fallida. Consulte errors[] para el detalle de cada campo. |
| 401 | auth_failed | Autenticación fallida. reason indica el motivo: 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 | Pago requerido. reason, véase a continuación. |
| 403 | forbidden_scope | Permiso ausente. reason: missing_scope. |
| 404 | not_found | El recurso no existe o no es visible para esta clave (evita la enumeración de clientes). |
| 409 | idempotency_conflict | Idempotency-Key ya utilizado con un cuerpo distinto. |
| 429 | rate_limited | Límite de tasa superado. Respete la cabecera Retry-After. |
| 500 | internal_error | Error interno del servidor. Indique request_id al contactar con soporte para correlacionar con el registro de auditoría. |
Motivos de pago requerido (HTTP 402)
Cuando el pedido no se puede pagar, la API devuelve HTTP 402 con un reason legible por máquina en el cuerpo JSON.
insufficient_credit_and_no_card(Saldo insuficiente y sin tarjeta registrada. Solución: recargar el saldo o añadir una tarjeta en el portal de clientes.)card_declined(Tarjeta rechazada por el banco o la pasarela. Solución: probar con otra tarjeta o contactar con su banco.)card_expired(Tarjeta caducada. Solución: añadir una nueva tarjeta en el portal de clientes.)client_not_found(Identificador de cuenta no encontrado (no debería ocurrir en la práctica, contacte con soporte).)

