API FormatX - Documentation
Deux APIs pour intégrer la conformité Factur-X dans vos applications.
Envoyez un PDF, Excel ou image. L'IA française Mistral extrait les données et génère le Factur-X.
Idéal pour convertir des factures existantes sans ressaisie.
Voir la doc v1 ↓Envoyez du JSON structuré. Recevez du XML Factur-X validé EN16931. 100% déterministe.
Pour les éditeurs de logiciels (ERP, compta, facturation).
Voir la doc v2 ↓v2 : ~50ms — v1 : ~5s
Mistral (IA française), données en Europe, RGPD
EN 16931, PDF/A-3, Chorus Pro
API v2 — Directe (JSON)
NOUVEAUPour les éditeurs de logiciels : envoyez vos données de facture en JSON, recevez du XML Factur-X certifié EN 16931. Pas d'IA, pas de PDF — 100% déterministe.
Base URL
https://formatx.fr/api/v2
Aucune clé API requise pour le moment. L'API est en accès libre pendant notre phase de pré-commercialisation. Vous pouvez appeler les endpoints directement, sans header d'authentification.
Une grille tarifaire sera mise en place à terme. Les utilisateurs actuels seront prévenus bien à l'avance et bénéficieront de conditions préférentielles.
Endpoint principal : JSON → XML Factur-X validé EN 16931.
Request Body (JSON)
{
"invoiceNumber": "F2026-042",
"invoiceDate": "2026-02-12",
"dueDate": "2026-03-12", // optionnel
"currency": "EUR", // optionnel, défaut: EUR
"seller": {
"name": "Ma Société SARL",
"address": "10 Rue de la Paix, 75001 Paris",
"vatNumber": "FR12345678901", // n° TVA ou SIRET
"country": "FR" // optionnel, auto-détecté
},
"buyer": {
"name": "Client SAS",
"address": "20 Avenue des Champs, 69001 Lyon",
"vatNumber": "FR98765432100", // optionnel
"country": "FR" // optionnel
},
"items": [
{
"description": "Prestation de conseil",
"quantity": 5,
"unitPrice": 800,
"vatRate": 20,
"reference": "REF-001" // optionnel
},
{
"description": "Formation sur site",
"quantity": 2,
"unitPrice": 1500,
"vatRate": 20
}
],
"totals": { // optionnel — calculé auto si absent
"totalHT": 7000,
"totalTTC": 8400,
"prepaidAmount": 1000 // acompte déjà versé
}
}Response 200 (Success)
{
"success": true,
"data": {
"xml": "<?xml version=\"1.0\"?>\n<rsm:CrossIndustryInvoice ...>...</rsm:CrossIndustryInvoice>",
"profile": "EN 16931 (Comfort)",
"validation": {
"valid": true,
"errors": [],
"warnings": []
}
},
"meta": {
"processingTimeMs": 52,
"apiVersion": "v2"
}
}Response 422 (Validation EN16931 échouée)
{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "2 erreur(s) bloquante(s)",
"details": [
{ "rule": "BR-06", "message": "L'identifiant fiscal du vendeur est obligatoire" },
{ "rule": "BR-E-03", "message": "Catégorie E exige un motif d'exonération" }
]
}
}Valide les données sans générer le XML. Utile pour pré-valider avant l'appel à /xml.
Request Body : même format que /v2/xml
Response 200
{
"success": true,
"data": {
"valid": true,
"errors": [],
"warnings": [
{ "rule": "BR-CO-15", "message": "SIRET acheteur recommandé" }
],
"summary": "Conforme EN16931"
}
}JSON + PDF → PDF Factur-X complet (PDF/A-3 avec XML embarqué).
Request Body (JSON)
{
"invoiceData": {
// Même format que /v2/xml
"invoiceNumber": "F2026-042",
"invoiceDate": "2026-02-12",
"seller": { ... },
"buyer": { ... },
"items": [ ... ]
},
"pdfBase64": "JVBERi0xLjQKJeLjz9..." // PDF existant en base64
}Response 200
Retourne directement le fichier PDF (Content-Type: application/pdf).
Content-Type: application/pdf Content-Disposition: attachment; filename="facture-x-F2026-042.pdf" X-Processing-Time-Ms: 1850 X-Conversion-Method: ghostscript+pdf-lib
XML Factur-X → PDF lisible. Transforme un XML EN 16931 (CII) en un PDF facture formaté.
Option A : Envoyer le XML directement
curl -X POST https://formatx.fr/api/v2/render \ -H "Content-Type: text/xml" \ -d @factur-x.xml \ --output facture.pdf
Option B : Envoyer via JSON
{
"xml": "<?xml version=\"1.0\"?>\n<rsm:CrossIndustryInvoice ...>...</rsm:CrossIndustryInvoice>"
}Response 200
Retourne directement le fichier PDF (Content-Type: application/pdf).
Content-Type: application/pdf Content-Disposition: attachment; filename="facture-F2026-042.pdf" X-Processing-Time-Ms: 120 X-Invoice-Number: F2026-042
Cas d'usage : Vous recevez des factures XML EN 16931 (Factur-X, ZUGFeRD, eFactura) et vous voulez les visualiser en PDF lisible. Fonctionne avec tout XML conforme EN 16931 au format CII.
Exemples v2 — API Directe
# Générer du XML Factur-X à partir de JSON
curl -X POST https://formatx.fr/api/v2/xml \
-H "Content-Type: application/json" \
-d '{
"invoiceNumber": "F2026-042",
"invoiceDate": "2026-02-12",
"seller": {
"name": "Ma Société SARL",
"address": "10 Rue de la Paix, 75001 Paris",
"vatNumber": "FR12345678901"
},
"buyer": {
"name": "Client SAS",
"address": "20 Avenue des Champs, 69001 Lyon"
},
"items": [
{
"description": "Prestation de conseil",
"quantity": 5,
"unitPrice": 800,
"vatRate": 20
}
]
}'import requests
response = requests.post(
"https://formatx.fr/api/v2/xml",
headers={
"Content-Type": "application/json"
},
json={
"invoiceNumber": "F2026-042",
"invoiceDate": "2026-02-12",
"seller": {
"name": "Ma Société SARL",
"address": "10 Rue de la Paix, 75001 Paris",
"vatNumber": "FR12345678901"
},
"buyer": {
"name": "Client SAS",
"address": "20 Avenue des Champs, 69001 Lyon"
},
"items": [
{
"description": "Prestation de conseil",
"quantity": 5,
"unitPrice": 800,
"vatRate": 20
}
]
}
)
result = response.json()
if result["success"]:
xml = result["data"]["xml"]
print("XML généré avec succès")
with open("facture-x.xml", "w") as f:
f.write(xml)
else:
print(f"Erreur: {result['error']['message']}")
if "details" in result.get("error", {}):
for err in result["error"]["details"]:
print(f" - [{err['rule']}] {err['message']}")async function generateFacturX(invoiceData) {
const response = await fetch("https://formatx.fr/api/v2/xml", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(invoiceData),
});
const result = await response.json();
if (!result.success) {
throw new Error(result.error.message);
}
return result.data.xml;
}
// Usage
const xml = await generateFacturX({
invoiceNumber: "F2026-042",
invoiceDate: "2026-02-12",
seller: {
name: "Ma Société SARL",
address: "10 Rue de la Paix, 75001 Paris",
vatNumber: "FR12345678901",
},
buyer: {
name: "Client SAS",
address: "20 Avenue des Champs, 69001 Lyon",
},
items: [
{ description: "Prestation de conseil", quantity: 5, unitPrice: 800, vatRate: 20 },
],
});
console.log("XML Factur-X:", xml);<?php
$data = json_encode([
"invoiceNumber" => "F2026-042",
"invoiceDate" => "2026-02-12",
"seller" => [
"name" => "Ma Société SARL",
"address" => "10 Rue de la Paix, 75001 Paris",
"vatNumber" => "FR12345678901"
],
"buyer" => [
"name" => "Client SAS",
"address" => "20 Avenue des Champs, 69001 Lyon"
],
"items" => [
[
"description" => "Prestation de conseil",
"quantity" => 5,
"unitPrice" => 800,
"vatRate" => 20
]
]
]);
$ch = curl_init("https://formatx.fr/api/v2/xml");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
]
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result["success"]) {
$xml = $result["data"]["xml"];
file_put_contents("facture-x.xml", $xml);
echo "XML généré avec succès\n";
} else {
echo "Erreur: " . $result["error"]["message"] . "\n";
}
?>Quotas et tarification
Accès libre pendant la phase de pré-commercialisation. Aucun quota mensuel, aucune facturation. Un rate limit technique de 60 requêtes/minute reste en place pour la stabilité du service.
Quand la grille tarifaire sera mise en place, vous serez prévenu à l'avance et bénéficierez de conditions avantageuses en tant qu'utilisateur early adopter.
Schéma d'entrée (v2) — Référence complète
| Champ | Type | Requis | Description |
|---|---|---|---|
| invoiceNumber | string | oui | Numéro de facture |
| invoiceDate | string | oui | Date (YYYY-MM-DD) |
| dueDate | string | non | Date d'échéance |
| currency | string | non | Code devise ISO (défaut: EUR) |
| seller.name | string | oui | Raison sociale vendeur |
| seller.address | string | oui | Adresse complète |
| seller.vatNumber | string | non | N° TVA intracommunautaire |
| seller.siret | string | non | N° SIRET (si pas de TVA) |
| buyer.name | string | oui | Raison sociale acheteur |
| buyer.address | string | oui | Adresse complète |
| items[].description | string | oui | Désignation de la ligne |
| items[].quantity | number | oui | Quantité (> 0) |
| items[].unitPrice | number | oui | Prix unitaire HT |
| items[].vatRate | number | oui | Taux de TVA (ex: 20, 10, 5.5, 0) |
| items[].vatCategory | string | non | S, E, Z, AE, K... (défaut: S) |
| totals.totalHT | number | non | Total HT (calculé si absent) |
| totals.totalTTC | number | non | Total TTC (calculé si absent) |
| totals.prepaidAmount | number | non | Acompte déjà versé |
API v1 — Avec IA Mistral (PDF/Excel/Image)
Envoyez un document (PDF, image, Excel, Word). L'IA française Mistral extrait automatiquement les données et génère le Factur-X. Vos données restent en Europe.
Base URL
https://formatx.fr/api/v1
Convertit une facture (PDF, image, Excel ou Word) en Factur-X conforme EN 16931. Extraction par IA Mistral (souveraineté FR).
Request Body (JSON)
{
// Option A: PDF en base64
"pdfBase64": "JVBERi0xLjQKJeLjz9...",
// Option B: Image en base64 (PNG, JPG)
"imageBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
"mimeType": "image/png",
// Paramètres optionnels
"fileName": "facture-001.pdf",
"profile": "comfort"
}Response 200 (Success)
{
"success": true,
"data": {
"extractedData": {
"invoiceNumber": "2025-001",
"invoiceDate": "2025-01-15",
"sellerName": "Ma Société SAS",
"sellerAddress": "123 Rue du Commerce, 75001 Paris",
"buyerName": "Client SA",
"items": [ ... ],
"totalHT": 1000,
"totalTTC": 1200,
"currency": "EUR"
},
"factureX": {
"xml": "<?xml version='1.0' encoding='UTF-8'?>...",
"profile": "comfort"
},
"validation": {
"valid": true,
"errors": [],
"warnings": []
}
}
}Codes d'erreur
400Requête mal formée ou paramètres manquants
422Les données ne passent pas la validation EN 16931. Détails dans error.details
429Trop de requêtes par minute (limite technique de 60 req/min)
500Erreur serveur. Contactez-nous si le problème persiste.