Format de réponse
Toute erreur (4xx ou 5xx) suit ce format JSON :statusCode: code HTTP (200-599)message: message humain décrivant l’erreurcode: code machine stable, présent sur une partie des erreurs (voir le tableau ci-dessous). Quand il est présent, branchez votre logique dessus.
code (clé manquante, invalide ou expirée, KYB requis, IP non autorisée…) : elles sont identifiées par leur statusCode et leur message texte.
Le 429 (rate limit) est une exception : son corps a une forme distincte, détaillée dans Rate limits.
Codes machine
Les codes ci-dessous sont les seuls codes machine stables émis par l’API marchande. Tous les autres cas d’erreur 4xx sont signalés parstatusCode + message, sans champ code.
| Code | HTTP | Sens |
|---|---|---|
INSUFFICIENT_SCOPE | 403 | La clé n’a pas le scope requis pour cette opération |
DASHBOARD_ONLY | 403 | Opération réservée au dashboard (indisponible par API) |
OWNER_ONLY | 403 | Opération réservée au propriétaire du compte |
DESTINATION_NOT_MATURED | 403 | Adresse de la liste d’autorisation encore en cours de maturation |
ACCOUNT_FROZEN | 401 | Compte gelé |
USER_SUSPENDED | 401 | Membre suspendu |
CREDENTIALS_CHANGED | 401 | Identifiants modifiés, reconnectez-vous |
Les rejets liés à la double authentification (par exemple si le propriétaire de la clé a
désactivé sa 2FA) renvoient un
403 dont le libellé reconnaissable est porté par le champ
message, pas par code. Les codes 2FA du flux de connexion au dashboard ne concernent pas
l’intégration par clé API.Codes HTTP utilisés
| Code | Sens |
|---|---|
| 200/201 | Succès |
| 204 | Succès sans body (ex: delete) |
| 400 | Bad Request : JSON malformé, headers manquants |
| 401 | Unauthorized : clé manquante, invalide ou expirée |
| 403 | Forbidden : scope insuffisant, KYB requis, IP non autorisée |
| 404 | Not Found |
| 409 | Conflict : ressource déjà existante (ex: slug déjà utilisé) |
| 422 | Unprocessable Entity : validation métier |
| 429 | Too Many Requests : rate limit (voir Rate limits) |
| 5xx | Erreur serveur : retryable |
Hiérarchie d’erreurs SDK Node
Chaque erreur du SDK descend deIziPayError. Vous pouvez catch tout d’un coup OU brancher sur la classe spécifique :
La hiérarchie typée du SDK expose des propriétés défensives comme
.requestId et .fields (parsing tolérant côté client). L’API marchande actuelle ne peuple pas ces champs : ils restent undefined. Branchez votre logique sur la classe d’erreur et sur .code plutôt que sur ces propriétés.Retry-Safe vs Non-retryable
| Erreur | Retry ? |
|---|---|
IziPayNetworkError | ✅ Oui, exponentiel |
IziPayServerError (5xx) | ✅ Oui |
IziPayRateLimitError (429) | ✅ Oui, après retryAfter |
IziPayValidationError (422) | ❌ Non, fixez le payload |
IziPayAuthError (401/403) | ❌ Non, la clé est invalide / révoquée |
IziPayNotFoundError (404) | ❌ Non |
IziPayApiError 409 | ❌ Non, conflit de ressource (ex: slug déjà utilisé) |
maxRetries: 0).
Logging recommandé
statusCode et code (quand il est présent) pour faciliter le tri de vos erreurs et les échanges avec le support.
Toutes les exceptions du SDK ont un
name distinct (pas le Error générique). Votre outil d’observabilité (Sentry, Datadog) les groupera par type d’erreur grâce au name distinct, sans configuration supplémentaire.