Déposer un avoir
const url = 'http://localhost:4000/v1/credit-notes';const options = { method: 'POST', headers: { 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"id":"cn_0001","number":"AV-2026-0001","invoice_id":"in_0001","reason":"Erreur de facturation","status":"issued","currency":"EUR","created_at":"2026-10-05T09:30:00Z","total_excl_tax":5000,"tax_total":1000,"total":6000,"lines":[{"id":"li_1","description":"Remise commerciale","quantity":1,"unit_amount":5000,"amount":5000,"taxes":[{"name":"TVA","percentage":20,"inclusive":false,"amount":1000}]}]}'};
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/credit-notes \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --data '{ "id": "cn_0001", "number": "AV-2026-0001", "invoice_id": "in_0001", "reason": "Erreur de facturation", "status": "issued", "currency": "EUR", "created_at": "2026-10-05T09:30:00Z", "total_excl_tax": 5000, "tax_total": 1000, "total": 6000, "lines": [ { "id": "li_1", "description": "Remise commerciale", "quantity": 1, "unit_amount": 5000, "amount": 5000, "taxes": [ { "name": "TVA", "percentage": 20, "inclusive": false, "amount": 1000 } ] } ] }'L’avoir référence la facture d’origine (invoice_id, son identifiant côté SaaS), qui doit
déjà avoir été déposée auprès de la passerelle : sinon 422 sur /invoice_id. Le lien
est conservé pour l’audit (origin_submission_id) et fournit le numéro (BT-25) et la date
(BT-26) de la facture précédente. Une facture rejetée par la PA ne se renvoie pas : une
nouvelle facture ou un avoir est requis.
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 »Avoir au format SaaS (référentiel 01 §9).
object
Facture d’origine (id côté SaaS). Doit avoir été déposée avant l’avoir.
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
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).
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).
Examples
Avoir partiel sur une facture
{ "id": "cn_0001", "number": "AV-2026-0001", "invoice_id": "in_0001", "reason": "Erreur de facturation", "status": "issued", "currency": "EUR", "created_at": "2026-10-05T09:30:00Z", "total_excl_tax": 5000, "tax_total": 1000, "total": 6000, "lines": [ { "id": "li_1", "description": "Remise commerciale", "quantity": 1, "unit_amount": 5000, "amount": 5000, "taxes": [ { "name": "TVA", "percentage": 20, "inclusive": false, "amount": 1000 } ] } ]}Responses
Section intitulée « Responses »Avoir reçu, 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"}