How to check the business rules
- Open the validator and paste, drop or fetch the invoice.
- Expand Validate against a schema, open the Catalog tab and pick the profile: EN 16931 (UBL or CII), Peppol BIS Billing 3.0, XRechnung (UBL or CII), a Factur-X profile, one of the Peppol ordering documents or an EPUB package document.
- Press Validate. The schema is checked first; when it passes, the rules run and each failed rule is listed with its id and line.
What Schematron adds
A schema says which elements exist and what they may contain. Schematron (ISO/IEC 19757-3) says what must be true of the content: that the total with VAT equals the total without VAT plus the VAT (BR-CO-15), that a code comes from the right list (BR-CL-25), that a Peppol invoice names its business process (PEPPOL-EN16931-R001). A document can match the UBL schema and still be rejected by an access point for breaking one of these. Every rule the validator checks has a page of its own.
Which rules are included
- EN 16931 1.3.17, published by the European Commission and CEN/TC 434 for UBL and CII, on the EN 16931 profiles. Peppol, XRechnung and the French profiles run 1.3.16 with their own rules, the release their publishers name, and move when they do.
- Peppol BIS Billing 3.0 3.0.21, by OpenPeppol, run after the EN 16931 rules, including the national rules of Denmark, Germany, Greece, Iceland, Italy, the Netherlands, Norway and Sweden.
- XRechnung 3.0 (rules 2.6.0), by KoSIT, run after the EN 16931 rules, for UBL and CII.
- France (XP Z12-012), the French rules (BR-FR-*) by FNFE-MPE, release 1.4.0.04, run after the EN 16931 rules, for UBL invoices and credit notes, CII and Factur-X (BASIC WL, EN 16931, EXTENDED), and the EXTENDED-CTC-FR rules for invoices beyond EN 16931.
- Peppol ordering and logistics (BIS upgrade-3), by OpenPeppol: Order, Order Response, Order Change, Order Cancellation, Despatch Advice, Catalogue, Catalogue Response, Invoice Response and Message Level Response.
- Factur-X / ZUGFeRD 1.09, by FNFE-MPE: the rules of each profile (MINIMUM, BASIC WL, BASIC, EN 16931 and EXTENDED), with their code lists, run on the invoice XML. Drop the PDF itself in the validator and the XML attached to it is opened, with the profile it names.
- EPUB package documents (EPUB 3 and EPUB 2 OPF), with the Schematron rules epubcheck ships, such as the one nav document an EPUB 3 package must declare.
The rule files are used as published and run with Saxon (SaxonJS), like the official validators. Each one is listed, with its licence and source, on its catalog page. One thing changes when they are compiled: IBAN check digits are worked out digit by digit, because SaxonJS can't hold a whole IBAN as one exact number and would reject valid ones.
We compared the results with the KoSIT validator (1.6.3, XRechnung configuration of 2026-08-31) on the 86 invoices of the XRechnung test suite and 80 EN 16931 invoices from the ZUGFeRD corpus: the verdict was the same for every one, and so were the rules reported, apart from the wording of schema errors (libxml2 rather than Xerces).
For Peppol BIS Billing, we ran the 573 test documents in OpenPeppol's repository (its unit tests, examples and snippets) through the EN 16931 and Peppol rules with Saxon-HE 12.9 for Java as well: both reported the same rules, at the same level, for every document.
Good to know
- The rules run only when the document matches the schema, as in the KoSIT validator: fix the schema errors first.
- They need the whole document in memory, so they run on documents up to 50 MB; larger ones get the schema check with a note.
- Your own rules can be added under Business rules (Schematron) in the validator: ISO Schematron with the files it includes, up to 1 MB, with the xslt2 or xslt3 query binding (XPath 1.0 rules usually work too). The browser can't compile Schematron, so the .sch file is compiled on our server; your documents stay in the browser. The API and the command-line client take the same rules (
rules_file,--rules). - For XRechnung, rule levels follow the KoSIT validator configuration for the scenario the invoice declares (standard, Extension or CVD), so a rule KoSIT lowers to a warning doesn't fail the invoice here either. KoSIT's "information" level shows as a warning.
In CI, from code and on a schedule
The same rules run through the API, the command-line client and GitHub Action by the catalog name, and in Pro URL monitors:
npx @xmlvalid/cli validate "out/**/*.xml" --schema peppol-bis-3-invoice
From the catalog
Official schemas with all their files in place. Open one to see what it checks, or validate against it straight away.
- EN 16931 Invoice (UBL): A UBL invoice checked against the schema and the business rules of the European e-invoicing standard EN 16931: mandatory fields, code lists and totals.
- EN 16931 Credit Note (UBL): A UBL credit note checked against the schema and the EN 16931 business rules.
- EN 16931 Invoice (CII): A Cross Industry Invoice checked against the D16B schema and the EN 16931 business rules: the XML inside Factur-X and ZUGFeRD (EN 16931 profile).
- Peppol BIS Billing 3.0 Invoice: A Peppol invoice checked the way an access point does: UBL 2.1 schema, EN 16931 rules and the Peppol BIS Billing 3.0 rules.
- Peppol BIS Billing 3.0 Credit Note: A Peppol credit note checked against the UBL 2.1 schema, the EN 16931 rules and the Peppol BIS Billing 3.0 rules.
- France e-invoice (UBL): An invoice for the French e-invoicing reform in UBL syntax, checked against the UBL 2.1 schema, the EN 16931 rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France e-invoice (CII): An invoice for the French e-invoicing reform in CII syntax, checked against the CII D22B schema, the EN 16931 rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France Factur-X EN 16931: The XML of a Factur-X invoice for the French e-invoicing reform, checked against the Factur-X EN 16931 schema and rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France e-credit note (UBL): A credit note for the French e-invoicing reform in UBL syntax, checked against the UBL 2.1 CreditNote schema, the EN 16931 rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France EXTENDED-CTC-FR (UBL): An invoice in the French EXTENDED-CTC-FR profile in UBL syntax, checked against the UBL 2.1 schema, the EXTENDED-CTC-FR rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France EXTENDED-CTC-FR (CII): An invoice in the French EXTENDED-CTC-FR profile in CII syntax, checked against the CII D22B schema, the EXTENDED-CTC-FR rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France Factur-X EXTENDED: The XML of a Factur-X EXTENDED invoice for the French e-invoicing reform, checked against the Factur-X EXTENDED schema and rules and the French rules (BR-FR-*) published by FNFE-MPE.
- France Factur-X BASIC WL: The XML of a Factur-X BASIC WL invoice for the French e-invoicing reform, checked against the Factur-X BASIC WL schema and rules and the French rules (BR-FR-*) published by FNFE-MPE.
- Croatia eRačun Invoice (UBL): A Croatian eRačun for Fiskalizacija 2.0, checked against the UBL 2.1 schema, the EN 16931 rules and the Croatian rules (HR-BR-*) published by the Tax Administration.
- Croatia eRačun Credit Note (UBL): A Croatian eRačun credit note (odobrenje) for Fiskalizacija 2.0, checked against the UBL 2.1 CreditNote schema, the EN 16931 rules and the Croatian rules (HR-BR-*).
- Romania RO e-Factura Invoice (UBL): A Romanian RO e-Factura invoice, checked against the UBL 2.1 schema and the CIUS-RO rules (EN 16931 and BR-RO-*) the Ministry of Finance publishes for ANAF's validator.
- Romania RO e-Factura Credit Note (UBL): A Romanian RO e-Factura credit note, checked against the UBL 2.1 CreditNote schema and the CIUS-RO rules (EN 16931 and BR-RO-*) the Ministry of Finance publishes for ANAF's validator.
- PINT UAE Invoice: A Peppol PINT UAE invoice for United Arab Emirates, checked against the UBL 2.1 schema, the PINT Billing rules and the UAE rules OpenPeppol publishes.
- PINT UAE Credit Note: A Peppol PINT UAE credit note for United Arab Emirates, checked against the UBL 2.1 schema, the PINT Billing rules and the UAE rules OpenPeppol publishes.
- PINT SG Invoice: A Peppol PINT SG invoice for Singapore, checked against the UBL 2.1 schema, the PINT Billing rules and the Singapore rules OpenPeppol publishes.
- PINT SG Credit Note: A Peppol PINT SG credit note for Singapore, checked against the UBL 2.1 schema, the PINT Billing rules and the Singapore rules OpenPeppol publishes.
- PINT JP Invoice: A Peppol PINT JP invoice for Japan, checked against the UBL 2.1 schema, the PINT Billing rules and the Japanese rules OpenPeppol publishes.
- PINT A-NZ Invoice: A Peppol PINT A-NZ invoice for Australia and New Zealand, checked against the UBL 2.1 schema, the PINT Billing rules and the Australia and New Zealand rules OpenPeppol publishes.
- PINT A-NZ Credit Note: A Peppol PINT A-NZ credit note for Australia and New Zealand, checked against the UBL 2.1 schema, the PINT Billing rules and the Australia and New Zealand rules OpenPeppol publishes.
- PINT MY Invoice: A Peppol PINT MY invoice for Malaysia, checked against the UBL 2.1 schema, the PINT Billing rules and the Malaysian rules OpenPeppol publishes.
- PINT MY Credit Note: A Peppol PINT MY credit note for Malaysia, checked against the UBL 2.1 schema, the PINT Billing rules and the Malaysian rules OpenPeppol publishes.
- XRechnung 3.0 Invoice (UBL): The German e-invoice in UBL syntax, checked against the UBL 2.1 schema, the EN 16931 rules and the XRechnung rules (BR-DE-*).
- XRechnung 3.0 Credit Note (UBL): A German XRechnung credit note in UBL syntax, checked against the UBL 2.1 CreditNote schema, the EN 16931 rules and the XRechnung rules (BR-DE-*).
- XRechnung 3.0 Invoice (CII): The German e-invoice in CII syntax (also the XML of ZUGFeRD XRECHNUNG profile), checked against the D16B schema, the EN 16931 rules and the XRechnung rules.
- FatturaPA 1.2.3: The Italian e-invoice: the XML that invoices to the public administration, between businesses and to consumers are sent in through the SdI (Sistema di Interscambio), checked against the schema and the SdI's own checks on the file.
- FatturaPA simplified 1.0.2: The Italian simplified e-invoice (fattura semplificata, art. 21-bis DPR 633/72) sent through the SdI, checked against the schema and the SdI's own checks on the file.
- Factur-X / ZUGFeRD EN 16931: The XML inside a Factur-X or ZUGFeRD PDF, in the profile that matches the European standard EN 16931, checked against the profile schema and the Factur-X EN 16931 rules.
- Factur-X / ZUGFeRD EXTENDED: The Factur-X and ZUGFeRD profile with more data than EN 16931, for industries that need it.
- Factur-X / ZUGFeRD BASIC: The Factur-X and ZUGFeRD profile with invoice lines and a subset of EN 16931.
- Factur-X / ZUGFeRD BASIC WL: The Factur-X and ZUGFeRD profile with header data and totals but no invoice lines.
- Factur-X / ZUGFeRD MINIMUM: The smallest Factur-X profile: invoice number, parties and totals.
- Peppol Order: A Peppol order (BIS Ordering 3), checked against the UBL 2.1 schema and the Peppol order rules.
- Peppol Order Response: A Peppol order response, checked against the UBL 2.1 schema and the Peppol rules.
- Peppol Order Change: A Peppol order change, checked against the UBL 2.1 schema and the Peppol rules.
- Peppol Order Cancellation: A Peppol order cancellation, checked against the UBL 2.1 schema and the Peppol rules.
- Peppol Despatch Advice: A Peppol despatch advice, checked against the UBL 2.1 schema and the Peppol rules.
- Peppol Catalogue: A Peppol catalogue, checked against the UBL 2.1 schema and the Peppol rules.
- Peppol Catalogue Response: The buyer's answer to a Peppol catalogue, checked against the UBL 2.1 schema and the Peppol rules.
- Peppol Invoice Response: The buyer tells the seller what happened to a Peppol invoice: received, accepted, rejected, paid.
- Peppol Message Level Response: The technical acknowledgement of a Peppol message: accepted, or rejected with the failed rules.
- EPUB 3 package document: The package document of an EPUB 3 book: metadata, manifest and spine, checked with the grammar and rules epubcheck uses.
- EPUB 2 OPF 2.0.1: The content.opf of an EPUB 2 book, checked with the grammar and rules epubcheck uses.
Questions
Is my invoice uploaded?
No. In the browser the schema check and the rules both run on your machine. Only the API and URL monitors validate on our servers.
Can I upload my own Schematron file?
Yes, in the validator, under Business rules (Schematron): an ISO Schematron file, with the files it includes, up to 1 MB, alone or after a schema. The rules are compiled on our server and kept for a week; the document is still checked in your browser. The API, the command-line client and the GitHub Action take the same rules, and on Pro, rules kept with a saved schema run wherever it is used, URL monitors included.
Why were the rules not checked?
They run only when the document matches the schema and is at most 50 MB. The result says which of the two applied.
Is this the same as the Peppol or KoSIT validator?
It runs the same published rule files with Saxon, and we compared the findings with the KoSIT validator and with Saxon for Java on several hundred test invoices (see above). For XRechnung, the levels of the KoSIT configuration (2026-08-31) are applied too, so the verdict matches the KoSIT validator.
Other schema languages
- XSD validator (XML Schema)
- DTD validator (Document Type Definition)
- RelaxNG validator (RelaxNG)