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
Chaque requête nécessite une clé API dans le header. Les clés commencent par fxk_.
X-API-Key: fxk_votre_cle_api # Alternative: Bearer token Authorization: Bearer fxk_votre_cle_api
Contactez-nous pour obtenir une clé API. Plan gratuit disponible (10 factures/mois).
Endpoint principal : JSON → XML Factur-X validé EN 16931. Consomme 1 unité de quota.
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",
"quota": {
"used": 3,
"limit": 100,
"remaining": 97
}
}
}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. Ne consomme pas de quota. 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é). Consomme 1 unité de quota.
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). Les infos de quota sont dans les headers de réponse.
Content-Type: application/pdf Content-Disposition: attachment; filename="facture-x-F2026-042.pdf" X-Quota-Remaining: 97 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é. Consomme 1 unité de quota.
Option A : Envoyer le XML directement
curl -X POST https://formatx.fr/api/v2/render \ -H "Content-Type: text/xml" \ -H "X-API-Key: fxk_votre_cle_api" \ -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-Quota-Remaining: 96 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" \
-H "X-API-Key: fxk_votre_cle_api" \
-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",
"X-API-Key": "fxk_votre_cle_api"
},
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"]
quota = result["meta"]["quota"]
print(f"XML généré! Quota: {quota['remaining']}/{quota['limit']}")
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",
"X-API-Key": "fxk_votre_cle_api",
},
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",
"X-API-Key: fxk_votre_cle_api"
]
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result["success"]) {
$xml = $result["data"]["xml"];
$remaining = $result["meta"]["quota"]["remaining"];
file_put_contents("facture-x.xml", $xml);
echo "XML généré! Quota restant: $remaining\n";
} else {
echo "Erreur: " . $result["error"]["message"] . "\n";
}
?>Plans et quotas (v2)
Les quotas se réinitialisent le 1er de chaque mois. Le header X-Quota-Remaining indique le solde après chaque appel.
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
401Clé API invalide, manquante ou révoquée
422Les données ne passent pas la validation EN 16931. Détails dans error.details
429Quota mensuel épuisé ou trop de requêtes par minute
500Erreur serveur. Contactez-nous si le problème persiste.