3 API3.4
Lire une facture, ses événements, ses documents
Lire une facture, ses événements et ses documents.
- Dans le bac à sable
En termes simples
Ces appels montrent où en est une facture, chaque événement de son historique et les fichiers stockés pour elle.
Quatre appels de lecture permettent de suivre une facture après le 202. Tous nécessitent une clé dotée de la portée read. Pour un identifiant qui n’existe pas ou qui appartient à un autre client, la réponse est 404.
La facture
GET /invoices/{id} renvoie l’état actuel de la facture.
| Champ | Signification |
|---|---|
id, invoice_ref, invoice_number | Notre identifiant, l’identifiant du document dans l’ERP et le numéro de facture. |
route, environment, client | Le canal, l’environnement et l’identifiant du client (local quand aucun n’a été indiqué). |
state | queued, submitted, ready, cancelled, etc. La page Statuts présente les deux niveaux. |
legal_id | La référence propre au canal, une fois que le réseau a la facture : le numéro KSeF, l’index d’envoi ANAF, l’identifiant de document du point d’accès ou l’identifiant de facture de la plateforme française. |
document_sha256 | Le SHA-256 de ce qui a été stocké. |
attempts | Les soumissions précédentes du même invoice_ref, par exemple après un rejet et une correction. |
deadline_at | Une échéance indicative, pour la Roumanie et la Pologne seulement, et seulement quand la facture porte une date d’émission. Elle n’est jamais antérieure à l’échéance réelle, et ne constitue pas un conseil juridique. |
created_at, updated_at | Horodatages RFC 3339 en UTC. |
curl "https://api-sandbox-eu.eurinvoice.com/invoices/inv_936a93e38de84e7b0a1d7681" \
-H "Authorization: Bearer <your-api-key>"import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/invoices/inv_936a93e38de84e7b0a1d7681"))
.header("Authorization", "Bearer <your-api-key>")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}const response = await fetch('https://api-sandbox-eu.eurinvoice.com/invoices/inv_936a93e38de84e7b0a1d7681', {
headers: {
Authorization: 'Bearer <your-api-key>',
},
});
console.log(response.status);
console.log(await response.text());{
"invoice_ref": "CAPTURE-JSON-1790961440",
"environment": "sandbox",
"document_sha256": "45f857890231e9bc6e73c1ec1e53bc01e7b030f84068b324bdd9ef42b88322bc",
"route": "DE-XRECHNUNG",
"updated_at": "2026-10-06T19:49:02.676Z",
"documents": [
{
"sha256": "45f857890231e9bc6e73c1ec1e53bc01e7b030f84068b324bdd9ef42b88322bc",
"kind": "canonical",
"href": "/invoices/inv_936a93e38de84e7b0a1d7681/documents/canonical"
},
{
"sha256": "ad122fe72dc6f04b2de6b6bbc01fcb7e46e33116b12e3bbb02a569cde3f10106",
"kind": "manifest",
"href": "/invoices/inv_936a93e38de84e7b0a1d7681/documents/manifest"
},
{
"sha256": "941fd5005aa03586a7bf23f3039c6d15e38220879d46690f9199a494e35fdc11",
"kind": "validation-report",
"href": "/invoices/inv_936a93e38de84e7b0a1d7681/documents/validation-report"
},
{
"sha256": "251a52fec3bdd44555a7396a1567d62c5ada3e3b7d002bb757d6b50e347c2e90",
"kind": "xrechnung-ubl",
"href": "/invoices/inv_936a93e38de84e7b0a1d7681/documents/xrechnung-ubl"
}
],
"client": "acme-srl",
"created_at": "2026-10-06T19:49:01.621Z",
"id": "inv_936a93e38de84e7b0a1d7681",
"state": "ready",
"invoice_number": "DOC-mux3dlqm"
}Ses événements
GET /invoices/{id}/events rejoue chaque événement de statut de la facture, dans l’ordre de sequence. Utilisez-le pour vous remettre à jour après une interruption. Les événements n’expirent pas tant que le contrat est en cours, et rien ne doit être acquitté.
curl "https://api-sandbox-eu.eurinvoice.com/invoices/inv_936a93e38de84e7b0a1d7681/events" \
-H "Authorization: Bearer <your-api-key>"import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/invoices/inv_936a93e38de84e7b0a1d7681/events"))
.header("Authorization", "Bearer <your-api-key>")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}const response = await fetch('https://api-sandbox-eu.eurinvoice.com/invoices/inv_936a93e38de84e7b0a1d7681/events', {
headers: {
Authorization: 'Bearer <your-api-key>',
},
});
console.log(response.status);
console.log(await response.text());{
"data": [
{
"occurred_at": "2026-10-06T19:49:01.621Z",
"sequence": 1,
"environment": "sandbox",
"invoice_ref": "CAPTURE-JSON-1790961440",
"document_sha256": "45f857890231e9bc6e73c1ec1e53bc01e7b030f84068b324bdd9ef42b88322bc",
"event_id": "evt_e1b58da963c46e4a63409006",
"country_route": "DE-XRECHNUNG",
"invoice_number": "DOC-mux3dlqm",
"status": "received"
},
{
"occurred_at": "2026-10-06T19:49:02.661Z",
"sequence": 2,
"environment": "sandbox",
"invoice_ref": "CAPTURE-JSON-1790961440",
"document_sha256": "45f857890231e9bc6e73c1ec1e53bc01e7b030f84068b324bdd9ef42b88322bc",
"event_id": "evt_0dcb4d0b797e93185b22c27d",
"country_route": "DE-XRECHNUNG",
"invoice_number": "DOC-mux3dlqm",
"status": "validated"
}
]
}Toutes les factures
GET /invoices liste et recherche les factures d’un client, les plus récentes d’abord, page par page. Il filtre par q (une partie de invoice_ref ou du numéro), route, state et le jour de réception (received_from, received_to). Une ligne contient ce que contient GET /invoices/{id}, sans les documents et sans le contenu de la facture : ni acheteur, ni montants, ni date d’émission. GET /invoices/series compte les factures reçues et rejetées pour chaque jour et chaque canal, pour un graphique. Voir la référence.
Ses documents
GET /invoices/{id}/documents/{kind} renvoie ce que le service a stocké. Le type est l’un des suivants :
| Type | Stocké quand |
|---|---|
canonical | Vous avez soumis du JSON. Le fichier est la facture telle que vous l’avez envoyée. |
erp-export | Vous avez soumis un export de l’ERP. Le fichier est l’export tel que l’ERP l’a envoyé. |
ubl, cii, fa3, pdf | Le fichier tel qu’envoyé, ou le document que le service a construit : xrechnung-ubl pour l’Allemagne, ubl ou fa3 pour les autres canaux. |
validation-report | Ce que chaque contrôle a trouvé. |
manifest | Le SHA-256 des octets qui partent vers le canal, et les contrôles exécutés dessus. |
Les types JSON sont servis en application/json.
ETag est le SHA-256 du fichier. Les documents ne sont lisibles qu’avec la clé. Il n’y a pas de liens publics. Un essai à blanc ne stocke rien.
curl "https://api-sandbox-eu.eurinvoice.com/invoices/inv_1721a979f65d8ff80ef5f64b/documents/ubl" \
-H "Authorization: Bearer <your-api-key>"import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/invoices/inv_1721a979f65d8ff80ef5f64b/documents/ubl"))
.header("Authorization", "Bearer <your-api-key>")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}const response = await fetch('https://api-sandbox-eu.eurinvoice.com/invoices/inv_1721a979f65d8ff80ef5f64b/documents/ubl', {
headers: {
Authorization: 'Bearer <your-api-key>',
},
});
console.log(response.status);
console.log(await response.text());<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"><cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID><cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID><cbc:ID>RE-2026-0142</cbc:ID><cbc:IssueDate>2026-09-26</cbc:IssueDate><cbc:DueDate>2026-10-10</cbc:DueDate><cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode><cbc:Note>Vielen Dank für Ihren Auftrag.</cbc:Note><cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode><cbc:BuyerReference>PO-88731</cbc:BuyerReference><cac:InvoicePeriod><cbc:StartDate>2026-09-01</cbc:StartDate><cbc:EndDate>2026-09-30</cbc:EndDate></cac:InvoicePeriod><cac:AccountingSupplierParty><cac:Party><cbc:EndpointID schemeID="9930">DE123456789</cbc:EndpointID><cac:PostalAddress><cbc:StreetName>Hafenstraße 12</cbc:StreetName><cbc:CityName>Hamburg</cbc:CityName><cbc:PostalZone>20457</cbc:PostalZone><cac:Country><cbc:IdentificationCode>DE</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyTaxScheme><cbc:CompanyID>DE123456789</cbc:CompanyID><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:PartyTaxScheme><cac:PartyLegalEntity><cbc:RegistrationName>Nordlicht Software GmbH</cbc:RegistrationName><cbc:CompanyID>HRB 123456</cbc:CompanyID><cbc:CompanyLegalForm>GmbH</cbc:CompanyLegalForm></cac:PartyLegalEntity><cac:Contact><cbc:Name>Jana Petersen</cbc:Name><cbc:Telephone>+49 40 1234567</cbc:Telephone><cbc:ElectronicMail>rechnung@nordlicht.example</cbc:ElectronicMail></cac:Contact></cac:Party></cac:AccountingSupplierParty><cac:AccountingCustomerParty><cac:Party><cbc:EndpointID schemeID="9930">DE987654321</cbc:EndpointID><cac:PostalAddress><cbc:StreetName>Marienplatz 4</cbc:StreetName><cbc:CityName>München</cbc:CityName><cbc:PostalZone>80331</cbc:PostalZone><cac:Country><cbc:IdentificationCode>DE</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyTaxScheme><cbc:CompanyID>DE987654321</cbc:CompanyID><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:PartyTaxScheme><cac:PartyLegalEntity><cbc:RegistrationName>Brauhaus Weber AG</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingCustomerParty><cac:PaymentMeans><cbc:PaymentMeansCode>58</cbc:PaymentMeansCode><cbc:PaymentID>RE-2026-0142</cbc:PaymentID><cac:PayeeFinancialAccount><cbc:ID>DE89370400440532013000</cbc:ID><cbc:Name>Nordlicht Software GmbH</cbc:Name><cac:FinancialInstitutionBranch><cbc:ID>COBADEFFXXX</cbc:ID></cac:FinancialInstitutionBranch></cac:PayeeFinancialAccount></cac:PaymentMeans><cac:PaymentTerms><cbc:Note>Zahlbar innerhalb von 14 Tagen ohne Abzug.</cbc:Note></cac:PaymentTerms><cac:TaxTotal><cbc:TaxAmount currencyID="EUR">1255.71</cbc:TaxAmount><cac:TaxSubtotal><cbc:TaxableAmount currencyID="EUR">6609.00</cbc:TaxableAmount><cbc:TaxAmount currencyID="EUR">1255.71</cbc:TaxAmount><cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19.00</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:TaxCategory></cac:TaxSubtotal></cac:TaxTotal><cac:LegalMonetaryTotal><cbc:LineExtensionAmount currencyID="EUR">6609.00</cbc:LineExtensionAmount><cbc:TaxExclusiveAmount currencyID="EUR">6609.00</cbc:TaxExclusiveAmount><cbc:TaxInclusiveAmount currencyID="EUR">7864.71</cbc:TaxInclusiveAmount><cbc:PayableAmount currencyID="EUR">7864.71</cbc:PayableAmount></cac:LegalMonetaryTotal><cac:InvoiceLine><cbc:ID>1</cbc:ID><cbc:InvoicedQuantity unitCode="LS">1</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID="EUR">5900.00</cbc:LineExtensionAmount><cac:Item><cbc:Description>Mapping Business Central → EN 16931, Validierung XRechnung, Test im Peppol-Testnetz</cbc:Description><cbc:Name>E-Rechnung Einführung (Festpreis)</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19.00</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID="EUR">5900.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine><cac:InvoiceLine><cbc:ID>2</cbc:ID><cbc:InvoicedQuantity unitCode="MON">1</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID="EUR">349.00</cbc:LineExtensionAmount><cac:Item><cbc:Description>Care Plus, September 2026</cbc:Description><cbc:Name>Betreuung abgelehnter Rechnungen</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19.00</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID="EUR">349.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine><cac:InvoiceLine><cbc:ID>3</cbc:ID><cbc:InvoicedQuantity unitCode="HUR">3</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID="EUR">360.00</cbc:LineExtensionAmount><cac:Item><cbc:Description>Remote, Buchhaltungsteam</cbc:Description><cbc:Name>Zusätzliche Schulung</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19.00</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID="EUR">120.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine></Invoice>
<!-- shortened for these docs -->Réponses
| Statut | Signification |
|---|---|
200 | La facture, ses événements ou le fichier. |
401 | Aucune clé, ou une clé inconnue. |
403 | La clé n’a pas la portée read. |
404 | Cette facture n’existe pas pour ce client, ou elle n’a pas de document de ce type. |
429 | Trop de requêtes pour la clé. Attendez Retry-After secondes. |
curl "https://api-sandbox-eu.eurinvoice.com/invoices/inv_unknown" \
-H "Authorization: Bearer <your-api-key>"import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/invoices/inv_unknown"))
.header("Authorization", "Bearer <your-api-key>")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}const response = await fetch('https://api-sandbox-eu.eurinvoice.com/invoices/inv_unknown', {
headers: {
Authorization: 'Bearer <your-api-key>',
},
});
console.log(response.status);
console.log(await response.text());{
"type": "https://eurinvoice.com/problems/not-found",
"title": "No such resource for this client",
"status": 404
}