Aller au contenu principal
MaFactureOK

API publique

MaFactureOK n’est pas qu’un vérificateur : c’est une brique que vous insérez dans vos scripts et vos automatisations pour réduire les rejets à la source. Gratuite en bêta : demandez une clé par email, elle arrive aussitôt et reste stable. Validez une facture en une ligne avec le SDK Node.js open source, ou depuis Python, Make, n8n ou curl. Le site, lui, reste utilisable sans clé.

Valider une facture

Envoyez le fichier Factur-X, UBL ou CII tel quel : vous recevez le rapport digéré en français, le verdict, chaque anomalie avec sa correction et son emplacement, et l’état des entreprises de la facture. Le fichier est analysé puis supprimé, jamais conservé ni journalisé.

POST /api/public/v1/valider-facture : corps binaire, 15 Mo au plus. Avec votre clé : 100 validations par jour, et les en-têtes x-quota-limit et x-quota-remaining pour savoir où vous en êtes. Sans clé, les quotas anonymes du site s’appliquent.

Node.js, en une ligne

MAFACTUREOK_CLE=mfok_live_votre_cle npx @mafactureok/sdk valider facture.pdf

TypeScript

import { MaFactureOK } from "@mafactureok/sdk";
import { readFile } from "node:fs/promises";

const client = new MaFactureOK({ cle: process.env.MAFACTUREOK_CLE });
const rapport = await client.valider(await readFile("facture.pdf"));
console.log(rapport.verdict, rapport.anomalies);

Le SDK @mafactureok/sdk est open source (licence MIT), sans dépendance, avec les types du contrat : github.com/mafactureok/mafactureok-node. Le dépôt contient aussi des factures d’exemple et leurs rapports attendus.

Python

import os, requests

with open("facture.pdf", "rb") as f:
    reponse = requests.post(
        "https://mafactureok.com/api/public/v1/valider-facture",
        headers={
            "Authorization": f"Bearer {os.environ['MAFACTUREOK_CLE']}",
            "Content-Type": "application/octet-stream",
        },
        data=f.read(),
        timeout=60,
    )
rapport = reponse.json()
print(rapport["verdict"], [a["titre"] for a in rapport["anomalies"]])

curl

curl -X POST https://mafactureok.com/api/public/v1/valider-facture \
  -H "Authorization: Bearer mfok_live_votre_cle" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @facture.pdf

Réponse

{
  "version": "1.0",
  "verifie_le": "2026-10-08T10:00:00Z",
  "verdict": "invalide",
  "titre": "Facture non conforme",
  "format": "UBL 2.1", "profil": "EN16931",
  "referentiels": [{ "nom": "FNFE France RFE", "version": "1.4.0.03" }],
  "points": [{ "ton": "error", "titre": "1 anomalie bloquante", "details": [] }],
  "anomalies": [
    { "gravite": "bloquante", "titre": "Montant à payer incohérent",
      "sens": "Le total à payer ne correspond pas au total TTC moins le montant déjà réglé.",
      "correction": "Recalculez BT-115 à partir de BT-112 et BT-113.",
      "valeur_proposee": "1200.00", "ou": "BT-115", "regles": ["BR-CO-16"] }
  ],
  "entreprises": [{ "role": "Vendeur", "etat": "ok", "signaux": [], "tva": "valide" }],
  "duree_ms": 412
}
Verdicts
valide, a_verifier (avertissements ou entreprise à contrôler), invalide (au moins une anomalie bloquante), non_analyse (fichier non pris en charge, motif fourni).
Codes
  • 200
  • 400 (fichier vide)
  • 401 (clé envoyée mais invalide : sans en-tête, l’appel reste anonyme)
  • 413 (plus de 15 Mo)
  • 429 avec Retry-After (quota atteint)
  • 502 (moteur indisponible : la réponse contient tout de même un rapport non_analyse)
Contrat
OpenAPI 3.1 : /api/public/v1/openapi.json. GET /api/public/v1/moi renvoie votre plan, vos quotas et votre usage, hors quota.

Vérifier des tiers

POST /api/public/v1/verifier-tiers : jusqu’à 25 SIREN (9 chiffres) ou SIRET (14 chiffres) par appel. Pour chacun : existe, actif ou cessé, raison sociale et adresse officielles, numéro de TVA (registre DGFiP, arbitré par VIES sinon), et un signal prêt à router.

curl -X POST https://mafactureok.com/api/public/v1/verifier-tiers \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer mfok_live_votre_cle" \
  -d '{ "identifiants": ["456500537", "897865184"] }'
{
  "version": "1.0",
  "verifie_le": "2026-08-24T10:00:00Z",
  "resultats": [
    { "identifiant": "456500537", "existe": true, "etat": "actif",
      "raison_sociale": "DALKIA",
      "adresse": "PANORAMA 204 RUE SADI CARNOT 59350 SAINT-ANDRE-LEZ-LILLE",
      "tva": { "numero": "FR42456500537", "statut": "valide" },
      "signal": "ok", "action": null },
    { "identifiant": "897865184", "existe": true, "etat": "cesse",
      "date_cessation": "2024-12-09", "signal": "alerte",
      "action": "Entreprise cessée : ne pas facturer sous cet identifiant sans vérification humaine." }
  ]
}
Signaux
  • ok
  • avertissement (TVA invalide, SIRET périmé, diffusion restreinte)
  • alerte (entreprise cessée ou introuvable)
  • indetermine (service officiel momentanément indisponible : le seul cas où relancer a un sens)
Codes
  • 200
  • 401 (clé absente ou invalide : demandez-en une ci-dessus)
  • 400 (corps ou identifiant invalide)
  • 413 (plus de 25 identifiants)
  • 429 avec Retry-After (quota bêta : 200 identifiants vérifiés par jour et par clé)
  • 503 (vérification indisponible)
Contrat
versionné et figé ; un changement cassant passera par /v2/.
Confidentialité
cet endpoint ne reçoit que des identifiants publics, jamais un nom de client ou un montant ; les factures envoyées à valider-facture sont analysées puis supprimées. Votre email n’est conservé que pour la clé et le suivi d’usage, et jamais utilisé pour du marketing sans la case dédiée. Détails.

Le workflow de référence

Vérifier avant de facturer, router selon le signal, ne relancer que ce qui peut changer. La correction est une étape à part, que vous branchez si vous la voulez : nous ne corrigeons jamais en douce.

  1. Source

    CRM, Google Sheet, bon de commande : la liste des clients à facturer.

  2. MaFactureOK : vérifier

    Un nœud HTTP appelle verifier-tiers ; chaque tiers revient avec un signal.

  3. Routeur

    Une branche par signal :

    • signal = ok : créer la facture dans votre logiciel
    • signal = indetermine : attendre puis relancer (seul cas de retry)
    • alerte ou avertissement : corriger ou notifier un humain
  4. Votre suite

    Notification, ticket, stockage : le dernier maillon vous appartient. Nous nous arrêtons à « donnée fiable ou anomalie qualifiée ».

Règle d’or du retry : relancez uniquement sur indetermine ou sur un 429 (en respectant Retry-After). Une alerte ou un avertissement décrit le fond : réessayer ne le changera pas.

La suite de la famille /v1/

corriger-facture (XML corrigé quand des corrections sont dérivables) arrivera ensuite. Validation et correction resteront deux actes distincts.

Les mêmes vérifications existent sous forme de serveur MCP pour ChatGPT, Claude et les clients compatibles, sans clé.

Question technique sur l’API (contrat, limites, intégration) : support@mafactureok.com.