Gestion des erreurs : codes HTTP, réessais et intégration robuste

Codes de statut HTTP, réponses d'erreur et logique de réessai de l'API PSB : comment construire une intégration robuste.

Toute intégration API rencontrera tôt ou tard des erreurs. Une panne réseau, un serveur inaccessible, un document mal formaté : cela fait partie du métier. L'API PSB communique les erreurs via des codes de statut HTTP standard et des réponses JSON structurées. De plus, la PSB dispose d'un mécanisme de réessai intégré qui gère automatiquement les erreurs temporaires lors de la livraison de documents.

Dans cet article, vous apprendrez quels codes de statut la PSB renvoie, comment interpréter les réponses d'erreur, quand un réessai est pertinent et comment fonctionne le mécanisme de réessai automatique de la PSB.

Codes de statut HTTP

L'API PSB utilise des codes de statut HTTP standard pour indiquer le résultat d'une requête. Les codes de statut se divisent en deux catégories : les erreurs client (4xx) que vous devez corriger vous-même, et les erreurs serveur (5xx) que vous pouvez réessayer.

Réponse de succès
CodeSignificationExplication200OKLa requête a été traitée avec succès201CreatedNouvel objet créé (par exemple un hook, un subscriber ou un document/ressource)202AcceptedRequête acceptée pour un traitement asynchrone/en file d'attente ; vérifiez le statut plus tard204No ContentRequête réussie sans corps de réponse (par exemple pour un DELETE ou une mise à jour sans corps)
Erreurs client (4xx) : ne pas réessayer

Avec une erreur 4xx, le problème se trouve dans la requête elle-même. Renvoyer avec les mêmes données produira le même résultat. Corrigez la cause avant de réessayer.

CodeSignificationQuandAction400Bad RequestErreur de validation ou erreur de syntaxe dans le documentVérifiez le corps de la requête. La réponse JSON contient les détails de ce qui n'a pas fonctionné401UnauthorizedAucun token envoyé, ou le token a expiré ou est invalideDemandez un nouveau Bearer token auprès de l'Identity Server403ForbiddenLe token est valide, mais l'action n'est pas autorisée. Le cas le plus fréquent : vous utilisez un partyId auquel votre compte n'a pas accès. Autres causes : bearer token expiré, subscription key invalide, ou un endpoint non disponible pour votre niveau d'autorisationVérifiez que vous utilisez le bon partyId et que l'utilisateur qui a obtenu le bearer token a accès à ce partyId. En cas de doute : obtenez un nouveau token via l'Identity Server404Not FoundLe endpoint ou la ressource demandée n'existe pas (par exemple un Document ID, un hook ou un PartyID inconnu). Lors de l'envoi, cela se produit aussi avec la combinaison "No valid delivery options. PartyId '...' not found in Peppol" (entre autres avec VerstuurInvoice) : le PartyId fourni n'est pas (pour ce type de document) sur Peppol/SMPVérifiez l'URL, le Document ID et le partyId. En cas de "PartyId not found in Peppol" : effectuez d'abord une recherche via queryRecipientParty ou lookup.peppol.org sur l'ID fourni, vérifiez ensuite éventuellement les schémas apparentés (par exemple BE 0208 versus 9925/BE:VAT, même numéro de base) -- ne recommandez un changement d'EndpointID qu'en cas de résultat de recherche confirmé. Aucun résultat sur un ID candidat : le destinataire n'est pas joignable via ces identifiants ; le client doit demander une inscription ou un autre ID de livraison auprès du destinataire405Method Not AllowedLa méthode HTTP utilisée n'est pas prise en charge sur ce endpointVérifiez la documentation API pour la méthode correcte (GET/POST/PUT/DELETE)409ConflictLe document a déjà été traité (idempotence)Aucune action nécessaire : le document a été reçu avec succès précédemment. Voir Idempotence413Content Too LargeLe fichier dépasse la taille maximaleRéduisez le document ou les pièces jointes. Limite IDR : 15 Mo415Unsupported Media TypeL'en-tête Content-Type est manquant ou incorrectUtilisez le type de contenu correct, par exemple application/json lorsque requis422Unprocessable EntityLa requête est techniquement correcte, mais le contenu ne peut pas être traité (par exemple UBL invalide, une erreur de validation Peppol ou une règle métier violée)Vérifiez la structure du document et les règles métier ; la réponse JSON contient généralement des détails400 (agences en double)Schéma d'identifiant en doubleDeux identifiants ou plus avec le même code de schéma/agence dans un seul appel queryRecipientParty. Message d'erreur : EConnect.Psb.Models.EConnectException: 'Duplicate id agencies {code} requested.' (où {code} est le code d'agence sans zéro initial, ex. schéma 0208208).Fournir un seul identifiant par schéma par appel. Plusieurs candidats dans le même schéma : faire des appels séparés.

API403 Access forbidden : le message d'erreur littéral [API403] Access forbidden. Please check PartyId authorization and make sure the Subscription-Key is valid peut notamment survenir lors d'un échec de soumission Peppol depuis Business Central ("delivery failed"), mais la cause est générique à la PSB, pas spécifique à BC. Ordre de diagnostic :

  1. Vérifiez l'autorisation PartyId : utilisez-vous le bon partyId et le lien de compte a-t-il des droits sur cette party ?
  2. Renouvelez le Bearer token s'il a expiré ou est invalide.
  3. Vérifiez la Subscription-Key uniquement si cet en-tête est encore requis (legacy/Collabrr/API31) -- pas comme première action par défaut.

Remarque : la mention de "Subscription-Key" dans le message d'erreur ne signifie pas automatiquement que la clé doit être renouvelée. L'autorisation PartyId et un problème de liaison côté plateforme sont des causes tout aussi fréquentes. Si la livraison continue d'échouer après une vérification valide du token et du partyId, escaladez vers le support eConnect plutôt que de faire tourner la Subscription-Key de manière répétée.

Validation de l'enveloppe SBDH (API400.USRMS1 / API400.USRMS2) : ces codes d'erreur indiquent une incohérence entre l'enveloppe Peppol (SBDH) et le document de facturation électronique lui-même. Avec USRMS1, l'expéditeur ou le destinataire dans l'enveloppe ne correspond pas aux identifiants dans le XML de la facture. Avec USRMS2, la PSB ne trouve pas d'expéditeur reconnaissable dans le document. Vérifiez que les EndpointID et PartyIdentification dans votre UBL correspondent aux valeurs fournies lors de l'envoi. La PSB rejette le document au niveau AS4 et renvoie l'erreur à l'Access Point expéditeur.

Limitation de débit (429) : réessai possible

Une exception à la règle « seul le 5xx est réessayable » : 429 Too Many Requests indique une limitation de débit et est réessayable. Attendez et respectez l'en-tête Retry-After avant de renvoyer la requête.

CodeSignificationQuandAction429Too Many RequestsLimitation de débit : vous envoyez trop de requêtes dans une période donnéeAttendez et respectez l'en-tête Retry-After, puis réessayez
Erreurs serveur (5xx) : réessayer

Une erreur 5xx indique un problème temporaire côté serveur. La requête elle-même peut être correcte. Avec le 429, ce sont les seuls codes de statut pour lesquels un réessai a du sens.

CodeSignificationQuandAction500Internal Server ErrorErreur serveur inattendueRéessayer avec exponential backoff502Bad GatewayRéponse invalide d'un service en amont ; généralement temporaireRéessayer avec exponential backoff503Service UnavailableLa PSB est temporairement indisponible (maintenance, surcharge)Réessayer avec exponential backoff504Gateway TimeoutUn service en amont ne répond pas à tempsRéessayer avec exponential backoff

Remarque : le endpoint d'envoi accepte un maximum de 24 Mo par requête, overhead HTTP inclus. Les payloads dépassant cette limite sont rejetés par le serveur web avec un HTTP 500 au lieu d'un 413, car le rejet intervient avant que la couche applicative n'effectue sa validation. Gardez cela à l'esprit avec les pièces jointes encodées en Base64 : elles ajoutent environ 33% à la taille du fichier.

API500UH lors des déploiements : le code d'erreur API500UH (Unhandled Error) peut survenir lorsque la PSB effectue une mise à jour de service interne (déploiement Service Fabric). Dans de nombreux cas, le document a déjà été livré avec succès au destinataire, mais l'étape de confirmation échoue en raison de la migration. Le mécanisme de réessai de la PSB tente automatiquement de compléter les étapes restantes. Si vous recevez un API500UH, vérifiez via les événements de statut si le document a été livré avant de le renvoyer.

Lire les réponses d'erreur

Avec une erreur 4xx, la réponse contient un corps JSON décrivant le problème. Ces informations vous aident à identifier rapidement la cause.

{
  "error": "Validation failed",
  "message": "The supplied document is not valid UBL 2.1",
  "details": [
    "cbc:InvoiceTypeCode is missing"
  ]
}

Avec une erreur 5xx, la réponse n'est pas toujours structurée. Basez votre logique de réessai sur le code de statut HTTP, pas sur le contenu du corps.

Stratégie de réessai pour votre intégration

Toutes les erreurs ne méritent pas un réessai. La règle de base est simple : seuls les codes de statut 5xx et les timeouts réseau valent un réessai. Avec les erreurs 4xx, vous devez modifier la requête avant de la renvoyer.

Exponential backoff

La stratégie de réessai recommandée est l'exponential backoff : commencez avec un temps d'attente court et doublez-le à chaque tentative suivante.

TentativeTemps d'attente11 seconde22 secondes34 secondes48 secondes516 secondes632 secondes7+60 secondes (maximum)

Conseil : ajoutez une petite variation aléatoire (jitter) au temps d'attente. Si après une panne plusieurs clients réessaient simultanément, le jitter empêche qu'ils frappent tous le serveur au même moment.

Réessais sûrs avec l'idempotence

Combinez toujours votre logique de réessai avec le header X-EConnect-DocumentId. En incluant le même documentId à chaque tentative, la PSB garantit qu'un document n'est jamais traité deux fois. Si la PSB reçoit un documentId qui a déjà été traité, elle renvoie un 409 Conflict en guise de confirmation.

Voir Idempotence : éviter les soumissions en double pour l'explication complète et les exemples de code.

Arbre de décision
Mécanisme de réessai automatique de la PSB

En plus de la logique de réessai que vous implémentez vous-même, la PSB dispose de son propre mécanisme de réessai pour la livraison de documents. Si la PSB tente de livrer une facture ou une commande au destinataire et que celui-ci renvoie une erreur 5xx, la PSB reprend automatiquement la livraison.

Livraison de documents (factures et commandes)

La PSB effectue jusqu'à 8 tentatives de réessai réparties sur environ 35 heures. À chaque tentative, la PSB publie un événement pour que vous puissiez suivre la progression :

ÉvénementSignificationInvoiceSentRetryUne nouvelle tentative de livraison pour une facture a démarréInvoiceSentErrorLes 8 tentatives ont échoué, la facture n'a pas pu être livréeOrderSentRetryUne nouvelle tentative de livraison pour une commande a démarréOrderSentErrorLes 8 tentatives ont échoué, la commande n'a pas pu être livrée

Si vous avez configuré un webhook pour ces topics, vous recevez une notification à chaque tentative. Après un InvoiceSentError ou OrderSentError, une action manuelle est nécessaire : contactez le destinataire ou escaladez via le support eConnect.

Conseil : abonnez-vous aux topics InvoiceSentRetry et InvoiceSentError via un webhook. Vous détecterez ainsi immédiatement les problèmes de livraison et pourrez agir de manière proactive.

Livraison des webhooks

Pour les webhooks, la PSB utilise un calendrier de réessai distinct. Si votre endpoint webhook est inaccessible ou ne renvoie pas un code de statut 2xx, la PSB réessaie de livrer l'événement.

ParamètreValeurDurée maximale de réessai5 joursStratégieExponential backoffTimeout par tentative100 secondesÉvénement par tentativeHookSentRetryÉvénement en cas d'échec définitifHookSentError

La PSB attend une réponse 2xx de votre endpoint dans les 100 secondes. Toute autre réponse (ou un timeout) compte comme une tentative échouée. Traitez donc les webhooks entrants le plus rapidement possible, confirmez la réception avec un 200 OK et effectuez les traitements lourds de manière asynchrone dans un processus en arrière-plan.

Remarque : si votre endpoint est inaccessible pendant une période prolongée, la PSB arrête les réessais après 5 jours. Les événements manqués peuvent toujours être récupérés via le endpoint batch. Voir Batch hooks pour plus d'informations.

Noms d'hôtes PSB pour la mise en liste blanche réseau

Pour les intégrations qui accèdent à la PSB depuis un réseau protégé (pare-feu, proxy, liste d'autorisation), les noms d'hôtes principaux et de basculement doivent être autorisés. everbinding.nl est l'ancien domaine eConnect et est activement utilisé pour le basculement PSB.

EnvironnementPrincipalBasculementProductionpsb.econnect.euapi.everbinding.nlAcceptationaccp-psb.econnect.eutestapi.everbinding.nl

Mettez les quatre noms d'hôtes sur liste blanche sur le port 443 (HTTPS). Sans les noms d'hôtes de basculement, une connexion PSB valide peut devenir inaccessible lors d'un événement de basculement, tandis que la PSB elle-même fonctionne toujours.

Aperçu : réessai possible ou non ?
Code de statutRéessai possibleStratégie200 OKNon nécessaireTraité201 CreatedNon nécessaireTraité202 AcceptedNon nécessaireVérifier le statut plus tard204 No ContentNon nécessaireTraité400 Bad RequestNonCorriger la requête401 UnauthorizedNonDemander un nouveau token403 ForbiddenNonVérifier les permissions404 Not FoundNonVérifier l'URL/la ressource405 Method Not AllowedNonVérifier la méthode HTTP409 ConflictNonLe document a déjà été traité413 Content Too LargeNonRéduire la taille du fichier415 Unsupported Media TypeNonCorriger l'en-tête Content-Type422 Unprocessable EntityNonVérifier la structure du document/les règles métier429 Too Many RequestsOuiAttendre Retry-After, exponential backoff500 Internal Server ErrorOuiExponential backoff502 Bad GatewayOuiExponential backoff503 Service UnavailableOuiExponential backoff504 Gateway TimeoutOuiExponential backoff

En résumé Les erreurs client (4xx) nécessitent votre attention : corrigez le problème dans votre requête. Les erreurs serveur (5xx) sont temporaires et peuvent être réessayées en toute sécurité avec l'exponential backoff. Utilisez toujours le header X-EConnect-DocumentId pour éviter le traitement en double lors des réessais. La PSB réessaie automatiquement la livraison de documents jusqu'à 8 fois sur environ 35 heures, et les webhooks pendant 5 jours maximum.

Voir la documentation API complète

Articles connexes