ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

CVR — the Danish central business register

The CVR (Centralt Virksomhedsregister), operated by Erhvervsstyrelsen since 1990, is the identity pivot of the entire Danish economy: 8 unique digits per entity, native integration in PEPPOL via ICD 0184, free public API and complete access to company records. No Danish e-invoice exists without an issuing CVR and a receiving CVR.

History — from Handelsregister to modern CVR

The Danish business register originates in the 19th-century Handelsregister maintained by the courts. Several successive modernisations led to the current CVR:

  • 1862: creation of local commercial registers maintained by Skifteretter (succession/commercial courts).
  • 1973: centralisation at the Aktieselskabs-Registeret (register of public limited companies), precursor to the CVR.
  • 1990: Lov nr. 417 om Det Centrale Virksomhedsregister creates the modern CVR — unique 8-digit identifier for all Danish legal entities.
  • 1995: coverage extended to all sole proprietorships (Enkeltmandsvirksomhed) registered with Skat.
  • 2003: public opening of CVR.dk with consumer search engine.
  • 2010: IT- og Telestyrelsen becomes Erhvervsstyrelsen, CVR brought under a single authority.
  • 2018: free public REST API launched to facilitate the ecosystem of accounting publishers.
  • 2024: native CVR-PEPPOL integration — ICD 0184 progressively replaces the former legacy ICD 0096 / GLN 0088.

The CVR number — format and rules

The CVR number is an 8-decimal-digit identifier sequentially assigned by Erhvervsstyrelsen:

  • Format: NNNNNNNN (exactly 8 digits, no dash, no space in canonical representation).
  • Range: 10,000,000 → 99,999,999 (numbers < 10M are historical reserved codes).
  • No checksum: unlike the French or Belgian VAT number, the CVR does not embed a mathematical control digit. Any verification must go through the API.
  • DK prefix for VAT: in the intra-EU context, the CVR becomes SE-nummer by adding "DK" (e.g. DK12345678).
  • Persistence: the CVR survives the dissolution of a business and remains reserved for historical traceability.

P-numre — production units

A business (CVR) can have several physical production units (branches, factories, depots). Each unit receives a P-nummer (Production unit number) of 10 digits assigned by Erhvervsstyrelsen:

  • Format: 10 decimal digits (often starting with 100 or 101).
  • Addressability: each P-nummer has its own postal address, enabling invoicing to different sites of the same legal entity.
  • E-invoice use: a recipient can be identified by P-nummer rather than CVR if invoicing is addressed to a specific site (e.g. Novo Nordisk pharmaceutical factories at Måløv vs Bagsværd).
  • ICD: P-nummer uses ICD 0096 (Denmark Producer numbers) rather than 0184 (CVR).

CVR in PEPPOL — ICD 0184

In the PEPPOL directory (SMP), a Danish entity declares itself with its CVR under the scheme 0184:

xml cvr-peppol-xml-snippet.xml
<!-- PartyIdentification in an OIOUBL/PEPPOL invoice -->
<cac:PartyIdentification>
  <cbc:ID schemeID="0184">12345678</cbc:ID>
</cac:PartyIdentification>

<!-- EndpointID for PEPPOL routing -->
<cbc:EndpointID schemeID="0184">12345678</cbc:EndpointID>

<!-- Corresponding VAT identifier (SE-nummer) -->
<cac:PartyTaxScheme>
  <cbc:CompanyID schemeID="DK:CVR">DK12345678</cbc:CompanyID>
  <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>

Free public CVR API

Erhvervsstyrelsen exposes several free public APIs to consult the CVR:

  • CVR Online API (cvrapi.dk) — free JSON REST service up to 1,000 requests/day, more with authentication.
  • DataCVR API (datacvr.virk.dk) — official ERST API with OAuth 2.0 authentication, full access (owners, balance sheets, annual XBRL accounts).
  • Virk.dk API — business overlay for banking and software integrations.
  • SOLR/ElasticSearch CVR — full-text search endpoint over all company records.

Example request:

http cvrapi-request-response.http
GET https://cvrapi.dk/api?country=dk&search=12345678 HTTP/1.1
Accept: application/json
User-Agent: ediverse.io v1 (contact@ediverse.io)

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
  "vat": 12345678,
  "name": "Eksempel A/S",
  "address": "Vesterbrogade 1",
  "zipcode": "1620",
  "city": "København V",
  "protected": false,
  "phone": "+45 33 14 22 14",
  "email": "kontakt@eksempel.dk",
  "fax": null,
  "startdate": "1995-04-12",
  "enddate": null,
  "employees": "10-19",
  "addressco": null,
  "industrycode": 581900,
  "industrydesc": "Anden udgivelse af bøger, brochurer mv.",
  "companycode": 80,
  "companydesc": "Aktieselskab",
  "creditstartdate": "1995-04-12",
  "creditstatus": 1,
  "creditbankrupt": false,
  "owners": [],
  "productionunits": [
    {
      "pno": 1003456789,
      "main": true,
      "name": "Eksempel A/S - Hovedkontor",
      "address": "Vesterbrogade 1",
      "zipcode": "1620",
      "city": "København V",
      "startdate": "1995-04-12",
      "employees": "10-19"
    }
  ]
}

Monthly OpenData — DataCVR

In addition to the live API, Erhvervsstyrelsen publishes a full dump of the CVR every month in several formats:

  • JSON-LD — for semantic and knowledge graph uses
  • CSV — for researchers and statistical analyses
  • XBRL — for published annual accounts of companies required to file
  • Delta API — daily differential feed to stay up to date

These data feed a large number of third-party services: Proff (financial analysis), Bisnode (credit scoring), Greens Analyse, KOMPASS DK, etc.