Factuur ontvangen via de API

Inkomende facturen ontvangen: webhooks configureren, documenten downloaden en retentie beheren.

Wanneer een factuur voor jouw organisatie binnenkomt via Peppol of een ander netwerk, slaat de PSB het document op en stuurt een notificatie naar je webhook. In dit artikel lees je hoe je die notificatie ontvangt, het document downloadt en het statusbeheer inricht.

Ontvangstflow

Het ontvangen van een factuur verloopt in vier stappen:

  1. Notificatie: de PSB stuurt een webhook-event InvoiceReceived naar je endpoint
  2. Download: je haalt het document op via het PurchaseInvoice-endpoint
  3. Verwerking: je verwerkt de factuur in je eigen systeem
  4. Opruiming (optioneel): je verwijdert het document uit de PSB
Webhook configureren

Om facturen te ontvangen heb je een webhook nodig die luistert op het topic InvoiceReceived. Registreer deze via de Hook API:

POST /api/v1/hook
{
  "action": "https://mijn-systeem.nl/webhook/invoices#mijnSecretKey",
  "topics": ["InvoiceReceived"]
}

Zodra een factuur binnenkomt, ontvangt je endpoint een POST-request met een JSON-payload. Deze payload bevat onder andere het documentId en de partyId waarmee je het document kunt ophalen.

Tip: Stel ook een webhook in op het topic InvoiceReceivedError om notificaties te ontvangen als er iets misgaat bij de ontvangst.

Document downloaden

Voor het downloaden zijn er twee endpoints, afhankelijk van het documenttype waarvoor je hook is geregistreerd:

EndpointWanneer gebruikenGET /api/v1/{partyId}/generic/{documentId}/downloadGenerieke route, werkt voor alle documenttypen (factuur, order, creditnota, despatch advice, self-billing). Aanbevolen als je integratie meerdere documenttypen verwerkt.GET /api/v1/{partyId}/purchaseInvoice/{documentId}/downloadDocumenttype-specifieke route voor inkomende facturen. Werkt identiek, maar legt het type vast in de URL.
GET /api/v1/{partyId}/generic/{documentId}/download HTTP/1.1
Host: psb.econnect.eu
Authorization: Bearer {access_token}

De response bevat het XML-document (standaard in het originele formaat). Wil je het document in een ander formaat ontvangen? Gebruik de targetDocumentTypeId-parameter (werkt op beide endpoints):

GET /api/v1/{partyId}/generic/{documentId}/download?targetDocumentTypeId={URN}

De PSB transformeert het document automatisch naar het opgegeven formaat voordat het wordt geretourneerd.

PDF ophalen

Of er een PDF beschikbaar is, hangt af van het bron-document:

Bron-documentWat de PSB teruggeeftUBL met embedded PDF (in cac:AdditionalDocumentReference)De embedded PDFFactur-X / ZUGFeRD 2.3 (PDF/A-3 met embedded CII-XML)De originele PDFUBL zonder embedded PDFGeen PDF beschikbaar via de PSB

On-demand PDF-generatie vanuit een gestructureerd UBL-document is op de PSB nog niet beschikbaar; alleen de embedded PDF wordt geretourneerd als die aanwezig is. Dit staat op de roadmap. Tot die tijd is de aanbeveling dat de afzender de PDF embed in UBL of dat de afnemer de PDF zelf rendert uit de gestructureerde data.

Retentiebeleid

De PSB bewaart ontvangen documenten volgens dit schema:

SituatieBewaartermijnDocument ontvangen, nog niet gedownload90 dagenDocument gedownload7 dagen na downloadHandmatig verwijderdDirect verwijderd

Het is aan te raden om documenten direct na ontvangst op te halen en in je eigen systeem op te slaan. Vertrouw niet op de PSB als langetermijnopslag.

Document verwijderen

Na verwerking kun je het document handmatig verwijderen:

DELETE /api/v1/{partyId}/purchaseInvoice/{documentId} HTTP/1.1
Host: psb.econnect.eu
Authorization: Bearer {access_token}

Dit verwijdert het document definitief uit de PSB. De audittrail blijft beschikbaar.

Statusbeheer

Na ontvangst kun je de verwerkingsstatus van een inkoopfactuur bijwerken. Dit is met name relevant als je Invoice Responses (statusberichten) wilt versturen naar de afzender. Lees hiervoor het artikel Invoice Response verzenden.

Message Level Status (MLS)

De PSB stuurt automatisch een MLS-bericht (Message Level Status) terug naar de verzendende partij na ontvangst van een document. Dit bevestigt dat het document is ontvangen en afgeleverd. Als integrator hoef je hier niets voor te configureren: de PSB regelt dit volledig. Als je zelf documenten verstuurt, ontvang je MLS-feedback via het webhook-topic MessageLevelStatusReceived. Zie Webhooks instellen voor de configuratie.

Polling als alternatief

Als je geen webhooks kunt configureren (bijvoorbeeld in een on-premise omgeving zonder inkomend internetverkeer), kun je facturen ook ophalen via polling:

GET /api/v1/{partyId}/purchaseInvoice HTTP/1.1
Host: psb.econnect.eu
Authorization: Bearer {access_token}

Dit endpoint retourneert een lijst van beschikbare inkoopfacturen. Webhooks zijn echter altijd de voorkeursmethode vanwege de real-time verwerking en lagere belasting op de API.

Let op: Overweeg bij on-premise integraties ook de reverse webhook (HTTPS inbound hook), waarmee de PSB documenten pusht zonder dat jouw systeem direct bereikbaar hoeft te zijn vanuit het internet.

Best practices
  • Verwerk idempotent: de PSB kan in uitzonderlijke gevallen een event meerdere keren bezorgen. Controleer aan jouw kant of je een document al hebt verwerkt voordat je het opnieuw importeert.
  • Dedupliceer op documentinhoud: gebruik Invoice/ID + sender partyId + issueDate uit het opgehaalde XML als deduplicatie-sleutel. Dit vangt ook duplicaten op die via een ander netwerk dan de PSB binnenkomen.
  • Download direct: haal documenten zo snel mogelijk op na de webhook-notificatie. De 90-dagenretentie is een vangnet, geen opslagstrategie.
  • Log het documentId: bewaar het PSB documentId in je eigen systeem voor tracering en eventuele troubleshooting.
  • Formaat converteren: als je een specifiek XML-formaat nodig hebt, gebruik dan targetDocumentTypeId bij het downloaden in plaats van zelf te converteren.
  • Webhook-retries: als je endpoint tijdelijk onbereikbaar is, probeert de PSB de notificatie tot 5 dagen opnieuw te bezorgen. Langdurige uitval? Gebruik batch hooks als fallback om gemiste documenten alsnog op te halen.
Veelgestelde vragen
Hoe weet ik dat er een factuur binnenkomt en hoe haal ik het XML op?

Registreer een webhook op het topic InvoiceReceived; de payload bevat onder meer documentId en partyId. Met die waarden roep je GET /api/v1/{partyId}/purchaseInvoice/{documentId}/download aan om het XML-document op te halen. Optioneel kun je targetDocumentTypeId gebruiken om een getransformeerd formaat te ontvangen.

Wat zijn de bewaartermijnen voor inkomende facturen in de PSB?

Een ontvangen document dat je nog niet hebt gedownload blijft maximaal 90 dagen beschikbaar. Na download wordt het nog 7 dagen bewaard; handmatig verwijderen wist het document direct uit de PSB. Bewaar kopieën in je eigen systeem, want de PSB is geen langetermijnarchief.

Kan ik zonder webhooks toch facturen ophalen?

Ja, met polling via GET /api/v1/{partyId}/purchaseInvoice krijg je een lijst van beschikbare inkoopfacturen. Webhooks blijven de voorkeur voor real-time verwerking en minder belasting op de API; bij on-premise zonder inkomend internet kun je ook een reverse webhook overwegen.


Bekijk de volledige PurchaseInvoice-endpoints en response-modellen op psb.econnect.eu.

Open de API-referentie