Aller au contenu

Erreurs & limites

Format d’erreur standard

Toutes les erreurs partagent la même enveloppe JSON :

{
"error": {
"code": "ERROR_CODE",
"message": "Message humain en français",
"request_id": "01HXY..."
}
}
  • code est contractuellement stable — testez sur ce champ, jamais sur message.
  • message peut évoluer entre versions.
  • request_id est l’identifiant à fournir au support en cas de dispute (correspond à meta.request_id côté succès et à l’en-tête X-Request-Id).

Codes d’erreur

HTTPCode applicatifCauseCrédit débité ?
401MISSING_SIGNATUREEn-têtes Signature-Input ou Signature absents.Non
401INVALID_SIGNATURESignature malformée, base non vérifiable, créateur expiré.Non
401INVALID_KEYkeyid inconnu ou révoqué.Non
401REPLAY_DETECTEDSignature déjà soumise dans les 5 dernières minutes.Non
401NO_CLIENT_CERT(hôte mTLS) Pas de certificat client valide.Non
402INSUFFICIENT_CREDITSSolde épuisé (mode prepaid).Non
403NOT_PARTNERCompte non habilité partenaire.Non
403IP_NOT_ALLOWEDIP source absente de votre allowlist (si activée).Non
404CANDIDAT_NOT_FOUNDMatricule inconnu ou non admis.Oui
404EDITION_NOT_FOUNDSession non encore publiée.Non
422INVALID_PARAMSFormat de matricule invalide.Non
429RATE_LIMITEDQuota dépassé.Non
500INTERNALErreur serveur.Non
503UPSTREAM_DB_DOWNUne dépendance critique est indisponible.Non

Rate-limit

ÉlémentValeur par défaut
Quota300 requêtes/seconde par partenaire (par key_id)
AlgorithmeSliding window côté Redis
GranularitéPar key_id, pas par IP
OverrideSur contrat, configurable jusqu’à plusieurs milliers/s
Boost ponctuelActivable automatiquement les jours de publication (annoncé 7 jours à l’avance)

En-têtes de rate-limit

Chaque réponse (succès ou erreur) porte :

X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 12

En cas de 429, l’API ajoute également Retry-After: <secondes> (RFC 6585).

Bonnes pratiques côté client

  • Plusieurs serveurs partageant le même key_id partagent le quota.
  • Implémentez un backoff exponentiel en cas de 429. Ne retentez pas avant la valeur de Retry-After.
  • Sur retry, resignez la requête : nouveau nonce, nouveau created. Un retry à l’identique → REPLAY_DETECTED.

Crédits

ModeComportement
prepaidLe solde décrémente à chaque appel facturé. Si balance = 0, l’API renvoie 402 INSUFFICIENT_CREDITS.
postpaidPas de blocage. Le compteur total_consumed incrémente ; facturation en fin de mois sur contrat.

Le champ meta.credits_remaining est présent dans chaque réponse facturée. Surveillez-le et déclenchez une alerte interne quand le solde descend sous, par exemple, 500 crédits (mode prepaid).

Quand un crédit est-il débité ?

Règle unique : dès que la requête a été exécutée côté serveur (signature OK, validation OK, requête base de données effectuée).

CasCrédit débité ?
200 réponse normaleOui
404 CANDIDAT_NOT_FOUND (matricule inconnu ou non admis)Oui
404 EDITION_NOT_FOUND (session non publiée)Non
401, 402, 403, 422, 429, 5xxNon
GET /v1/me (toujours)Non

Dispute

En cas d’écart de facturation, fournissez à ExaTrust la liste des request_id contestés (un par ligne). Le ledger interne search_logs permet la réconciliation au crédit près.

Anti-replay

ÉlémentValeur
Fenêtre created±5 minutes
StockageRedis, clé seen_sig:<sha256(signature)>
TTL5 minutes
Comportement si Redis indisponibleFail-open (la vérification est sautée, un warn log est émis)

IP allowlist (optionnel)

Vous pouvez restreindre les IP autorisées à appeler l’API avec votre key_id depuis votre dashboard partenaire. Une fois activée :

  • Formats acceptés : IPv4, IPv4 CIDR, IPv6, IPv6 CIDR.
  • Résolution de l’IP source : CF-Connecting-IPX-Real-IP → IP TCP.
  • Vide = filtre désactivé (comportement par défaut).
  • Le dashboard expose la dernière IP vue par l’API pour éviter de se verrouiller.

Une IP rejetée renvoie :

{
"error": {
"code": "IP_NOT_ALLOWED",
"message": "Votre IP source 203.0.113.99 n'est pas dans votre liste d'IPs autorisées",
"request_id": "01HXY..."
}
}

Aucun crédit n’est débité (le filtre tourne avant la facturation).

Identifiant de requête

Chaque réponse — succès comme erreur — porte un identifiant unique :

  • En-tête HTTP : X-Request-Id: 01HXY...
  • JSON succès : meta.request_id
  • JSON erreur : error.request_id

C’est la référence à conserver dans vos logs partenaire et à fournir au support ExaTrust.

Support

Pour toute question technique, dispute de facturation, ou demande d’augmentation de quota, contactez votre référent commercial ExaTrust en joignant les request_id concernés.