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

    API-adgang kræver et betalt abonnement (Basic eller Pro). 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/37520556"

    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).

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/{cvr}

Hent virksomhed efter CVR

Returnerer fulde detaljer for én virksomhed. Forbruger 1 daglig 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 37520556.

Eksempelforespørgsel

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

Eksempelsvar

json
{
  "success": true,
  "data": {
    "cvr": "37520556",
    "companyName": "Codepilots ApS",
    "status": "ACTIVE",
    "isActive": true,
    "companyType": {
      "code": 80,
      "shortDescription": "ApS",
      "longDescription": "Anpartsselskab"
    },
    "address": {
      "street": "Eksempelgade",
      "houseNumber": "1",
      "postalCode": "1050",
      "city": "København K",
      "country": "DK",
      "fullAddress": "Eksempelgade 1, 1050 København K"
    },
    "industry": {
      "code": "620100",
      "description": "Computerprogrammering"
    },
    "shareCapital": { "amount": 40000, "currency": "DKK" },
    "owners": [
      {
        "name": "Eksempel Person",
        "role": "Reel ejer",
        "ownershipShare": "100%",
        "entityType": "PERSON"
      }
    ],
    "foundedDate": "2016-04-01",
    "lastUpdated": "2026-04-15"
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar (fx data.cvr).

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.countrystringISO landekode (fx "DK").
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 (fx "50%-66.66%").
owners[].votingSharestring?Stemmeandel.
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).
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/usage

Forbrug og kvoter

Returnerer aktuel kvote-status (dag, måned, minut) 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 -H "Authorization: Bearer cvr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  "https://cvrlookup.dk/api/v1/usage?period=week"

Eksempelsvar

json
{
  "success": true,
  "data": {
    "quota": {
      "daily":   { "limit": 100, "used": 12, "remaining": 88 },
      "monthly": { "limit": 2000, "used": 240, "remaining": 1760 },
      "rateLimit": { "perMinute": 20, "currentUsage": 0, "remaining": 20 },
      "resetTime": "2026-05-05T00:00:00.000Z"
    },
    "usage": {
      "period": "day",
      "startDate": "2026-05-04",
      "endDate": "2026-05-04",
      "totalCalls": 14,
      "successfulCalls": 14,
      "failedCalls": 0,
      "successRate": "100.00",
      "avgResponseTime": 122,
      "totalResultsReturned": 14
    },
    "breakdown": {
      "byQueryType": { "cvr": 12, "name": 2 },
      "daily": [
        { "date": "2026-05-04", "calls": 14, "successfulCalls": 14 }
      ]
    }
  }
}

Svarskema

Felterne nedenfor er indpakket under data i det rå svar (fx data.cvr).

FeltTypeBeskrivelse
quota.daily.limitnumberDaglig kvote ifølge dit abonnement.
quota.daily.usednumberAntal unikke CVR-opslag i dag.
quota.daily.remainingnumberResterende daglig kvote.
quota.monthly.limitnumberMånedlig kvote.
quota.monthly.usednumberForbrug i indeværende måned.
quota.monthly.remainingnumberResterende månedlig kvote.
quota.rateLimit.perMinutenumberTilladte CVR-opslag pr. minut.
quota.rateLimit.currentUsagenumberForbrug i de seneste 60 sekunder.
quota.rateLimit.remainingnumberResterende minut-kvote.
quota.resetTimestringISO-tidsstempel for næste midnatsreset.
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" / "name").
breakdown.daily[].datestringYYYY-MM-DD.
breakdown.daily[].callsnumberKald den dag.
breakdown.daily[].successfulCallsnumberSuccesfulde kald den dag.

Rate limits & kvoter

Opslag på CVR-numre tæller mod en daglig kvote og en pr.-minut grænse. Navnesøgning er gratis. Det samme CVR slået op flere gange samme dag tæller kun én gang.

PlanPrisPr. dagPr. månedPr. minutREST API
Gratis0 kr/måned101005Ikke inkluderet
Basic49 kr/måned1002.00020Inkluderet
Pro99 kr/måned50010.00060Inkluderet
  • Daglige kvoter nulstilles ved midnat (CET). 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": "Daglig 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_PARAMETER400Hverken 'name' eller 'cvr' blev angivet til /search.
RATE_LIMIT_EXCEEDED429For mange anmodninger pr. minut. Vent og prøv igen.
QUOTA_EXCEEDED429Daglig kvote opbrugt. Opgradér plan eller vent til midnat.
COMPANY_NOT_FOUND404Ingen virksomhed med det angivne CVR-nummer.
NOT_FOUND404Ressourcen findes ikke.
CVR_API_ERROR500Fejl fra det underliggende CVR-register hos Erhvervsstyrelsen.
SERVICE_UNAVAILABLE503Midlertidigt utilgængelig — ofte fordi kvote-tjek fejlede.
INTERNAL_ERROR500Uventet serverfejl. Prøv igen, eller kontakt support hvis det fortsætter.