Mettre en place l'API, pas à pas

De la clé de test au premier Factur-X conforme EN 16931, en une quinzaine de minutes.

Il vous faut un terminal avec curl et une facture PDF. Les commandes sont écrites pour macOS et Linux ; sous Windows, utilisez Git Bash ou WSL.

1

Créer votre compte et votre clé de test

  1. Créez un compte sur pont-facturx.com et confirmez votre adresse e-mail.
  2. Ouvrez Réglages → API, choisissez Test (sk_test_), donnez un nom à la clé (par exemple « Essais ») puis cliquez sur Créer.
  3. Copiez la clé tout de suite : elle ne s'affiche qu'une fois.

Une clé de test utilise exactement le même moteur qu'une clé de production, ne consomme aucun crédit et ne conserve aucun fichier. Elle est limitée à 5 requêtes par jour et 25 par mois : de quoi suivre ce tutoriel et tester vos propres factures.

Gardez la clé hors de votre code, dans une variable d'environnement :

Terminal

export PFX_KEY="sk_test_votre_cle"
2

Vérifier la connexion

Cet appel ne lit aucun fichier : il confirme que la clé est acceptée et affiche l'état du compte.

Terminal

curl https://api.pont-facturx.com/v1/account/usage \
  -H "Authorization: Bearer $PFX_KEY"

Une réponse 200 en JSON signifie que tout est prêt. Une réponse 401 veut dire que la clé est mal copiée ou révoquée.

3

Lire une facture PDF

/v1/extract lit le PDF et renvoie les données reconnues, sans rien produire. C'est le bon moyen de voir ce que l'outil comprend de vos modèles de facture.

Terminal

curl -X POST https://api.pont-facturx.com/v1/extract \
  -H "Authorization: Bearer $PFX_KEY" \
  -F "file=@facture.pdf" \
  -o extract.json

extract.json (extrait)

{
  "job_id": "0f0a4f6e-2c39-4a6e-9d21-9c3f0f7f1f8e",
  "invoice_data": {
    "invoiceNumber": "FA-2026-0042",
    "invoiceDate": "2026-10-29",
    "vendorName": "Votre société SAS",
    "vendorSIRET": "12345678900017",
    "clientName": "Client SARL",
    "clientSIRET": "98765432100019",
    "amountHT": "1218.00",
    "vatAmount": "243.60",
    "amountTTC": "1461.60",
    "vatBreakdown": [{ "rate": "20", "base": "1218.00" }]
  },
  "raw": { "...": "sortie brute du moteur de lecture" }
}

Relisez invoice_data : c'est exactement le format que l'étape suivante accepte. Vous pouvez le corriger et le renvoyer tel quel.

4

Produire le Factur-X

Option A, le PDF seul. L'outil lit la facture puis produit le Factur-X. Pratique pour démarrer.

Terminal

curl -X POST https://api.pont-facturx.com/v1/convert \
  -H "Authorization: Bearer $PFX_KEY" \
  -F "file=@facture.pdf" \
  -F "profile=EN16931" \
  -D entetes.txt \
  -o facture-facturx.pdf

Option B, le PDF et vos données. Vous envoyez aussi les données de la facture dans invoice_data. Le fichier est alors construit à partir de vos données, sans lecture du PDF : c'est la voie à privilégier dès que vos factures sortent d'un logiciel (étape 6).

Terminal

# Récupérer le bloc invoice_data de l'étape 3, puis le relire et le corriger
jq '.invoice_data' extract.json > invoice_data.json

curl -X POST https://api.pont-facturx.com/v1/convert \
  -H "Authorization: Bearer $PFX_KEY" \
  -F "file=@facture.pdf" \
  -F "profile=EN16931" \
  -F "invoice_data=<invoice_data.json" \
  -D entetes.txt \
  -o facture-facturx.pdf

La réponse est directement le PDF Factur-X (PDF/A-3 avec le XML embarqué). Le résultat du contrôle part dans les en-têtes, enregistrés ici dans entetes.txt :

  • X-Facturx-Validation-Status: PASSED : le fichier respecte les règles EN 16931.
  • VALIDATION_FAILED : le PDF est quand même renvoyé, et X-Facturx-Validation liste les règles en défaut (souvent une donnée manquante, comme le SIREN du client).
5

Contrôler un fichier

/v1/validate contrôle n'importe quel Factur-X ou XML CII, produit par nous ou par un autre outil : profil, schéma XSD, règles EN 16931 et conteneur PDF/A. Ce contrôle est gratuit.

Terminal

curl -X POST https://api.pont-facturx.com/v1/validate \
  -H "Authorization: Bearer $PFX_KEY" \
  -F "file=@facture-facturx.pdf"

La réponse indique "valid": true ou la liste des erreurs, avec la règle concernée. Un fichier invalide renvoie 200 : ce n'est pas une erreur de l'API.

6

Brancher Sage ou un logiciel métier

Votre logiciel (Sage, un outil de facturation métier, un ERP) connaît déjà toutes les données de chaque facture. Plutôt que de faire relire le PDF, envoyez-les avec lui : aucune erreur de lecture, quelle que soit la mise en page, et un résultat identique d'une facture à l'autre.

Le principe : un export par logiciel (fichier CSV, requête sur la base ou appel direct depuis le logiciel), une correspondance entre ses colonnes et les champs ci-dessous, puis un appel à /v1/convert par facture.

Champ invoice_dataContenuExemple
invoiceNumberNuméro de factureFA-2026-0042
invoiceDate / dueDateDate de facture et d'échéance2026-10-29 (ou 29/10/2026)
vendorName, vendorSIRET, vendorVAT, vendorAddressVotre société (émetteur)SIRET sur 14 chiffres, TVA FR…
clientName, clientSIRET (ou clientSIREN), clientVAT, clientAddressVotre client (acheteur)Le SIREN du client est obligatoire depuis le 1er septembre 2026
amountHT, vatAmount, amountTTCTotaux de la facture"1218.00", "243.60", "1461.60"
vatRate ou vatBreakdownTaux unique, ou détail par taux[{"rate": "20", "base": "1218.00"}]
lineItemsLignes (facultatif, recommandé)[{"description", "quantity", "unitPrice", "totalHT", "vatRate"}]
paymentTerms, iban, bicConditions et coordonnées de paiementPénalités, indemnité de 40 €, IBAN
serviceCode, engagementJuridiqueFacture au secteur public (Chorus Pro)Code service, n° d'engagement
prepaidAmountAcompte déjà versé"1032.22" donne un net à payer de 0,00 €
allowances / chargesRemises et frais de pied de facture[{"amount": "522.00", "reason": "Remise contrat", "vatRate": "20"}]
vatExemptionReasonCodeMotif des lignes à 0 %VATEX-EU-79-C (débours), VATEX-FR-FRANCHISE…
documentType, precedingInvoiceNumber, precedingInvoiceDateAvoir"credit_note" + facture d'origine

Montants avec un point décimal, dates au format AAAA-MM-JJ ou JJ/MM/AAAA. La liste complète des champs est dans la documentation.

Exemple en Python : il lit un export CSV (une ligne par facture) et le dossier des PDF correspondants, puis produit un Factur-X par facture.

convertir_export.py

import csv, json, os, pathlib
import requests  # pip install requests

API = "https://api.pont-facturx.com"
KEY = os.environ["PFX_KEY"]  # sk_test_... pour les essais, sk_live_... en production

# Ce qui ne change pas d'une facture à l'autre : votre société.
EMETTEUR = {
    "vendorName": "Votre société SAS",
    "vendorSIRET": "12345678900017",
    "vendorVAT": "FR32123456789",
    "vendorAddress": "1 rue de l'Exemple, 75001 Paris",
    "iban": "FR7630001007941234567890185",
}

sortie = pathlib.Path("facturx")
sortie.mkdir(exist_ok=True)

# Un export de votre logiciel : une ligne par facture, séparateur « ; ».
with open("export_factures.csv", newline="", encoding="utf-8") as f:
    for ligne in csv.DictReader(f, delimiter=";"):
        invoice_data = {
            **EMETTEUR,
            "invoiceNumber": ligne["numero"],
            "invoiceDate": ligne["date"],
            "dueDate": ligne["echeance"],
            "clientName": ligne["client"],
            "clientSIRET": ligne["siret_client"],
            "clientVAT": ligne["tva_client"],
            "clientAddress": ligne["adresse_client"],
            "amountHT": ligne["total_ht"],
            "vatAmount": ligne["total_tva"],
            "amountTTC": ligne["total_ttc"],
            "vatRate": ligne["taux_tva"],
            "paymentTerms": ligne["conditions"],
        }
        pdf = pathlib.Path("pdf") / f"{ligne['numero']}.pdf"
        with pdf.open("rb") as fichier:
            r = requests.post(
                f"{API}/v1/convert",
                headers={
                    "Authorization": f"Bearer {KEY}",
                    # Rejouer la même facture ne débite qu'un crédit.
                    "Idempotency-Key": f"facture-{ligne['numero']}",
                },
                files={"file": (pdf.name, fichier, "application/pdf")},
                data={
                    "profile": "EN16931",
                    "invoice_data": json.dumps(invoice_data, ensure_ascii=False),
                },
                timeout=120,
            )
        if r.status_code != 200:
            print(ligne["numero"], "ERREUR", r.status_code, r.text[:300])
            continue
        (sortie / pdf.name).write_bytes(r.content)
        print(ligne["numero"], r.headers.get("X-Facturx-Validation-Status"))

Avec une clé de test, limitez-vous à quelques factures (5 par jour). Pour un essai plus large sur vos factures réelles, écrivez-nous : nous pouvons ouvrir un pilote.

7

Passer en production

  1. Ouvrez l'accès production depuis Réglages → API avec un pack API (à partir de 99,00 € TTC les 1 000 conversions, sans expiration) ou un abonnement Pro ou Business.
  2. Créez une clé sk_live_ et remplacez simplement la clé de test : le code ne change pas.
  3. Ajoutez l'en-tête Idempotency-Key (par exemple le numéro de facture) : un appel rejoué après une coupure réseau ne débite qu'un crédit.
  4. Respectez 30 requêtes par minute ; au-delà, l'API répond 429 avec un délai d'attente.

1 crédit par conversion, rien pour le contrôle. Au-delà de 20 000 conversions par mois ou pour plusieurs sociétés, contactez-nous pour une offre sur mesure.

Le Factur-X produit est ensuite transmis par votre plateforme agréée à vos clients entreprises, et déposé sur Chorus Pro pour vos clients publics.

Erreurs fréquentes

  • 401 clé absente, mal copiée ou révoquée : vérifiez Authorization: Bearer sk_....
  • 402 plus de crédit (clé de production) : rechargez depuis Réglages → API.
  • 403 premium_required accès production non ouvert : un pack API ou un abonnement est nécessaire.
  • 429 test_quota_exceeded quota de test atteint : 5 requêtes par jour, 25 par mois.
  • VALIDATION_FAILED dans les en-têtes : une donnée obligatoire manque ou ne concorde pas ; le détail est dans X-Facturx-Validation.

Une question pendant la mise en place ?

Envoyez-nous la commande lancée et la réponse obtenue, nous vous répondons dans la journée.