Toutes les erreurs suivent la RFC 7807. Le corps est en application/problem+json avec les champs type, title, status, detail, request_id et éventuellement reason ou errors[].
{
"type": "https://www.kernelhost.com/en/kernelhost-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 | Signification |
|---|---|---|
| 400 | validation_failed | Échec de la validation des entrées. Voir errors[] pour le détail par champ. |
| 401 | auth_failed | Échec de l'authentification. La réponse contient toujours reason unauthorized (ou ip_not_allowed si la clé est limitée à d'autres adresses IP) et n'en révèle volontairement pas davantage. Vérifiez la clé, le secret, l'heure (±300 s), le nonce et la signature ; le support retrouve la cause exacte grâce au request_id. |
| 402 | payment_required | Paiement requis. reason : voir ci-dessous. |
| 403 | forbidden_scope | Permission manquante. reason : missing_scope. |
| 404 | not_found | La ressource n'existe pas ou n'est pas visible pour cette clé (empêche l'énumération entre locataires). |
| 409 | idempotency_conflict, order_in_progress, service_not_active | Conflit. Soit l'Idempotency-Key a déjà été utilisée avec un autre corps ou sur un autre point de terminaison (idempotency_conflict, reason in_progress tant que la première requête n'est pas terminée), soit une autre commande de votre compte est encore en cours de traitement (reason order_in_progress, respectez l'en-tête Retry-After), soit le service n'est pas dans un état qui permet l'action (service_not_active, voir service_status). |
| 413 | payload_too_large | Corps de requête supérieur à 65 536 octets. Il est rejeté avant l'authentification. |
| 422 | unprocessable | Requête comprise mais non exécutable. reason billing_cycle_not_available : le produit n'est pas proposé pour ce cycle de facturation. reason zero_total_not_allowed : la commande serait gratuite sans motif valable tel qu'un code promo. |
| 429 | rate_limited | Limite de débit dépassée. Respectez l'en-tête Retry-After. |
| 500 | internal_error | Erreur interne du serveur. Indiquez request_id pour la corrélation avec le journal d'audit lorsque vous contactez le support. |
Motifs de paiement requis (HTTP 402)
Lorsque la commande ne peut pas être payée, l'API renvoie HTTP 402 avec un motif lisible par machine dans le corps JSON.
insufficient_credit_and_no_card(Crédit insuffisant et aucune carte enregistrée. Solution : rechargez le crédit ou ajoutez une carte dans le portail client.)card_declined(Carte refusée par la banque ou la passerelle. Solution : essayez une autre carte ou contactez votre banque.)credit_apply_failed(Le crédit n'a pas pu être appliqué à la facture. Rien n'a été débité et la commande a été annulée. Réessayez avec une nouvelle Idempotency-Key ou contactez le support.)client_not_found(Identifiant de compte introuvable (ne devrait pratiquement jamais se produire, contactez le support).)

