Déposer une facture
const url = 'http://localhost:4000/v1/invoices';const options = { method: 'POST', headers: { 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"id":"in_0001","number":"F-2026-0001","status":"open","customer_id":"cus_042","created_at":"2026-10-01T08:00:00Z","finalized_at":"2026-10-01T08:00:05Z","due_date":"2026-10-31","period_start":"2026-10-01","period_end":"2026-10-31","currency":"EUR","subtotal":10000,"total_excl_tax":10000,"tax_total":2000,"total":12000,"amount_paid":0,"amount_due":12000,"lines":[{"id":"li_1","description":"Abonnement Pro - octobre 2026","type":"subscription","quantity":1,"unit_amount":10000,"amount":10000,"taxes":[{"name":"TVA","percentage":20,"inclusive":false,"amount":2000}]}],"customer_snapshot":{"id":"cus_042","type":"company","name":"Exemple SAS","email":"compta@exemple.fr","billing_address":{"line1":"1 rue de la Paix","postal_code":"75002","city":"Paris","country":"FR"},"tax_ids":[{"type":"siren","value":"552100554"}]}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:4000/v1/invoices \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --data '{ "id": "in_0001", "number": "F-2026-0001", "status": "open", "customer_id": "cus_042", "created_at": "2026-10-01T08:00:00Z", "finalized_at": "2026-10-01T08:00:05Z", "due_date": "2026-10-31", "period_start": "2026-10-01", "period_end": "2026-10-31", "currency": "EUR", "subtotal": 10000, "total_excl_tax": 10000, "tax_total": 2000, "total": 12000, "amount_paid": 0, "amount_due": 12000, "lines": [ { "id": "li_1", "description": "Abonnement Pro - octobre 2026", "type": "subscription", "quantity": 1, "unit_amount": 10000, "amount": 10000, "taxes": [ { "name": "TVA", "percentage": 20, "inclusive": false, "amount": 2000 } ] } ], "customer_snapshot": { "id": "cus_042", "type": "company", "name": "Exemple SAS", "email": "compta@exemple.fr", "billing_address": { "line1": "1 rue de la Paix", "postal_code": "75002", "city": "Paris", "country": "FR" }, "tax_ids": [ { "type": "siren", "value": "552100554" } ] } }'Accepte une facture au format SaaS (non conforme par défaut). La réponse 202 signifie
« reçue », pas « acceptée par la PA » : suivre le statut via GET /v1/invoices/{id}
ou les webhooks.
Le même Idempotency-Key renvoie la soumission d’origine sans retraitement.
Authorizations
Section intitulée « Authorizations »Parameters
Section intitulée « Parameters »Header Parameters
Section intitulée « Header Parameters »Clé d’idempotence choisie par le SaaS (unique par dépôt).
Request Bodyrequired
Section intitulée « Request Bodyrequired »Facture au format SaaS (référentiel 01 §6), non conforme par défaut.
object
Identifiant côté SaaS.
ISO 4217. Devises prises en charge : EUR, USD, GBP, CHF, CAD, AUD, JPY, KRW, XOF, XAF, BHD, KWD, TND. Toute autre devise est refusée en 422.
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
object
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant HT de la ligne.
object
Taux en %, 0 à 100.
Vrai si le prix est TTC.
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
object
Taux en %, 0 à 100.
Vrai si le prix est TTC.
Montant en plus petite unité monétaire (centimes pour l’EUR).
Montant en plus petite unité monétaire (centimes pour l’EUR).
object
object
ISO 3166-1 alpha-2.
object
ISO 3166-1 alpha-2.
object
Ex. eu_vat, siren.
ISO 4217. Devises prises en charge : EUR, USD, GBP, CHF, CAD, AUD, JPY, KRW, XOF, XAF, BHD, KWD, TND. Toute autre devise est refusée en 422.
object
object
Examples
Facture d'abonnement mensuel
{ "id": "in_0001", "number": "F-2026-0001", "status": "open", "customer_id": "cus_042", "created_at": "2026-10-01T08:00:00Z", "finalized_at": "2026-10-01T08:00:05Z", "due_date": "2026-10-31", "period_start": "2026-10-01", "period_end": "2026-10-31", "currency": "EUR", "subtotal": 10000, "total_excl_tax": 10000, "tax_total": 2000, "total": 12000, "amount_paid": 0, "amount_due": 12000, "lines": [ { "id": "li_1", "description": "Abonnement Pro - octobre 2026", "type": "subscription", "quantity": 1, "unit_amount": 10000, "amount": 10000, "taxes": [ { "name": "TVA", "percentage": 20, "inclusive": false, "amount": 2000 } ] } ], "customer_snapshot": { "id": "cus_042", "type": "company", "name": "Exemple SAS", "email": "compta@exemple.fr", "billing_address": { "line1": "1 rue de la Paix", "postal_code": "75002", "city": "Paris", "country": "FR" }, "tax_ids": [ { "type": "siren", "value": "552100554" } ] }}Responses
Section intitulée « Responses »Facture reçue, traitement asynchrone.
object
Identifiant attribué par la passerelle.
Identifiant côté SaaS (id fourni au dépôt).
État de traitement dans la passerelle, indépendant des statuts PA 200 à 214.
received → validated → sent ; rejected si la validation ou la PA refuse définitivement.
Seul received est produit aujourd’hui.
Dernier statut PA connu ; absent tant que la PA n’a rien renvoyé.
object
Statut du cycle de vie (référentiel 02 §17) : 200 Déposée, 201 Émise, 202 Reçue, 203 Mise à disposition, 204 Prise en charge, 205 Approuvée, 206 Approuvée partiellement, 207 En litige, 208 Suspendue, 209 Complétée, 210 Refusée, 211 Paiement transmis, 212 Encaissée, 213 Rejetée, 214 Visée (à vérifier : absent du référentiel 02).
Motif, notamment pour 210 et 213.
Avoirs uniquement. Dépôt de la facture d’origine (piste d’audit).
Example
{ "processing_state": "received"}URL de la ressource créée.
Requête mal formée (JSON invalide, champ requis absent).
Erreur au format RFC 9457.
object
Dépôt existant, pour un doublon (409).
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "submission_id": "example"}Jeton absent ou invalide.
Erreur au format RFC 9457.
object
Dépôt existant, pour un doublon (409).
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "submission_id": "example"}Conflit, de deux natures (champ type) :
urn:einvoicing:problem:idempotency-conflict: mêmeIdempotency-Keyavec un corps différent.urn:einvoicing:problem:duplicate-submission: ce numéro ou cet identifiant SaaS a déjà été déposé pour ce type de document (facture ou avoir), même sous une autre clé.submission_iddésigne le dépôt existant. Une facture rejetée ne se renvoie pas : il faut une nouvelle facture ou un avoir, avec un nouveau numéro.
Erreur au format RFC 9457.
object
Dépôt existant, pour un doublon (409).
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "submission_id": "example"}Corps supérieur à 1 Mio.
Erreur au format RFC 9457.
object
Dépôt existant, pour un doublon (409).
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "submission_id": "example"}Valeur impossible à convertir (rejet définitif) : devise non prise en charge, SIREN, SIRET
ou n° de TVA malformé, pays invalide, taux hors de 0 à 100, plusieurs TVA sur une ligne,
devise de l’avoir absente, facture d’origine d’un avoir inconnue (/invoice_id). Chaque erreur porte le chemin JSON du champ. Les règles EN 16931
complètes (BR-CO-*) ne sont pas encore appliquées. Corriger puis redéposer ; la même
Idempotency-Key reste utilisable, un rejet ne la consomme pas.
object
Dépôt existant, pour un doublon (409).
object
Pointeur JSON vers le champ fautif.
Règle enfreinte, ex. BR-CO-10.
Example
{ "errors": [ { "path": "/lines/0/taxes/0/percentage" } ]}Erreur interne (message générique, détail dans les logs du serveur).
Erreur au format RFC 9457.
object
Dépôt existant, pour un doublon (409).
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "submission_id": "example"}