Foutafhandeling: HTTP-codes, retries en robuust integreren

HTTP-statuscodes, foutresponses en retry-logica van de PSB API: zo bouw je een robuuste integratie.

Elke API-integratie krijgt vroeg of laat te maken met fouten. Een netwerkstoring, een onbereikbare server, een verkeerd geformateerd document: het hoort erbij. De PSB API communiceert fouten via standaard HTTP-statuscodes en gestructureerde JSON-responses. Daarnaast heeft de PSB een ingebouwd retry-mechanisme dat tijdelijke fouten bij documentaflevering automatisch afvangt.

In dit artikel leer je welke statuscodes de PSB retourneert, hoe je foutresponses interpreteert, wanneer je veilig kunt retrien en hoe het automatische retry-mechanisme van de PSB werkt.

HTTP-statuscodes

De PSB API gebruikt standaard HTTP-statuscodes om het resultaat van een verzoek aan te geven. De statuscodes vallen in twee categorieën: client-fouten (4xx) die je zelf moet oplossen, en server-fouten (5xx) die je kunt retrien.

Succesresponse
CodeBetekenisToelichting200OKHet verzoek is succesvol verwerkt
Client-fouten (4xx): niet opnieuw proberen

Bij een 4xx-fout zit het probleem in het verzoek zelf. Opnieuw versturen met dezelfde data levert hetzelfde resultaat op. Los eerst de oorzaak op voordat je het opnieuw probeert.

CodeBetekenisWanneerActie400Bad RequestValidatiefout of syntaxfout in het documentControleer de request-body. De JSON-response bevat details over wat er mis is401UnauthorizedGeen token meegestuurd, of het token is verlopen of ongeldigVraag een nieuw Bearer token aan via de Identity Server403ForbiddenHet token is geldig, maar de actie is niet toegestaan. Meest voorkomend: je gebruikt een partyId waarvoor je account geen toegang heeft. Andere oorzaken: bearer token verlopen, ongeldige subscription key, of een endpoint dat niet beschikbaar is voor jouw autorisatieniveauControleer of je het juiste partyId gebruikt en of de gebruiker die het bearer token heeft opgehaald, toegang heeft tot dat partyId. Bij twijfel: haal een nieuw token op via de Identity Server404Not FoundHet gevraagde endpoint of de resource bestaat nietControleer de URL en het partyId409ConflictHet document is al verwerkt (idempotency)Geen actie nodig: het document is eerder succesvol ontvangen. Zie idempotency413Content Too LargeHet bestand overschrijdt de maximale grootteVerklein het document of de bijlagen. IDR-limiet: 15 MB

SBDH envelope-validatie (API400.USRMS1 / API400.USRMS2): deze foutcodes duiden op een mismatch tussen de Peppol-enveloppe (SBDH) en het e-factuurdocument zelf. Bij USRMS1 komt de afzender of ontvanger in de enveloppe niet overeen met de identifiers in de factuur-XML. Bij USRMS2 kan de PSB geen herkenbare afzender vinden in het document. Controleer of het EndpointID en de PartyIdentification in je UBL overeenkomen met de waarden die bij het verzenden worden meegegeven. De PSB wijst het document af op AS4-niveau en retourneert de fout aan het verzendende Access Point.

Server-fouten (5xx): opnieuw proberen

Een 5xx-fout duidt op een tijdelijk probleem aan de serverkant. Het verzoek zelf is mogelijk correct. Dit zijn de enige statuscodes waarbij retrien zinvol is.

CodeBetekenisWanneerActie500Internal Server ErrorOnverwachte serverfoutRetry met exponential backoff503Service UnavailableDe PSB is tijdelijk niet beschikbaar (onderhoud, overbelasting)Retry met exponential backoff

Let op: het send-endpoint accepteert maximaal 24 MB per request, inclusief HTTP-overhead. Payloads die deze grens overschrijden worden door de webserver afgewezen met een HTTP 500 in plaats van een 413, omdat de afwijzing plaatsvindt vóórdat de applicatielaag de validatie uitvoert. Houd hier rekening mee bij base64-encoded bijlagen: die voegen circa 33% toe aan de bestandsgrootte.

API500UH tijdens deployments: de foutcode API500UH (Unhandled error) kan optreden als de PSB een interne service-update uitvoert (Service Fabric deployment). Het document is in veel gevallen al succesvol afgeleverd bij de ontvanger, maar de bevestigingsstap faalt door de migratie. Het retry-mechanisme van de PSB probeert de resterende stappen automatisch opnieuw uit te voeren. Ontvang je een API500UH? Controleer via de statusevents of het document alsnog is afgeleverd voordat je het opnieuw verstuurt.

Foutresponses lezen

Bij een 4xx-fout bevat de response een JSON-body met een beschrijving van het probleem. Deze informatie helpt je om de oorzaak snel te achterhalen.

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

Bij een 5xx-fout is de response niet altijd gestructureerd. Baseer je retry-logica daarom op de HTTP-statuscode, niet op de inhoud van de body.

Retry-strategie voor jouw integratie

Niet elke fout verdient een retry. De vuistregel is eenvoudig: alleen 5xx-statuscodes en netwerk-timeouts zijn het opnieuw proberen waard. Bij 4xx-fouten moet je het verzoek aanpassen voordat je het opnieuw stuurt.

Exponential backoff

De aanbevolen retry-strategie is exponential backoff: begin met een korte wachttijd en verdubbel die bij elke volgende poging.

PogingWachttijd11 seconde22 seconden34 seconden48 seconden516 seconden632 seconden7+60 seconden (maximum)

Tip: voeg een kleine willekeurige spreiding (jitter) toe aan de wachttijd. Als meerdere clients tegelijkertijd retrien na een storing, voorkomt jitter dat ze allemaal op hetzelfde moment de server belasten.

Veilig retrien met idempotency

Combineer je retry-logica altijd met de X-EConnect-DocumentId-header. Door bij elke poging hetzelfde documentId mee te sturen, garandeert de PSB dat een document nooit dubbel wordt verwerkt. Ontvangt de PSB een documentId dat al verwerkt is, dan retourneert hij een 409 Conflict als bevestiging.

Zie Idempotency: dubbele verzendingen voorkomen voor de volledige uitleg en codevoorbeelden.

Beslisboom
Automatisch retry-mechanisme van de PSB

Naast de retry-logica die je zelf implementeert, heeft de PSB een eigen retry-mechanisme voor documentaflevering. Als de PSB een factuur of order probeert af te leveren bij de ontvanger en die partij retourneert een 5xx-fout, dan hervat de PSB de aflevering automatisch.

Documentaflevering (facturen en orders)

De PSB doet maximaal 8 herpogingen verspreid over circa 35 uur. Bij elke poging publiceert de PSB een event zodat je de voortgang kunt volgen:

EventBetekenisInvoiceSentRetryEen nieuwe afleverpoging voor een factuur is gestartInvoiceSentErrorAlle 8 pogingen zijn mislukt, de factuur kon niet worden afgeleverdOrderSentRetryEen nieuwe afleverpoging voor een order is gestartOrderSentErrorAlle 8 pogingen zijn mislukt, de order kon niet worden afgeleverd

Als je een webhook hebt geconfigureerd voor deze topics, ontvang je bij elke poging een notificatie. Na een InvoiceSentError of OrderSentError is handmatige actie nodig: neem contact op met de ontvanger of escaleer via eConnect Support.

Tip: abonneer je op de InvoiceSentRetry- en InvoiceSentError-topics via een webhook. Zo detecteer je afleveringsproblemen direct en kun je proactief handelen.

Webhook-bezorging

Voor webhooks hanteert de PSB een apart retry-schema. Als jouw webhook-endpoint niet bereikbaar is of geen 2xx-statuscode retourneert, probeert de PSB het event opnieuw te bezorgen.

ParameterWaardeMaximale retry-duur5 dagenStrategieExponential backoffTimeout per poging100 secondenEvent per pogingHookSentRetryEvent na definitief falenHookSentError

De PSB verwacht binnen 100 seconden een 2xx-response van je endpoint. Elke andere response (of een timeout) telt als mislukte poging. Verwerk daarom inkomende webhooks zo snel mogelijk, bevestig de ontvangst met een 200 OK en doe zware verwerking asynchroon in een achtergrondproces.

Let op: als je endpoint langdurig onbereikbaar is, stopt de PSB na 5 dagen met herpogingen. Gemiste events kun je alsnog ophalen via het batch-endpoint. Zie Batch hooks voor meer informatie.

Overzicht: retrybaar of niet?
StatuscodeRetrybaarStrategie200 OKNiet nodigVerwerkt400 Bad RequestNeeVerzoek corrigeren401 UnauthorizedNeeNieuw token aanvragen403 ForbiddenNeeRechten controleren404 Not FoundNeeURL/resource controleren409 ConflictNeeDocument was al verwerkt413 Content Too LargeNeeBestand verkleinen500 Internal Server ErrorJaExponential backoff503 Service UnavailableJaExponential backoff

In het kort Client-fouten (4xx) vereis je aandacht: los het probleem op in je verzoek. Server-fouten (5xx) zijn tijdelijk en kun je veilig retrien met exponential backoff. Gebruik altijd de X-EConnect-DocumentId-header om dubbele verwerking te voorkomen bij retries. De PSB retried documentaflevering automatisch tot 8 keer over circa 35 uur, en webhooks tot 5 dagen lang.

Veelgestelde vragen
Wanneer moet ik een verzoek opnieuw proberen (retrien)?

Alleen bij server-fouten (5xx) is het zinvol om te retrien, bij voorkeur met exponential backoff. Client-fouten (4xx) vereisen een aanpassing in je verzoek en zijn niet retryable. Gebruik altijd de X-EConnect-DocumentId header om dubbele verwerking te voorkomen.

Hoe lang probeert de PSB een document af te leveren?

De PSB retried documentaflevering automatisch tot 8 keer over circa 35 uur. Als de aflevering na alle pogingen niet lukt, wordt het document als onbestelbaar gemarkeerd en ontvang je een notificatie.

Wat betekent een 409 Conflict-fout?

Een 409 Conflict betekent dat het document al eerder is verwerkt met dezelfde X-EConnect-DocumentId. Dit is het idempotency-mechanisme dat dubbele verwerking voorkomt. Je hoeft geen actie te ondernemen, het document is al verwerkt.

Bekijk de volledige API-documentatie