DataCVR API giver nem adgang til danske virksomhedsdata via en moderne REST API. Uanset om du skal integrere CVR-opslag i dit regnskabssystem, bygge en leadgenereringsplatform, eller automatisere compliance-processer, så giver API'et dig de data, du har brug for - hurtigt og i struktureret JSON-format.
Kom i gang
Det tager under 2 minutter at komme i gang med DataCVR API. Følg disse tre trin:
- Opret en gratis konto på datacvrapi.dk/opret-konto
- Find din API-nøgle i dit dashboard under "API-nøgle"
- Lav dit første kald med din API-nøgle som autentificering
Den gratis plan giver dig 25 opslag per dag - nok til at teste og komme i gang.
Autentificering
Alle API-kald kræver en gyldig API-nøgle. Du kan autentificere på tre måder:
1. Bearer Token (anbefalet)
Authorization: Bearer DIN_API_NØGLE
2. X-API-Key Header
X-API-Key: DIN_API_NØGLE
3. Basic Auth
Authorization: Basic base64(DIN_API_NØGLE:)
API-nøglen som brugernavn, tomt password. Eksempel med curl: curl -u "DIN_API_NØGLE:"
Vigtigt: Query parameter-autentificering er ikke understøttet. Brug altid headers.
Base URL
API'et er tilgængeligt via to identiske base-URLs. Begge peger på samme backend, og du kan frit bruge den du foretrækker:
https://datacvrapi.dk/api/v2 (kanonisk, anbefalet)
https://api.datacvrapi.dk/api/v2 (subdomain-alias)
Eksempel: GET /dk/company/10150817 kan kaldes via https://datacvrapi.dk/api/v2/dk/company/10150817 eller https://api.datacvrapi.dk/api/v2/dk/company/10150817. Samme svar.
Vi anbefaler datacvrapi.dk/api/v2 i ny kode. api.datacvrapi.dk eksisterer som alias for bagudkompatibilitet. Bemærk at stien altid starter med /api/v2/, også på api.-subdomainet.
Alle endpoints bruger HTTPS (TLS 1.2+) for sikker kommunikation.
Endpoints oversigt
API'et er opdelt i tre tydelige områder:
- Danske virksomheder: CVR-data fra Erhvervsstyrelsen. Sti-prefix:
/dk/ - Norske virksomheder: Organisationsdata fra Brønnøysundregistrene. Sti-prefix:
/no/ - Scrape tokens (tilkøb): Kontakt-scraping fra virksomhedens hjemmeside. Betales med separate scrape-tokens. Sti:
/account/scrape-tokens+ scrape-endpoints på virksomheder
Derudover findes et public uptime-endpoint GET /api/v2/health (ingen API-nøgle, ingen rate-limit), som returnerer {"status":"ok","version":"v2","timestamp":"..."}. Beregnet til monitorer og deploy smoke-tests.
Til SLA-monitoring findes også et deep health-endpoint GET /api/v2/health/deep, som verificerer database, Erhvervsstyrelsens ES API, og delta-sync freshness. Returnerer HTTP 503 hvis database eller ES API er utilgængelig.
AI-integration (nyt): GET /api/v2/ai/tools returnerer OpenAI function-calling JSON med de 6 primære endpoints. Ingen API-nøgle kræves. Bruges af ChatGPT plugins, Cursor og andre LLM-klienter til auto-discovery af API'et. Alle company-responses indeholder nu et llm_summary-felt med en kort prosa-opsummering.
MCP-server: Den officielle MCP-server @datacvrapi/mcp giver Claude Desktop, Claude Code, Codex, Cursor og VS Code direkte adgang til API'et med 10 tools: søgning, virksomhedsopslag, ejere, person-opslag, P-numre og regnskaber for både Danmark og Norge. Den kører lokalt via npx og bruger din egen API-nøgle. Se opsætningsguiden.
Danske virksomheder (/dk/)
| Endpoint | Metode | Beskrivelse | Plan |
|---|---|---|---|
/dk/company/{cvr} |
GET | Stamdata fra CVR (navn, adresse, status, branche, ejere) | Gratis |
/dk/search/company |
GET | Søg virksomheder (navn, branche, status, by, postnummer) | Alle |
/dk/suggestions/company/{query} |
GET | Autocomplete på virksomhedsnavn | Alle |
/dk/industry/counts |
GET | Antal virksomheder per branchekode | Alle |
/dk/subsidiary/{pnr} |
GET | P-nummer opslag (produktionsenhed) | Alle |
/dk/search/subsidiary |
GET | Søg produktionsenheder | Alle |
/dk/suggestions/subsidiary/{query} |
GET | Autocomplete på P-nummer | Alle |
/dk/participant/{id} |
GET | Deltager opslag (ejer eller ledelse) | Alle |
/dk/search/participant |
GET | Søg ejere og ledelse | Alle |
/dk/suggestions/participant/{query} |
GET | Autocomplete på ejere og ledelse | Alle |
/dk/changed/list/company |
GET | Ændrede DK virksomheder (changed feed) | Alle |
/dk/changed/company/{change_id} |
GET | Enkelt virksomhed fra changed feed | Alle |
/dk/company/{cvr}/accounts |
GET | Alle årsregnskaber for virksomhed (inkl. pdf_url) |
Business+ |
/dk/company/{cvr}/accounts/latest |
GET | Seneste årsregnskab for virksomhed | Business+ |
/dk/search/accounts |
GET | Søg i regnskabsdata | Business+ |
/dk/company/{cvr}/capital-changes |
GET | Detaljerede kapitalændringer (beta): kurs, indbetalingsmåde, beslutningsdato | Hobby+ |
/dk/company/{cvr}/capital-changes/contribute |
POST | Bidrag rå HTML fra virk.dk registreringsmeddelelser så data kan parses og caches (max 50/dag/bruger) | Business+ |
/dk/company/{cvr}/capital-changes-live |
GET | Live kapitalændringer fra Erhvervsstyrelsens registreringstekster API | Hobby+ |
/dk/company/{cvr}/address-changes |
GET | Adresse- og hjemstedsændringer historik | Hobby+ |
/dk/company/{cvr}/personnel-changes |
GET | Direktion, bestyrelse, tilsynsråd, tegningsberettigede (med enhedsNummer-link til personer) |
Hobby+ |
/dk/company/{cvr}/auditor-changes |
GET | Revisor-skift (fratrådte/tiltrådte med CVR + adresse) | Hobby+ |
/dk/company/{cvr}/status-changes |
GET | Konkurs, opløsning, tvangsopløsning, likvidation, rekonstruktion | Hobby+ |
/dk/company/{cvr}/founding-text |
GET | Fuld stiftelsestekst med stiftere, direktion, bestyrelse, kapital, formål | Hobby+ |
/dk/company/{cvr}/mergers-demergers |
GET | Fusioner og spaltninger (offentliggjort + gennemført, parties med rolle) | Hobby+ |
/dk/company/{cvr}/conversions |
GET | Selskabsomdannelser (ApS→A/S, IVS→ApS, ...) | Hobby+ |
/dk/company/{cvr}/owner-discrepancies |
GET | Uoverensstemmelser i reelle ejere | Hobby+ |
/dk/company/{cvr}/corrections |
GET | Erhvervsstyrelsens rettelser til tidligere registreringer | Hobby+ |
/dk/company/{cvr}/other-registrations |
GET | Vedtægtsændringer, formålsændringer, øvrige | Hobby+ |
/dk/company/{cvr}/registreringstekster |
GET | Raw registreringstekster (alle 12 status-typer, med filter ?status=) |
Hobby+ |
Registreringstekster (officiel Erhvervsstyrelsen-data)
De 12 endpoints under /dk/company/{cvr}/ der ender på -changes, -text, conversions, corrections, mergers-demergers, owner-discrepancies, other-registrations og registreringstekster leverer struktureret data fra Erhvervsstyrelsens officielle CVR-historik (distribution.virk.dk/registreringstekster).
Adgang verificeret via system-til-system aftale med Erhvervsstyrelsen (sagsnr. 146615).
Samlet quota for alle registreringstekst-endpoints: 100/30d (Hobby), 1.000/30d (Business+).
Personer leveres med enhedsNummer så du kan slå dem op i /dk/participant/{enhedsNummer}.
Virksomheder leveres med 8-cifret CVR + adresse når nævnt i original-teksten.
Norske virksomheder (/no/)
Data hentes fra Brønnøysundregistrene (brreg.no) og har tilsvarende struktur som danske endpoints. Organisationsnummer er 9 cifre.
/no/ via samme path-struktur. Ikke alle datatyper er dog tilgængelige i Norge: registreringstekster (stiftelsestekst, kapitalændringer-live, person- og adresseændringer, fusioner/spaltninger og resten af /registreringstekster-familien) findes kun på /dk/, da Brønnøysundregistrene ikke offentliggør tilsvarende historiske registreringsdokumenter. Norske felter kan også afvige (fx ingen companystatus_code-mapping; NO bruger egen AKTIV/OPPLOEST-klassifikation).
| Endpoint | Metode | Beskrivelse | Plan |
|---|---|---|---|
/no/company/{orgnr} |
GET | Stamdata for norsk virksomhed | Gratis |
/no/search/company |
GET | Søg norske virksomheder | Alle |
/no/changed/list/company |
GET | Ændrede NO virksomheder (changed feed) | Alle |
/no/company/{orgnr}/accounts |
GET | Norske regnskaber | Business+ |
Scrape tokens (tilkøb)
Kontakt-scraping henter telefon, email og direktør-kontaktinfo fra virksomhedens hjemmeside. Det er en separat tilkøbsydelse der betales med scrape-tokens (1 token per scrape-job, uanset udfald). Tokens købes som engangskøb i dashboardet og er uafhængige af månedsabonnementet.
Flow: (1) POST /dk/company/{cvr}/contacts/scrape starter et job → (2) poll GET /dk/company/{cvr}/scrape-jobs/{id} for status → (3) hent resultat via GET /dk/company/{cvr}/contacts når færdig. Resultat caches 30 dage.
| Endpoint | Metode | Beskrivelse | Omkostning |
|---|---|---|---|
/account/scrape-tokens/balance |
GET | Tjek token-saldo | Gratis |
/dk/company/{cvr}/contacts/scrape |
POST | Start scrape-job for virksomhed | 1 token |
/dk/company/{cvr}/scrape-jobs/{id} |
GET | Tjek scrape-job status (pending/running/done/failed) | Gratis |
/dk/company/{cvr}/contacts |
GET | Hent cached kontakter fra tidligere scrape | Gratis (cached 30 dage) |
Response format
Alle endpoints returnerer JSON. Her er eksempler på de mest brugte endpoints:
Virksomhedsdata (stamdata)
GET /api/v2/dk/company/24256790
{
"vat": 24256790,
"name": "Novo Nordisk A/S",
"address": "Novo Allé 1",
"zipcode": "2880",
"city": "Bagsværd",
"cityname": "Bagsværd",
"protected": false,
"phone": "44442288",
"email": null,
"fax": null,
"startdate": "1989-01-09",
"enddate": null,
"employees": "10000+",
"industrycode": 210000,
"industrydesc": "Fremstilling af farmaceutiske råvarer og præparater",
"companycode": 80,
"companydesc": "Aktieselskab",
"website": "www.novonordisk.com",
"companystatus": "Aktiv",
"creditbankrupt": false,
"address_details": {
"street": "Novo Allé",
"house_number": "1",
"floor": null,
"door": null,
"co_name": null,
"zipcode": "2880",
"city": "Bagsværd",
"municipality": "Gladsaxe",
"municipality_code": 159,
"country": "DK",
"latitude": 55.7604,
"longitude": 12.4470
},
"owners": [
{
"name": "Novo Holdings A/S",
"role": "LEGAL EJER",
"title": "Legal ejer",
"share": 28.1,
"participantnumber": 4000012345,
"startdate": "1989-01-09",
"enddate": null,
"active": true
}
],
"signing_rule": "Selskabet tegnes af bestyrelsesformanden i forening med et bestyrelsesmedlem eller af to bestyrelsesmedlemmer i forening eller af direktionen.",
"productionunits": [],
"lifecycle": [
{"startdate": "1989-01-09", "enddate": null}
],
"companyform_history": [
{"code": 80, "short": "AS", "long": "Aktieselskab", "startdate": "1989-01-09", "enddate": null}
],
"employees_yearly": [
{"year": 2025, "employees": "10000+", "fte": 58000.0}
],
"accounts": [],
"llm_summary": "Novo Nordisk A/S (CVR 24256790) er en global lægemiddelvirksomhed inden for farmaceutisk fremstilling fra Bagsværd. Stiftet 1989, status Aktiv, 10000+ ansatte.",
"t": 1748736000,
"version": 8
}
name- Personens navnrole- Rolle (DIREKTION, BESTYRELSE, REEL EJER, STIFTER, LEGAL EJER, REVISION)title- Organisatorisk enhed (DIREKTION, BESTYRELSE, osv.)share- Ejerandel i procent (null hvis ikke relevant)participantnumber- Deltager-nummer til person-opslag via/participant/{id}startdate/enddate- Rolleperiode (enddate=null = aktiv)active- Boolean.true= aktiv rolle,false= ophørt
true = virksomheden er reklamebeskyttet (markedsføringsforbudslisten). Brug dette felt til at afgøre marketing eligibility.
status_history[]- Alle statusændringer (status,startdate,enddate)name_history[]- Navneændringer (name,startdate,enddate)address_history[]- Adresseændringer (address,zipcode,city,municipality,startdate,enddate)industry_history[]- Brancheændringer (code,text,startdate,enddate)purpose_history[]- Formålsændringer (purpose,startdate,enddate)capital_history[]- Kapitalændringer (capital,currency,startdate,enddate)companyform_history[]- Virksomhedsform over tid. Fx IVS → ApS → A/Semployees_monthly[]- Ansatte pr. måned (year,month,employees,fte)employees_quarterly[]- Ansatte pr. kvartalemployees_yearly[]- Ansatte pr. år
startdate/enddate perioder. employees er et interval (fx "10-19") eller eksakt tal. fte er fuldtidsækvivalenter. Data stammer direkte fra CVR-registret og opdateres dagligt.
address_details- Struktureret adresse medstreet,house_number,floor,door,co_name,municipality,municipality_codesigning_rule- Tegningsregel (fx "Selskabet tegnes af en direktør")signing_rule_history[]- Historik for tegningsregelauditors[]- Revisorer medname,startdate,enddatefounders[]- Stiftereproductionunits[]- Produktionsenheder (P-numre) med adresse, branchekode og ansattemergers_demergers[]- Fusions- og spaltningsdatafiscal_year- Regnskabsårets start/slutarticles_date- Seneste vedtægtsdatoowners[].participantnumber- Deltager-nummer til person-opslag via/participant/{id}
equity_ratio, return_on_equity, liquidity_ratio, solvency_ratio, debt_ratio) beregnes per regnskabsår og returneres i /company/{cvr}/accounts endpointet.
Regnskabsdata
GET /api/v2/dk/company/35954716/accounts/latest
{
"cvr": "35954716",
"report_id": "urn:ofk:oid:...",
"document_type": "aarsrapport",
"period_start": "2024-01-01",
"period_end": "2024-12-31",
"fiscal_year": 2024,
"publication_date": "2025-04-10T...",
"company_name": "EKSEMPEL A/S",
"currency": "DKK",
"auditor_name": "PricewaterhouseCoopers Statsautoriseret Revisionspartnerselskab",
"figures": {
"revenue": 58700000000,
"gross_profit": 16200000000,
"operating_profit": 3500000000,
"profit_before_tax": 2100000000,
"net_profit": 1709000000,
"total_assets": 40426000000,
"fixed_assets": 31200000000,
"current_assets": 9226000000,
"cash": 2100000000,
"equity": 13836000000,
"total_liabilities": 40426000000,
"provisions": 1500000000,
"long_term_debt": 16800000000,
"short_term_debt": 8090000000,
"employees": 18132,
"equity_ratio": 34.22,
"return_on_equity": 12.35,
"liquidity_ratio": 1.14,
"solvency_ratio": 34.22,
"debt_ratio": 1.92
},
"pdf_url": "http://regnskaber.virk.dk/...",
"xbrl_url": "http://regnskaber.virk.dk/...",
"ixbrl_url": null
}
Alle beløb er i DKK. Liste-endpointet (/accounts) returnerer { cvr, count, accounts: [...] }; /accounts/latest returnerer det nøgne account-objekt direkte. Parseren er namespace-agnostisk: håndterer både Danish GAAP (fsa:) og IFRS (ifrs-full:) taxonomier samt alle namespace-aliaser (xbrli:xbrl, xi:xbrl, ix:xbrl, m.fl.). 15 rapporterede tal + 5 beregnede nøgletal (equity_ratio, return_on_equity, liquidity_ratio, solvency_ratio, debt_ratio).
Officiel årsrapport-PDF: Hvert regnskab inkluderer pdf_url der peger direkte på den officielle PDF hos Erhvervsstyrelsen (gratis, ingen auth). For 2024+ regnskaber er pdf_url ofte null da nye indleveringer kun er ESEF-format (ixbrl_url).
Tomme figures? Hvis et regnskab returneres med figures: {}, kontakt support med CVR + fiscal_year. Parseren dækker alle kendte XBRL-namespace-varianter, men nye taxonomi-aliaser kan opstå over tid og kræver opdatering af parserens whitelist.
Norske regnskaber returneres med afvigende figures. NO inkluderer long_term_debt, men mangler gross_profit, profit_before_tax, cash, employees, provisions, equity_ratio og return_on_equity. Valuta er NOK. PDF/XBRL/iXBRL-felter findes ikke for norske regnskaber.
Error codes: 400 INVALID_CVR, 400 INVALID_PARAMETER (limit ikke positivt heltal), 401 TOKEN_REQUIRED, 403 TIER_REQUIRED (Business+ påkrævet), 404 NOT_FOUND (ingen regnskaber for CVR), 502 UPSTREAM_ERROR.
Detaljerede kapitalændringer (beta)
Komplet kapitalhistorik per dansk virksomhed med kurs, beslutningsdato, vedtægtsdato og indbetalingsmetode. Tier: Hobby (100/md inkl.) eller Business (1.000/md inkl.). Kun for danske virksomheder.
GET /api/v2/dk/company/36424303/capital-changes
{
"cvr": "36424303",
"count": 9,
"capital_changes": [
{
"registered_date": "2026-02-20",
"change_type": "Ændring af kapital",
"direction": "increase",
"company_name": "Dripdrop ApS",
"address": "Søren Frichs Vej 25, 1., 8000 Aarhus C",
"statutes_changed_date": "2026-02-06",
"decision_date": "2026-02-06",
"execution_date": null,
"amount": 1400.00,
"currency": "DKK",
"payment_method": "kontant",
"exchange_rate": 7437.14,
"capital_after": 97414.12,
"is_correction": false
}
],
"source": "datacvr.virk.dk",
"cached_at": "2026-04-10T14:00:00Z",
"expires_at": "2026-05-10T14:00:00Z",
"status": "ok",
"_meta": {
"feature_status": "best_effort_temporary",
"disclaimer": "Detaljerede kapitalændringer er en midlertidig best-effort feature...",
"quota": {
"limit_per_30_days": 1000,
"used_this_period": 87,
"remaining": 913,
"tier": "business"
}
}
}
Status-koder: ok (cached data leveret), queued (CVR sat i kø, kald igen efter estimated_ready_in_seconds), pending (cache udløbet, ny henter), error (seneste scrape fejlede).
⚠️ Best-effort feature: Cached data leveres altid hurtigt. Nye CVR'er kan tage flere timer at hente og er ikke garanteret leveret pga. Cloudflare-beskyttelse på datacvr.virk.dk. Quota: Hvis du når månedlig grænse, returneres HTTP 429 CAPITAL_QUOTA_EXCEEDED.
Søg virksomheder
GET /api/v2/dk/search/company?name=branthiq&limit=10
{
"total": 1,
"limit": 10,
"offset": 0,
"results": [
{
"vat": 24256790,
"name": "Novo Nordisk A/S",
"address": "Novo Allé 1",
"zipcode": "2880",
"city": "Bagsværd",
...
}
]
}
// Søgeparametre (alle valgfri, kombiner frit):
// name : virksomhedsnavn (partiel match, case-insensitive)
// address : adresse (partiel match)
// zipcode : postnummer (eksakt match)
// city : by (partiel match)
// phone : telefonnummer (partiel match)
// email : email (partiel match)
// industrycode : branchekode (DB07), fx "620100" (eksakt) eller "62" (præfiks)
// companyform : virksomhedsform: integer-kode (80) eller forkortelse ("ApS", "A/S", "I/S")
// companystatus : string-label (anbefalet) eller integer-kode:
// "NORMAL" / 20 : aktiv virksomhed
// "AKTIV" / 20 : alias for NORMAL
// "OPLØST" / 3 : opløst (generisk)
// "UNDER KONKURS" / 5 : under konkursbehandling
// "UNDER FRIVILLIG LIKVIDATION" / 6
// "UNDER TVANGSOPLØSNING" / 7
// "OPHØRT" / 8 : ophørt
// "SLETTET" / 3 : slettet
// "UDENRETSVIRKNING" : uden retsvirkning
// (string-labels er case-insensitive, mellemrum ignoreres)
// employees_min, employees_max : antal ansatte
// capital_min, capital_max : selskabskapital i DKK
// founded_after, founded_before : stiftelsesdato (YYYY-MM-DD)
// municipality : kommunekode (fx 101) eller kommunenavn (partiel)
// Pagination: limit (default 50 med nøgle, 20 anonymt; max 1000 med nøgle),
// offset (max 10000 med nøgle), cursor (alternativ til offset)
// Bemærk: disse parameter-navne findes IKKE og ignoreres silent:
// branche → brug industrycode
// status → brug companystatus
// region → brug municipality
// website, hasWebsite, ingenHjemmeside → findes ikke som filter
// creditstatus → ikke implementeret som filter
Autosuggest
GET /api/v2/dk/suggestions/company/novo
[
{ "vat": 24256790, "name": "Novo Nordisk A/S", "address": "Novo Allé 1, 2880 Bagsværd" },
{ "vat": 25052943, "name": "Novozymes A/S", "address": "Krogshoejvej 36, 2880 Bagsværd" }
]
Norsk virksomhed (med owners)
GET /api/v2/no/company/923609016
{
"vat": 923609016,
"name": "EQUINOR ASA",
"address": "Forusbeen 50",
"zipcode": "4035",
"city": "STAVANGER",
"companydesc": "Allment aksjeselskap",
"industrydesc": "Utvinning av råolje",
"owners": [
{
"name": "Anders Opedal",
"role": "Daglig leder",
"title": "Daglig leder/ adm.direktør",
"share": null,
"startdate": "2020-11-02",
"enddate": null
},
{
"name": "Jon Erik Reinhardsen",
"role": "Styrets leder",
"title": "Styre",
"share": null,
"startdate": "2018-05-15",
"enddate": null
}
]
}
Changed feed - nye/ændrede virksomheder
// Danmark
GET /api/v2/dk/changed/list/company?since=2026-04-02&limit=100
{
"total": 754,
"limit": 100,
"results": [
{
"vat": 34421463,
"name": "Kapitalakademiet",
"companydesc": "PMV",
...
}
],
"next_cursor": "1775092552000,43132296"
}
// Pagination: brug next_cursor som cursor parameter
GET /api/v2/dk/changed/list/company?since=2026-04-02&cursor=1775092552000,43132296
// Norge
GET /api/v2/no/changed/list/company?since=2026-04-02&limit=100
{
"since": "2026-04-02",
"total": 451,
"limit": 100,
"items": [
{
"orgnr": "922827044",
"updateId": 24075678,
"date": "2026-04-02",
"changeType": "Ny enhet"
}
],
"next_cursor": "24075687"
}
// Parametere: since (YYYY-MM-DD, påkrævet), limit (max 100), cursor
Kontakt-scraping (asynkron)
POST /api/v2/dk/company/24256790/contacts/scrape
Content-Type: application/json
Authorization: Bearer DIN_API_NØGLE
// Svar (202 Accepted):
{
"job_id": "abc123-def456",
"status": "pending",
"message": "Scrape job oprettet. Poll GET /dk/company/{cvr}/scrape-jobs/{id} for status."
}
Statuskoder
API'et bruger standard HTTP-statuskoder:
| Kode | Betydning | Beskrivelse |
|---|---|---|
200 |
OK | Anmodningen lykkedes |
202 |
Accepted | Asynkront job oprettet (kontakt-scraping) |
400 |
Bad Request | Ugyldigt CVR-nummer eller manglende parametre |
401 |
Unauthorized | Manglende eller ugyldig API-nøgle |
403 |
Forbidden | Din plan har ikke adgang til dette endpoint |
404 |
Not Found | Virksomheden findes ikke i CVR-registret |
429 |
Too Many Requests | Rate limit overskredet |
500 |
Server Error | Intern serverfejl - prøv igen senere |
Fejl-response format
Alle 4xx og 5xx svar returnerer JSON med konsistent struktur. Eksempel ved manglende API-nøgle:
{
"error": "TOKEN_REQUIRED",
"message": "API-nøgle mangler. Tilføj 'Authorization: Bearer DIN_NØGLE' header."
}
Eksempel ved ugyldigt CVR-nummer:
{
"error": "INVALID_CVR",
"message": "CVR-nummer skal være 8 cifre."
}
Eksempel ved kvota-overskridelse:
{
"error": "QUOTA_EXCEEDED",
"message": "Du har brugt 10.000 af 10.000 opslag denne måned. Opgrader plan eller vent til næste cyklus."
}
Rate limiting
API'et har rate limits afhængigt af din plan:
| Plan | Opslag | Pris |
|---|---|---|
| Gratis | 25 / dag | 0 kr. |
| Hobby | 10.000 / md | 299 kr./md. ekskl. moms |
| Business | 50.000 / md | 499 kr./md. ekskl. moms |
| Custom | Ubegrænset | Kontakt os |
Hvis du overskrider dit rate limit, returnerer API'et statuskode 429. Vi anbefaler at implementere retry-logik med exponential backoff.
Rate limit headers
Hvert svar inkluderer headers, der fortæller dig hvor mange opslag du har tilbage. Brug dem til at bygge robust retry-logik:
| Header | Beskrivelse |
|---|---|
X-RateLimit-Limit |
Maksimalt antal opslag i din nuværende periode (dag eller måned) |
X-RateLimit-Remaining |
Antal opslag du har tilbage |
X-RateLimit-Reset |
Antal sekunder til din kvota nulstilles |
Retry-After |
Sendes kun ved 429 svar. Antal sekunder til du kan prøve igen |
Conditional GET (ETag / If-None-Match)
API'et understøtter HTTP Conditional GET på virksomhedsendpoints. Hvis data ikke er ændret siden dit seneste opslag, returnerer API'et 304 Not Modified med tom body, og kaldet tæller ikke mod din månedlige kvote.
Understøttede endpoints:
GET /api/v2/dk/company/{cvr}GET /api/v2/no/company/{orgnr}
Sådan bruger du det
1. Gem ETag-headeren fra dit første svar:
# Trin 1: hent ETag
curl -sI "https://datacvrapi.dk/api/v2/dk/company/22756214" \
-H "X-API-Key: DIN_API_NØGLE" | grep -i "^etag:"
# ETag: "dk-22756214-1717804800000"
# Trin 2: send If-None-Match med næste kald
curl -sI "https://datacvrapi.dk/api/v2/dk/company/22756214" \
-H "X-API-Key: DIN_API_NØGLE" \
-H 'If-None-Match: "dk-22756214-1717804800000"'
# HTTP/2 304 (data uændret, 0 bytes body, tæller ikke mod kvote)
Response-headers
| Header | Beskrivelse |
|---|---|
ETag |
Unik version-streng for virksomhedens data. Format: "country-cvr-timestamp" |
Last-Modified |
Hvornår virksomhedens data sidst blev ændret (RFC 7231 datoformat) |
Vary |
Altid X-API-Key, Authorization på ETag-responses |
Kvote-besparelse
Et kald der returnerer 304 Not Modified registreres i din log, men tæller ikke mod din månedlige kvote. 99% af virksomheder i databasen er over 7 dage gamle og ændres ikke dagligt, så klienter der cacher ETag-værdier typisk reducerer kvoteforbruget betydeligt ved gentagne opslag på de samme virksomheder.
Bemærk: ETag er kun tilgængelig når virksomheden findes i vores cache (Supabase fast path). Cache miss eller forældet data henter friske data fra CVR-registret og returnerer altid 200 med ny ETag.
Kodeeksempler
cURL
curl -X GET "https://datacvrapi.dk/api/v2/dk/company/24256790" \
-H "Authorization: Bearer DIN_API_NØGLE"
JavaScript (fetch)
const response = await fetch(
'https://datacvrapi.dk/api/v2/dk/company/24256790',
{
headers: {
'Authorization': 'Bearer DIN_API_NØGLE'
}
}
);
if (!response.ok) {
throw new Error(`API fejl: ${response.status}`);
}
const virksomhed = await response.json();
console.log(virksomhed.name); // "Novo Nordisk A/S"
console.log(virksomhed.companystatus); // "Aktiv"
Python (requests)
import requests
url = "https://datacvrapi.dk/api/v2/dk/company/24256790"
headers = {
"Authorization": "Bearer DIN_API_NØGLE"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
virksomhed = response.json()
print(virksomhed["name"]) # "Novo Nordisk A/S"
print(virksomhed["companystatus"]) # "Aktiv"
Hent regnskabsdata (JavaScript)
// Hent regnskabsdata for en virksomhed
async function hentRegnskab(cvr, apiKey) {
const response = await fetch(
`https://datacvrapi.dk/api/v2/dk/company/${cvr}/accounts`,
{
headers: { 'Authorization': `Bearer ${apiKey}` }
}
);
if (response.status === 403) {
console.error('Business-abonnement påkrævet for regnskabsdata');
return null;
}
return response.json();
}
const data = await hentRegnskab('24256790', 'DIN_API_NØGLE');
// Response format: { cvr, count, accounts: [...] }
if (data && data.accounts && data.accounts.length > 0) {
const seneste = data.accounts[0];
console.log('Omsætning:', seneste.figures.revenue);
console.log('Egenkapital:', seneste.figures.equity);
}
SDKs og integrationer
DataCVR API er en standard REST API og kan bruges med enhver HTTP-klient. Vi tilbyder desuden:
- Postman Collection: Importér vores endpoints direkte i Postman for hurtig test
- cURL-eksempler: Kopiér og tilpas til dit system
- Integration guides: Se vores trin-for-trin integration guide med eksempler i JavaScript, Python, PHP og C#
Vi arbejder på officielle SDKs til JavaScript/TypeScript og Python. Følg med på vores dashboard for opdateringer.
Næste skridt
Nu har du overblikket over DataCVR API. Her er, hvad du kan gøre nu:
- Opret en gratis konto og få din API-nøgle
- Læs vores integration guide med kodeeksempler i flere sprog
- Se API changelog for versionshistorik og seneste ændringer
- Udforsk hvilke virksomhedsdata der er tilgængelige
- Se priser og planer for at vælge den rette løsning