Docs

3 API3.3

3.3

Transmitere XML: POST /invoices/xml

XML UBL, CII sau FA(3).

  • În sandbox

În cuvinte simple

Acest apel transmite o factură care există deja ca fișier XML finalizat. Fișierul trece printr-o verificare de siguranță și prin validatoarele proprii ale canalului și ajunge în coadă dacă le trece.

POST /invoices/xml primește un fișier UBL, CII sau FA(3) finalizat. Nu are loc nicio mapare. Serviciul verifică siguranța și tipul fișierului, rulează validatoarele oficiale ale canalului, apoi îl pune în coadă și îl trimite neschimbat. Pentru FA(3), verificările sunt schema plus regulile KSeF pentru fișier și date.

Notă

Un 202 înseamnă că fișierul a trecut verificarea de siguranță și este în coadă. Pentru a verifica un fișier înainte de a-l trimite, trimiteți factura ca JSON la POST /validate.

Cererea

ElementSemnificație
parametrul de interogare routeObligatoriu. Unul dintre cele cinci canale.
parametrul de interogare invoice_refObligatoriu. ID-ul propriu al documentului în ERP, de cel mult 100 de caractere.
parametrul de interogare clientOpțional. Cheia proprie a unui client îl poate omite sau poate indica propriul client.
antetul Idempotency-KeyObligatoriu, între 8 și 100 de caractere.
antetul Content-Typeapplication/xml sau text/xml. application/pdf este stocat și pus în coadă la fel.

Ce fișier acceptă fiecare canal:

CanalAcceptă
DE-XRECHNUNGUBL, CII
FR-PAUBL, CII
PEPPOLUBL
RO-EFACTURAUBL
PL-KSEFFA(3)

Un fișier acceptat

Exemplul este fa3-pl-ksef.xml, un fișier FA(3) polonez cu părți fictive. Starea este queued.

curl -X POST "https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PL-KSEF&invoice_ref=INV-2026-0042" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/xml" \
  -H "Idempotency-Key: order-2026-0042" \
  --data-binary @fa3-pl-ksef.xml
Răspuns202 Accepted
{
  "links": {
    "self": "/invoices/inv_d249e33382ce2911876b7295",
    "events": "/invoices/inv_d249e33382ce2911876b7295/events"
  },
  "id": "inv_d249e33382ce2911876b7295",
  "state": "queued"
}
Înregistrat pe 7 oct. 2026.

Un fișier trimis de două ori

Același fișier trimis din nou pentru același client și același canal este factura deja existentă. Răspunsul conține duplicate_of, ID-ul primei facturi, și nu se trimite nimic nou. O transmitere încheiată cu rejected, validation_failed sau cancelled nu se pune la socoteală, deci fișierul poate fi trimis din nou.

Fișiere refuzate

Un XML bine format care nu este factură primește 422 cu EI-XML-TYPE.

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.xml
Răspuns422 Unprocessable Content
{
  "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
}
Înregistrat pe 7 oct. 2026. Fișierul este [not-an-invoice.xml](/samples/not-an-invoice.xml).

Un fișier cu DOCTYPE primește 422 cu EI-XML-DTD, înainte ca vreun validator să-l citească. Un fișier care nu este bine format primește EI-XML-SYNTAX.

curl -X POST "https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PEPPOL&invoice_ref=INV-2026-0052" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/xml" \
  -H "Idempotency-Key: order-2026-0052" \
  --data-binary @with-doctype.xml
Răspuns422 Unprocessable Content
{
  "type": "https://eurinvoice.com/problems/validation-failed",
  "title": "The invoice did not pass the checks",
  "errors": [
    {
      "code": "EI-XML-DTD",
      "fix_hint": "Export the invoice without the DOCTYPE line. If the ERP adds one on purpose, raise it with the ERP vendor: no e-invoicing format uses it.",
      "who_fixes": "erp",
      "source": "XML-safety",
      "message": "The invoice file contains a DOCTYPE declaration, which e-invoices never use, so we refused it for security before reading it. Export it again without the DOCTYPE line."
    }
  ],
  "status": 422
}
Înregistrat pe 7 oct. 2026. Fișierul este [with-doctype.xml](/samples/with-doctype.xml).

Un tip de conținut care nu este XML sau PDF primește 415.

curl -X POST "https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PEPPOL&invoice_ref=INV-2026-0053" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: text/plain" \
  -H "Idempotency-Key: order-2026-0053" \
  --data-binary @hello.txt
Răspuns415 Unsupported Media Type
{
  "type": "https://eurinvoice.com/problems/unsupported-media",
  "title": "Not UBL, CII or FA(3)",
  "status": 415
}
Înregistrat pe 7 oct. 2026.

Un Idempotency-Key lipsă sau prea scurt primește 400.

curl -X POST "https://api-sandbox-eu.eurinvoice.com/invoices/xml?route=PEPPOL&invoice_ref=INV-2026-0054" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/xml" \
  --data-binary @ubl-peppol.xml
Răspuns400 Bad Request
{
  "detail": "Idempotency-Key must be between 8 and 100 characters.",
  "type": "https://eurinvoice.com/problems/bad-request",
  "title": "The request could not be read",
  "status": 400
}
Înregistrat pe 7 oct. 2026.

Răspunsuri

CodSemnificație
202Acceptată și pusă în coadă. Location conține URL-ul facturii.
400Un parametru de interogare sau Idempotency-Key lipsește ori este greșit.
401Lipsește cheia sau cheia este necunoscută.
403Cheia nu are domeniul submit sau indică un alt client (forbidden).
409Cheia a fost folosită cu un corp diferit (idempotency-conflict) sau prima ei cerere încă rulează (request-in-progress).
413Corpul cererii depășește 5 MB (payload-too-large).
415Tipul de conținut nu este XML sau PDF (unsupported-media).
422Un fișier refuzat: EI-XML-DTD, EI-XML-SYNTAX sau EI-XML-TYPE.
429Prea multe cereri pentru cheie. Așteptați numărul de secunde din Retry-After.
503O altă cerere pentru același document este încă în curs de stocare (busy). Reîncercați după numărul de secunde din Retry-After.

Pe această pagină