Retour à l'accueil

API FormatX - Documentation

Deux APIs pour intégrer la conformité Factur-X dans vos applications.

v1 — API avec IA

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 ↓
v2 — API DirecteNOUVEAU

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 ↓
Rapide

v2 : ~50ms — v1 : ~5s

IA souveraine

Mistral (IA française), données en Europe, RGPD

Conforme

EN 16931, PDF/A-3, Chorus Pro

API v2 — Directe (JSON)

NOUVEAU

Pour 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
Authentification (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).

POST/api/v2/xml

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" }
    ]
  }
}
POST/api/v2/validategratuit

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"
  }
}
POST/api/v2/embed

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
POST/api/v2/renderNOUVEAU

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

cURL
# 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
      }
    ]
  }'
Python
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']}")
JavaScript / Node.js
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
<?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)

Free— test et POC
10 factures/mois
Pro— PME, petit éditeur
100 factures/mois
Business— éditeur avec volume
500 factures/mois
Entreprise— sur mesure
Contactez-nous

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

ChampTypeRequisDescription
invoiceNumberstringouiNuméro de facture
invoiceDatestringouiDate (YYYY-MM-DD)
dueDatestringnonDate d'échéance
currencystringnonCode devise ISO (défaut: EUR)
seller.namestringouiRaison sociale vendeur
seller.addressstringouiAdresse complète
seller.vatNumberstringnonN° TVA intracommunautaire
seller.siretstringnonN° SIRET (si pas de TVA)
buyer.namestringouiRaison sociale acheteur
buyer.addressstringouiAdresse complète
items[].descriptionstringouiDésignation de la ligne
items[].quantitynumberouiQuantité (> 0)
items[].unitPricenumberouiPrix unitaire HT
items[].vatRatenumberouiTaux de TVA (ex: 20, 10, 5.5, 0)
items[].vatCategorystringnonS, E, Z, AE, K... (défaut: S)
totals.totalHTnumbernonTotal HT (calculé si absent)
totals.totalTTCnumbernonTotal TTC (calculé si absent)
totals.prepaidAmountnumbernonAcompte 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
POST/api/v1/convert

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

400
INVALID_INPUT

Requête mal formée ou paramètres manquants

401
UNAUTHORIZED

Clé API invalide, manquante ou révoquée

422
VALIDATION_FAILED

Les données ne passent pas la validation EN 16931. Détails dans error.details

429
QUOTA_EXCEEDED / Rate Limit

Quota mensuel épuisé ou trop de requêtes par minute

500
INTERNAL_ERROR

Erreur serveur. Contactez-nous si le problème persiste.

Prêt à intégrer Factur-X dans votre logiciel ?

Demandez votre clé API gratuite. On revient vers vous sous 24h.

Accès gratuit pendant la phase beta. IA souveraine Mistral — vos données restent en France.