Suivez ce tutoriel pour créer, finaliser et envoyer une facture électronique conforme Factur-X EN 16931 via l'API REST Facturino. Du client au PDF/A-3 avec XML CII intégré, en 6 étapes.
Ce tutoriel utilise taxSource: "facturino" :
la TVA est déterminée par Facturino. Si votre système la détermine déjà,
la TVA fournie par votre intégration
suit exactement les mêmes étapes.
Compte Facturino
Créez un compte gratuit — aucune carte bancaire requise.
Informations fiscales du vendeur
Renseignez l’établissement, le régime et les options déclaratives dans Paramètres → Informations fiscales. Ce contexte sécurise les deux sources de TVA sans choisir à votre place qui la détermine.
Clé API test
Paramètres → API → Nouvelle clé. Préfixe fac_test_ pour le mode sandbox.
Base URL
https://facturino.com/api/v1/ Authentification
Authorization: Bearer fac_test_... Content-Type
application/json
Commencez par créer un client avec POST /v1/customers.
Le SIRET est validé via l'algorithme de Luhn côté serveur. Si le SIRET est connu de l'API Sirene,
la raison sociale et l'adresse sont auto-complétées.
SIRET validé Luhn — rejeté si invalide (erreur 422)
Auto-complétion Sirene — raison sociale et adresse pré-remplies
Numéro TVA — vérifié via VIES pour les clients intracommunautaires
$ curl -X POST https://facturino.com/api/v1/customers \
-H "Authorization: Bearer fac_test_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Durand & Associés SARL",
"siret": "00012345500008",
"vatNumber": "FR31000123455",
"address": {
"line1": "15 rue de la Paix",
"city": "Paris",
"postalCode": "75002",
"country": "FR"
},
"contacts": [{ "email": "compta@durand-associes.fr" }]
}'
# Réponse
{
"id": "cus_8f2k4m9n",
"name": "Durand & Associés SARL",
"siret": "00012345500008",
"vatNumber": "FR31000123455",
"livemode": false
}
Décrivez l'opération avec POST /v1/tax-decisions :
Facturino décide la TVA, les montants exacts et les trois obligations de transmission,
puis fige le tout dans une décision immuable. Le header
Idempotency-Key
y est obligatoire.
taxSource: facturino — la TVA est déterminée par Facturino
taxSource: integration — la TVA est fournie par votre intégration ; Facturino la valide et refuse toute contradiction, sans jamais corriger en silence (détail)
amountToCharge — le montant exact à encaisser, décidé côté serveur, quel que soit le moyen de paiement
$ curl -X POST https://facturino.com/api/v1/tax-decisions \
-H "Authorization: Bearer fac_test_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: qs-dec-001" \
-d '{
"taxSource": "facturino",
"customerId": "cus_8f2k4m9n",
"effectiveAt": "2026-09-25",
"currency": "eur",
"priceMode": "tax_exclusive",
"lines": [
{
"reference": "conseil",
"description": "Prestation de conseil",
"category": "services", "rateCategory": "standard",
"unitAmount": 150000, "quantity": "1"
}
]
}'
# Réponse — la TVA, les montants et les trois obligations, décidés et figés
{
"id": "taxdec_9k2f7p1m",
"object": "tax_decision",
"taxSource": "facturino",
"status": "final",
"totals": { "totalHT": 150000, "totalVAT": 30000, "totalTTC": 180000 },
"amountToCharge": 180000,
"invoiceChannel": "einvoicing",
"transactionReporting": "none",
"paymentReporting": "fr212"
}
Créez le brouillon avec POST /v1/invoices :
taxDecisionId lie la décision,
decisionLines ne porte que la
présentation (unité, produit catalogue). La TVA, les montants et les mentions viennent de la décision, copiés tels quels.
Une décision, une facture — une décision finale adosse exactement une facture. Pour une nouvelle opération, demandez une nouvelle décision.
Montants en centimes —
180000 = 1 800,00 EUR.
Aucun flottant, aucun arrondi ambigu.
Contenu fiscal figé — seuls l'échéance, les conditions, les notes et les métadonnées restent modifiables
Acomptes et échéancier — réglés contre le montant décidé, sans jamais le modifier
$ curl -X POST https://facturino.com/api/v1/invoices \
-H "Authorization: Bearer fac_test_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: qs-inv-001" \
-d '{
"customerId": "cus_8f2k4m9n",
"taxDecisionId": "taxdec_9k2f7p1m",
"decisionLines": [
{ "taxLineRef": "conseil", "unit": "flat_rate" }
],
"buyer": {
"companyName": "Durand & Associés SARL",
"siret": "00012345500008",
"address": { "line1": "15 rue de la Paix", "postalCode": "75002", "city": "Paris", "country": "FR" }
},
"dates": { "issued": "2026-09-25", "due": "2026-10-25" },
"payment": {
"terms": "30 jours net", "termsDays": 30, "method": "transfer",
"latePaymentRate": "3 fois le taux légal", "collectionFee": "40.00 EUR"
},
"notes": "Merci pour votre confiance."
}'
# Réponse — la TVA décidée est copiée telle quelle et figée (centimes entiers)
{
"id": "inv_3p7r2x5q",
"object": "invoice",
"status": "draft",
"taxSource": "facturino",
"taxDecisionId": "taxdec_9k2f7p1m",
"totals": {
"totalHT": 150000,
"totalVAT": 30000,
"totalTTC": 180000
}
}
Appelez POST /v1/invoices/:id/finalize
pour verrouiller la facture. Un numéro séquentiel définitif est attribué (ex: FAC2026-00001)
et un hash SHA-256 est calculé pour la chaîne d'archivage.
La finalisation est irréversible. Une facture finalisée ne peut plus être modifiée.
Pour corriger une erreur, vous devrez émettre un avoir (POST /v1/credit-notes).
Numéro définitif — séquentiel, sans trou (transaction atomique)
Hash SHA-256 — intégrité vérifiable via /verify
Mentions légales — auto-générées selon CGI et régime TVA
$ curl -X POST https://facturino.com/api/v1/invoices/inv_3p7r2x5q/finalize \
-H "Authorization: Bearer fac_test_..."
# Réponse
{
"id": "inv_3p7r2x5q",
"status": "finalized",
"number": "FAC2026-00001",
"totals": {
"totalHT": 207000,
"totalVAT": 41400,
"totalTTC": 248400
},
// La chaîne de hash d'archivage est scellée à la génération du
// Factur-X (étape suivante) ; vérifiable ensuite via GET /invoices/:id/verify
"dates": {
"issued": "2026-03-24T14:30:00Z",
"due": "2026-04-30T00:00:00Z"
}
}
Transmettez la facture à votre destinataire via
POST /v1/invoices/:id/send.
Facturino transmet la facture à la PA connectée par le client — un
connecteur dédié
(Super PDP, Iopole, B2Brouter, Seqino) ou le
connecteur générique AFNOR
pour toute autre PA, configuré côté interface.
Vous pouvez aussi télécharger la facture (GET /v1/invoices/:id/facturx) pour dépôt manuel.
Les changements de statut sont notifiés en temps réel via webhooks.
En mode sandbox (fac_test_),
l'envoi est simulé. Aucune facture n'est transmise à une PA réelle. Utilisez
/v1/sandbox/simulate-status
pour tester les transitions de statut.
14 statuts DGFiP — de deposited à paid, en temps réel
Webhooks — invoice.status.* à chaque transition
Exactly-once — idempotency key PA pour éviter les doublons
$ curl -X POST https://facturino.com/api/v1/invoices/inv_3p7r2x5q/send \
-H "Authorization: Bearer fac_test_..."
# Réponse 202 — envoi en cours
{
"id": "inv_3p7r2x5q",
"object": "invoice",
"status": "sending"
}
# Suivre le statut PA via GET /status
$ curl https://facturino.com/api/v1/invoices/inv_3p7r2x5q/status \
-H "Authorization: Bearer fac_test_..."
{
"status": "deposited",
"einvoicing": {
"paStatus": "deposited",
"paId": "42"
},
"dates": {
"due": "2026-04-30",
"finalizedAt": "2026-03-25T10:00:00Z"
}
}
Récupérez le Factur-X avec GET /v1/invoices/:id/facturx.
Le fichier est un PDF/A-3b avec le XML CII D22B intégré en pièce jointe. Profil EN 16931,
validation Schematron CIUS-FR automatique, métadonnées XMP conformes.
PDF/A-3b — archivable, lisible par tout lecteur PDF
XML CII intégré — factur-x.xml, AFRelationship "Alternative"
Profil EN 16931 — conforme CIUS-FR, ZUGFeRD 2.4
Aussi disponible — /pdf et /xml séparément
# 1. Recuperer l'URL signee (JSON, pas le binaire)
$ curl https://facturino.com/api/v1/invoices/inv_3p7r2x5q/facturx \
-H "Authorization: Bearer fac_test_..."
# 200 -> fichier pret :
{ "object": "file_url", "url": "https://storage.../facture.pdf?...", "expires_in": 900 }
# 202 -> generation en cours : { "object": "job", "id": "job_...", "status": "pending" }
# (repoller l'endpoint jusqu'a recevoir "file_url")
# 2. Telecharger le PDF/A-3b depuis l'URL signee (valide 15 min)
$ curl -o facture-FAC2026-00001.pdf "https://storage.../facture.pdf?..."
# PDF/A-3b avec XML CII integre, profil EN16931, CIUS-FR
# Metadata XMP : conformance "B", factur-x.xml Les conventions essentielles de l'API Facturino pour bien démarrer.
Tous les montants sont des entiers en centimes d'euros.
150000 = 1 500,00 EUR.
Aucun flottant, aucune perte de précision.
Les taux sont en centièmes de pourcent.
2000 = 20,00 %,
550 = 5,50 %.
Arrondi conforme EN 16931, au plus proche.
De draft à
paid, en passant par
deposited,
transmitted et
approved.
Transitions validées côté serveur.
Préfixe fac_test_ pour le sandbox (données isolées, aucun envoi réel).
Préfixe fac_live_ pour la production.
Les environnements sont strictement cloisonnés.
Header Idempotency-Key sur les POST.
Même clé = même résultat pendant 24h. Indispensable pour les retries réseau.
Chaque erreur contient type,
code,
message,
doc_url et
hint.
| Champ | Valeur API | Affichage | Convention |
|---|---|---|---|
| unitPrice | 65000 | 650,00 EUR | Centimes |
| vatRate | 2000 | 20,00 % | Centièmes % |
| vatRate | 550 | 5,50 % | Centièmes % |
| discountPercent | 500 | 5,00 % | Centièmes % |
| totalTTC | 248400 | 2 484,00 EUR | Centimes |
Arrondi : chaque ligne est arrondie à 2 décimales (mode demi-vers-le-haut, le 0,5 monte), puis les lignes sont sommées. Conforme à la norme EN 16931.
Les 6 étapes en un coup d'oeil, avec les endpoints et statuts correspondants.
| Étape | Méthode | Endpoint |
|---|---|---|
| 1. Client | POST | /v1/customers |
| 2. Décision | POST | /v1/tax-decisions |
| 3. Facture | POST | /v1/invoices |
| 4. Finaliser | POST | /v1/invoices/:id/finalize |
| 5. Envoyer | POST | /v1/invoices/:id/send |
| 6. Factur-X | GET | /v1/invoices/:id/facturx |
PDF/A-3b + XML CII
Cross-Industry Invoice
Universal Business Language
PDF classique lisible
Votre première facture est envoyée. Voici les prochaines étapes pour aller plus loin.
Téléchargez des fichiers d'exemple (XML CII, profil EN16931) pour vos tests d'intégration.
Explorez les 147 endpoints, testez les requêtes en direct et consultez les schémas OpenAPI 3.1.
Node.js, Python, PHP, Go. Typage complet, gestion d'erreurs intégrée, pagination automatique.
Recevez des notifications push signées HMAC-SHA256 pour chaque changement de statut.
Convertissez un devis, décidez sa TVA, adossez la décision au même brouillon, finalisez. Émettez des avoirs qui héritent de la position fiscale corrigée. Même API, même logique.
Fixtures pré-chargées, simulation de statuts PA, reset instantané. Idéal pour les tests CI/CD.
Tout comprendre sur le PDF/A-3, le XML CII D22B, les profils EN 16931 et la conformité CIUS-FR.
Créez votre compte, obtenez une clé API test et envoyez votre première facture conforme en quelques minutes. Plan gratuit sans carte bancaire.
Besoin d'aide ? Contacter le support