Rule version and changes
Which rules eRechio validates with, where they come from and what has changed in validation behaviour. The browser validator and the API use the same files.
Current rule version
XRechnung 3.0.2 · KoSIT 2026-08-31 · e17455c9cb03 · in use since 2026-10-21
The identifier is the beginning of the SHA-256 over all rule files (name and checksum). Same identifier = same rules and schemas. Machine-readable: regelstand.json.
Origin
| Source | Version | Licence | Use | SHA-256 of the release file |
|---|---|---|---|---|
| KoSIT validation configuration XRechnung CEN Schematron EN 16931 1.3.16, XRechnung Schematron 3.0.2, scenarios and severity levels, XSD UBL 2.1 and CII D16B | 3.0.2 (Release 2026-08-31) | Apache-2.0 | rules and schemas (shipped) | 2530cd107c414511… |
| KoSIT Validator | 1.6.3 | Apache-2.0 | reference validator in the update test (not shipped) | 799e64befca97d40… |
| KoSIT XRechnung test suite | 3.0.2 (Release 2026-08-31) | Apache-2.0 | valid test invoices in the update test (not shipped) | 1e81ef7563e0fa04… |
| SaxonJS | 2.7.0 | Saxonica licence (free of charge) | runs the Schematron rules (browser: SaxonJS2.rt.js; API: npm saxon-js 2.7.0) | – |
| xmllint-wasm (libxml2) | 5.3.0 | MIT | XSD schema validation (browser and API) | – |
Shipped files
The rules are the Schematron XSLT of the KoSIT configuration, compiled unchanged into the SaxonJS format with xslt3 2.7.0; the schemas are the XSD files of the configuration, bundled per syntax. Hover over a checksum to see it in full.
| File | Size | SHA-256 |
|---|---|---|
/pruefen/regeln/EN16931-CII-validation.sef.json.gz | 212 kB | 2adf7a8c95e29b36… |
/pruefen/regeln/EN16931-UBL-validation.sef.json.gz | 217 kB | dcf46b102c0f024f… |
/pruefen/regeln/KoSIT-README.md | 2 kB | 5be65e76f189eba5… |
/pruefen/regeln/XRechnung-CII-validation.sef.json.gz | 55 kB | 629768b6d19c0215… |
/pruefen/regeln/XRechnung-UBL-validation.sef.json.gz | 62 kB | eee0187dd85745f1… |
/pruefen/regeln/XSD-CII.json.gz | 14 kB | 1d16accd873516f2… |
/pruefen/regeln/XSD-UBL.json.gz | 54 kB | d8942ecb73555f17… |
/pruefen/regeln/szenarien.json | 4 kB | fe2de85468d760f7… |
/pruefen/saxon/SaxonJS2.rt.js | 499 kB | 7704990d3bfd64e6… |
/pruefen/xmldom.js | 277 kB | 7b1ad3ba5455c7c8… |
/pruefen/xsd/index-browser.mjs | 6 kB | 4b87283c88b01bd6… |
/pruefen/xsd/xmllint-browser.mjs | 28 kB | 5f5a2c17be12d398… |
/pruefen/xsd/xmllint.wasm | 779 kB | 4e3cc21a67e8dd40… |
Update test
Before release, every change to rules, schemas, runtime or validation core is tested against valid invoices (KoSIT XRechnung test suite), deliberately broken invoices and the KoSIT reference validator (validator 1.6.3 with the same configuration). Compared are acceptance or rejection and the reported rule codes.
Last run: 2026-10-22 for rule version e17455c9cb03 – passed
| Check | Result |
|---|---|
| Rule version and sources | ✓ checksums of rules, runtime and sources match |
| Valid invoices (test suite) | ✓ 86/86 fully validated |
| Valid invoices in the KoSIT validator | ✓ 86/86 accepted |
| Rule errors against KoSIT (mutations of all standard invoices) | ✓ 514/514 same acceptance and error codes as KoSIT |
| Structural errors against KoSIT (XSD) | ✓ 10/10 structural errors rejected like KoSIT |
| PDF extraction (crafted PDFs) | ✓ 16/16 cases |
| API (same validation core) | ✓ 29/29 tests |
The content and tax correctness of the data is not checked. Schema messages come from libxml2 and are worded differently from the KoSIT validator; only whether a schema error exists is compared.
Changes to validation behaviour
| Date | Area | Change | Effect on results |
|---|---|---|---|
| 2026-10-23 | API Operation | API 1.3.0: the status reports the real state (503 “gestört”, i.e. disrupted, with a reason when no validation is possible). A document is counted only after the response has been sent completely; dropped connections stop the validation even while queued; validations waiting behind expired ones start immediately. | none – results unchanged |
| 2026-10-23 | Validator Usability | Validation in the browser runs in its own background process (Web Worker). The page stays usable even with large invoices, and “Cancel” stops the work immediately. New runtime file: xmldom.js (XML DOM for the background process, MIT). Browsers without worker support validate as before. Checked: 88 of 88 test files with the same result as before. | none – results unchanged |
| 2026-10-22 | Validator and API Traceability | Rule version published: origin, version and SHA-256 of all rule, schema and runtime files are listed on this page and machine-readable in /pruefen/regeln/regelstand.json. Every change to them passes the update test against the KoSIT validator before release. | none – results unchanged |
| 2026-10-22 | Validator Error report | Messages can be filtered by errors, warnings and notices; identical messages at several locations are merged into one entry listing all locations. New button “Download report”: an HTML file created in the browser with file name, time, rule version, scope and the parts not checked. New explanation for PEPPOL-EN16931-R020 (seller electronic address). | none – results unchanged, presentation only |
| 2026-10-21 | Validator and API Scope | XML schema validation added (XSD: UBL 2.1, CII D16B from the KoSIT configuration). The result now has two levels: “rule check passed” (all Schematron rules without errors) and “fully validated” (also schema-valid). Before, a file was called “valid” after the rule check alone, although the schema had not been checked. | Files with structural errors (wrong order, unknown elements, wrong date format) are now reported as errors; in the test 6 of 10 such files that would have passed before. API 1.1.0: new fields vollstaendig_validiert, regelpruefung_bestanden, schemapruefung; valid is deprecated. |
| 2026-10-21 | Validator and API Error handling | If the rule check aborts because of a value in the wrong format (e.g. amount “336,90”), the validator reports ABBRUCH (aborted) with a hint instead of a generic error (API: previously status 500). | affected files only |
| 2026-10-21 | Validator | ZUGFeRD/Factur-X PDF: only embedded files (EmbeddedFile with a file name) are read; known names such as factur-x.xml take precedence. If a PDF contains several invoice files, the validator says so instead of picking one. Unpacking is limited (10 MB per attachment, 40 MB in total, 10 s). | PDFs whose XML is not embedded as an attachment are no longer found; crafted PDFs no longer hang the browser. |
| 2026-10-21 | Validator Usability | Every validation has a job number; the result names the file, and an older result that finishes later is discarded. Running validations can be cancelled. | none – results unchanged |
| 2026-10-12 | Validator and API Extra check | The check digit of the Leitweg-ID (BT-10, ISO 7064 Mod 97-10) is recalculated and reported as a notice. The KoSIT rules do not check it; the notice does not change the result. | additional notice, not an error |
| 2026-10-11 | Validator Notices | ZUGFeRD profiles MINIMUM, BASIC WL, BASIC and EXTENDED are identified instead of only reporting “no validation profile”. These profiles are still validated against EN 16931, as in the KoSIT tool without a matching scenario. | additional notice, result unchanged |
| 2026-10-09 | API First version | API 1.0.0 with the same validation core as the browser validator (Schematron rules, no schema validation). | – |
| 2026-10-08 | Validator First version | Browser validator with the Schematron rules of the KoSIT configuration XRechnung 3.0.2 (release 2026-08-31): EN 16931 1.3.16 and XRechnung 3.0.2, with scenarios and severity levels as in the KoSIT tool. No schema validation at the time. | – |
Changes to the API interface are also listed in the API reference; quick start in English: API.
Technical notes on the data format, not tax or legal advice. Whether VAT rate, supply and amounts are correct in substance is a question for your tax adviser.