CVR API: Den komplette guide til at hente virksomhedsdata programmatisk

Sådan får I adgang til CVR's API, hvad I kan hente, og hvor rå registerdata slipper op. Den ærlige guide fra folk, der arbejder med registerdata hver dag.

Leder I efter en måde at slå virksomheder op automatisk i stedet for at klikke rundt på Virk? Så er I havnet det rette sted. Her får I den korte, ærlige version af, hvordan CVR's API fungerer, hvordan I får adgang, og hvad I skal være opmærksomme på, før I bygger noget vigtigt ovenpå.

Vi arbejder selv med registerdata hver eneste dag, så vi kender både styrkerne og de skjulte faldgruber. Begge dele får I her.

Hvad er CVR API'et?

CVR API'et er Erhvervsstyrelsens system-til-system-adgang til Det Centrale Virksomhedsregister. Det giver jer mulighed for at hente stamdata om alle registrerede danske virksomheder direkte ind i jeres egne systemer: navn, adresse, virksomhedsform, branchekode, startdato, antal ansatte, personkreds, tegningsregler og mere.

Adgangen er gratis, og data kommer direkte fra kilden. Det er det åbenlyse udgangspunkt, hvis I vil automatisere virksomhedsopslag i Danmark.

Teknisk set er løsningen bygget på Elasticsearch, i skrivende stund version 6.8, som nåede end-of-life hos Elastic tilbage i 2022. I søger i registret via et RESTful API med Elasticsearch Query DSL mod distribution.virk.dk (fx endpointet /cvr-permanent/virksomhed/_search), ikke via klassiske REST-endpoints med pæne parametre. Det vender vi tilbage til.

Bemærk i øvrigt: Googler I "CVR API", rammer I typisk en håndfuld tredjeparts-API'er, der har bygget et pænere lag ovenpå de samme registerdata. De løser interface-problemet, men ikke dataproblemet. Mere om den forskel senere.

Sådan får I adgang

  1. Skriv til Erhvervsstyrelsen. Adgang anmodes via mail til cvrselvbetjening@erst.dk. Der er ingen selvbetjeningsformular med straksadgang, så indregn sagsbehandlingstid.
  2. Underskriv erklæringen. I skal skrive under på, at I overholder betingelserne for reklamebeskyttede enheder. Kort fortalt: virksomheder, der har frabedt sig henvendelser, må ikke kontaktes på baggrund af data fra registret.
  3. Modtag jeres adgangsoplysninger. I får credentials til distribution.virk.dk, hvor I kan søge i CVR-data via Elasticsearch. Adgangen er ren læseadgang til søgninger.
  4. Læs dokumentationen grundigt. Erhvervsstyrelsen yder ikke support på Elasticsearch-delen. De henviser til Elasticsearchs egen dokumentation, anbefaler korte scroll-vinduer og små batch-størrelser ved masseudtræk, og de forbeholder sig retten til midlertidigt at spærre jeres adgang, hvis jeres forespørgsler belaster deres drift.

Alternativt findes der adgang til CVR-tjenester via Datafordeleren. Vær dog opmærksomme på, at Datafordelerens CVR REST-tjenester er under udfasning: de lukker 15. januar 2027 til fordel for GraphQL, så start ikke et nyt projekt på dem. For de fleste er system-til-system-adgangen via distribution.virk.dk hovedvejen.

Hvordan ser et opslag ud i praksis?

Her er et minimalt Python-eksempel på det mest almindelige: Slå en virksomhed op på CVR-nummer og hent udvalgte stamdata. Bemærk, at I selv vælger felterne med _source. Svaret er ellers et stort, nestet JSON-dokument.

import requests

AUTH = ("brugernavn", "adgangskode")  # udleveres af Erhvervsstyrelsen

query = {
    "_source": [
        "Vrvirksomhed.cvrNummer",
        "Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn",
        "Vrvirksomhed.status",
        "Vrvirksomhed.sidstOpdateret",
    ],
    "query": {"term": {"Vrvirksomhed.cvrNummer": "37677892"}},  # Risika A/S
}

r = requests.post(
    "https://distribution.virk.dk/cvr-permanent/virksomhed/_search",
    json=query, auth=AUTH, timeout=30,
)
r.raise_for_status()

for hit in r.json()["hits"]["hits"]:
    print(hit["_source"])

Årsrapporter ligger i et separat indeks, offentliggoerelser. Her søger I på samme måde, og svaret viser med det samme, hvorfor regnskabsdata er sit eget projekt:

query = {
    "_source": ["cvrNummer", "offentliggoerelsesTidspunkt", "dokumenter"],
    "query": {"term": {"cvrNummer": 37677892}},
    "sort": [{"offentliggoerelsesTidspunkt": {"order": "desc"}}],
}

r = requests.post(
    "https://distribution.virk.dk/offentliggoerelser/_search",
    json=query, auth=AUTH, timeout=30,
)

for hit in r.json()["hits"]["hits"]:
    for dok in hit["_source"]["dokumenter"]:
        if "AARSRAPPORT" in dok["dokumentType"]:
            print(dok["dokumentMimeType"], dok["dokumentUrl"])

# application/xml       -> XBRL-data, klar til parsing
# application/xhtml+xml -> iXBRL (nyere regnskaber)
# application/pdf       -> kun et dokument, ingen strukturerede tal
# image/tiff            -> ja, scannede årsrapporter findes stadig

To ting, vi selv har lært på den hårde måde:

  • Masseudtræk: Skal I hente mange virksomheder, så brug Elasticsearchs scroll-API med korte scroll-vinduer (?scroll=1m), sortér på _doc og hold batch-størrelsen nede. Det er præcis dét, Erhvervsstyrelsen beder om, og det holder jer fri af spærringer.
  • Tidszoner: CVR-stamdata leverer tidsstempler i dansk lokaltid, mens regnskabsindekset svarer i UTC. Den forskel har kostet mange udviklere en all-nighter.

Hvad kan I hente?

  • Stamdata: CVR-nummer, navn, binavne, adresse, virksomhedsform, status (aktiv, under konkurs, ophørt)
  • Branche: Hoved- og bibrancher med branchekoder
  • Personkreds: Direktion, bestyrelse, stiftere og tegningsregler
  • Produktionsenheder: P-numre og deres adresser
  • Historik: Ændringer over tid, fx adresseflytninger og ledelsesskift
  • Antal ansatte: Intervaller baseret på indberetninger via eIndkomst

Det er et solidt fundament. For mange interne værktøjer, fx automatisk udfyldning af kundestamkort, er det rigeligt.

Det skal I være opmærksomme på, før I bygger

Her kommer den del, de færreste guider fortæller jer. Rå CVR-data er præcis det: rå.

Reelle ejere er ikke længere offentligt tilgængelige

Siden 1. september 2025 deler CVR ikke oplysninger om reelle ejere med offentligheden. Det er en konsekvens af EU-Domstolens dom fra 2022 og implementeringen af EU's 6. hvidvaskdirektiv.

Tre grupper kan fortsat få adgang: kompetente myndigheder, forpligtede enheder under hvidvaskloven og aktører med legitim interesse. Erhvervsstyrelsen nævner selv pressen, civilsamfundsorganisationer og tredjeparts-dataleverandører som eksempler på den sidste gruppe. Enkeltopslag kræver login med MitID og en tro- og loveerklæring; system-til-system-adgang kræver en særskilt kontrakt med Erhvervsstyrelsen, hvor erklæringen er indbygget.

Bygger I KYC- eller AML-processer, er det her, jeres arkitektur bliver kompliceret.

Ingen kreditvurdering

CVR fortæller jer, at en virksomhed eksisterer. Ikke om den betaler sine regninger, om den er på vej mod konkurs, eller om dens nøgletal ser sunde ud. Registret registrerer. Det vurderer eller analyserer ikke.

Og en detalje, mange overser: Bygger I selv kreditvurderinger oven på data og videregiver dem til andre, kræver det tilladelse fra Datatilsynet som kreditoplysningsbureau efter databeskyttelseslovens § 19. Interne vurderinger til eget brug må I gerne lave, men i samme øjeblik I deler dem, gælder bureau-reglerne.

Regnskabsdata kræver ekstra arbejde. Meget ekstra arbejde

Årsrapporter ligger i et separat system og skal parses fra XBRL, hvis I vil have nøgletal ud.

Lad os sætte tal på, hvad det reelt betyder: Der offentliggøres omkring 350.000 danske årsrapporter om året, og på tværs af dem har vi observeret over 2.800 forskellige XBRL-felter i brug alene i 2025-regnskaberne. Et typisk regnskab bruger kun omkring 100 af dem, men aldrig de samme 100. Hvilke felter I møder, afhænger af regnskabsklasse, revisors opsætning og virksomhedens valg.

Og taksonomien står ikke stille: Erhvervsstyrelsen udgiver en ny version hvert år, som tilføjer nye felter. I 2025 kom fx felter til bæredygtighedserklæringen.

Hos Risika koger vi den kompleksitet ned til 73 standardiserede regnskabstal og 42 beregnede nøgletal per regnskab. Det er den slags mapping-arbejde, der aldrig bliver "færdigt": Det skal vedligeholdes, hver gang taksonomien ændrer sig.

XBRL dækker ikke alle virksomheder

Banker, forsikringsselskaber og pensionskasser har historisk indberettet årsrapporter uden for de almindelige XBRL-taksonomier. Først fra regnskabsåret 2025 skal finansielle virksomheder indberette digitalt med Finanstilsynets taksonomi, så der ligger mange års regnskaber, som aldrig kommer i XBRL. Filialer af udenlandske virksomheder indsender fortsat den udenlandske årsrapport som PDF, og ældre årsrapporter ligger som scannede dokumenter.

For alle disse får I i CVR's regnskabsdata kun et link til en PDF, ingen strukturerede tal. Vil I have nøgletal på en dansk bank eller en tyskejet filial, skal I selv i gang med dokumentlæsning og manuel indtastning. Hos Risika har vi digitaliseret netop de regnskaber, så tallene er tilgængelige via vores API på lige fod med alle andre, selvom de aldrig har eksisteret som rå XBRL-data.

Nogle regnskaber kommer aldrig til CVR

Foreninger, andelsboligforeninger og en række andre organisationsformer er registreret i CVR med stamdata, men har ingen pligt til at indsende årsrapport til Erhvervsstyrelsen.

Tag DR: registreret i CVR som forening, milliardbalance, men årsrapporten offentliggøres på deres egen hjemmeside, ikke i registret. Uanset hvor godt I integrerer mod CVR's API, får I aldrig de tal derfra. Hos Risika opsøger vi løbende de regnskaber, der offentliggøres uden for CVR, og strukturerer dem, så de er tilgængelige via vores API på lige fod med resten.

Kun Danmark

Har I kunder eller leverandører i Norge, Sverige eller Finland, skal I gentage hele øvelsen mod Brønnøysundregistrene, Bolagsverket og PRH. Fire registre, fire datamodeller, fire adgangsprocesser, fire vedligeholdelsesopgaver. Og hvor CVR er gratis, tager flere af de andre nordiske registre betaling for data.

Datakvaliteten svinger

Felter mangler på mange virksomheder, formater er inkonsistente over tid, og I skal selv bygge logik til at håndtere det. Antal ansatte er et klassisk eksempel: Tallene kommer med forsinkelse og mangler helt på en stor andel af virksomhederne.

I skal selv holde systemet kørende

Elasticsearch-forespørgsler mod en ældre version, spærringer ved for tunge kald, overvågning af ændringer i datastrukturen og en ny regnskabstaksonomi hvert år. Det er ikke uoverkommeligt, men det er et system, nogen hos jer skal eje. For evigt.

Hvad skal I vælge?

Tommelfingerregel: Bygger I et internt værktøj, der bare skal slå danske stamdata op, så start med CVR API'et. Det er gratis, og det virker.

Bygger I noget, hvor beslutninger afhænger af data? Kreditgivning, onboarding, compliance, risikostyring på tværs af Norden? Så er rå registerdata kun fundamentet, og alt det ovenpå - rensning, berigelse, scoring, overvågning, nordisk dækning - er det, der reelt koster tid. Det er den del, vi har brugt år på at bygge, så I ikke behøver. Og fordi mange af jer selv er underlagt tilsyn, dokumenterer vi vores kontroller med en ISAE 3000-erklæring og understøtter de krav, DORA stiller til jeres tredjepartsleverandører.

Den rigtige risiko er ikke et sats. Det er en strategi. Og strategien starter med at vide, hvad jeres datakilde kan, og hvad den ikke kan.

Sammenligning

CVR API vs. Risika Data API

Skal I så bruge det gratis API eller en beriget datakilde? Ærligt svar: Det afhænger af, hvad I bygger.

CVR API (Erhvervsstyrelsen)

Pris
Gratis
Dækning
Danmark
Stamdata
Ja
Regnskabsdata
Selv-parsing fra XBRL (2.800+ mulige felter)
Kreditscore
Nej
Konkursrisiko og svindelindikatorer
Nej
Reelle ejere (UBO)
Kræver særskilt kontrakt og adgangsgrundlag
Overvågning og events
Byg selv
Regnskaber uden XBRL (banker, forsikring, udenlandske filialer)
Kun PDF-link
Regnskaber, der ikke offentliggøres i CVR (foreninger, boligforeninger m.fl.)
Findes ikke
Interface
Elasticsearch Query DSL (v6.8)
Support
Ingen
Compliance
Ingen

Risika Data API

Pris
Afhængigt af forbrug
Dækning
Danmark, Norge, Sverige, Finland og 190 andre lande
Stamdata
Ja, valideret og renset
Regnskabsdata
73 regnskabstal og 42 nøgletal, klar til brug
Kreditscore
Risika-score 1-10 med forklarede risikofaktorer
Konkursrisiko og svindelindikatorer
Ja
Reelle ejere (UBO)
Del af løsningen for forpligtede enheder
Overvågning og events
Daglige notifikationer om ændringer via e-mail, i platformen eller via API
Regnskaber uden XBRL (banker, forsikring, udenlandske filialer)
Digitaliseret og struktureret
Regnskaber, der ikke offentliggøres i CVR (foreninger, boligforeninger m.fl.)
Indsamles fra andre kilder og udstilles i API'et
Interface
REST API med dokumentation, SDK'er og sandbox
Support
Dedikeret teknisk support og SLA
Compliance
ISAE 3000-erklæring og understøttelse af jeres DORA-krav til tredjepartsleverandører

FAQ

Ofte stillede spørgsmål om CVR API'et

Ja. Erhvervsstyrelsens system-til-system-adgang er gratis. I betaler med udviklingstimer og vedligehold i stedet.

Der er ingen straksadgang. I skriver til Erhvervsstyrelsen, underskriver en erklæring og modtager derefter credentials. Beregn sagsbehandlingstid i jeres projektplan.

Ikke uden videre. Siden 1. september 2025 kræver adgang til reelle ejere, at I er myndighed, forpligtet enhed eller har en legitim interesse, og system-til-system-adgang kræver en særskilt kontrakt.

Ikke som strukturerede data. Finansielle virksomheder har historisk indberettet uden for de almindelige XBRL-taksonomier: digital indberetning via Finanstilsynets taksonomi gælder først fra regnskabsåret 2025, og udenlandske filialer indsender fortsat årsrapporten som PDF. I CVR-udtrækket får I kun et PDF-link.

Tredjeparts-API'er giver typisk et enklere interface til de samme rå data. Det sparer jer for Elasticsearch, men ikke for datakvalitetsarbejdet, regnskabsparsingen eller den manglende kreditvurdering.

Vil I se, hvordan beriget data ser ud i praksis?

Se vores API-dokumentation eller book en gennemgang, hvor vi viser jer forskellen på rå og beriget data på virksomheder, I selv vælger.