Fouten en de catalogus
Problem JSON en elke cataloguscode.
- In de sandbox
In gewone woorden
Als een aanroep mislukt, zegt het antwoord of het verzoek of de factuur fout is. Bij een factuur noemt een code het veld in de export van de eindklant en zegt ze wie het oplost. De partner corrigeert foute verzoeken en foute gegevens; wij corrigeren onze eigen mapping en proberen fouten aan de kant van het verzendkanaal opnieuw.
Tip
400 gaat over ons verzoekformaat. 422 gaat over de factuur, en de cataloguscode ervan noemt het veld in de ERP-export. Houd die twee uit elkaar.
Problem JSON
Elk foutantwoord is problem JSON (RFC 9457): type, title en status, met detail als er meer te zeggen is. Een 422 voegt errors toe, een lijst van bevindingen. Elke bevinding bevat een code uit de catalogus, de partij die ze oplost (who_fixes), een fix_hint en een message, en een field als de bevinding over één veld gaat (zie pagina 3.2). De gemarkeerde regel is de code.
curl -X POST "https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PEPPOL&invoice_ref=INV-2026-0051" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/xml" \
-H "Idempotency-Key: order-2026-0051" \
--data-binary @not-an-invoice.xmlimport java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PEPPOL&invoice_ref=INV-2026-0051"))
.header("Authorization", "Bearer <your-api-key>")
.header("Content-Type", "application/xml")
.header("Idempotency-Key", "order-2026-0051")
.POST(HttpRequest.BodyPublishers.ofFile(Path.of("not-an-invoice.xml")))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}import { readFile } from 'node:fs/promises';
const response = await fetch('https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PEPPOL&invoice_ref=INV-2026-0051', {
method: 'POST',
headers: {
Authorization: 'Bearer <your-api-key>',
'Content-Type': 'application/xml',
'Idempotency-Key': 'order-2026-0051',
},
body: await readFile('not-an-invoice.xml'),
});
console.log(response.status);
console.log(await response.text());{
"type": "https://eurinvoice.com/problems/validation-failed",
"title": "The invoice did not pass the checks",
"errors": [
{
"code": "EI-XML-TYPE",
"fix_hint": "Send the invoice itself, in the format agreed for the route.",
"who_fixes": "erp",
"source": "XML-safety",
"message": "The file is not an invoice in a format this route accepts. Please send the invoice in the agreed format."
}
],
"status": 422
}Een pad dat de dienst niet kent, geeft 404 met {"detail": "Not Found"}, gewone JSON.
Wat elke status betekent
| Status | Betekenis | Wat u doet |
|---|---|---|
400 | Het verzoek is niet leesbaar: geen JSON, een veld is fout, of de Idempotency-Key ontbreekt of is niet 8 tot 100 tekens lang. | Corrigeer het verzoek. |
401 | Geen sleutel, of een onbekende sleutel. | Corrigeer de sleutel. |
403 | De sleutel mist de scope die de aanroep nodig heeft, of de aanroep gaat over de gegevens van een andere eindklant (forbidden). | Gebruik een sleutel met de scope, of de juiste eindklant. |
404 | Deze factuur, dit document, dit catalogusitem of dit item op de opvolgingslijst bestaat niet voor deze eindklant. | Controleer de ID. |
409 | De Idempotency-Key werd gebruikt met een andere body, of het eerste verzoek ermee loopt nog. Een annulering kwam te laat. De toegangsgegevens bestaan al of zijn ingetrokken. | Corrigeer de aanroep. |
413 | De body is groter dan 5 MB (payload-too-large). | Stuur een kleiner bestand. |
415 | Het contenttype is geen XML of PDF, of een PDF-body is geen PDF. | Corrigeer het contenttype. |
422 | De factuur heeft een controle niet doorstaan. Er is niets in de wachtrij gezet. | Corrigeer de bevindingen met erp. Die met us zijn voor ons. |
429 | Te veel aanvragen voor de sleutel. | Wacht het aantal seconden in Retry-After en probeer het dan opnieuw. |
500 | De factuur kon niet worden gecontroleerd. Er ging iets mis aan onze kant. | Probeer dezelfde aanroep opnieuw met dezelfde sleutel. |
503 | De dienst is bezet (busy), of een aanroep voor toegangsgegevens kwam bij een proces zonder ingestelde hoofdsleutel. | Probeer dezelfde aanroep opnieuw na het aantal seconden in Retry-After. |
Elke 409 heeft een eigen type in de problem JSON, onder https://eurinvoice.com/problems/: idempotency-conflict, request-in-progress, already-submitted, send-in-progress, dead-letter, credential-exists en credential-revoked. Lees het type, niet de title, om ze uit elkaar te houden. Een 413 wordt niet bij de Idempotency-Key opgeslagen, dus dezelfde sleutel kan opnieuw worden gebruikt met een kleinere body.
Een 429 komt per eindklant en scope, met Retry-After (zie limieten). Na een 202 verzendt u nooit opnieuw. Fouten aan de kant van het netwerk die vanzelf kunnen overgaan, proberen we volgens ons schema opnieuw, en een definitieve afwijzing gaat naar de opvolgingslijst.
Wie handelt
Elke cataloguscode heeft één verantwoordelijke.
| Verantwoordelijke | Wie dat is |
|---|---|
erp | De partner: de ERP-export of de stamgegevens ervan. |
us | eurinvoice: mapping, serializer of configuratie. |
business | Het bedrijf van de verkoper, samen met zijn koper of boekhouder. |
client | De eindklant, de verkoper: registratie, toegangsgegevens of machtiging. |
buyer | De kant van de koper. |
route | De beheerder van het verzendkanaal, een overheidsinstantie, toegangspunt of platform: wachten en opnieuw proberen. |
De partner lost 400, 401, 403, 409, 413 en 415 op. Een 422 bevat bevindingen, en elke bevinding zegt wie ze oplost: erp is de partner, us is eurinvoice.
De catalogus
De catalogus bevat een code voor elke bevinding. Deze pagina toont een selectie van twaalf, een of twee per groep regels. Typ een code en druk op Enter om ernaartoe te springen. Met een sleutel legt GET /catalogue/{code} elke code uit (zie catalogus raadplegen). De volledige catalogus is voor partners: vraag hem aan met toegang tot de sandbox.
12 codes
| Code | Wie handelt | Wat er mis is | Wat te doen |
|---|---|---|---|
EI-ID-IBANOnze controles, controle van identificatienummers | Partner | De IBAN slaagt niet voor de controle mod 97. | Corrigeer de bankrekening in de bedrijfsinstellingen. |
EI-SCHEMAOnze controles, schema | eurinvoice | De factuur-JSON komt niet overeen met het canonieke model: een ontbrekend of onbekend veld, een verkeerd type of een verkeerde code, of een regel van het verzendkanaal over de structuur. | Lees het JSON-pad in de fout en corrigeer de mapping van de eindklant. |
EI-TOTALS-MISMATCHOnze controles, voorafgaande controle | Partner | De totalen die het ERP stuurde (erp_totals) verschillen van de totalen die uit de factuurregels zijn berekend, dus het document zou niet overeenkomen met de eigen boekhouding van het ERP. | Zoek het verschil (meestal afronding per regel tegenover per document, of een kortingsregel die de export wegliet) en corrigeer de export of de mapping. |
BR-CO-16EN 16931 en syntaxis, validator van het verzendkanaal | eurinvoice | Het te betalen bedrag (BT-115) is niet gelijk aan het totaal inclusief btw (BT-112) min het betaalde bedrag (BT-113) plus de afronding (BT-114). | We berekenen de totalen uit de factuurregels, dus dit verschijnt alleen als de totalen van buitenaf kwamen (een doorgegeven bestand) of zijn bewerkt. Bouw de totalen opnieuw op uit de factuurregels en verzend opnieuw. |
EI-XML-DTDEN 16931 en syntaxis, validator van het verzendkanaal | Partner | De XML declareert een DOCTYPE. UBL, CII en FA(3) gebruiken er nooit een, en via een DOCTYPE komen externe entiteiten, het ophalen van externe DTD’s en entiteitsexpansie in een bestand terecht (XXE). Het bestand wordt geweigerd voordat een validator of verzendkanaal het leest. | Exporteer de factuur zonder de DOCTYPE-regel. Als het ERP er bewust een toevoegt, kaart het aan bij de ERP-leverancier: geen enkel formaat voor e-facturatie gebruikt het. |
EI-XML-SYNTAXEN 16931 en syntaxis, validator van het verzendkanaal | Partner | Het bestand is geen welgevormde XML: het is bijvoorbeeld afgebroken, de codering komt niet overeen met de declaratie, of een teken zoals & is niet geëscapet. Geen enkele validator kan het lezen. | Exporteer het bestand opnieuw en open het in een XML-viewer. Zoek naar een afgebroken bestand, een codering die afwijkt van de declaratie, of een niet geëscapete &. |
EI-XML-TYPEEN 16931 en syntaxis, validator van het verzendkanaal | Partner | De XML is welgevormd, maar geen factuur die we valideren: geen UBL Invoice of CreditNote, geen UN/CEFACT CII-factuur en geen KSeF-factuur in FA(3) (bijvoorbeeld een UBL Order, of een ouder FA(2)-bestand). | Stuur de factuur zelf, in het formaat dat voor het verzendkanaal is afgesproken. |
EI-PEPPOL-NO-ROUTEPeppol, antwoord van het netwerk, vereist een netwerk | Partner | Het toegangspunt vond geen ontvanger voor de identificatie van de koper: de koper is voor dit documenttype niet op Peppol geregistreerd. Definitief voor deze verzending. | Vergelijk de Peppol-ID van de koper in het klantrecord van het ERP met de Peppol Directory; als de koper niet op Peppol zit, spreek met hem een ander afleverkanaal af. |
PEPPOL-EN16931-R001Peppol, validator van het verzendkanaal | eurinvoice | Het bedrijfsproces (BT-23) zou aanwezig moeten zijn. Mustang meldde het als opmerking bij ons ZUGFeRD-bestand in EN 16931, dat geen Peppol-document is. | Geen actie voor ZUGFeRD; onze Peppol-UBL schrijft het proces altijd. |
BR-DE-5Duitsland, validator van het verzendkanaal | Partner | De naam van de contactpersoon van de verkoper (BT-41) ontbreekt. | Voeg een contactpersoon of afdeling voor facturatie toe aan de bedrijfsinstellingen. |
KSEF-440Polen, antwoord van het netwerk, vereist een netwerk | eurinvoice | KSeF heeft al een factuur met hetzelfde NIP van de verkoper, hetzelfde factuurtype (RodzajFaktury) en hetzelfde nummer (P_2); die sleutel bewaart KSeF 10 jaar. De sleutel is het nummer, niet het bestand: in TEST kreeg ook een ander bestand onder een geaccepteerd nummer 440. Het antwoord geeft het KSeF-nummer en de sessie van het exemplaar dat KSeF als eerste accepteerde. Een nummer dat KSeF heeft afgewezen (430 of 450) wordt niet bewaard en kan opnieuw worden gebruikt. | Verzend niet opnieuw. Noteer het oorspronkelijke KSeF-nummer uit het antwoord en meld de factuur als geaccepteerd onder dat nummer. |
BR-RO-001Roemenië, validator van het verzendkanaal | eurinvoice | De specificatie-identificator (BT-24) is niet de waarde van CIUS-RO. | Stel het profiel ro-cius in; dat schrijft de identificator van CIUS-RO 1.0.1. |