Portée

Pour les requêtes dont le chemin commence par /api/, les exceptions non gérées et les erreurs HTTP courantes sont formatées en JSON avec la structure ci-dessous (y compris 404 « route introuvable » ou modèle introuvable).

Structure d’une erreur

{
  "success": false,
  "error": {
    "code": "validation_error",
    "message": "Les données envoyées sont invalides.",
    "details": {
      "domain": ["The domain field is required."]
    }
  }
}
Le champ details n’est présent que lorsqu’il y a des informations supplémentaires (souvent erreurs de validation par champ).

Codes HTTP usuels

CodeCas typique
401Token manquant ou invalide (unauthenticated)
403Permission insuffisante (forbidden) ou token sandbox en écriture (sandbox_read_only)
404Ressource introuvable ou non autorisée (not_found)
422Règle métier / validation (validation_error, invalid_state, no_reseller_service, etc.)
429Limite de débit
500Erreur serveur (server_error, hors mode debug)
503Service externe indisponible (whm_unavailable, payment_unavailable, …)

Codes error.code renvoyés par les contrôleurs v1

Les contrôleurs utilisent des codes snake_case cohérents avec le JSON métier :
CodeHTTPSignification
forbidden403Scope Sanctum manquant (Missing scope: …) ou action interdite
not_found404Ressource absente ou n’appartenant pas à l’utilisateur
unauthenticated401Non authentifié (handler global)
validation_error422Erreur de validation ; détails dans error.details
sandbox_read_only403Clé kh_test_ : pas d’écriture
invalid_state422État incompatible (ex. ticket fermé, facture non payable)
no_reseller_service422Pas de service revendeur actif
whm_unavailable503WHM non configuré
whm_error422 / 503Erreur retournée par l’API WHM
payment_unavailable503Passerelle de paiement non configurée
payment_init_failed422Échec d’initialisation NotchPay
dns_error422Erreur DNS / registrar
Les réponses success: true des endpoints métier utilisent leurs propres codes dans data lorsque pertinent (ex. reason_code pour la disponibilité domaine).

Erreurs globales (handler)

CodeHTTPQuand
http_errorvariableException HTTP générique
server_error500Erreur non prévue (hors APP_DEBUG)

Bonnes pratiques

$json = $response->json();
if (!($json['success'] ?? false)) {
    $code = $json['error']['code'] ?? 'unknown';
    // journaliser, retry, alerter…
}
Pour la validation, parcourez error.details (tableau associatif champ → liste de messages).