Jamais d'arrondi silencieux
Centimes, quantités et prix en entiers, produits en bigint, arrondi commercial unique. Les totaux que vous fournissez sont vérifiés — un TTC qui ne colle pas est une erreur nommée, pas une valeur corrigée à votre place.
v1.10 · vérifié par les validateurs officiels
Un SDK pur — zéro dépendance native, compatible edge et serverless — pour générer, valider, embarquer et lire des factures Factur-X au profil EN 16931, avec les règles françaises de la réforme. Chaque promesse est jugée par un validateur officiel, pas par nous.
pnpm add facturx-sdk
Jugé par les outils de référence, à chaque commit
Studio · gratuit, sans compte
Six modèles, votre couleur, votre police, votre logo, un QR code de paiement SEPA — et toutes les mentions obligatoires, qu'aucun réglage ne retire. Le Studio contrôle en direct avec les validateurs officiels, produit le PDF Factur-X et montre le code SDK qui fait la même chose. Rien ne quitte votre navigateur.
Factures, avoirs, acomptes · clients, catalogue et numérotation gardés sur votre machine
Validateur en ligne · gratuit
Les schematrons officiels du profil de la facture — EN 16931, Factur-X, BR-FR — s'exécutent dans votre navigateur. Le fichier ne part sur aucun serveur, et chaque anomalie arrive avec son code de règle et l'endroit exact du document.
PDF Factur-X ou XML CII · aucun compte, votre fichier ne bouge pas
Montants en entiers, totaux calculés puis vérifiés, erreurs typées avec le chemin exact du champ. Le SDK ne corrige jamais en silence.
import { cents, computeTotals, percent, quantity, unitPrice, assertValidInvoice } from 'facturx-sdk';
const draft = {
id: 'F-2026-0001', issueDate: '2026-09-11', typeCode: '380', currency: 'EUR',
operationCategory: 'services', // nature de l'opération (réforme)
seller: { name: 'Atelier Exemple SAS', siren: '443061841', vatId: 'FR64443061841',
address: { postCode: '75011', city: 'Paris', countryCode: 'FR' } },
buyer: { name: 'Client Démo SARL', siren: '732829320',
electronicAddress: { value: '732829320', scheme: '0225' }, // routage plateforme
address: { postCode: '69002', city: 'Lyon', countryCode: 'FR' } },
delivery: { date: '2026-09-10' },
lines: [{ id: '1', name: 'Conseil', quantity: quantity(20000), unitCode: 'DAY',
unitPrice: unitPrice(8000000), netAmount: cents(160000),
tax: { category: 'S', rate: percent('20') } }],
paymentTerms: { dueDate: '2026-10-11', latePenaltyRate: percent('10'),
recoveryIndemnity: cents(4000), earlyPaymentDiscount: 'none' },
};
const invoice = assertValidInvoice({ ...draft, ...computeTotals(draft) });
// sinon : FacturXValidationError { issues: [{ code: 'BR-CO-15', path: 'totals.taxInclusiveAmount', … }] }
import { toCiiXml } from 'facturx-sdk';
import { renderInvoicePdf, embedFacturX } from 'facturx-sdk/pdf';
// La page lisible, dessinée depuis le modèle : plus besoin d'apporter son PDF
const page = await renderInvoicePdf(invoice, {
fonts: { regular: ttf, bold: ttfBold }, // police statique, embarquée
footer: 'SARL au capital de 10 000 € · RCS Paris 443 061 841',
});
// La page + le XML → PDF/A-3 Factur-X, validé par veraPDF à chaque commit
const pdfA3 = await embedFacturX(page, { invoice }, {
outputIntent: { iccProfile: srgb },
});
import { fromCiiXml, readCiiGuideline } from 'facturx-sdk';
import { extractInvoice } from 'facturx-sdk/pdf';
// PDF reçu → facture typée, validée (ou undefined sans Factur-X)
const received = await extractInvoice(pdfBytes);
// XML reçu → facture typée ; FacturXParseError { code, path } si illisible
const invoice = fromCiiXml(xmlString);
// Router sans tout lire : profil (BT-24) et cadre de facturation (BT-23)
const { guidelineId, businessProcessId } = readCiiGuideline(xmlString);
Centimes, quantités et prix en entiers, produits en bigint, arrondi commercial unique. Les totaux que vous fournissez sont vérifiés — un TTC qui ne colle pas est une erreur nommée, pas une valeur corrigée à votre place.
BR-CO-15 @ totals.taxInclusiveAmount. Codes officiels EN 16931 et AFNOR, prêts pour votre formulaire.
36 règles BR-FR de la norme XP Z12-012 : SIREN, cadre de facturation, notes légales, adresses 0225, TVA sur les débits, avoirs et factures rectificatives, factures déjà payées, franchise en base.
Factur-X, CII nu et UBL : tout profil, tout préfixe, pièces jointes, acomptes, avoirs. Une même facture lue en CII et en UBL rend le même objet. Éprouvé sur 30 factures d'autres outils, ré-émises conformes.
Les quatre statuts transmissibles au portail public — l'annexe officielle n'en connaît pas d'autres pour une facture —, les 40 motifs de refus normalisés, et le message CDV écrit et relu, validé contre le schéma CDAR d'UN/CEFACT.
Le SDK produit aussi la page lisible — six modèles, votre couleur, votre police, votre logo, un QR code de paiement SEPA —, avec chaque mention obligatoire. Elles viennent de la même source que le XML : le lisible et le structuré ne peuvent pas diverger. Essayez-les dans le Studio.
npx facturx-sdk validate facture.pdf — le format est reconnu seul, chaque anomalie arrive avec son chemin, et le code de sortie permet de bloquer une facture dans une chaîne automatique.
Pas de DTD ni d'entité externe, profondeur et tailles bornées, aucune exécution de contenu. SECURITY.md
Aucune API Node dans l'entrée principale ; pdf-lib uniquement dans facturx-sdk/pdf. Un handler Request → Response suffit pour Next.js, Hono ou Cloudflare Workers — l'exemple est dans le dépôt.
Recevoir des factures structurées devient obligatoire pour toutes les entreprises, puis les émettre selon la taille, via une plateforme agréée. Le SDK est la brique format et conformité ; la plateforme, la brique transport.
facturx : valider, résumer, extraireÉcrit noir sur blanc dans le guide de la réforme et le journal des 71 décisions.
Quatre exemples exécutés en intégration continue : émission depuis un modèle JSON, réception d'un dossier de PDF, handler HTTP, acomptes → facture définitive.
pnpm add facturx-sdk