Erreurs & troubleshooting
Codes d'erreur, cas métier et checklist de diagnostic pour l'intégration partenaire.
Format commun des erreurs
Toutes les erreurs retournent une enveloppe JSON homogène :
{
"error": {
"code": "validation_failed",
"message": "Le payload de demande de contrat est invalide",
"requestId": "req_2026-04-24_001",
"details": {
"field": "contract.pfs",
"reason": "Doit etre > 125 pour cat=550 et scatCode=011"
}
}
}| Champ | Description |
|---|---|
error.code | Code stable, safe à matcher côté partenaire. |
error.message | Message humain, non stable (ne pas matcher). |
error.requestId | À fournir au support pour toute investigation. |
error.details | Contexte additionnel, variable selon le code. |
Codes HTTP
| Code | Sémantique |
|---|---|
| 200 | Succès (lecture). |
| 201 | Succès (création). |
| 400 | Requête invalide ou configuration serveur manquante. |
| 401 | Authentification absente / invalide. |
| 403 | Authentifié mais non autorisé (rôle ou propriété de ressource). |
| 404 | Ressource inconnue. |
| 409 | Conflit (idempotency, état incompatible). |
| 422 | Validation métier échouée (champ cohérent mais règle refusée). |
| 429 | Rate limit atteint. |
| 500 | Erreur interne agrégateur. |
| 502 | Erreur d'un provider amont (paiement ou ASKIA). |
| 503 | Indisponibilité temporaire. |
Erreurs fréquentes
400 — Configuration paiement manquante
{
"error": {
"code": "dexpay_config_missing",
"message": "La configuration interne du paiement n'est pas active"
}
}Cause : côté plateforme, la configuration interne de paiement est incomplète.
Action partenaire : contacter le support. Ce n'est pas une erreur d'intégration côté partenaire.
401 — Non authentifié
{
"error": { "code": "unauthorized", "message": "Invalid or missing API key" }
}Causes :
x-api-keyabsent.- Clé révoquée ou expirée.
- Mélange environnement (clé sandbox utilisée en production ou inversement).
422 — Validation métier refusée
{
"error": {
"code": "validation_failed",
"message": "Le payload de demande de contrat est invalide",
"details": {
"field": "contract.pfs",
"reason": "Doit etre > 125 pour cat=550 et scatCode=011"
}
}
}Causes possibles :
cat=550+scatCode=011avecpfs <= 125cat=550+scatCode=010avecpfs > 125- URL de retour manquante ou invalide
- champ obligatoire ASKIA absent ou mal formate
403 — Interdit : /contracts/auto/* appelé par un partenaire
{
"error": {
"code": "forbidden",
"message": "Direct contract creation is not permitted for partner role. Use the payment-first flow."
}
}Cause : tentative d'appel direct à POST /contracts/auto/classic ou assimilé
avec une clé API de rôle partner.
Action : migrer vers
POST /api/v1/partner/contracts/auto/classic.
403 — Ressource appartenant à un autre partenaire
{
"error": { "code": "forbidden", "message": "Resource not owned by this partner" }
}Cause : tentative d'accéder à une reference créée par un autre
compte partenaire.
Action : verifier la provenance de la reference et l environnement utilise.
404 — Référence inconnue
{
"error": { "code": "reference_not_found", "message": "Unknown reference" }
}Causes possibles :
- Typo sur la
reference. - Utilisation de la
referencesandbox en production (et vice-versa). - Purge (les références non-payées peuvent être purgées après un délai long).
502 — Erreur provider (paiement ou ASKIA)
{
"error": {
"code": "provider_upstream_error",
"message": "Upstream provider returned an error",
"details": { "provider": "dexpay", "upstreamStatus": 503 }
}
}Action : retenter avec backoff exponentiel. Si persistant, escalader au support.
Cas métier : paiement complété mais émission échouée
Ce cas est critique : l'utilisateur final a été débité, mais aucun contrat n'a été émis. Il doit déclencher un alerting immédiat côté partenaire.
Comment le détecter
Vous le détectez par l'un des deux signaux suivants :
- Réception d'un webhook
insurance.contract.issuance_failed. - Appel
GET /api/v1/partner/contracts/requests/:referenceretournantcontractStatus = ISSUANCE_FAILED.
Que faire
- Ne pas rembourser automatiquement. L'agrégateur peut rejouer l'émission.
- Créer un ticket support contenant :
- la
reference, - le
requestIdde la réponse, - la valeur de
issuance.errorCode.
- la
- Informer l'utilisateur d'un "traitement en cours" (UX recommandée : ne pas afficher "paiement échoué", ce qui serait faux).
- L'opérateur admin déclenchera un rejeu ; vous recevrez un nouveau webhook
insurance.contract.issuedsi le rejeu aboutit.
Checklist de diagnostic
Avant d'ouvrir un ticket, valider dans cet ordre :
Clé API
Est-elle bien celle de l'environnement appelé ? (sandbox ≠ prod).
Headers
x-api-key,Content-Type: application/json,x-request-idprésents ?Idempotency
Le même
idempotency-keyest-il réutilisé avec un body différent ? (409).Payload contrat
contract,returnUrletcancelUrlsont-ils complets et coherents avec les regles metier ?URLs
returnUrl,cancelUrl,webhookUrlen HTTPS et publiques ?Webhook
Votre endpoint répond
2xxen < 5s ? La signature est-elle vérifiée ?Logs
Conservez
x-request-iddans les logs partenaire — indispensable au support.
Contact support
Tout ticket doit contenir :
- l'environnement (sandbox / production),
- la ou les
referenceconcernées, - les
requestIddes réponses, - un extrait de logs côté partenaire (avec timestamps UTC),
- la fenêtre temporelle de l'incident.
Comprendre le parcours complet de la demande au contrat actif.
Tester les endpoints et consulter les schemas OpenAPI reels.
Verifier la signature et traiter les emissions en temps reel.
Valider les prerequis de production avant ouverture partenaire.