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:
<!-- 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:
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.