Invoir
  1. Home
  2. Guides
  3. Peppol BIS Billing 3.0

Peppol BIS Billing 3.0, explained for developers

Peppol is two things: a network that delivers business documents between access points, and a set of document specifications. Peppol BIS Billing 3.0 is the invoice specification, a UBL file built on EN 16931. Belgium made it the default for invoices between businesses on 1 January 2026.

Updated 19 October 2026

What a Peppol BIS invoice is

The specification, the rules and example files are at docs.peppol.eu, maintained by OpenPeppol. It is updated in regular releases; the current one is the May 2026 release.

How the network works

Peppol is a "four-corner" model. Your software (corner 1) hands the invoice to your access point (corner 2), which looks up the receiver in the Peppol directory (SML/SMP) and delivers it to the receiver's access point (corner 3), which passes it to the buyer's software (corner 4). Sender and receiver can use different providers.

Parties are addressed by a participant identifier: a scheme code from the EAS list plus the identifier. Examples: 0208 with the Belgian enterprise number (KBO/BCE), 9925 with a Belgian VAT number, 0088 with a GLN, 0204 with a German Leitweg-ID. In the invoice they go in the seller's and buyer's cbc:EndpointID with a schemeID attribute.

Invoir creates and validates the invoice file; it is not an access point and does not send through Peppol. To send, you need a Peppol access point provider. OpenPeppol lists the certified ones.

The Peppol rules people hit

A Peppol BIS invoice is checked against the CEN EN 16931 rules for UBL and the Peppol rules. The Peppol ones that fail most:

PEPPOL-EN16931-R010 / R020 Buyer / seller electronic address must be provided
Both cbc:EndpointID elements, each with a schemeID from the EAS list (else PEPPOL-EN16931-CL008).
PEPPOL-EN16931-R003 A buyer reference or purchase order reference must be provided
Either cbc:BuyerReference or cac:OrderReference/cbc:ID.
PEPPOL-EN16931-R004 / R001 / R007 Identifiers
The CustomizationID must start with the Peppol value above, and the ProfileID must be present and approved. Copying a file from another CIUS (such as XRechnung UBL) and forgetting these is a classic.
PEPPOL-EN16931-R120 Line net amount
Must equal quantity × (net price ÷ base quantity) + line charges − line allowances. Rounding the price before multiplying is the usual cause.
PEPPOL-EN16931-R053 Only one tax total with tax subtotals
Exactly one cac:TaxTotal carries the VAT breakdown.

The EN 16931 rules (BR-*, BR-CO-*) are explained on the EN 16931 page.

Where Peppol BIS is used

Peppol BIS API

Validate a Peppol BIS invoice against the official CEN and Peppol Schematron before you hand it to your access point:

curl https://validate.invoir.dev/api/v1/validate \
  -H "Authorization: Bearer inv_YOUR_KEY" \
  -F [email protected]

The report names the rule set version it used (API docs). Generating Peppol BIS XML from JSON is in development. Comparing formats? See ZUGFeRD vs XRechnung vs Factur-X vs Peppol BIS.

Check a file in your browser, or over the API. The free validator runs the official rules (KoSIT, CEN and Peppol Schematron, Mustang, veraPDF) and lists every error with its rule ID. Nothing is stored. The same check is one HTTP call with a free API key: 25 documents a month, no credit card.

Sources

More guides