Reference
EN 16931 rules, and which ones we check.
When an e-invoice is rejected, what comes back is a rule identifier. This is the full list of the ones this engine reports, rendered from the module the validator actually runs, so it cannot describe something the code does not do.
The list
28 rule groups from EN 16931 and Peppol BIS Billing 3.0 are actively checked, plus 1 check of our own. 9 more cannot be violated through this API, because the totals they constrain are recomputed from the lines rather than accepted from the caller. Rule texts verified against Peppol BIS Billing 3.0 rule list on 2026-08-16.
| Rule | What it requires | Terms | Status | Source |
|---|---|---|---|---|
| BR-01 | specification identifier | BT-24 | By construction | EN 16931 |
| BR-02 | invoice number | BT-1 | Checked | EN 16931 |
| BR-03 | issue date | BT-2 | Checked | EN 16931 |
| BR-04 | invoice type code | BT-3 | Checked | EN 16931 |
| BR-05 | currency code | BT-5 | Checked | EN 16931 |
| BR-06 | seller name | BT-27 | Checked | EN 16931 |
| BR-07 | buyer name | BT-44 | Checked | EN 16931 |
| BR-08 | seller postal address | BG-5 | Checked | EN 16931 |
| BR-09 | seller country code | BT-40 | Checked | EN 16931 |
| BR-10 | buyer postal address | BG-8 | Checked | EN 16931 |
| BR-11 | buyer country code | BT-55 | Checked | EN 16931 |
| BR-12 | sum of line net amounts | BT-106 | By construction | EN 16931 |
| BR-13 | invoice total without VAT | BT-109 | By construction | EN 16931 |
| BR-14 | invoice total with VAT | BT-112 | By construction | EN 16931 |
| BR-15 | amount due for payment | BT-115 | By construction | EN 16931 |
| BR-16 | at least one invoice line | BG-25 | Checked | EN 16931 |
| BR-21 | line identifier | BT-126 | Checked | EN 16931 |
| BR-22 | line quantity | BT-129 | Checked | EN 16931 |
| BR-23 | line unit of measure | BT-130 | Checked | EN 16931 |
| BR-24 | line net amount | BT-131 | Checked | EN 16931 |
| BR-25 | item name | BT-153 | Checked | EN 16931 |
| BR-26 | item net price | BT-146 | Checked | EN 16931 |
| BR-27 | item net price is not negative | BT-146 | Checked | EN 16931 |
| BR-CO-10 | sum of line net amounts equals the lines | BT-106, BT-131 | By construction | EN 16931 |
| BR-CO-13 | total without VAT is consistent | BT-109 | By construction | EN 16931 |
| BR-CO-15 | total with VAT equals total without VAT plus VAT | BT-112, BT-109, BT-110 | By construction | EN 16931 |
| BR-CO-16 | amount due equals total with VAT minus prepaid | BT-115, BT-112, BT-113 | By construction | EN 16931 |
| BR-DEC-* | amounts limited to two decimals | BT-131, BT-110, BT-113 | Checked | EN 16931 |
| BR-CL-* | codelists: currency, country, VAT category, invoice type | BT-5, BT-40, BT-55, BT-3, BT-151 | Checked | EN 16931 |
| BR-S-* | standard rate requires a positive VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| BR-Z-* | zero rate requires a zero VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| BR-E-* | exempt lines require a zero VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| BR-AE-* | reverse charge requires a zero VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| BR-K-* | intra-community supply requires a zero VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| BR-G-* | free export requires a zero VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| BR-O-* | outside the scope of VAT requires a zero VAT rate | BT-151, BT-152 | Checked | EN 16931 |
| PEPPOL-EN16931-R120 | line net amount agrees with quantity times item net price | BT-131, BT-129, BT-146 | Checked | Peppol BIS Billing 3.0 |
| ATW-PREPAID-EXCEEDS-TOTAL | prepaid amount does not exceed the invoice total | BT-113, BT-115 | Checked | AgentToolWorks |
A rule links to a page only where we have written a real diagnosis and fix for it. The rest are listed without a link on purpose: a page generated from this same table would tell you nothing the table has not already told you, and we would rather have a short reference that is worth reading than a long one that is not.
How to read the status column
- Checked. A code path can report this rule as violated. If your document breaks it, you will see it in the response with the value we actually saw.
- By construction. The rule constrains a number we derive rather than accept. Every total is recomputed from the lines, so a document produced here cannot contradict itself. These are listed rather than hidden, because a coverage claim that quietly drops them is a coverage claim you cannot check.
The source column matters more than it looks. EN 16931 is the European semantic standard; Peppol BIS Billing 3.0 layers its own rules on top and is what most European networks actually validate against. They are routinely spoken of as one thing, which is how a sender ends up searching the wrong specification for an identifier that is not in it.
Questions people actually ask
- What does a rule identifier like BR-09 actually mean?
- It names one requirement in the European e-invoicing standard. BR-09 says the seller's postal address has to carry a country code. When a validator rejects your invoice it reports the identifier rather than a sentence, because the identifier is the same in every tool and every language.
- Is passing this validator the same as being EN 16931 compliant?
- No, and anyone telling you otherwise is selling something. The norm has roughly 150 rules plus national extensions. This engine checks a documented subset, listed on this page with a status against each rule. Passing means no checked rule was broken.
- What does "satisfied by construction" mean?
- The rule constrains a value we compute rather than accept. The rules on document totals, for example, require the totals to agree with the lines; we derive the totals from the lines, so they cannot come out disagreeing. Those rules are listed because leaving them out would understate the coverage and including them as "checked" would overstate it.
- Why is one rule prefixed ATW rather than BR?
- Because we check something the standards do not name. A prepaid amount larger than the invoice total gives a negative amount due, which is nearly always an error worth flagging, but no rule in EN 16931 or Peppol forbids it. Reporting it under a borrowed identifier would send a reader to a specification page that says something else.