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
- Skriv til Erhvervsstyrelsen. Adgang anmodes via mail til cvrselvbetjening@erst.dk. Der er ingen selvbetjeningsformular med straksadgang, så indregn sagsbehandlingstid.
- 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.
- 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.
- 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 stadigTo 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å_docog 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.