Errori e catalogo
Il problem JSON e tutti i codici del catalogo.
- Nella sandbox
In parole semplici
Quando una chiamata non va a buon fine, la risposta dice se è errata la richiesta o la fattura. Per una fattura, un codice indica il campo nell’export del cliente e dice chi lo corregge. Il partner corregge le richieste errate e i dati errati; noi correggiamo la nostra mappatura e ritentiamo gli invii non riusciti lato canale.
Suggerimento
400 riguarda il formato delle richieste alla nostra API. 422 riguarda la fattura, e il suo codice del catalogo indica il campo nell’export dell’ERP. Tenere distinti i due casi.
Problem JSON
Ogni risposta di errore è un problem JSON (RFC 9457): type, title e status, con detail quando c’è altro da dire. Un 422 aggiunge errors, un elenco di segnalazioni. Ognuna ha un code del catalogo, chi la corregge (who_fixes), un fix_hint e un message, e un field quando la segnalazione riguarda un solo campo (vedere la pagina 3.2). La riga evidenziata è il codice.
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
}Per un percorso che il servizio non ha, la risposta è 404 con {"detail": "Not Found"}, in JSON semplice.
Cosa significa ogni stato
| Stato | Significato | Cosa fare |
|---|---|---|
400 | La richiesta non si può leggere: non è JSON, un campo è errato, oppure la Idempotency-Key manca o non è lunga da 8 a 100 caratteri. | Correggere la richiesta. |
401 | Nessuna chiave, o una chiave sconosciuta. | Correggere la chiave. |
403 | La chiave non ha lo scope richiesto dalla chiamata, oppure la chiamata riguarda i dati di un altro cliente (forbidden). | Usare una chiave con lo scope, o il cliente giusto. |
404 | Per questo cliente non esiste una fattura, un documento, una voce del catalogo o una voce dell’elenco degli scarti con questo id. | Controllare l’id. |
409 | La Idempotency-Key è stata usata con un corpo diverso, oppure la sua prima richiesta è ancora in corso. Un annullamento è arrivato troppo tardi. Una credenziale esiste già o è stata revocata. | Correggere la chiamata. |
413 | Il corpo supera 5 MB (payload-too-large). | Inviare un file più piccolo. |
415 | Il tipo di contenuto non è XML o PDF, oppure un corpo PDF non è un PDF. | Correggere il tipo di contenuto. |
422 | La fattura non ha superato un controllo. Non è stato messo in coda nulla. | Correggere le segnalazioni contrassegnate erp. Quelle contrassegnate us spettano a noi. |
429 | Troppe richieste per la chiave. | Attendere i secondi indicati in Retry-After, poi riprovare. |
500 | Non è stato possibile controllare la fattura. Qualcosa non ha funzionato da parte nostra. | Ripetere la stessa chiamata con la stessa chiave. |
503 | Il servizio è occupato (busy), oppure una chiamata sulle credenziali è arrivata a un processo senza chiave master impostata. | Ripetere la stessa chiamata dopo Retry-After secondi. |
Ogni 409 ha un proprio type nel problem JSON, sotto https://eurinvoice.com/problems/: idempotency-conflict, request-in-progress, already-submitted, send-in-progress, dead-letter, credential-exists e credential-revoked. Per distinguerli, leggere il type, non il title. Un 413 non viene associato alla Idempotency-Key, quindi la stessa chiave si può riutilizzare con un corpo più piccolo.
Un 429 arriva per cliente e per scope, con Retry-After (vedere limiti). Dopo un 202 non si reinvia mai. Gli errori lato infrastruttura che un nuovo tentativo può superare vengono ritentati secondo il nostro calendario, e uno scarto definitivo va nell’elenco degli scarti.
Chi interviene
Ogni codice del catalogo ha un solo responsabile.
| Responsabile | Chi è |
|---|---|
erp | Il partner: l’export dell’ERP o i suoi dati anagrafici. |
us | eurinvoice: mappatura, serializzatore o configurazione. |
business | L’azienda del venditore, con il suo acquirente o il suo commercialista. |
client | Il cliente, cioè il venditore: registrazione, credenziali o autorizzazione. |
buyer | La parte dell’acquirente. |
route | L’operatore del canale, cioè un’autorità, un access point o una piattaforma: attendere e ritentare. |
Il partner corregge 400, 401, 403, 409, 413 e 415. Un 422 contiene segnalazioni, e ognuna dice chi la corregge: erp è il partner, us è eurinvoice.
Il catalogo
Il catalogo contiene un codice per ogni segnalazione. Questa pagina ne mostra un campione di dodici, uno o due per ogni famiglia di regole. Digitare un codice e premere Invio per raggiungerlo. Con una chiave, GET /catalogue/{code} spiega qualsiasi codice (vedere consultazione del catalogo). Il catalogo completo è riservato ai partner: richiederlo con l’accesso alla sandbox.
12 codici
| Codice | Chi interviene | Cosa non va | Cosa fare |
|---|---|---|---|
EI-ID-IBANI nostri controlli, controllo dell’identificativo | Partner | L’IBAN non supera la verifica mod-97. | Correggere il conto bancario nelle impostazioni dell’azienda. |
EI-SCHEMAI nostri controlli, schema | eurinvoice | Il JSON della fattura non corrisponde al modello canonico: un campo mancante o sconosciuto, un tipo o un codice errato, oppure una regola del canale sulla struttura. | Leggere il percorso JSON nell’errore e correggere la mappatura del cliente. |
EI-TOTALS-MISMATCHI nostri controlli, controllo preliminare | Partner | I totali inviati dall’ERP (erp_totals) differiscono dai totali calcolati dalle righe, quindi il documento non corrisponderebbe alla contabilità dell’ERP stesso. | Individuare la differenza (di solito arrotondamento per riga anziché per documento, o una riga di sconto omessa dall’export) e correggere l’export o la mappatura. |
BR-CO-16EN 16931 e sintassi, validatore del canale | eurinvoice | L’importo dovuto (BT-115) non è uguale al totale IVA inclusa (BT-112) meno l’importo pagato (BT-113) più l’arrotondamento (BT-114). | Calcoliamo i totali dalle righe, quindi questo codice compare solo quando i totali provengono dall’esterno (un file pass-through) o sono stati modificati. Ricalcolare i totali dalle righe e reinviare. |
EI-XML-DTDEN 16931 e sintassi, validatore del canale | Partner | L’XML dichiara un DOCTYPE. UBL, CII e FA(3) non ne usano mai uno, e un DOCTYPE è il modo in cui entità esterne, download di DTD remote ed espansione delle entità entrano in un file (XXE). Il file viene rifiutato prima che un validatore o un canale lo legga. | Esportare la fattura senza la riga DOCTYPE. Se l’ERP la aggiunge di proposito, segnalarlo al fornitore dell’ERP: nessun formato di fatturazione elettronica la usa. |
EI-XML-SYNTAXEN 16931 e sintassi, validatore del canale | Partner | Il file non è XML ben formato: per esempio è troncato, la sua codifica non corrisponde alla dichiarazione, oppure un carattere come & non è sottoposto a escape. Nessun validatore può leggerlo. | Esportare di nuovo il file e aprirlo in un qualsiasi visualizzatore XML. Cercare un file troncato, una codifica diversa dalla dichiarazione o una & senza escape. |
EI-XML-TYPEEN 16931 e sintassi, validatore del canale | Partner | L’XML è ben formato ma non è una fattura che validiamo: non è una Invoice o CreditNote UBL, una fattura CII UN/CEFACT o una fattura FA(3) KSeF (per esempio un Order UBL, o un vecchio file FA(2)). | Inviare la fattura stessa, nel formato concordato per il canale. |
EI-PEPPOL-NO-ROUTEPeppol, risposta dell’infrastruttura, richiede un’infrastruttura | Partner | L’access point non ha trovato alcun destinatario per l’identificativo dell’acquirente: l’acquirente non è registrato su Peppol per questo tipo di documento. Definitivo per questo invio. | Confrontare l’ID Peppol dell’acquirente nell’anagrafica cliente dell’ERP con la directory Peppol; se l’acquirente non è su Peppol, concordare con lui un altro canale. |
PEPPOL-EN16931-R001Peppol, validatore del canale | eurinvoice | Il processo commerciale (BT-23) dovrebbe essere presente. Mustang lo ha segnalato come nota sul nostro file ZUGFeRD EN 16931, che non è un documento Peppol. | Nessuna azione per ZUGFeRD; il nostro UBL Peppol scrive sempre il processo. |
BR-DE-5Germania, validatore del canale | Partner | Manca il nome del contatto del venditore (BT-41). | Aggiungere una persona o un reparto di contatto per la fatturazione alle impostazioni dell’azienda. |
KSEF-440Polonia, risposta dell’infrastruttura, richiede un’infrastruttura | eurinvoice | KSeF ha già una fattura con lo stesso NIP del venditore, lo stesso tipo di fattura (RodzajFaktury) e lo stesso numero (P_2); conserva questa chiave per 10 anni. La chiave è il numero, non il file: in TEST anche un file diverso con un numero già accettato ha ricevuto 440. La risposta indica il numero KSeF e la sessione della copia accettata per prima. Un numero che KSeF ha scartato (430 o 450) non viene conservato e si può riutilizzare. | Non reinviare. Registrare il numero KSeF originale dalla risposta e indicare la fattura come accettata con quel numero. |
BR-RO-001Romania, validatore del canale | eurinvoice | L’identificativo della specifica (BT-24) non è il valore CIUS-RO. | Impostare il profilo ro-cius, che scrive l’identificativo CIUS-RO 1.0.1. |