Conformity¶
Everything on this page can be re-run by you. We do not ask you to trust our own validator: the files below were generated by the live API and then checked with an independent, open-source reference validator, and we publish the raw reports.
Last run: 2 September 2026, against https://facturx.orvel.dev, API version 0.1.2.
What was checked¶
| Layer | Tool | Rule set |
|---|---|---|
| PDF/A-3 container | veraPDF (inside Mustangproject) | ISO 19005-3, level B, 10 210 assertions per file |
| XML structure | Mustangproject 2.26.0 | Factur-X 1.0.07 XSD (CII D16B), UBL 2.1 XSD |
| EN 16931 business rules | Mustangproject 2.26.0 | CEN schematron 1.3.16 (BR-*, BR-CO-*, BR-S/E/AE/K/G-*) |
| Factur-X profile rules | Mustangproject 2.26.0 | FX-SCH-* for BASIC WL, EN 16931, EXTENDED |
| French rules | Mustangproject 2.26.0 | BR-FR "Flux 2" schematron v1.3.0 (AFNOR XP Z12-012, 16 Feb 2026) |
Mustangproject is the open-source validator behind the ZUGFeRD community's online validation service and one of the tools recommended in the FNFE-MPE resources. It is unrelated to this API.
Corpus¶
Three invoices from our test suite, each covering a different VAT situation, in every profile and syntax the API produces:
| Fixture | Situation | Profiles |
|---|---|---|
invoice_fr_standard |
French B2B, 20 % and 10 % VAT, delivery date, purchase order | EN 16931, EXTENDED-CTC-FR, BASIC WL |
invoice_fr_franchise |
Micro-entrepreneur, VAT not applicable (art. 293 B CGI, category E) |
EN 16931, EXTENDED-CTC-FR |
invoice_eu_reverse_charge |
Intra-EU services, reverse charge (category AE) |
EN 16931, EXTENDED-CTC-FR |
Syntaxes: Factur-X PDF/A-3 (CII embedded), CII XML, UBL 2.1 XML (EN 16931 only). 17 files in total.
Results¶
| Profile / syntax | Files | PDF/A-3 | XSD | EN 16931 | BR-FR | Factur-X profile |
|---|---|---|---|---|---|---|
| EN 16931, Factur-X PDF | 3 | pass | pass | pass | pass | pass |
| EN 16931, CII XML | 3 | n/a | pass | pass | pass | pass |
| EN 16931, UBL XML | 3 | n/a | pass | pass | n/a | n/a |
| BASIC WL, Factur-X PDF and CII | 2 | pass | pass | pass | pass | pass |
| EXTENDED-CTC-FR, Factur-X PDF and CII | 6 | pass | pass | pass | pass | see note 1 |
Zero business-rule errors across the corpus. The two remarks the validator raises are explained below, with references so you can check them yourself.
Note 1: FX-SCH-A-000636 on EXTENDED-CTC-FR (validator code list, not a document defect)
Mustang reports Value of ram:ID is not allowed on the specification identifier (BT-24) of every EXTENDED-CTC-FR file. The value we emit is
urn:cen.eu:en16931:2017#conformant#urn.cpro.gouv.fr:1p0:extended-ctc-fr, which is the identifier mandated by the French standard XP Z12-012 (section on BT-24, published by the DGFiP in the external B2B specifications). Mustang 2.26 validates the French BR-FR rules but its Factur-X EXTENDED code list still only contains the generic urn:factur-x.eu:1p0:extended and urn:zugferd.de:2p0:extended values, so the French URN is flagged as unknown. Every other rule on those files, including the 117 BR-FR rules fired on the reverse-charge case, passes. We keep the official URN: a Plateforme Agréée expects it.
Note 2: PEPPOL-EN16931-R008 warning (empty ApplicableHeaderTradeDelivery)
On invoices without delivery information, the CII element ram:ApplicableHeaderTradeDelivery is emitted empty. The CII D16B schema makes it mandatory (cardinality 1..1 in SupplyChainTradeTransactionType, see the Factur-X XSD), so it cannot be omitted; the PEPPOL rule "document must not contain empty elements" was written for UBL and is reported by Mustang as a warning, not an error. The invoice_fr_standard case carries a delivery date and does not trigger it.
The Mustang run also prints German XRechnung notices (BR-DE-*); they only apply to invoices addressed to German public entities and are informational.
Files¶
- Summary:
summary.json - Reports (one Mustang XML report per file):
reports/— replace the file name with any sample name below - Samples, as produced by the API:
invoice_fr_standard: EN 16931 PDF · CII · UBL · EXTENDED-CTC-FR PDF · BASIC WL PDFinvoice_fr_franchise: EN 16931 PDF · CII · UBL · EXTENDED-CTC-FR PDFinvoice_eu_reverse_charge: EN 16931 PDF · CII · UBL · EXTENDED-CTC-FR PDF
Reproduce it¶
Two ways.
Online, no install. Download any PDF above and drop it into the FNFE-MPE validator (the French association's own service, free account) or the ZUGFeRD community validator (runs Mustang). Two independent engines, same files.
Locally, against the live API. Requires Java 17+ and any API key (the Free plan is enough; the run uses 17 documents):
git clone https://github.com/LeBorgneAntoine/Brainstorm
cd Brainstorm/projects/facturx-api
export FACTURX_API_KEY=fx....
uv run python scripts/conformity.py --out /tmp/conformity
The script downloads Mustang-CLI 2.26.0 (SHA-256 pinned), generates the 17 files through POST /v1/invoices/generate, validates each one, and writes summary.md, summary.json and the raw reports. Point --base at another vendor's URL to compare.
What this does not prove¶
- Acceptance by a specific Plateforme Agréée: each PA can apply additional controls (directory lookups, lifecycle statuses, routing). The AIFE / PA sandboxes are not open to third parties at the time of writing; this section will be updated when a PA test result is available.
- Correctness of your data: the engine validates structure and business rules, not whether your amounts or VAT treatment are right for your situation.
- The visual PDF layer: PDF/A-3 conformity is checked; the readability of the human page is a matter of taste, see the samples.