Błędy i katalog
Problem JSON i wszystkie kody z katalogu.
- W sandboxie
Prostymi słowami
Gdy wywołanie się nie powiedzie, odpowiedź informuje, czy błędne jest żądanie, czy faktura. W przypadku faktury kod wskazuje pole w eksporcie klienta i podaje, kto ma je poprawić. Partner poprawia błędne żądania i błędne dane; my poprawiamy własne mapowanie i ponawiamy próby po niepowodzeniach po stronie kanału.
Wskazówka
400 dotyczy formatu żądania wysłanego do nas. 422 dotyczy faktury, a jej kod z katalogu wskazuje pole w eksporcie z ERP. Tych dwóch przypadków nie należy mylić.
Problem JSON
Każda odpowiedź z błędem ma format problem JSON (RFC 9457): type, title i status, oraz detail, gdy są dodatkowe informacje. 422 dodaje errors, listę ustaleń. Każde z nich ma code z katalogu, informację, kto ma dokonać poprawki (who_fixes), fix_hint i message, a także field, gdy ustalenie dotyczy jednego pola (zob. stronę 3.2). Wyróżniony wiersz to kod.
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
}Dla ścieżki, której usługa nie obsługuje, odpowiedzią jest 404 z {"detail": "Not Found"} w postaci zwykłego JSON.
Co oznacza każdy status
| Status | Znaczenie | Co należy zrobić |
|---|---|---|
400 | Nie można odczytać żądania: to nie JSON, pole jest błędne albo brakuje Idempotency-Key lub jego długość nie mieści się w zakresie od 8 do 100 znaków. | Poprawić żądanie. |
401 | Brak klucza lub nieznany klucz. | Poprawić klucz. |
403 | Klucz nie ma zakresu, którego wymaga wywołanie, albo wywołanie dotyczy danych innego klienta (forbidden). | Użyć klucza z odpowiednim zakresem albo właściwego klienta. |
404 | Brak takiej faktury, dokumentu, wpisu w katalogu lub pozycji na liście do obsługi dla tego klienta. | Sprawdzić identyfikator. |
409 | Idempotency-Key został użyty z inną treścią albo jego pierwsze żądanie jeszcze trwa. Anulowanie przyszło za późno. Dane dostępowe już istnieją lub zostały unieważnione. | Poprawić wywołanie. |
413 | Treść przekracza 5 MB (payload-too-large). | Wysłać mniejszy plik. |
415 | Typ treści nie jest ani XML, ani PDF albo treść oznaczona jako PDF nie jest plikiem PDF. | Poprawić typ treści. |
422 | Faktura nie przeszła kontroli. Nic nie trafiło do kolejki. | Usunąć przyczyny ustaleń oznaczonych erp. Te oznaczone us należą do nas. |
429 | Zbyt wiele żądań dla klucza. | Odczekać liczbę sekund podaną w Retry-After, a potem ponowić. |
500 | Nie udało się sprawdzić faktury. Coś zawiodło po naszej stronie. | Ponowić to samo wywołanie z tym samym kluczem. |
503 | Usługa jest zajęta (busy) albo wywołanie dotyczące danych dostępowych trafiło do procesu bez ustawionego klucza głównego. | Ponowić to samo wywołanie po liczbie sekund podanej w Retry-After. |
Każda odpowiedź 409 ma własny type problemu, pod https://eurinvoice.com/problems/: idempotency-conflict, request-in-progress, already-submitted, send-in-progress, dead-letter, credential-exists i credential-revoked. Aby je rozróżnić, należy czytać type, a nie title. Odpowiedź 413 nie jest zapisywana pod danym Idempotency-Key, więc tego samego klucza można użyć ponownie z mniejszą treścią.
Odpowiedź 429 jest udzielana osobno dla każdego klienta i zakresu, z nagłówkiem Retry-After (zob. limity). Po 202 nigdy nie wysyła się faktury ponownie. Przy błędach po stronie sieci, które mogą ustąpić, ponawiamy wysyłkę według naszego harmonogramu, a trwałe odrzucenie trafia na listę do obsługi.
Kto reaguje
Każdy kod z katalogu ma przypisany jeden podmiot.
| Podmiot | Kto to |
|---|---|
erp | Partner: eksport z ERP lub jego dane podstawowe. |
us | eurinvoice: mapowanie, serializator lub konfiguracja. |
business | Firma sprzedawcy, we współpracy z nabywcą lub księgowym. |
client | Klient, czyli sprzedawca: rejestracja, dane dostępowe lub autoryzacja. |
buyer | Strona nabywcy. |
route | Operator kanału, czyli administracja, punkt dostępowy lub platforma: należy poczekać i ponowić próbę. |
Błędy 400, 401, 403, 409, 413 i 415 poprawia partner. 422 zawiera ustalenia, a każde z nich podaje, kto ma dokonać poprawki: erp to partner, us to eurinvoice.
Katalog
Katalog zawiera kod dla każdego ustalenia. Ta strona pokazuje próbkę dwunastu, po jednym lub dwa dla każdej rodziny reguł. Aby przejść do kodu, należy go wpisać i nacisnąć Enter. Z kluczem GET /catalogue/{code} wyjaśnia dowolny kod (zob. wyszukiwanie w katalogu). Pełny katalog jest przeznaczony dla partnerów: można o niego poprosić przez dostęp do sandboxa.
12 kodów
| Kod | Kto reaguje | Co jest nie tak | Co zrobić |
|---|---|---|---|
EI-ID-IBANNasze kontrole, kontrola identyfikatora | Partner | IBAN nie przechodzi kontroli mod-97. | Poprawić rachunek bankowy w ustawieniach firmy. |
EI-SCHEMANasze kontrole, schemat | eurinvoice | JSON faktury nie odpowiada modelowi kanonicznemu: brakuje pola lub pole jest nieznane, typ lub kod jest błędny albo naruszona jest reguła kanału dotycząca struktury. | Odczytać ścieżkę JSON z błędu i poprawić mapowanie klienta. |
EI-TOTALS-MISMATCHNasze kontrole, kontrola wstępna | Partner | Sumy wysłane przez ERP (erp_totals) różnią się od sum obliczonych z pozycji, więc dokument nie zgadzałby się z księgami prowadzonymi w ERP. | Znaleźć różnicę (zwykle zaokrąglanie raz na poziomie pozycji, a raz na poziomie dokumentu, albo pozycja rabatowa pominięta w eksporcie) i poprawić eksport lub mapowanie. |
BR-CO-16EN 16931 i składnia, walidator kanału | eurinvoice | Kwota do zapłaty (BT-115) nie jest równa sumie z VAT (BT-112) pomniejszonej o kwotę zapłaconą (BT-113) i powiększonej o zaokrąglenie (BT-114). | Sumy obliczamy z pozycji, więc ten błąd pojawia się tylko wtedy, gdy sumy pochodzą z zewnątrz (plik przekazywany bez zmian) lub zostały zmienione. Należy odtworzyć sumy z pozycji i wysłać ponownie. |
EI-XML-DTDEN 16931 i składnia, walidator kanału | Partner | XML deklaruje DOCTYPE. UBL, CII i FA(3) nigdy go nie używają, a przez DOCTYPE do pliku trafiają encje zewnętrzne, pobieranie zdalnych DTD i rozwijanie encji (XXE). Plik zostaje odrzucony, zanim odczyta go jakikolwiek walidator lub kanał. | Wyeksportować fakturę bez wiersza DOCTYPE. Jeśli ERP dodaje go celowo, należy zgłosić to producentowi ERP: żaden format e-faktur go nie używa. |
EI-XML-SYNTAXEN 16931 i składnia, walidator kanału | Partner | Plik nie jest poprawnie sformułowanym XML: na przykład jest ucięty, jego kodowanie nie odpowiada deklaracji albo znak taki jak & nie jest zastąpiony encją. Żaden walidator nie może go odczytać. | Wyeksportować plik ponownie i otworzyć go w dowolnej przeglądarce XML. Szukać uciętego pliku, kodowania innego niż w deklaracji lub niezastąpionego znaku &. |
EI-XML-TYPEEN 16931 i składnia, walidator kanału | Partner | XML jest poprawnie sformułowany, ale nie jest fakturą, którą walidujemy: nie jest to UBL Invoice ani CreditNote, faktura UN/CEFACT CII ani faktura KSeF FA(3) (na przykład UBL Order albo starszy plik FA(2)). | Wysłać samą fakturę, w formacie uzgodnionym dla kanału. |
EI-PEPPOL-NO-ROUTEPeppol, odpowiedź sieci, wymaga sieci | Partner | Punkt dostępowy nie znalazł odbiorcy dla identyfikatora nabywcy: nabywca nie jest zarejestrowany w Peppol dla tego typu dokumentu. Wynik ostateczny dla tej wysyłki. | Sprawdzić identyfikator Peppol nabywcy z kartoteki kontrahenta w ERP w katalogu Peppol; jeśli nabywcy nie ma w Peppol, uzgodnić z nim inny sposób doręczenia. |
PEPPOL-EN16931-R001Peppol, walidator kanału | eurinvoice | Proces biznesowy (BT-23) powinien być podany. Mustang zgłosił to jako informację dla naszego pliku ZUGFeRD EN 16931, który nie jest dokumentem Peppol. | Dla ZUGFeRD nie trzeba nic robić; nasz Peppol UBL zawsze zapisuje proces. |
BR-DE-5Niemcy, walidator kanału | Partner | Brakuje imienia i nazwiska osoby kontaktowej sprzedawcy (BT-41). | Dodać osobę kontaktową lub dział ds. faktur w ustawieniach firmy. |
KSEF-440Polska, odpowiedź sieci, wymaga sieci | eurinvoice | KSeF ma już fakturę z tym samym numerem NIP sprzedawcy, rodzajem faktury (RodzajFaktury) i numerem (P_2); przechowuje ten klucz przez 10 lat. Kluczem jest numer, a nie plik: w środowisku TEST inny plik pod przyjętym numerem również otrzymał 440. Odpowiedź podaje numer KSeF i sesję kopii, którą KSeF przyjął jako pierwszą. Numer odrzucony przez KSeF (430 lub 450) nie jest przechowywany i można go użyć ponownie. | Nie wysyłać ponownie. Zapisać pierwotny numer KSeF z odpowiedzi i zgłosić fakturę jako przyjętą pod tym numerem. |
BR-RO-001Rumunia, walidator kanału | eurinvoice | Identyfikator specyfikacji (BT-24) nie ma wartości CIUS-RO. | Ustawić profil ro-cius, który zapisuje identyfikator CIUS-RO 1.0.1. |