OIOUBL 3.0 — the Danish format for NemHandel
OIOUBL is the Danish CIUS (Core Invoice Usage Specification) built on OASIS UBL 2.1. Launched in 2008 to replace OIOXML, the 3.0 version released in late 2024 by Erhvervsstyrelsen is the most significant evolution in 16 years — strict EN 16931 alignment, removal of legacy pre-UBL semantics, opening to PEPPOL extension mechanisms.
History — from OIOXML to OIOUBL 3.0
The Danish format evolution follows five milestones:
- 2003-2007 — OIOXML: proprietary XML schema developed by Statens IT and IT- og Telestyrelsen. Very Denmark- specific, weakly internationally interoperable.
- 2008 — OIOUBL 2.01: migration to OASIS UBL 2.0, preserving semantics but moving to standard OASIS schemas.
- 2010 — OIOUBL 2.02: UBL 2.1 alignment, addition of OrdSim and CatSim profiles for public procurement.
- 2018 — Annex OIOUBL-PEPPOL: mapping table to enable automatic OIOUBL ↔ PEPPOL-BIS 3.0 translation.
- 2024 — OIOUBL 3.0: major overhaul, strict EN 16931 alignment, removal of legacy OIOXML fields, XBRL extension mechanisms for accounting reporting.
Positioning vs UBL and EN 16931
OIOUBL 3.0 is technically a restrictive superset of the EN 16931 standard:
- Restrictive (Core): implements the 192 terms of the EN 16931 semantic model, with mandatory BR-* rules.
- Superset (DK extensions): adds ~40 Danish fields for public invoicing (FIK references, ContractDocumentReference with specific "Konteringsstreng" format).
For purely DK ↔ DK flows, OIOUBL is recommended. For DK ↔ EU cross-border B2G flows, PEPPOL-BIS 3.0 remains preferable because OIOUBL extensions are not guaranteed to be preserved by foreign access points.
The OIOUBL 3.0 profiles
OIOUBL distinguishes several profiles (ProfileID) by business use case:
- Procurement-BilSim-1.0 — simple invoice (most frequent case)
- Procurement-BilAdv-1.0 — advanced invoice with prior OrderResponse
- Procurement-OrdSim-1.0 — simple purchase order
- Procurement-OrdAdv-1.0 — advanced purchase order with negotiated response
- Procurement-CatSim-1.0 — simple catalogue
- Procurement-CatAdv-1.0 — advanced catalogue with differential updates
- Procurement-ReminderSim-1.0 — payment reminder
Specific BR-DK-* rules
OIOUBL 3.0 enriches the EN 16931 business rules (BR-01 to BR-65, BR-S-01 to BR-AE-10) with approximately 140 rules specific to the Danish context, named BR-DK-01 to BR-DK-140:
- BR-DK-01: The PartyIdentification scheme ID must be "0184" (DK:CVR).
- BR-DK-02: The CompanyID in PartyTaxScheme must start with "DK" followed by 8 digits.
- BR-DK-15: For InvoiceTypeCode 380, 381 and 384, the mention "Faktura" / "Kreditnota" / "Korrigeret faktura" is expected in Note.
- BR-DK-22: Payment codes FIK 04/15/71/73 must be declared in PaymentMeans/InstructionID with a Kreditor identifier (8 digits).
- BR-DK-40: The TaxCategory ID must belong to the DK list: S, Z, E, AE, K, G, O.
- BR-DK-65: For invoices > 100,000 DKK, a ContractDocumentReference must be present (public procurement contract reference).
Example — minimal OIOUBL 3.0 invoice
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>OIOUBL-3.0</cbc:CustomizationID>
<cbc:ProfileID>Procurement-BilSim-1.0</cbc:ProfileID>
<cbc:ID>2026-DK-00042</cbc:ID>
<cbc:IssueDate>2026-05-20</cbc:IssueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>DKK</cbc:DocumentCurrencyCode>
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0184">12345678</cbc:EndpointID>
<cac:PartyIdentification>
<cbc:ID schemeID="0184">12345678</cbc:ID>
</cac:PartyIdentification>
<cac:PartyName><cbc:Name>Eksempel A/S</cbc:Name></cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Vesterbrogade 1</cbc:StreetName>
<cbc:CityName>København</cbc:CityName>
<cbc:PostalZone>1620</cbc:PostalZone>
<cac:Country><cbc:IdentificationCode>DK</cbc:IdentificationCode></cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID schemeID="DK:CVR">DK12345678</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0184">87654321</cbc:EndpointID>
<cac:PartyIdentification>
<cbc:ID schemeID="0184">87654321</cbc:ID>
</cac:PartyIdentification>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="DKK">250.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="DKK">1000.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="DKK">250.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="DKK">1000.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="DKK">1000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="DKK">1250.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="DKK">1250.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
</Invoice> Migration from OIOUBL 2.02
ERST publishes an official Migration Guide (v3.0, November 2024) detailing breaking changes to anticipate:
- Modified CustomizationID: from
OIOUBL-2.02toOIOUBL-3.0. - Removed PartyLegalEntity/CompanyID: all legal identity fields must now use PartyTaxScheme.
- Removed legacy DeliveryTerms: replaced by Delivery/DeliveryLocation with EN 16931 standard Incoterms.
- Rewritten Schematron rules: integrated into the NemHandel validation engine and SBR Service.
- Coexistence period: NemHandel accepts OIOUBL 2.02 and 3.0 until 31 December 2026, after which only 3.0 will be received.
Coexistence with PEPPOL-BIS 3.0
Since 2018, Denmark has accepted both formats side by side:
- OIOUBL 3.0 recommended for internal B2G flows and Bogføringsloven accounting (preservation of Danish extensions).
- PEPPOL-BIS 3.0 recommended for EU cross-border flows and non-Danish European suppliers.
- DK PEPPOL access points (Visma, Pagero, etc.) perform automatic OIOUBL ↔ PEPPOL-BIS translation based on origin and destination.
- OIOUBL retains the 0184 identifier (DK:CVR) — the same as that used in PEPPOL for Denmark, ensuring reversibility.