REST API · v1

API-dokumentation

Programmatisk adgang til danske virksomhedsdata. Slå op på CVR-numre, søg på virksomhedsnavne, og hold styr på dit forbrug.

Kom i gang

Brug API'et i to trin: Få en API-nøgle, og lav dit første kald.

  1. Trin 1

    Opret en konto og generér en API-nøgle

    Alle planer — også Gratis — har API-adgang. Du kan oprette og tilbagekalde nøgler under Dashboard → API-nøgler.

  2. Trin 2

    Lav dit første opslag

    Send en GET-forespørgsel med din nøgle som Bearer-token:

    curl
    curl -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
      "https://cvrlookup.dk/api/v1/company/43269070"

    Du får et JSON-svar med fulde virksomhedsdetaljer. Kald gerne samme CVR igen samme dag — gentagelser er gratis.

Prøv det live

Interaktivt eksperiment direkte fra dokumentationen — kommer snart.

Try-It-widget kommer snart

Indtast et CVR-nummer, vælg endpoint og se det rå JSON-svar — uden at forlade siden. I mellemtiden kan du teste alle endpoints med eksemplerne nedenfor.

Godkendelse

Alle endpoints under /api/v1 kræver en gyldig API-nøgle sendt som Bearer-token i Authorization-headeren.

header
Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • Nøgler har præfiks cvr_ og er knyttet til den bruger, der oprettede dem.
  • Hold dine nøgler hemmelige — de giver fuld adgang til dit forbrug og kvoter. Tilbagekald kompromitterede nøgler øjeblikkeligt fra dashboardet.
  • Manglende eller ugyldig header giver 401 UNAUTHORIZED.
  • Som svar på autoriserede kald sender vi følgende rate-limit-headers: X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset (Unix-tidsstempel).

Test-tilstand

Prøv API'et uden konto: enhver nøgle på formen cvr_test_… returnerer faste testdata — ingen kvote, ingen registerkald, ingen oprettelse.

bash
# Ingen konto nødvendig — test-nøglen er syntetisk og rammer kun fixtures
curl -H "Authorization: Bearer cvr_test_demo" \
  "https://cvrlookup.dk/api/v1/company/10000001"
Test-CVRAdfærd
10000001Aktivt selskab med fuld post — og regnskabstal på /financials
10000002Ophørt selskab (status DISSOLVED)
99999999404 COMPANY_NOT_FOUND

Understøttet på virksomhedsopslag, søgning og regnskabstal (regnskabstal uden Pro-krav i test-tilstand — fixturet er prøveturen). Alle svar er markeret med meta.mode: "test" og headeren X-CVR-Mode: test — testdata kan aldrig forveksles med registerdata. Øvrige endpoints afviser test-nøgler som ugyldige.

Endpoints

REST-endpoints under base-URL'en bliver dokumenteret nedenfor med parametre, eksempler og fuldt svarskema.

Base-URL: https://cvrlookup.dk
GET/api/v1/company/searchAlle planer

Søg virksomheder (navn)

Søg på virksomhedsnavn og få virksomhedernes identitet tilbage (CVR, navn, adresse, status, branche) — nok til at disambiguere og slå videre op. Tilgængelig på alle planer, også Gratis. Dette er det anbefalede endpoint til navnesøgning.

Parametre

NavnTypePåkrævetStandardBeskrivelse
qstringPåkrævetSøgetekst — virksomhedsnavn (max 100 tegn). Aliaset 'name' accepteres også.
limitnumberValgfri10Antal resultater (1-50).
offsetnumberValgfri0Pagination offset (mindst 0).
status"all" | "active" | "inactive"Valgfri"all"Filtrer på aktiv-status.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/company/search?q=codepilots&limit=10" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "companies": [
      {
        "cvr": "43269070",
        "companyName": "codepilots ApS",
        "status": "ACTIVE",
        "isActive": true,
        "address": {
          "city": "Odense C",
          "postalCode": "5000",
          "municipality": "ODENSE",
          "fullAddress": "Kochsgade 31B, 5000 Odense C"
        },
        "industry": {
          "code": "622000",
          "description": "Computerkonsulentbistand og forvaltning af computerfaciliteter"
        }
      }
    ],
    "total": 1,
    "query": "codepilots",
    "limit": 10,
    "offset": 0,
    "took": 38
  },
  "meta": {
    "page": 1,
    "limit": 10,
    "total": 1,
    "hasMore": false
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
companies[].cvrstring8-cifret CVR-nummer.
companies[].companyNamestringOfficielt virksomhedsnavn.
companies[].status"ACTIVE" | "DISSOLVED" | "BANKRUPTCY" | "RECONSTRUCTION" | "UNKNOWN"Normaliseret status.
companies[].isActivebooleanHurtig flag for aktiv-status.
companies[].address.citystring?Postdistrikt / by.
companies[].address.postalCodestring?Postnummer.
companies[].address.municipalitystring?Kommunenavn.
companies[].address.fullAddressstring?Sammenfletning af adressefelter.
companies[].industry.codestring?Branchekode (NACE).
companies[].industry.descriptionstring?Branchetekst.
totalnumberSamlet antal matchende virksomheder.
querystringDen brugte søgestreng.
limitnumberAnvendt limit.
offsetnumberAnvendt offset.
tooknumberEksekveringstid (ms).
meta.pagenumberAktuel side (1-indekseret).
meta.hasMorebooleanFindes der flere resultater?

Bemærk

  • Søgningen tæller som 1 kvote-enhed mod den månedlige kvote og pr.-minut grænsen — samme søgestreng gentaget samme dag er gratis.
  • Ugyldig 'limit' eller 'offset' (ikke-numerisk eller uden for grænserne) afvises med 400 INVALID_REQUEST.
  • Svaret er identitetsdata — brug 'GET /api/v1/company/{cvr}' for fulde detaljer, eller 'GET /api/v1/search/advanced' (Basic/Pro) for fulde objekter direkte i søgningen.
GET/api/v1/search/advancedFra Basic

Avanceret søgning

Søg på virksomhedsnavn og få FULDE virksomhedsobjekter tilbage (samme skema som 'GET /api/v1/company/{cvr}') med statusfiltrering og pagination. Kræver Basic eller Pro.

Parametre

NavnTypePåkrævetStandardBeskrivelse
qstringPåkrævetSøgetekst — virksomhedsnavn (max 100 tegn). Aliaset 'name' accepteres også.
limitnumberValgfri10Antal resultater (1-50).
offsetnumberValgfri0Pagination offset (mindst 0).
status"all" | "active" | "inactive"Valgfri"all"Filtrer på aktiv-status.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/search/advanced?q=codepilots&status=active" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "companies": [{
    "cvr": "43269070",
    "companyName": "codepilots ApS",
    "status": "ACTIVE",
    "isActive": true,
    "companyType": {
      "code": 80,
      "shortDescription": "APS",
      "longDescription": "Anpartsselskab"
    },
    "address": {
      "street": "Kochsgade",
      "houseNumber": "31B",
      "postalCode": "5000",
      "city": "Odense C",
      "country": "Danmark",
      "fullAddress": "Kochsgade 31B, 5000 Odense C"
    },
    "industry": {
      "code": "622000",
      "description": "Computerkonsulentbistand og forvaltning af computerfaciliteter"
    },
    "shareCapital": { "amount": 40000, "currency": "DKK" },
    "owners": [
      {
        "name": "INTERNET FACTORY ApS",
        "role": "Ejer",
        "ownershipShare": "50%",
        "ownershipInterval": { "floor": 50, "ceiling": 66.66, "label": "50-66,66%" },
        "entityType": "VIRKSOMHED"
      }
    ],
    "foundedDate": "2022-05-17",
    "lastUpdated": "2025-05-21"
  }],
    "total": 1,
    "query": "codepilots",
    "limit": 10,
    "offset": 0,
    "took": 47
  },
  "meta": {
    "page": 1,
    "limit": 10,
    "total": 1,
    "hasMore": false
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
companies[]CVRCompany[]Fulde virksomhedsobjekter — samme skema som 'GET /api/v1/company/{cvr}'.
totalnumberSamlet antal matchende virksomheder.
querystringDen brugte søgestreng.
limitnumberAnvendt limit.
offsetnumberAnvendt offset.
tooknumberEksekveringstid (ms).
meta.pagenumberAktuel side (1-indekseret).
meta.hasMorebooleanFindes der flere resultater?

Bemærk

  • Kræver Basic eller Pro — på Gratis-planen svares med 403 FORBIDDEN (brug 'GET /api/v1/company/search' i stedet).
  • Søgningen tæller som 1 kvote-enhed mod den månedlige kvote og pr.-minut grænsen — samme søgestreng gentaget samme dag er gratis.
  • Ugyldig 'limit' eller 'offset' (ikke-numerisk eller uden for grænserne) afvises med 400 INVALID_REQUEST.
GET/api/v1/company/{cvr}Alle planer

Hent virksomhed efter CVR

Returnerer fulde detaljer for én virksomhed. Forbruger 1 månedlig kvote-enhed pr. unikt CVR pr. dag — gentagne opslag samme dag er gratis.

Parametre

NavnTypePåkrævetStandardBeskrivelse
cvrstring (path)PåkrævetPræcis 8 cifre, fx 43269070.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/company/43269070" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "cvr": "43269070",
    "companyName": "codepilots ApS",
    "status": "ACTIVE",
    "isActive": true,
    "companyType": {
      "code": 80,
      "shortDescription": "APS",
      "longDescription": "Anpartsselskab"
    },
    "address": {
      "street": "Kochsgade",
      "houseNumber": "31B",
      "postalCode": "5000",
      "city": "Odense C",
      "country": "Danmark",
      "fullAddress": "Kochsgade 31B, 5000 Odense C"
    },
    "industry": {
      "code": "622000",
      "description": "Computerkonsulentbistand og forvaltning af computerfaciliteter"
    },
    "shareCapital": { "amount": 40000, "currency": "DKK" },
    "owners": [
      {
        "name": "INTERNET FACTORY ApS",
        "role": "Ejer",
        "ownershipShare": "50%",
        "ownershipInterval": { "floor": 50, "ceiling": 66.66, "label": "50-66,66%" },
        "entityType": "VIRKSOMHED"
      }
    ],
    "foundedDate": "2022-05-17",
    "lastUpdated": "2025-05-21"
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
cvrstring8-cifret CVR-nummer.
companyNamestringOfficielt virksomhedsnavn (nyeste).
tradeNamesstring[]?Binavne / alternative navne.
status"ACTIVE" | "DISSOLVED" | "BANKRUPTCY" | "RECONSTRUCTION" | "UNKNOWN"Normaliseret status.
statusTextstring?Original statustekst fra CVR.
isActivebooleanHurtig flag for aktiv-status.
creditStatus.codenumber?Kreditoplysningskode.
creditStatus.textstring?Kreditoplysningstekst.
companyType.codenumber?Virksomhedsformskode.
companyType.shortDescriptionstring?Kort beskrivelse, fx "A/S".
companyType.longDescriptionstring?Lang beskrivelse, fx "Aktieselskab".
address.streetstring?Vejnavn.
address.houseNumberstring?Husnummer.
address.floorstring?Etage.
address.doorstring?Side/dør.
address.postalCodestring?Postnummer.
address.citystring?Postdistrikt / by.
address.coNamestring?C/O-navn.
address.municipalitystring?Kommunenavn.
address.municipalityCodenumber?Kommunekode.
address.countrystringLandenavn som API'et returnerer det, fx "Danmark".
address.fullAddressstring?Sammenfletning af adressefelter.
postalAddress.*object?Separat postadresse hvis forskellig fra beliggenhedsadresse.
industry.codestring?Branchekode (NACE).
industry.descriptionstring?Branchetekst.
secondaryIndustries[].codestring?Sekundære branchekoder.
secondaryIndustries[].descriptionstring?Sekundære branchetekster.
employeeInfo.yearnumber?År for senest rapporterede beskæftigelse.
employeeInfo.quarternumber?Kvartal (1-4).
employeeInfo.employeesnumber?Antal ansatte.
employeeInfo.employeesIncludingOwnersnumber?Antal inkl. ejere.
employeeInfo.fullTimeEquivalentnumber?Årsværk.
employeeInfo.employeeIntervalstring?Intervalkode for ansatte (fx "10-19").
contact.phonestring?Telefonnummer.
contact.secondaryPhonestring?Sekundær telefon.
contact.faxstring?Fax.
contact.emailstring?E-mail.
contact.mandatoryEmailstring?Obligatorisk e-mail (digital post).
contact.websitestring?Hjemmeside.
registrationNumbersstring[]?Reg.numre (P-numre, banker mv.).
signatureRulestring?Tegningsregel.
owners[].namestring?Ejer-navn.
owners[].rolestring?Rolle.
owners[].addressstring?Adresse.
owners[].ownershipSharestring?Ejerandel — Ejerregisterets interval-BUND (fx "15%" for båndet 15-19,99%). Legale ejerandele registreres i lovbestemte intervaller, aldrig som eksakte andele, så summen på tværs af ejere er ofte under 100%.
owners[].votingSharestring?Stemmeandel — samme interval-bund-semantik som ownershipShare.
owners[].ownershipIntervalobject?Det lovbestemte ejerandelsinterval bunden tilhører: { floor: 15, ceiling: 19.99, label: "15-19,99%" }. Udelades hvis værdien ikke matcher et kendt interval.
owners[].votingIntervalobject?Interval for stemmeandel, samme form som ownershipInterval.
owners[].startDatestring?Startdato (ISO).
owners[].entityType"PERSON" | "VIRKSOMHED"?Type af ejer.
owners[].cvrstring?CVR hvis ejer er virksomhed.
boardMembers[]object[]?Bestyrelse / direktion. Felter: name, role, title, address, entityType, cvr.
founders[]object[]?Stiftere. Felter: name, address, entityType, cvr.
auditors[]object[]?Revisorer. Felter: name, address, entityType, cvr.
accountants[]object[]?Regnskabsfolk.
foundedDatestring?Stiftelsesdato (ISO).
dissolvedDatestring?Opløsningsdato (ISO).
endDatestring?Ophørsdato fra livsforløb — sat for virksomheder der er ophørt uden formel opløsning (ISO).
startDatestring?Første registreringsdato.
effectDatestring?Virkningsdato.
lastUpdatedstringSidst opdateret (ISO).
lastLoadedstring?Sidst indlæst i CVR-distribution.
advertisingProtectionboolean?Reklamebeskyttet.
productionUnitsnumber?Antal P-enheder.
unitNumbernumber?EnhedsNummer (intern).
shareCapital.amountnumber?Selskabskapital.
shareCapital.currencystring?Valuta (fx "DKK").
companyPurposestring?Formål.
accountingPeriod.startMonthnumber?Regnskabsår startmåned (1-12).
accountingPeriod.startDaynumber?Regnskabsår startdag.
accountingPeriod.endMonthnumber?Regnskabsår slutmåned.
accountingPeriod.endDaynumber?Regnskabsår slutdag.
firstAccountingPeriod.startstring?Første regnskabsår start.
firstAccountingPeriod.endstring?Første regnskabsår slut.
auditExemptboolean?Revision fravalgt.
latestArticlesDatestring?Seneste vedtægtsdato.

Bemærk

  • Felter markeret med '?' kan være null/undefined hvis CVR-registret ikke har data for dem.
  • Tilføj 'Accept: application/xml' for at få svaret i XML i stedet for JSON.
GET/api/v1/company/{cvr}/financialsPro

Hent regnskabstal efter CVR

Returnerer strukturerede regnskabstal (resultatopgørelse og balance) parset fra virksomhedens offentliggjorte årsrapporter, nyeste periode først. Kræver Pro. Forbruger 1 månedlig kvote-enhed pr. unikt CVR pr. dag — gentagne kald samme dag er gratis.

Parametre

NavnTypePåkrævetStandardBeskrivelse
cvrstring (path)PåkrævetPræcis 8 cifre, fx 43269070.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/company/43269070/financials" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "cvr": "43269070",
    "count": 4,
    "syncedAt": "2026-07-17T10:43:26.487Z",
    "periods": [
      {
        "periodStart": "2025-01-01",
        "periodEnd": "2025-12-31",
        "publishedAt": "2026-05-20T10:40:38.000Z",
        "figures": {
          "grossProfit": 2042685,
          "employeeBenefitsExpense": 1536189,
          "ebit": 506496,
          "profitBeforeTax": 489638,
          "taxExpense": 64438,
          "netResult": 425200,
          "totalAssets": 1747314,
          "currentAssets": 1747314,
          "cashAndCashEquivalents": 1271470,
          "equity": 1193023,
          "contributedCapital": 40000,
          "shorttermLiabilities": 554291,
          "employees": 3
        }
      }
    ]
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
cvrstring8-cifret CVR-nummer.
countnumberAntal regnskabsperioder i svaret.
syncedAtstring?Tidspunkt for seneste vellykkede synkronisering mod registret. Ved midlertidige registerfejl serveres data fra cache — syncedAt viser hvor friske tallene er.
periods[].periodStartstringRegnskabsperiodens start (ISO-dato). Tom streng for perioder der kun kendes som sammenligningstal.
periods[].periodEndstringRegnskabsperiodens slutdato (ISO-dato). Unik pr. periode; nyeste først.
periods[].publishedAtstring?Offentliggørelsestidspunkt for den årsrapport tallene stammer fra.
periods[].figuresobjectParsede regnskabstal i hele DKK fra årsrapportens XBRL. ALLE felter er valgfri — hvad en virksomhed indberetter afhænger af regnskabsklassen. Se felterne nedenfor.
…figures.revenuenumber?Nettoomsætning. Ofte udeladt: regnskabsklasse B må undlade omsætning (ÅRL §32) — brug grossProfit som gennemgående toplinje.
…figures.grossProfitnumber?Bruttofortjeneste/-tab — det mest konsistent tilgængelige resultattal på tværs af virksomheder.
…figures.employeeBenefitsExpensenumber?Personaleomkostninger.
…figures.depreciationAmortisationnumber?Af- og nedskrivninger.
…figures.ebitnumber?Resultat af primær drift (EBIT).
…figures.financialIncomenumber?Finansielle indtægter.
…figures.financialExpensesnumber?Finansielle omkostninger.
…figures.profitBeforeTaxnumber?Resultat før skat.
…figures.taxExpensenumber?Skat af årets resultat.
…figures.netResultnumber?Årets resultat.
…figures.totalAssetsnumber?Aktiver i alt (balancesum).
…figures.noncurrentAssetsnumber?Anlægsaktiver i alt.
…figures.currentAssetsnumber?Omsætningsaktiver i alt.
…figures.inventoriesnumber?Varebeholdninger.
…figures.cashAndCashEquivalentsnumber?Likvide beholdninger.
…figures.equitynumber?Egenkapital i alt.
…figures.contributedCapitalnumber?Selskabskapital.
…figures.retainedEarningsnumber?Overført resultat.
…figures.proposedDividendnumber?Foreslået udbytte.
…figures.provisionsnumber?Hensatte forpligtelser.
…figures.longtermLiabilitiesnumber?Langfristede gældsforpligtelser i alt.
…figures.shorttermLiabilitiesnumber?Kortfristede gældsforpligtelser i alt.
…figures.employeesnumber?Gennemsnitligt antal ansatte i perioden.

Bemærk

  • Kræver Pro — på Gratis- og Basic-planen svares med 403 FORBIDDEN.
  • Alle beløb er i hele DKK som indberettet i årsrapportens XBRL. Alle figures-felter er valgfri: hvad en virksomhed indberetter afhænger af regnskabsklassen — fx må klasse B-virksomheder udelade omsætning (ÅRL §32), så 'grossProfit' er den gennemgående toplinje.
  • Svaret dækker typisk virksomhedens fulde digitale indberetningshistorik (op til de 10 nyeste årsrapporter, inkl. sammenligningstal). En omgørelse (korrigeret årsrapport) erstatter automatisk den oprindelige for samme periode.
  • 404 COMPANY_NOT_FOUND betyder at virksomheden ikke har nogen maskinlæsbar årsrapport — fx nystiftede virksomheder uden aflagt regnskab.
  • Regnskabstal måles som sin egen 'financials'-kvote-enhed: et virksomhedsopslag og et regnskabskald på samme CVR samme dag tæller som to enheder.
POST/api/v1/company/batchFra Basic

Batch-opslag af virksomheder

Slår op til 50 CVR-numre op i ét kald og returnerer fulde virksomhedsobjekter. Opslagene udføres parallelt. Kræver Basic eller Pro.

Parametre

NavnTypePåkrævetStandardBeskrivelse

Request body (JSON)

NavnTypePåkrævetStandardBeskrivelse
cvrsstring[]PåkrævetListe af 8-cifrede CVR-numre (1-50). Dubletter fjernes, så et gentaget CVR kun slås op — og faktureres — én gang.

Eksempelforespørgsel

curl
curl -X POST "https://cvrlookup.dk/api/v1/company/batch" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"cvrs":["<string>"]}'

Eksempelsvar

json
{
  "success": true,
  "data": {
    "results": [
      {
        "cvr": "43269070",
        "found": true,
        "company": {
    "cvr": "43269070",
    "companyName": "codepilots ApS",
    "status": "ACTIVE",
    "isActive": true,
    "companyType": {
      "code": 80,
      "shortDescription": "APS",
      "longDescription": "Anpartsselskab"
    },
    "address": {
      "street": "Kochsgade",
      "houseNumber": "31B",
      "postalCode": "5000",
      "city": "Odense C",
      "country": "Danmark",
      "fullAddress": "Kochsgade 31B, 5000 Odense C"
    },
    "industry": {
      "code": "622000",
      "description": "Computerkonsulentbistand og forvaltning af computerfaciliteter"
    },
    "shareCapital": { "amount": 40000, "currency": "DKK" },
    "owners": [
      {
        "name": "INTERNET FACTORY ApS",
        "role": "Ejer",
        "ownershipShare": "50%",
        "ownershipInterval": { "floor": 50, "ceiling": 66.66, "label": "50-66,66%" },
        "entityType": "VIRKSOMHED"
      }
    ],
    "foundedDate": "2022-05-17",
    "lastUpdated": "2025-05-21"
  }
      },
      {
        "cvr": "99999999",
        "found": false
      }
    ],
    "requested": 2,
    "returned": 2,
    "errors": 0,
    "stoppedReason": null,
    "quotaExhausted": false,
    "took": 412
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
results[].cvrstringCVR-nummeret fra anmodningen.
results[].foundbooleanBlev virksomheden fundet?
results[].companyCVRCompany?Fuldt virksomhedsobjekt (samme skema som 'GET /api/v1/company/{cvr}'). Udeladt når found=false.
results[].errorboolean?true hvis netop dette opslag fejlede (tælles i 'errors'); de øvrige resultater påvirkes ikke.
requestednumberAntal unikke CVR-numre i anmodningen (dubletter fjernes).
returnednumberAntal CVR-numre der blev behandlet. Kan være lavere end 'requested', hvis en kvote-grænse afbrød batchen.
errorsnumberAntal opslag der fejlede uden at vælte resten af batchen.
stoppedReason"quota" | "rate_limit" | nullSat når en grænse afbrød batchen, før alle CVR-numre var behandlet — årsagen til at der blev stoppet.
quotaExhaustedbooleanDen månedlige kvote blev opbrugt undervejs. Uafhængig af 'stoppedReason' — en batch kan stoppes af minut-grænsen og samtidig have opbrugt månedskvoten.
tooknumberEksekveringstid (ms).

Bemærk

  • Kræver Basic eller Pro — på Gratis-planen svares med 403 FORBIDDEN.
  • Hvert nyt CVR forbruger 1 månedlig kvote-enhed og tæller mod minut-grænsen; et CVR der allerede er slået op samme dag er gratis. Opslag der ikke findes eller fejler faktureres ikke.
  • Delvis succes: rammes en grænse undervejs, svares stadig 200 med de behandlede resultater — 'stoppedReason' angiver om det var månedskvoten ("quota") eller minut-grænsen ("rate_limit"), og 'quotaExhausted' fortæller uafhængigt om månedskvoten blev opbrugt.
  • Kan intet CVR behandles overhovedet, svares 429 med QUOTA_EXCEEDED eller RATE_LIMIT_EXCEEDED. Fejler alle behandlede opslag mod registret (uden én succes), svares 503 SERVICE_UNAVAILABLE.
  • Svaret bærer de månedlige X-RateLimit-headers ligesom de øvrige endpoints.
GET/api/v1/usageAlle planer

Forbrug og kvoter

Returnerer aktuel kvote-status (måned + minut-grænse) samt aggregeret forbrug for den valgte periode. Fri at kalde — tæller ikke mod kvoten.

Parametre

NavnTypePåkrævetStandardBeskrivelse
period"day" | "week" | "month"Valgfri"day"Hvor langt tilbage opsummering skal dække.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/usage?period=week" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "quota": {
      "daily":   { "limit": 100, "used": 12, "remaining": 88 },
      "monthly": { "limit": 25000, "used": 240, "remaining": 24760, "resetTime": "2026-08-01T00:00:00.000Z" },
      "rateLimit": { "perMinute": 20, "currentUsage": 0, "remaining": 20 },
      "resetTime": "2026-07-16T00:00:00.000Z",
      "monthlyResetTime": "2026-08-01T00:00:00.000Z"
    },
    "usage": {
      "period": "day",
      "startDate": "2026-07-15",
      "endDate": "2026-07-15",
      "totalCalls": 14,
      "successfulCalls": 14,
      "failedCalls": 0,
      "successRate": "100.00",
      "avgResponseTime": 122,
      "totalResultsReturned": 14
    },
    "breakdown": {
      "byQueryType": { "cvr": 12, "search": 2 },
      "daily": [
        { "date": "2026-07-15", "calls": 14, "successfulCalls": 14 }
      ]
    }
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
quota.daily.limitnumberDagligt tal ifølge dit abonnement. Kun informativt — den daglige grænse håndhæves ikke længere (beholdt for bagudkompatibilitet).
quota.daily.usednumberAntal unikke opslag i dag (informativt).
quota.daily.remainingnumberResterende af det daglige tal (informativt).
quota.monthly.limitnumberMånedlig kvote — den grænse der håndhæves.
quota.monthly.usednumberForbrug i indeværende måned.
quota.monthly.remainingnumberResterende månedlig kvote.
quota.monthly.resetTimestringISO-tidsstempel for næste månedlige reset.
quota.rateLimit.perMinutenumberTilladte opslag pr. minut.
quota.rateLimit.currentUsagenumberForbrug i de seneste 60 sekunder.
quota.rateLimit.remainingnumberResterende minut-kvote.
quota.resetTimestringISO-tidsstempel for næste midnatsreset (bagudkompatibilitet — hører til den informative daglige tæller).
quota.monthlyResetTimestringISO-tidsstempel for næste månedlige reset (samme som quota.monthly.resetTime).
usage.period"day" | "week" | "month"Anvendt periode.
usage.startDatestringStart på rapportperiode (YYYY-MM-DD).
usage.endDatestringSlut (YYYY-MM-DD).
usage.totalCallsnumberSamlet antal API-kald.
usage.successfulCallsnumberAntal succesfulde kald (HTTP 2xx eller 404).
usage.failedCallsnumberAntal fejlede kald.
usage.successRatestringProcent som tekst (fx "98.50").
usage.avgResponseTimenumberGennemsnitlig svartid (ms).
usage.totalResultsReturnednumberSamlet antal returnerede resultater.
breakdown.byQueryTypeRecord<string, number>Antal kald grupperet på queryType ("cvr" / "search" / "person").
breakdown.daily[].datestringYYYY-MM-DD.
breakdown.daily[].callsnumberKald den dag.
breakdown.daily[].successfulCallsnumberSuccesfulde kald den dag.

Bemærk

  • Den månedlige kvote er den grænse der håndhæves (sammen med minut-grænsen). 'quota.daily' og det øverste 'quota.resetTime' er kun informative og beholdt for bagudkompatibilitet.
  • X-RateLimit-headerne på alle endpoints afspejler den månedlige kvote.
GET/api/v1/person/{id}Alle planer

Hent person efter enhedsnummer

Returnerer detaljer om en person og deres virksomhedsrelationer (ejer, ledelse, stifter mv.). Forbruger 1 månedlig kvote-enhed pr. unikt enhedsnummer pr. dag — gentagne opslag samme dag er gratis.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetPræcis 10 cifre (enhedsNummer), fx 4000012345.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/person/4000012345" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "enhedsNummer": "4000012345",
    "name": "Eksempel Person",
    "address": "Eksempelgade 1, 1050 København K",
    "companies": [
      {
        "cvr": "43269070",
        "companyName": "codepilots ApS",
        "role": "owner",
        "roleLabel": "Reel ejer",
        "ownershipShare": "50%",
        "ownershipInterval": { "floor": 50, "ceiling": 66.66, "label": "50-66,66%" },
        "active": true
      }
    ]
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
enhedsNummerstring10-cifret enhedsnummer for personen.
namestringPersonens fulde navn.
addressstring?Adresse (kan være udeladt ved beskyttelse).
protectedAddressboolean?Adressebeskyttelse aktiv.
advertisingProtectionboolean?Reklamebeskyttet.
companies[].cvrstringCVR for relateret virksomhed.
companies[].companyNamestringVirksomhedsnavn.
companies[].role"owner" | "boardMember" | "founder" | "auditor" | "accountant"Personens rolle i virksomheden.
companies[].roleLabelstring?Dansk etiket for rollen.
companies[].titlestring?Titel (fx "Direktør").
companies[].ownershipSharestring?Ejerandel — Ejerregisterets interval-bund (fx "15%" for båndet 15-19,99%).
companies[].votingSharestring?Stemmeandel — samme interval-bund-semantik.
companies[].ownershipIntervalobject?Det lovbestemte ejerandelsinterval: { floor, ceiling, label }, fx { floor: 15, ceiling: 19.99, label: "15-19,99%" }.
companies[].votingIntervalobject?Interval for stemmeandel, samme form som ownershipInterval.
companies[].startDatestring?Startdato (ISO).
companies[].endDatestring | null?Slutdato (ISO), eller null hvis aktiv.
companies[].activebooleanEr relationen aktiv.

Bemærk

  • Felter markeret med '?' kan mangle, hvis CVR-registret ikke har data for dem.
  • Adressen kan være udeladt, hvis personen har adressebeskyttelse.
GET/api/v1/watchlistsPro

List watchlists

Returnerer brugerens watchlists samt forbrug mod plan-grænserne.

Parametre

NavnTypePåkrævetStandardBeskrivelse

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/watchlists" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "watchlists": [
      {
        "id": "wl_2x9a1c",
        "name": "Leverandører",
        "description": "Vigtige leverandører",
        "tag": "suppliers",
        "cadence": "daily",
        "webhookUrl": null,
        "createdAt": "2026-06-01T10:00:00.000Z",
        "updatedAt": "2026-06-15T08:30:00.000Z"
      }
    ],
    "quota": { "watchlistsUsed": 1, "watchlistLimit": 10, "entitiesUsed": 3, "entityLimit": 100 }
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
watchlists[]Watchlist[]Brugerens watchlists (samme skema som ovenfor).
quota.watchlistsUsednumberAntal watchlists i brug.
quota.watchlistLimitnumberMaks antal watchlists for planen.
quota.entitiesUsednumberAntal entiteter i brug.
quota.entityLimitnumberMaks antal entiteter for planen.

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
POST/api/v1/watchlistsPro

Opret watchlist

Opretter en ny watchlist for brugeren.

Parametre

NavnTypePåkrævetStandardBeskrivelse

Request body (JSON)

NavnTypePåkrævetStandardBeskrivelse
namestringPåkrævetNavn (1-120 tegn).
descriptionstringValgfriBeskrivelse (max 500 tegn).
tagstringValgfriFrit tag (max 40 tegn).
cadence"daily" | "weekly"Valgfri"daily"Overvågningsfrekvens.

Eksempelforespørgsel

curl
curl -X POST "https://cvrlookup.dk/api/v1/watchlists" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"name":"<string>","description":"<string>","tag":"<string>","cadence":"daily"}'

Eksempelsvar

json
{ "success": true, "data": {
  "id": "wl_2x9a1c",
  "name": "Leverandører",
  "description": "Vigtige leverandører",
  "tag": "suppliers",
  "cadence": "daily",
  "webhookUrl": null,
  "createdAt": "2026-06-01T10:00:00.000Z",
  "updatedAt": "2026-06-15T08:30:00.000Z"
} }

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
idstringWatchlist-id (præfiks "wl_").
namestringNavn (1-120 tegn).
descriptionstring?Beskrivelse.
tagstring?Frit tag (fx "suppliers").
cadence"daily" | "weekly"Overvågningsfrekvens.
webhookUrlstring?Webhook-URL for hændelser.
createdAtstringOprettet (ISO).
updatedAtstringSidst ændret (ISO).

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
  • Returnerer 403 hvis plan-grænsen for antal watchlists er nået.
GET/api/v1/watchlists/{id}Pro

Hent watchlist

Returnerer én watchlist efter id.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetWatchlist-id ("wl_...").

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/watchlists/wl_2x9a1c" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{ "success": true, "data": {
  "id": "wl_2x9a1c",
  "name": "Leverandører",
  "description": "Vigtige leverandører",
  "tag": "suppliers",
  "cadence": "daily",
  "webhookUrl": null,
  "createdAt": "2026-06-01T10:00:00.000Z",
  "updatedAt": "2026-06-15T08:30:00.000Z"
} }

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
idstringWatchlist-id (præfiks "wl_").
namestringNavn (1-120 tegn).
descriptionstring?Beskrivelse.
tagstring?Frit tag (fx "suppliers").
cadence"daily" | "weekly"Overvågningsfrekvens.
webhookUrlstring?Webhook-URL for hændelser.
createdAtstringOprettet (ISO).
updatedAtstringSidst ændret (ISO).

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
PATCH/api/v1/watchlists/{id}Pro

Opdater watchlist

Opdaterer felter på en watchlist. Kun medsendte felter ændres.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetWatchlist-id.

Request body (JSON)

NavnTypePåkrævetStandardBeskrivelse
namestringValgfriNyt navn (1-120 tegn).
descriptionstringValgfriNy beskrivelse (eller null for at rydde).
tagstringValgfriNyt tag (eller null for at rydde).
cadence"daily" | "weekly"ValgfriNy frekvens.

Eksempelforespørgsel

curl
curl -X PATCH "https://cvrlookup.dk/api/v1/watchlists/wl_2x9a1c" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"name":"<string>","description":"<string>","tag":"<string>","cadence":"<\"daily\" | \"weekly\">"}'

Eksempelsvar

json
{ "success": true, "data": {
  "id": "wl_2x9a1c",
  "name": "Leverandører",
  "description": "Vigtige leverandører",
  "tag": "suppliers",
  "cadence": "daily",
  "webhookUrl": null,
  "createdAt": "2026-06-01T10:00:00.000Z",
  "updatedAt": "2026-06-15T08:30:00.000Z"
} }

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
idstringWatchlist-id (præfiks "wl_").
namestringNavn (1-120 tegn).
descriptionstring?Beskrivelse.
tagstring?Frit tag (fx "suppliers").
cadence"daily" | "weekly"Overvågningsfrekvens.
webhookUrlstring?Webhook-URL for hændelser.
createdAtstringOprettet (ISO).
updatedAtstringSidst ændret (ISO).

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
DELETE/api/v1/watchlists/{id}Pro

Slet watchlist

Sletter en watchlist og dens entiteter. Svarer med 204 No Content.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetWatchlist-id.

Eksempelforespørgsel

curl
curl -X DELETE "https://cvrlookup.dk/api/v1/watchlists/wl_2x9a1c" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Svar

204 No Content — tomt svar ved succes.

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
GET/api/v1/watchlists/{id}/entitiesPro

List entiteter

Returnerer entiteterne (virksomheder/personer) på en watchlist.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetWatchlist-id.

Eksempelforespørgsel

curl
curl "https://cvrlookup.dk/api/v1/watchlists/wl_2x9a1c/entities" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Eksempelsvar

json
{ "success": true, "data": [{
  "id": "wle_7p4k2",
  "watchlistId": "wl_2x9a1c",
  "entityType": "company",
  "entityRef": "43269070",
  "displayName": "codepilots ApS",
  "addedAt": "2026-06-10T12:00:00.000Z"
}] }

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
idstringEntitet-id (præfiks "wle_").
watchlistIdstringWatchlist-id entiteten hører til.
entityType"company" | "person"Type af overvåget entitet.
entityRefstringCVR (virksomhed) eller enhedsNummer (person).
displayNamestringVisningsnavn.
addedAtstringTilføjet (ISO).

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
  • data er et array af entiteter.
POST/api/v1/watchlists/{id}/entitiesPro

Tilføj entitet

Tilføjer en virksomhed (CVR) eller person (enhedsNummer) til en watchlist.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetWatchlist-id.

Request body (JSON)

NavnTypePåkrævetStandardBeskrivelse
entityType"company" | "person"PåkrævetType af entitet.
entityRefstringPåkrævet8-cifret CVR for virksomhed, ellers enhedsNummer for person.
displayNamestringPåkrævetVisningsnavn (1-200 tegn).

Eksempelforespørgsel

curl
curl -X POST "https://cvrlookup.dk/api/v1/watchlists/wl_2x9a1c/entities" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"<\"company\" | \"person\">","entityRef":"<string>","displayName":"<string>"}'

Eksempelsvar

json
{ "success": true, "data": {
  "id": "wle_7p4k2",
  "watchlistId": "wl_2x9a1c",
  "entityType": "company",
  "entityRef": "43269070",
  "displayName": "codepilots ApS",
  "addedAt": "2026-06-10T12:00:00.000Z"
} }

Svarskema

Felterne nedenfor er indpakket under data i det rå svar.

FeltTypeBeskrivelse
idstringEntitet-id (præfiks "wle_").
watchlistIdstringWatchlist-id entiteten hører til.
entityType"company" | "person"Type af overvåget entitet.
entityRefstringCVR (virksomhed) eller enhedsNummer (person).
displayNamestringVisningsnavn.
addedAtstringTilføjet (ISO).

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.
  • Virksomheds-entiteter skal bruge et 8-cifret CVR-nummer.
  • Returnerer 409 hvis entiteten allerede findes på listen, eller 403 hvis entitets-grænsen er nået.
DELETE/api/v1/watchlists/{id}/entities/{wleId}Pro

Fjern entitet

Fjerner en entitet fra en watchlist. Svarer med 204 No Content.

Parametre

NavnTypePåkrævetStandardBeskrivelse
idstring (path)PåkrævetWatchlist-id.
wleIdstring (path)PåkrævetEntitet-id ("wle_...").

Eksempelforespørgsel

curl
curl -X DELETE "https://cvrlookup.dk/api/v1/watchlists/wl_2x9a1c/entities/wle_7p4k2" \
  -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Svar

204 No Content — tomt svar ved succes.

Bemærk

  • Kræver Pro-planen (watchlists er en Pro-funktion) — ellers 403 FORBIDDEN.

MCP-server

Fjern-MCP-server til AI-agenter (Streamable HTTP): samme data og samme kvoter som REST-API'et, eksponeret som værktøjer.

Endpoint: https://cvrlookup.dk/api/mcp — Bearer API-nøgle, POST JSON-RPC.
  • lookup_companyAlle planerSlå virksomhed op på CVR-nummer
  • search_companiesAlle planerSøg virksomheder på navn
  • get_company_financialsProHent regnskabstal (Pro)

Opsætning for Claude Code, Cursor og andre klienter: cvrlookup.dk/mcp

Rate limits & kvoter

Opslag og søgninger tæller mod en månedlig kvote og en pr.-minut grænse. Det samme CVR (eller den samme søgestreng) gentaget samme dag tæller kun én gang.

PlanPrisPr. månedPr. minutREST API
Gratis0 kr/måned1.0005Inkluderet
Basic49 kr/måned25.00020Inkluderet
Pro149 kr/måned100.00060Inkluderet
  • Månedlige kvoter nulstilles ved starten af din faktureringsperiode (kalendermåned på Gratis). Tidspunktet for næste reset returneres i headeren X-RateLimit-Reset.
  • Når en grænse rammes, svarer vi med HTTP 429 og fejlkode RATE_LIMIT_EXCEEDED eller QUOTA_EXCEEDED.
  • Endpointet GET /api/v1/usage returnerer dit aktuelle forbrug — uden at tælle mod kvoten.

Behov for større kvoter?

Skriv til support, så finder vi en plan der passer dit volumen. Se aktuelle priser

Fejlkoder

Alle fejl returneres med samme JSON-skema og en HTTP-statuskode. Felterne 'code' og 'message' er stabile — undgå at parse 'message' for logik.

json
{
  "success": false,
  "error": {
    "code": "QUOTA_EXCEEDED",
    "message": "Månedlig kvote overskredet. Opgradér din plan for flere opslag."
  }
}
KodeHTTPBeskrivelse
UNAUTHORIZED401Manglende eller ugyldig API-nøgle. Tjek 'Authorization'-headeren.
INVALID_API_KEY401API-nøglen kunne ikke valideres (måske tilbagekaldt eller udløbet).
FORBIDDEN403Autentificeret, men din konto har ikke adgang til endpointet.
INVALID_REQUEST400Forespørgslen er ugyldig (fx ukendt værdi til 'period').
INVALID_CVR400CVR-nummer skal være præcis 8 cifre.
MISSING_PARAMETER400Et påkrævet parameter mangler — fx 'q' til søge-endpoints, eller hverken 'name' eller 'cvr' til /search.
RATE_LIMIT_EXCEEDED429For mange anmodninger pr. minut. Vent og prøv igen.
QUOTA_EXCEEDED429Månedlig kvote opbrugt. Opgradér plan eller vent til næste periode.
COMPANY_NOT_FOUND404Ingen virksomhed med det angivne CVR-nummer.
PERSON_NOT_FOUND404Ingen person med det angivne enhedsNummer.
INVALID_PERSON_ID400enhedsNummer skal være præcis 10 cifre.
NOT_FOUND404Ressourcen findes ikke.
SERVICE_UNAVAILABLE503Midlertidigt utilgængelig — ofte fordi kvote-tjek fejlede.
INTERNAL_ERROR500Uventet serverfejl. Prøv igen, eller kontakt support hvis det fortsætter.