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é.
Obtenir une clé (gratuit, immédiat)
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/moirenvoie 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
okavertissement(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.
Source
CRM, Google Sheet, bon de commande : la liste des clients à facturer.
MaFactureOK : vérifier
Un nœud HTTP appelle verifier-tiers ; chaque tiers revient avec un signal.
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
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.