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.5 · 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
Validateur en ligne · gratuit
Les trois schematrons — EN 16931, Factur-X et 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.
22 règles BR-FR de la norme XP Z12-012 : SIREN, cadre de facturation, notes légales, adresses 0225, TVA sur les débits.
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.
Depuis la 1.5, le SDK produit aussi la page lisible — en-tête, lignes, totaux, TVA, mentions légales, pagination. Celles-ci viennent de la même source que le XML : le lisible et le structuré ne peuvent pas diverger.
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 50 décisions.
Cinq 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