Danish e-invoice validator: OIOUBL 2.1

Check an OIOUBL invoice, credit note or reminder before it goes on NemHandel: the UBL 2.1 schema and the OIOUBL Schematron rules, with every finding on its line. Peppol BIS invoices with the Danish rules work too, and nothing is uploaded.

E-invoicing in Denmark in short

Invoices to the Danish public sector are electronic: they travel on NemHandel, the Danish e-invoicing infrastructure, and 99% of them arrive as e-invoices. The format is OIOUBL, the Danish adaptation of UBL (version 2.1 since 2022), or Peppol BIS Billing 3.0.

Between businesses e-invoicing is not required. Instead, the bookkeeping act has made digital bookkeeping systems mandatory step by step from 2022 to 2026, and these systems must be able to send and receive e-invoices. Under Executive Order 811 of 22 September 2026, registered systems let their users confirm their identity with MitID and show the e-invoice option by 1 March 2027, with the remaining requirements from 1 January 2028; a business is then signed up to receive e-invoices unless it declines within four weeks. Cross-border invoices between EU businesses become electronic by 1 July 2030 at the latest, under the ViDA directive.

How to check an OIOUBL document

  1. Open the validator with the OIOUBL invoice profile, or the credit note or reminder one. A file with the CustomizationID OIOUBL-2.1 picks the right one by itself.
  2. Paste the XML or drop the file, then press Validate.
  3. Click a rule id for what it checks.

What is checked

The UBL 2.1 schema, then NemHandel's OIOUBL Schematron 1.17.2. The rules name themselves in their messages, F- for errors and W- for warnings, and that is how they are shown here: the CustomizationID and profile (F-LIB002), an order reference for the profiles that need one (F-INV002), the payable amount against the totals (F-INV133), amounts with two decimals (F-INV149), the tax currency (F-INV016), party identifiers such as CVR and EAN numbers, and the code lists.

A Peppol BIS Billing 3.0 invoice runs the Peppol rules, which have Danish rules for Danish suppliers and customers, such as the CVR number (DK-R-002, DK-R-014).

Profiles to check with

Rules invoices break most

Each one has a page with what it checks, its test and, for many, how to fix it.

  • F-LIB002: Invalid CustomizationID. Must be either 'OIOUBL-2.01', 'OIOUBL-2.02' or 'OIOUBL-2.1'
  • F-INV002: There must be an OrderReference class for this profileID
  • F-INV133: PayableAmount is calculated incorrectly - PayableAmount ('…' ) don't match total calculation ('…' )
  • F-INV149: Invalid LineExtensionAmount. Must have at least 2 decimals
  • F-INV016: TaxCurrencyCode must be either DKK or EUR
  • DK-R-002: Danish suppliers MUST provide legal entity (CVR-number)
  • DK-R-014: For Danish Suppliers it is mandatory to specify schemeID as "0184" (DK CVR-number) when PartyLegalEntity/CompanyID is used for AccountingSupplierParty

Questions

Is the invoice uploaded?

No. The schema check and the rules both run in your browser. Only the API and URL monitors validate on our servers.

Why do the rule ids look like F-INV133?

OIOUBL's Schematron puts its rule id and level at the start of each message, such as [F-INV133]. We use that id for the rule and its page, and F or W for its level.

Which version of the rules is used?

The OIOUBL Schematron 1.17.2 (May 2026). A weekly check tells us when a newer release is out.

Can I check invoices from code?

Yes: the API and the command-line client with --schema dk-oioubl-invoice, or --schema auto for a folder of mixed documents.

Official sources

Other countries