domainSelskabsInfo
    API Dokumentation

    CVR API Reference

    Komplet reference for SelskabsInfo CVR API. Opslag, søgning og berigelse af danske virksomhedsdata.

    Kom i gang

    Tre trin for at lave dit første API-kald:

    1

    Opret en konto

    Log ind eller opret en konto på SelskabsInfo.

    2

    Opret din API-nøgle

    Gå til Mine API-nøgler i din profil. Klik "Opret nøgle" - nøglen vises kun én gang, så gem den sikkert.

    3

    Foretag dit første kald

    Send en GET-request med din API-nøgle i Authorization-headeren:

    Første API-kald
    bash
    curl -X GET "https://api.selskabsinfo.dk/v1/company/10150817" \
      -H "Authorization: Bearer sk_live_your_api_key_here"

    Authentication

    Alle API-kald kræver en gyldig API-nøgle sendt via Authorization-headeren.

    Authorization header
    http
    Authorization: Bearer sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

    Opbevar din nøgle sikkert

    API-nøglen vises kun ved oprettelse. Den gemmes som SHA-256 hash i vores database og kan ikke genskabes. Hold din nøgle hemmelig - del den ikke i klient-side kode eller offentlige repositories.

    Nøgleformat

    API-nøgler har formatet sk_live_ efterfulgt af 32 hexadecimale tegn:

    Format
    sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
    ^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    prefix   32 hex characters

    Base URL & Versioning

    Base URL
    https://api.selskabsinfo.dk/v1

    Alle endpoints er relative til denne base URL. Kun GET-requests understøttes. Alle responses er JSON med UTF-8 encoding.

    API Versioning

    API'et versioneres via URL-path (/v1/). Nye felter kan tilføjes til eksisterende endpoints uden version-bump (additiv ændring). Breaking changes medfører en ny version (f.eks. /v2/). Ældre versioner understøttes i minimum 12 måneder efter introduktion af en ny version.

    Response Format

    Alle succesfulde responses returnerer JSON med HTTP status 200. Fejl returneres ligeledes som JSON med et error-objekt (se Fejlkoder).

    Content-Type

    application/json

    CORS

    Fuld CORS-understøttelse - kan bruges direkte fra browsere (men skjul din API-nøgle!)

    Encoding

    UTF-8. Danske tegn (æ, ø, å) returneres direkte i JSON.

    Endpoints

    GET/v1/company/{cvr}

    Hent komplet virksomhedsprofil for et givet CVR-nummer. Returnerer basisdata som standard - brug include-parameteren til at tilføje yderligere datasektioner (ledelse, regnskab, retssager m.m.).

    Parametre

    cvrstringrequired
    8-cifret CVR-nummer. Eksempel: 10150817
    includestring
    Kommasepareret liste af valgfrie datasektioner. Se Include-system. Eksempel: management,financials
    on_restrictedstring
    Hvordan kald med includes uden for din plan håndteres: error (default - returnerer 403) eller skip (returnerer det din plan tillader plus et warnings-array). Se Håndtering af tier-restriktioner.
    enriched_contactstring
    Default true på Starter og højere: tomme og udløbne felter i kontakt udfyldes med kontaktoplysninger vi selv har fundet, uden ekstra credits. CVR-registret indeholder kun det selskabet selv har indberettet - fx har Salling Group A/S ingen hjemmeside registreret. kontaktMeta.kilder angiver pr. felt om værdien er cvr (gældende registrering), cvr_udloebet (registrering selskabet siden har afmeldt), beriget (fundet af os) eller mangler, så du altid kan se hvad der kommer hvorfra. Sæt false for kun at få registrets egne værdier. På Free-planen returneres registrets egne værdier, og kontaktMeta.berigelse angiver at berigelse kræver Starter; et eksplicit enriched_contact=true følger on_restricted som enhver anden tier-begrænsning. Felter, registret har markeret hemmelige, returneres aldrig - hverken som CVR-værdi eller beriget. kontakt.reklamebeskyttet viser altid, om selskabet har frabedt sig markedsføringshenvendelser, så du kan se det, før du bruger kontaktoplysningerne - berigede såvel som registrerede.
    Eksempel - basis
    bash
    curl "https://api.selskabsinfo.dk/v1/company/10150817" \
      -H "Authorization: Bearer sk_live_..."
    Eksempel - kun registrets egne værdier
    bash
    curl "https://api.selskabsinfo.dk/v1/company/35954716?enriched_contact=false" \
      -H "Authorization: Bearer sk_live_..."
    Eksempel - med includes
    bash
    curl "https://api.selskabsinfo.dk/v1/company/10150817?include=management,financials,ownership" \
      -H "Authorization: Bearer sk_live_..."

    Basis-response felter:

    FeltTypeBeskrivelse
    cvrstringCVR-nummer
    navnstringAktivt virksomhedsnavn
    navneHistorikarrayHistorik over navneændringer (navn, fraDato, tilDato)
    statusstringNuværende status fra CVR (NORMAL, UNDERKONKURS, OPLØST m.fl.). Bemærk: aktive selskaber har NORMAL, ikke AKTIV
    statusHistorikarrayHistorik over statusændringer
    ophoertbooleanOm virksomheden er ophørt. Læs dette felt frem for status alene: en lukket enkeltmandsvirksomhed beholder ofte status NORMAL, og ophøret står kun i CVR's livsforløb
    ophoersDatostring | nullDatoen virksomheden ophørte, eller null for en aktiv virksomhed
    virksomhedsformobjectSelskabsform (kode, beskrivelse)
    stiftelsesDatostringDato for stiftelse
    beliggenhedsadresseobjectNuværende adresse (vejnavn, husnummerFra, etage, sidedoer, postnummer, postdistrikt, kommune, landekode, latitude, longitude)
    kontaktobjectKontaktoplysninger (telefon, email, hjemmeside, reklamebeskyttet)
    kontakt.reklamebeskyttetboolean | nullReklamebeskyttelse i CVR-registret. true: selskabet har frabedt sig henvendelser i markedsføringsøjemed, og kontaktoplysningerne - registrerede såvel som berigede - må efter CVR-loven ikke bruges til det. null: registret oplyser det ikke. Returneres på alle opslag, uden ekstra credits
    kontaktMetaobjectKildeangivelse for kontakt: kilde, telefonRegistreret, emailRegistreret, hjemmesideRegistreret, hentet. Returneres på alle opslag
    kontaktMeta.kilderobject | undefinedKilde pr. felt: cvr, cvr_udloebet, beriget eller mangler. Til stede når berigelse kørte — altså ikke på Free og ikke ved enriched_contact=false
    kontaktMeta.berigelsestring | undefinedKun på Free: forklaring på, at berigede kontaktoplysninger kræver Starter
    hovedbrancheobjectHovedbranche (kode, beskrivelse)
    bibrancherarrayGældende sekundære brancher (op til 3, med kode og beskrivelse). Afmeldte bibrancher medtages ikke
    antalAnsattenumber | nullSeneste præcise antal ansatte. null, når registret ikke oplyser et præcist antal - se antalAnsatteInterval og antalAarsvaerk
    antalAnsatteIntervalstring | nullRegistrets interval for antal ansatte, f.eks. "20-49" eller "1000+". CVR oplyser et præcist tal for under halvdelen af de aktive selskaber og et interval for resten
    antalAarsvaerknumberSeneste antal årsværk
    medarbejderPeriodestringPeriode for medarbejdertal (f.eks. "2024-Q3")
    kapitalobjectRegistreret kapital (registreretKapital, valuta)
    tegningsregelstringTegningsregel
    formaalstringSelskabets formål
    regnskabsperiodeobjectSeneste regnskabsperiode
    Eksempel response
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      "navneHistorik": [
        { "navn": "COOP TRADING A/S", "fraDato": "2015-01-01", "tilDato": null }
      ],
      "status": "NORMAL",
      "statusHistorik": [
        { "status": "NORMAL", "fraDato": "2001-01-01", "tilDato": null }
      ],
      "ophoert": false,
      "ophoersDato": null,
      "virksomhedsform": {
        "kode": 60,
        "beskrivelse": "Aktieselskab"
      },
      "stiftelsesDato": "2001-01-01",
      "beliggenhedsadresse": {
        "vejnavn": "Roskildevej",
        "husnummerFra": 65,
        "postnummer": 2620,
        "postdistrikt": "Albertslund",
        "kommune": "Albertslund",
        "landekode": "DK",
        "latitude": 55.6567,
        "longitude": 12.3456
      },
      "kontakt": {
        "telefon": "43868686",
        "email": "info@coop.dk",
        "hjemmeside": "https://coop.dk",
        "reklamebeskyttet": false
      },
      "kontaktMeta": {
        "kilde": "CVR-registret (Erhvervsstyrelsen)",
        "telefonRegistreret": "2015-01-01",
        "emailRegistreret": "2015-01-01",
        "hjemmesideRegistreret": "2015-01-01",
        "hentet": "2026-08-17T09:31:02.418Z",
        "kilder": { "telefon": "cvr", "email": "cvr", "hjemmeside": "cvr" }
      },
      "hovedbranche": {
        "kode": "461700",
        "beskrivelse": "Agenturhandel med foedevarer, drikkevarer og tobak"
      },
      "bibrancher": [],
      "antalAnsatte": 156,
      "antalAarsvaerk": 148.5,
      "medarbejderPeriode": "2024-Q3",
      "kapital": {
        "registreretKapital": 100000000,
        "valuta": "DKK"
      },
      "tegningsregel": "Selskabet tegnes af bestyrelsens formand ...",
      "formaal": "Selskabets formaal er ...",
      "regnskabsperiode": { ... }
    }

    GET/v1/company/{cvr}/momsStarter+

    Slå op, om DK{cvr} er et gyldigt, aktivt momsnummer i momsregisteret. Kræver Starter-plan eller højere. Koster 1 kald.

    Læs dette før du bruger svaret

    Momsregistrering findes ikke i CVR-registret. Erhvervsstyrelsen registrerer selskabet; Skattestyrelsen registrerer momsen — og den hænger på SE-nummeret, ikke på CVR-nummeret. Dette endpoint spørger derfor et andet register end resten af API'et.

    Momsregisteret besvarer præcis ét spørgsmål: er DK{cvr} et gyldigt momsnummer? Det er ikke det samme som er selskabet momsregistreret. Et koncernselskab i en fællesregistrering afregner moms under et andet SE-nummer, og dets eget CVR-nummer er derfor ikke et gyldigt momsnummer — selvom selskabet utvivlsomt betaler moms. Novo Nordisk A/S og Coloplast A/S opfører sig sådan i dag.

    Derfor returnerer vi to felter i stedet for ét. momsnummerGyldigt er momsregisterets bogstavelige svar og er det, du skal bruge, når du afgør, om der skal faktureres med eller uden moms — den beslutning handler om nummeret. momsregistreret er slutningen om selskabet, og den er aldrig false: vi kan ikke skelne "ikke registreret" fra "registreret under et andet SE-nummer".

    Der findes bevidst intet momspligtig-felt. Momspligt er en juridisk egenskab ved aktiviteten efter momsloven, ikke en oplysning noget register fører.

    Parametre

    cvrstringrequired
    8-cifret CVR-nummer. Angives i stien.
    Eksempel
    bash
    curl "https://api.selskabsinfo.dk/v1/company/61056416/moms" \
      -H "Authorization: Bearer sk_live_..."

    Response-felter:

    FeltTypeBeskrivelse
    cvrstringCVR-nummeret der blev slået op
    momsnummerstringDet momsnummer der blev valideret (DK + CVR)
    momsnummerGyldigtbooleanMomsregisterets bogstavelige svar. Brug dette til faktureringsbeslutninger.
    momsregistrerettrue | nullSlutningen om selskabet. true når nummeret er gyldigt, ellers null (kan ikke afgøres). Aldrig false
    navnIMomsregisterstring | nullNavn som registreret hos Skattestyrelsen. Kan afvige fra CVR-navnet — den forskel er i sig selv nyttig ved kontrol af en handelspartner
    adresseIMomsregisterstring | nullAdresse som registreret hos Skattestyrelsen
    forbeholdstring | nullUdfyldt når nummeret ikke er gyldigt: forklarer hvorfor det ikke er det samme som "ikke momspligtig"
    kildeobjectOpslagsdetaljer (svarkode, forespurgt, bemaerkning). forespurgt er det faktiske opslagstidspunkt — også når svaret serveres fra cache, hvor cachetSvar: true tilføjes
    Eksempel response — gyldigt nummer
    json
    {
      "cvr": "61056416",
      "momsnummer": "DK61056416",
      "momsnummerGyldigt": true,
      "momsregistreret": true,
      "navnIMomsregister": "Carlsberg A/S",
      "adresseIMomsregister": "J.C. Jacobsens Gade 1\n1799 København V\n",
      "forbehold": null,
      "kilde": {
        "svarkode": "VALID",
        "forespurgt": "2026-08-17T13:18:26.418Z",
        "bemaerkning": "Momsregistrering findes ikke i CVR-registret. Den hører til SE-nummeret hos Skattestyrelsen."
      }
    }
    Eksempel response — ugyldigt nummer (fællesregistreret koncern)
    json
    {
      "cvr": "24256790",
      "momsnummer": "DK24256790",
      "momsnummerGyldigt": false,
      "momsregistreret": null,
      "navnIMomsregister": null,
      "adresseIMomsregister": null,
      "forbehold": "Momsregisteret svarer, at DK24256790 ikke er et gyldigt momsnummer. Det er ikke det samme som, at selskabet ikke er momspligtigt: ved fællesregistrering ...",
      "kilde": {
        "svarkode": "INVALID",
        "forespurgt": "2026-08-17T13:18:09.632Z",
        "bemaerkning": "Momsregistrering findes ikke i CVR-registret. Den hører til SE-nummeret hos Skattestyrelsen."
      }
    }

    Momsregisterets svartid svinger mellem ~1 og ~10 sekunder hen over døgnet. Derfor cacher vi hvert svar i op til 15 minutter (samme friskhed som Cache-Control-headeren), så gentagne opslag på samme CVR-nummer svarer øjeblikkeligt. Kan registeret ikke svare, serveres det seneste kendte svar i op til 24 timer — markeret med kilde.cachetSvar: true og det faktiske opslagstidspunkt i kilde.forespurgt. Først når der hverken er et live-svar eller et cachet et, får du 503 — aldrig et gættet negativt svar. Koden skelner: circuit_open betyder, at opslaget slet ikke blev forsøgt, mens upstream_unavailable betyder, at det blev forsøgt uden brugbart svar. I begge tilfælde koster det dig ingenting: kvoten trækkes, når forespørgslen sendes videre, men bliver ført tilbage, når der ikke kom data ud af den. I pressede perioder melder registeret nemlig fejl frem for et egentligt svar, så vi genforsøger og skelner mellem ægte og midlertidige afvisninger, før vi svarer.

    Søg efter virksomheder efter navn eller CVR-nummer. Returnerer paginerede resultater med basisinfo. Understøtter fuzzy-matching og prefix-søgning. Hvert resultat indeholder reklamebeskyttet, så reklamebeskyttede selskaber kan frasorteres, før der bruges credits på opslag.

    Parametre

    qstringrequired
    Søgeord. Minimum 2 tegn. Kan være virksomhedsnavn eller 8-cifret CVR.
    pageinteger
    Sidenummer (standard: 1). page × perPage må højst være 10.000 - dybere sider afvises med 400 invalid_page uden at koste et kald.
    perPageinteger
    Antal resultater per side (standard: 25, max: 100).
    Eksempel
    bash
    curl "https://api.selskabsinfo.dk/v1/search?q=novo+nordisk&page=1&perPage=10" \
      -H "Authorization: Bearer sk_live_..."
    Response
    json
    {
      "results": [
        {
          "cvr": "24256790",
          "navn": "NOVO NORDISK A/S",
          "status": "NORMAL",
          "by": "Bagsværd",
          "postnummer": 2880,
          "branche": "Fremstilling af farmaceutiske præparater",
          "branchekode": "212000",
          "virksomhedsform": "A/S",
          "reklamebeskyttet": false
        },
        ...
      ],
      "total": 15,
      "page": 1,
      "perPage": 10
    }

    GET/v1/person/{id}Starter+

    Hent personprofil med aktive og historiske virksomhedsrelationer, roller og adressehistorik. Kræver Starter-plan eller højere.

    Parametre

    idintegerrequired
    Personens enhedsNummer fra CVR-registret. Kan findes via /v1/search/person eller i virksomhedens ledelsesdata (f.eks. direktion[].enhedsNummer).
    Eksempel
    bash
    curl "https://api.selskabsinfo.dk/v1/person/4000068941" \
      -H "Authorization: Bearer sk_live_..."

    Response-felter:

    FeltTypeBeskrivelse
    enhedsNummernumberPersonens unikke enhedsNummer i CVR-registret
    navnstring | nullPersonens aktuelle fulde navn
    navneHistorikarrayHistorik over navneændringer (navn, fraDato, tilDato)
    adresseobject | nullNuværende adresse (vejnavn, husnummerFra, etage, sidedoer, postnummer, postdistrikt, kommune, landekode)
    adresseHistorikarrayHistorik over adresseændringer med perioder
    aktiveRelationerarrayVirksomheder hvor personen har en aktiv rolle eller ejer en andel i dag
    aktiveRelationer[].virksomhedNavnstringVirksomhedens navn
    aktiveRelationer[].cvrstringCVR-nummer
    aktiveRelationer[].statusstringVirksomhedens status fra CVR (NORMAL, OPLØST m.fl.)
    aktiveRelationer[].rollerarrayRoller i virksomheden (type, titel, fraDato, tilDato). En ejerandel fra ejerregistret er en rolle med titlen LEGAL EJER og felterne ejerandel og stemmeret som intervaller, fx "50-66%"
    historiskeRelationerarrayVirksomheder hvor alle personens roller og ejerandele er afsluttede - samme struktur som aktiveRelationer
    antalVirksomhedernumberSamlet antal virksomheder (aktive + historiske)
    Eksempel response
    json
    {
      "enhedsNummer": 4000068941,
      "navn": "Anders Mikkelsen Jensen",
      "navneHistorik": [
        { "navn": "Anders Mikkelsen Jensen", "fraDato": "2010-01-01", "tilDato": null }
      ],
      "adresse": {
        "vejnavn": "Strandvejen",
        "husnummerFra": 42,
        "etage": null,
        "sidedoer": null,
        "postnummer": 2900,
        "postdistrikt": "Hellerup",
        "kommune": "Gentofte",
        "landekode": "DK"
      },
      "adresseHistorik": [
        {
          "vejnavn": "Strandvejen",
          "husnummerFra": 42,
          "postnummer": 2900,
          "postdistrikt": "Hellerup",
          "landekode": "DK",
          "fraDato": "2018-03-15",
          "tilDato": null
        }
      ],
      "aktiveRelationer": [
        {
          "virksomhedNavn": "COOP TRADING A/S",
          "cvr": "10150817",
          "status": "NORMAL",
          "roller": [
            {
              "type": "DIREKTION",
              "titel": "ADMINISTRERENDE DIREKTØR",
              "fraDato": "2020-06-01",
              "tilDato": null
            }
          ]
        },
        {
          "virksomhedNavn": "AMJ HOLDING ApS",
          "cvr": "12345678",
          "status": "NORMAL",
          "roller": [
            {
              "type": "REGISTER",
              "titel": "LEGAL EJER",
              "fraDato": "2016-02-01",
              "tilDato": null,
              "ejerandel": "100%",
              "stemmeret": "100%"
            }
          ]
        }
      ],
      "historiskeRelationer": [
        {
          "virksomhedNavn": "OLD COMPANY ApS",
          "cvr": "87654321",
          "status": "OPLØST",
          "roller": [
            {
              "type": "DIREKTION",
              "titel": "DIREKTØR",
              "fraDato": "2015-01-01",
              "tilDato": "2019-12-31"
            }
          ]
        }
      ],
      "antalVirksomheder": 3
    }

    Persondata hentes direkte fra CVR-registrets deltager-index. Response caches i 1 time. Resultater inkluderer alle virksomhedsrelationer - både aktive og historiske - med detaljerede rollebeskrivelser.

    GET/v1/search/personStarter+

    Søg efter personer i CVR-registret efter navn. Returnerer detaljerede resultater inkl. adresse, navnehistorik og virksomhedsrelationer. Kræver Starter-plan eller højere. Understøtter fuzzy-matching og prefix-søgning.

    Parametre

    qstringrequired
    Personnavn. Minimum 2 tegn. Understøtter delvis match og fuzzy-søgning.
    limitinteger
    Maks antal resultater (standard: 10, max: 50). Resultater deduplikeres automatisk.
    Eksempel
    bash
    curl "https://api.selskabsinfo.dk/v1/search/person?q=Anders+Jensen&limit=5" \
      -H "Authorization: Bearer sk_live_..."

    Response-felter per resultat:

    FeltTypeBeskrivelse
    enhedsNummernumberPersonens unikke enhedsNummer (brug til /v1/person-opslag)
    navnstringPersonens aktuelle fulde navn
    adresseobject | nullNuværende adresse (vejnavn, husnummerFra, etage, sidedoer, postnummer, postdistrikt, landekode)
    navneHistorikarrayHistorik over navneændringer (navn, fraDato, tilDato)
    aktiveRelationerarrayVirksomheder med en aktiv rolle eller en ejerandel i dag (virksomhedNavn, cvr, roller[]). En ejerandel er en rolle med titlen LEGAL EJER og intervallerne ejerandel og stemmeret
    historiskeRelationerarrayVirksomheder hvor alle roller og ejerandele er afsluttede
    antalAktiveRelationernumberAntal virksomheder med en aktiv rolle eller ejerandel
    antalHistoriskeRelationernumberAntal virksomheder hvor alt er afsluttet
    Response
    json
    {
      "results": [
        {
          "enhedsNummer": 4000068941,
          "navn": "Anders Mikkelsen Jensen",
          "adresse": {
            "vejnavn": "Strandvejen",
            "husnummerFra": 42,
            "etage": null,
            "sidedoer": null,
            "postnummer": 2900,
            "postdistrikt": "Hellerup",
            "landekode": "DK"
          },
          "navneHistorik": [
            { "navn": "Anders Mikkelsen Jensen", "fraDato": "2010-01-01", "tilDato": null }
          ],
          "aktiveRelationer": [
            {
              "virksomhedNavn": "COOP TRADING A/S",
              "cvr": "10150817",
              "roller": [
                {
                  "type": "DIREKTION",
                  "titel": "ADMINISTRERENDE DIREKTØR",
                  "fraDato": "2020-06-01",
                  "tilDato": null,
                  "aktiv": true
                }
              ]
            }
          ],
          "historiskeRelationer": [],
          "antalAktiveRelationer": 1,
          "antalHistoriskeRelationer": 0
        }
      ],
      "total": 1,
      "returned": 1
    }

    total og returned er ikke det samme

    returned er antallet af elementer i results. total er derimod antallet af træf hos CVR før vi frasorterer dubletter og ikke-personer, så total overstiger rutinemæssigt både returned og limit. Brug returned, ikke total, når du paginerer.

    Person-søgeresultater inkluderer virksomhedsrelationer med roller - dette giver dig mulighed for at identificere personen korrekt og se deres aktuelle engagement, uden behov for et ekstra /v1/person-kald. Hvert roller-objekt inkluderer et aktiv-felt for nem filtrering.

    GET/v1/konkurser

    Konkursdekreter offentliggjort i Statstidende af de danske skifteretter, beriget med branche og selskabsform fra CVR. Sorteret med nyeste dekret først. Koster 1 kald fra din kvote. Datasættet dækker perioden fra januar 2026 og frem.

    Parametre

    fromstring
    Tidligste dekretdato, ISO-format (YYYY-MM-DD).
    tostring
    Seneste dekretdato, ISO-format (YYYY-MM-DD).
    courtstring
    Skifteret, eksakt match (fx Sø- og Handelsretten).
    industrystring
    Branchetekst, eksakt match.
    citystring
    By, eksakt match — matcher enten by eller registreret_by.
    qstring
    Fritekstsøgning i virksomhedsnavn. Mindst 2 og højst 200 tegn.
    pageinteger
    Sidenummer (standard: 1). En side efter den sidste giver en tom results med det reelle total, ikke en fejl. page × perPage må højst være 100.000 - dybere sider afvises med 400 invalid_page uden at koste et kald.
    perPageinteger
    Resultater per side (standard: 25, max: 100).
    Eksempel
    bash
    curl "https://api.selskabsinfo.dk/v1/konkurser?from=2026-06-01&perPage=2" \
      -H "Authorization: Bearer sk_live_..."
    Response
    json
    {
      "results": [
        {
          "cvr": "12345678",
          "navn": "EKSEMPEL RESTAURANT ApS",
          "dekretdato": "2026-09-07",
          "skifteret": "Sø- og Handelsretten",
          "sagsnummer": "K 1234/26-A",
          "kurator": "Jens Jensen",
          "kuratoradresse": "Rådhuspladsen 1, 1550 København V",
          "by": "København V",
          "postnummer": "1550",
          "registreret_by": "København V",
          "branche": "Restauranter",
          "virksomhedsform": "APS"
        }
      ],
      "total": 811,
      "page": 1,
      "perPage": 2
    }

    cvr kan være null

    Et lille antal bekendtgørelser i Statstidende angiver ikke CVR-nummer. De indgår stadig i resultatet, men kan ikke slås op med /v1/company/{cvr}.

    Én række pr. konkurs, kun virksomheder

    Statstidende trykker af og til samme dekret igen, enten ordret eller med en rettelse (fx en ny kurator). Så vises kun den nyeste bekendtgørelse, og konkursen tæller én gang i total. Listen dækker virksomheder, hvis navn bærer en selskabsbetegnelse (A/S, ApS, I/S, K/S, P/S, IVS, A.M.B.A. m.fl.), eller hvis navn indeholder under konkurs, under tvangsopløsning eller under rekonstruktion. Personlige konkurser og enkeltmandsvirksomheder, der står i ejerens navn, er ikke med.

    virksomhedsform er en kode her, men et navn på /v1/nyevirksomheder

    De to endpoints henter selskabsform fra hver sin kilde, som gemmer den i hver sin form. Her får du CVR's korte kode — APS, A/S, IVS — mens /v1/nyevirksomheder giver det fulde navn, fx Anpartsselskab. Filtrér derfor med den form det pågældende endpoint selv returnerer.

    by og registreret_by

    by og postnummer er adressen som den står på bekendtgørelsen, og hører altid sammen.registreret_by er virksomhedens aktuelt registrerede by i CVR og kan afvige, hvis virksomheden er flyttet siden bekendtgørelsen — den har intet postnummer i vores data og er derfor et selvstændigt felt frem for at overskrive by. De to felter bruger også forskellige stavemåder: Statstidende skriver Århus C, hvor CVR skriver Aarhus C. Derfor matchercity-filteret begge felter.

    GET/v1/nyevirksomheder

    Nyregistrerede danske virksomheder: aktive virksomheder stiftet inden for de seneste 24 måneder, sorteret med nyeste stiftelsesdato først. Synkroniseres fra CVR hver nat. Koster 1 kald fra din kvote.

    Parametre

    fromstring
    Tidligste stiftelsesdato, ISO-format (YYYY-MM-DD).
    tostring
    Seneste stiftelsesdato, ISO-format (YYYY-MM-DD).
    industrystring
    Branchetekst, eksakt match.
    industry_codestring
    Branchekode, præcis 6 cifre (fx 702000) - alle branchekoder i datasættet er 6-cifrede. En værdi med andet end præcis 6 cifre giver 400 invalid_industry_code.
    citystring
    By, eksakt match.
    legal_formstring
    Selskabsform, eksakt match (fx Anpartsselskab).
    qstring
    Fritekstsøgning i virksomhedsnavn. Mindst 2 og højst 200 tegn.
    pageinteger
    Sidenummer (standard: 1). En side efter den sidste giver en tom results med det reelle total, ikke en fejl. page × perPage må højst være 100.000 - dybere sider afvises med 400 invalid_page uden at koste et kald.
    perPageinteger
    Resultater per side (standard: 25, max: 100).
    Eksempel
    bash
    curl "https://api.selskabsinfo.dk/v1/nyevirksomheder?from=2026-09-01&legal_form=Anpartsselskab&perPage=2" \
      -H "Authorization: Bearer sk_live_..."
    Response
    json
    {
      "results": [
        {
          "cvr": "46768442",
          "navn": "EKSEMPEL HOLDING ApS",
          "stiftelsesdato": "2026-09-14",
          "by": "Aarhus C",
          "postnummer": "8000",
          "kommunekode": "0751",
          "branche": "Virksomhedsrådgivning og anden ledelsesrådgivning",
          "branchekode": "702000",
          "virksomhedsform": "Anpartsselskab",
          "virksomhedstype": "APS"
        }
      ],
      "total": 4879,
      "page": 1,
      "perPage": 2
    }

    Kun aktive virksomheder, kun 24 måneder

    Bemærk formaterne: kommunekode er, når den er udfyldt, nulpolstret til fire tegn ("0751", ikke "751"), og virksomhedstype er CVR's korte selskabskode med versaler ("APS", "ENK") — den lange tekst står i virksomhedsform.

    Endpointet dækker aktive virksomheder stiftet inden for de seneste 24 måneder. Skal du bruge kontaktoplysninger, regnskabstal eller medarbejderantal, ligger de i /v1/company/{cvr} med de relevante include-sektioner.

    kommunekode er string | null

    For en del virksomheder, især de ældre registreringer i perioden, har vi endnu ikke kommunekoden fra CVR. For mange af dem er koden udledt af postnummeret, hvor det ligger inden for én kommune, indtil CVR's egen værdi når frem; for resten er feltet null. De senest registrerede virksomheder får den normalt med ved den natlige synkronisering. Skal du placere virksomhederne geografisk, er postnummer det sikre felt.

    Include-system

    Brug include-parameteren på /v1/company/{cvr} for at tilføje valgfrie datasektioner. Flere sektioner adskilles med komma.

    IncludeResponse-felterMin. plan
    managementdirektion, bestyrelse, revision, stiftere, likvidatorer, repraesentanterFree
    financialsregnskabsdata - detaljeret regnskabsdataFree
    courtDataretssager, antalRetssager, myndighedssager, antalMyndighedssagerStarter
    ownershipejerskab - legale ejere med ejerandel og stemmeretPro
    subsidiariesdatterselskaber, antalDatterselskaberPro
    creditRiskkreditrisiko - SI-score fra SI-vurderingen (model med 15 faktorer)Starter
    capitalkapitalhaendelser - kapitalforhøjelser, stiftelse, nedsættelser med ejerskabStarter
    realOwnersreelleEjere - reelle ejere fra Erhvervsstyrelsens lukkede registerKontrakt
    Eksempel med flere includes
    bash
    curl "https://api.selskabsinfo.dk/v1/company/10150817?include=management,financials,ownership,courtData" \
      -H "Authorization: Bearer sk_live_..."

    Hvis du anmoder om en include, som din plan ikke dækker, returneres en 403 tier_restricted-fejl med besked om hvilken plan der kræves.

    include: management

    Tilføjer ledelsesdata: direktion, bestyrelse, revision, stiftere, likvidatorer og foreningsrepræsentanter. Tilgængelig på alle planer inkl. Free.

    Response-felter:

    FeltTypeBeskrivelse
    direktionarrayMedlemmer af direktionen
    direktion[].navnstringFulde navn på direktøren
    direktion[].titelstring | nullFunktionstitel (f.eks. "ADMINISTRERENDE DIREKTØR")
    direktion[].fraDatostring | nullTiltrædelsesdato (ISO 8601)
    direktion[].tilDatostring | nullFratrædelsesdato (null = nuværende)
    direktion[].enhedsNummernumber | nullPersonens enhedsNummer (brug til /v1/person-opslag)
    bestyrelsearrayBestyrelsesmedlemmer - samme feltstruktur som direktion
    revisionarrayTilknyttede revisorer - samme feltstruktur som direktion
    likvidatorerarrayLikvidator for et selskab under likvidation eller tvangsopløsning, som tegner selskabet i stedet for ledelsen - samme feltstruktur som direktion (titel er "LIKVIDATOR")
    repraesentanterarrayForeningsrepræsentanter. Foreninger har ingen direktion eller bestyrelse i CVR, kun repræsentanter - samme feltstruktur som direktion (titel er "Foreningsrepræsentant")
    stifterearrayStiftere af selskabet
    stiftere[].navnstringStifterens navn
    stiftere[].enhedsNummernumber | nullEnhedsNummer for stifteren. Stiftere har kun disse to felter — der er intet cvr på en stifter
    Eksempel response - management
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      ...
      "direktion": [
        {
          "navn": "Michael Kristian Friis",
          "titel": "ADMINISTRERENDE DIREKTØR",
          "fraDato": "2020-06-01",
          "tilDato": null,
          "enhedsNummer": 4000012345
        }
      ],
      "bestyrelse": [
        {
          "navn": "Jette Sørensen",
          "titel": "FORMAND",
          "fraDato": "2019-04-15",
          "tilDato": null,
          "enhedsNummer": 4000067890
        },
        {
          "navn": "Anders Nielsen",
          "titel": "NÆSTFORMAND",
          "fraDato": "2021-03-01",
          "tilDato": null,
          "enhedsNummer": 4000011223
        }
      ],
      "revision": [
        {
          "navn": "Deloitte Statsautoriseret Revisionspartnerselskab",
          "titel": "REVISION",
          "fraDato": "2018-04-25",
          "tilDato": null,
          "enhedsNummer": 4000044556
        }
      ],
      "likvidatorer": [],
      "repraesentanter": [],
      "stiftere": [
        {
          "navn": "FDB A.M.B.A.",
          "enhedsNummer": 4000099887
        }
      ]
    }

    include: financials

    Tilføjer detaljeret regnskabsdata fra virksomhedens op til fire senest offentliggjorte årsrapporter, inkl. EBIT og EBITDA for hvert år. Tilgængelig på alle planer inkl. Free.

    Response-felter:

    FeltTypeBeskrivelse
    regnskabsdataobject | nullRegnskabsdata fra seneste årsrapporter. Null hvis ingen data tilgængelig.
    regnskabsdata.hasRealDatabooleanOm der blev fundet faktiske regnskabsdata
    regnskabsdata.financialReportsarrayMetadata om tilgængelige årsrapporter
    regnskabsdata.financialDataarrayParsede regnskabstal per regnskabsperiode - op til fire regnskabsår, i den rækkefølge årsrapporterne er offentliggjort (normalt nyeste først). En årsrapport, der er indsendt for sent eller rettet, kan ligge foran et nyere år - find et bestemt år via regnskabsaar
    financialData[].periodestringRegnskabsperiode (f.eks. "2023-01-01 - 2023-12-31")
    financialData[].regnskabsaarnumber | nullRegnskabsåret - året perioden slutter i (2023/24 er 2024). Null hvis perioden ikke kan aflæses
    financialData[].nettoomsaetningnumber | nullNettoomsætning i DKK
    financialData[].bruttofortjenestenumber | nullBruttofortjeneste i DKK
    financialData[].ebitnumber | nullEBIT (resultat af primær drift) i DKK. Årsrapportens eget driftsresultat, eller beregnet som bruttofortjeneste minus personaleomkostninger og af- og nedskrivninger, når årsrapporten ikke angiver det. Beregnet efter samme regel som EBIT i Lead Finder
    financialData[].ebitdanumber | nullEBITDA i DKK: EBIT plus af- og nedskrivninger. Null når årsrapporten ikke angiver af- og nedskrivninger
    financialData[].ebitAfledtbooleantrue når ebit er beregnet ud fra resultatopgørelsens linjer, fordi årsrapporten ikke angiver et driftsresultat
    financialData[].driftsresultatnumber | nullDriftsresultat i DKK, som angivet i årsrapporten. Mange små selskaber angiver det ikke - brug ebit
    financialData[].afskrivningernumber | nullAf- og nedskrivninger i DKK
    financialData[].resultatFoerSkatnumber | nullResultat før skat i DKK
    financialData[].aaretsResultatnumber | nullÅrets resultat i DKK
    financialData[].egenkapitalnumber | nullEgenkapital i DKK
    financialData[].statusBalancenumber | nullBalance (aktiver i alt) i DKK
    financialData[].personaleomkostningernumber | nullPersonaleomkostninger i DKK
    financialData[].likvideBehoelningernumber | nullLikvide beholdninger i DKK
    financialData[].gaeldsforpligtelsernumber | nullGældsforpligtelser i DKK
    financialData[].valutastringValuta (altid "DKK" - konverteret automatisk)

    Regnskabsdata indeholder mange flere detaljerede felter end vist ovenfor, bl.a. anlægsaktiver, omsætningsaktiver, gæld, hensættelser, egenkapitaldetaljer m.m. Se det fulde eksempel nedenfor.

    Eksempel response - financials
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      ...
      "regnskabsdata": {
        "hasRealData": true,
        "financialReports": [ ... ],
        "financialData": [
          {
            "periode": "2023-01-01 - 2023-12-31",
            "regnskabsaar": 2023,
            "nettoomsaetning": 8456000000,
            "bruttofortjeneste": 523000000,
            "ebit": 98000000,
            "ebitda": 140000000,
            "ebitAfledt": false,
            "driftsresultat": 98000000,
            "resultatAfPrimaerDrift": 98000000,
            "resultatFoerSkat": 112000000,
            "aaretsResultat": 87000000,
            "personaleomkostninger": 245000000,
            "afskrivninger": 42000000,
            "finansielleIndtaegter": 18000000,
            "finansielleOmkostninger": 4000000,
            "skatAfAaretsResultat": 25000000,
            "statusBalance": 3400000000,
            "anlaegsaktiverValue": 1800000000,
            "omsaetningsaktiver": 1600000000,
            "varebeholdninger": 320000000,
            "tilgodehavender": 890000000,
            "likvideBehoelninger": 390000000,
            "egenkapital": 1250000000,
            "gaeldsforpligtelser": 2150000000,
            "langfristetGaeld": 800000000,
            "kortfristetGaeld": 1350000000,
            "virksomhedskapital": 100000000,
            "overfoertResultat": 1150000000,
            "valuta": "DKK",
            "originalValuta": "DKK"
          },
          ...
        ]
      }
    }

    Vækst (CAGR): Med fire regnskabsår kan du beregne den årlige vækst over tre år, f.eks. for EBIT: (ebit[år] / ebit[år - 3]) ^ (1/3) - 1. Find årene via regnskabsaar frem for rækkefølgen - et regnskab, der er indsendt for sent eller rettet, kan ligge foran et nyere, og et år kan mangle. Vækst giver kun mening, når begge år er positive og dækker 12 måneder (se periode).

    Ikke alle virksomheder offentliggør detaljeret regnskabsdata. Felter kan være null hvis data ikke er tilgængelig i årsrapporten. Enkeltmandsvirksomheder og små selskaber offentliggør typisk færre nøgletal. Udenlandsk valuta konverteres automatisk til DKK.

    include: courtData

    Tilføjer retssager og myndighedssager. Data indsamles fra domstolenes retslister (civile sager), Arbejdsretten, otte myndigheder og nævn samt Statstidende. Kræver Starter eller højere.

    Response-felter:

    FeltTypeBeskrivelse
    retssagerarrayRetssager fra danske domstole hvor virksomheden nævnes
    retssager[].sagsnummerstring | nullSagsnummer
    retssager[].retstring | nullDomstolens navn (f.eks. "Retten i København")
    retssager[].sagstypestring | nullSagstype (f.eks. "Civil sag")
    retssager[].datostring | nullRetsdato (ISO 8601)
    retssager[].tidspunktStartstring | nullStarttidspunkt for retsmøde (f.eks. "09:30")
    retssager[].tidspunktSlutstring | nullSluttidspunkt for retsmøde
    retssager[].retssalstring | nullRetssal
    retssager[].erOffentligboolean | nullOm retsmødet er offentligt
    retssager[].beskrivelsestring | nullBeskrivelse af sagen
    retssager[].dommerearray | nullDommernavne. Kan være null — typisk på insolvenssager uden dommerliste
    retssager[].sagsøgerearray | nullSagsøgere som { name, lawyer }
    retssager[].sagsøgtearray | nullSagsøgte som { name, lawyer }
    retssager[].kildeUrlstring | nullKilde-URL fra domstolens hjemmeside
    retssager[].kildestring | undefinedKun "arbejdsretten". Arbejdsretten-afgørelser har en anden form — se boksen nedenfor. Forgren på dette felt
    antalRetssagernumberAntal retssager i retssager
    myndighedssagerobjectSager fra otte myndigheder og nævn samt Statstidende (12 nøgler), grupperet per kilde. Kun kilder med fund er til stede
    antalMyndighedssagernumberSamlet antal myndighedssager på tværs af alle myndigheder
    Mulige nøgler i myndighedssager: arbejdstilsynet, datatilsynet, datatilsynet_boeder, finanstilsynet, foedevarestyrelsen, forbrugerombudsmanden, sikkerhedsstyrelsen, statstidende_konkurser, statstidende_staevninger, statstidende_andet, kfst, klagenaevnet_udbud. Elementformen er forskellig per myndighed.
    Eksempel response - courtData
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      ...
      "retssager": [
        {
          "sagsnummer": "BS-12345/2026-KBH",
          "ret": "Retten i København",
          "sagstype": "Civil sag",
          "dato": "2026-11-15",
          "tidspunktStart": "09:30",
          "tidspunktSlut": "11:00",
          "retssal": "Retssal 4",
          "erOffentlig": true,
          "beskrivelse": "Hovedforhandling",
          "dommere": ["Silja Lundberg Peris"],
          "sagsøgere": [{ "name": "COOP TRADING A/S", "lawyer": "Adv. Jens Hansen" }],
          "sagsøgte": [{ "name": "Leverandør ApS", "lawyer": null }],
          "kildeUrl": "https://www.domstol.dk/retten-i-koebenhavn/retslister/"
        }
      ],
      "antalRetssager": 1,
      "myndighedssager": {
        "arbejdstilsynet": [
          {
            "titel": "Strakspåbud om sikkerhedsforanstaltninger",
            "beskrivelse": "Virksomheden har fået påbud vedrørende maskinsikkerhed.",
            "dato": "2026-06-10",
            "cvrNummer": "10150817",
            "link": "https://at.dk/afgoerelser/..."
          }
        ],
        "foedevarestyrelsen": [
          {
            "titel": "Indskærpelse",
            "beskrivelse": "...",
            "dato": "2026-08-20",
            "virksomhed": "COOP TRADING A/S",
            "solgtI": "Detail",
            "link": "https://www.findsmiley.dk/...",
            "billedeUrl": null
          }
        ]
      },
      "antalMyndighedssager": 2
    }

    Arbejdsretten-afg\u00f8relser har en anden form

    Samme retssager-array indeholder ogs\u00e5 afg\u00f8relser fra Arbejdsretten. De b\u00e6rer kilde: "arbejdsretten" og felterne titel, parter, resum\u00e9, n\u00f8gleord og pdfUrl i stedet for retsm\u00f8defelterne. Forgren p\u00e5 kilde, f\u00f8r du l\u00e6ser et element.

    Myndighedssager returneres kun for de myndigheder, hvor der faktisk er fundet sager. Tomme myndigheder udelades fra response.

    include: ownership

    Tilføjer legale ejere fra ejerregisteret med ejerandel og stemmeret. Reelle ejere kræver include=realOwners, og stiftere følger med include=management. Kræver Pro eller højere.

    Response-felter:

    FeltTypeBeskrivelse
    ejerskabobjectContainer for ejerskabsdata
    ejerskab.ejerearrayLegale ejere fra ejerregisteret. Ikke reelle ejere — dem henter du med include=realOwners
    ejerskab.antalEjerenumberAntal ejere
    ejerskab.ejere[].navnstringEjerens navn
    ejerskab.ejere[].typestring"virksomhed" eller "person"
    ejerskab.ejere[].cvrstring | undefinedCVR-nummer, hvis ejeren er en virksomhed
    ejerskab.ejere[].enhedsNummerstring | undefinedEnhedsNummer for ejeren
    ejerskab.ejere[].ejerandelstringInterval som tekst, ikke et tal — CVR udstiller kun spænd. Et af 0%, under 5%, 5-10%, 10-15%, 15-20%, 20-25%, 25-33%, 33-50%, 50-66%, 66-90%, 90-100%, 100% eller Ukendt
    ejerskab.ejere[].stemmeretstring | undefinedStemmeandel, samme intervalformat som ejerandel. Udeladt når den ikke er registreret
    Eksempel response - ownership
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      ...
      "ejerskab": {
        "ejere": [
          {
            "navn": "COOP AMBA",
            "type": "virksomhed",
            "cvr": "30899849",
            "enhedsNummer": "4000034567",
            "ejerandel": "100%",
            "stemmeret": "100%"
          },
          {
            "navn": "Peter Guldager",
            "type": "person",
            "enhedsNummer": "4000078901",
            "ejerandel": "20-25%"
          }
        ],
        "antalEjere": 2
      }
    }

    include: subsidiaries

    Tilføjer datterselskaber - virksomheder der ejes af den pågældende virksomhed. Kræver Pro eller højere.

    Response-felter:

    FeltTypeBeskrivelse
    datterselskaberarrayListe af datterselskaber (kun aktive virksomheder)
    datterselskaber[].cvrstringCVR-nummer på datterselskabet
    datterselskaber[].enhedsNummernumberDatterselskabets enhedsNummer
    datterselskaber[].namestringNavn på datterselskabet
    datterselskaber[].addressstringAdresse på datterselskabet
    datterselskaber[].statusstringDatterselskabets status
    datterselskaber[].ownershipPercentagestring | nullEjerandel (f.eks. "75%", "50-66%")
    datterselskaber[].votingRightsstring | nullStemmerettigheder (f.eks. "75%")
    antalDatterselskabernumberAntal elementer i datterselskaber. Returneres altid sammen med arrayet
    Eksempel response - subsidiaries
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      ...
      "datterselskaber": [
        {
          "cvr": "34567890",
          "enhedsNummer": 12345678,
          "name": "COOP LOGISTICS ApS",
          "address": "Roskildevej 65, 2620 Albertslund",
          "status": "NORMAL",
          "ownershipPercentage": "100%",
          "votingRights": "100%"
        },
        {
          "cvr": "45678901",
          "enhedsNummer": 23456789,
          "name": "COOP IMPORT A/S",
          "address": "Industrivej 10, 2630 Taastrup",
          "status": "NORMAL",
          "ownershipPercentage": "50-66%",
          "votingRights": "50-66%"
        }
      ],
      "antalDatterselskaber": 2
    }

    include: creditRisk

    Tilføjer SI-scoren fra SI-vurderingen, baseret på en model med 15 faktorer. Inkluderer risikoscore (0–10), risikoniveau, kreditanbefaling, detaljerede faktorer, advarsler og kritiske flags. Kræver Starter eller højere.

    Response-felter:

    FeltTypeBeskrivelse
    kreditrisiko.scorenumber | nullSamlet risikoscore (0–10, højere = bedre). null for virksomhedsformer uden score (se scoreAnvendelig)
    kreditrisiko.scoreAnvendeligbooleanOm en samlet score beregnes. Kapitalselskaber og fonde får altid en score; andre former (fx enkeltmandsvirksomheder, foreninger, andelsselskaber) får kun en score, hvis de offentliggør regnskab — ellers null. Opløste/inaktive virksomheder får altid en score
    kreditrisiko.bemærkningstringKun når scoreAnvendelig er false: forklaring på, hvorfor scoren ikke beregnes
    kreditrisiko.scoreOutOfnumberAltid 10 (maks. score)
    kreditrisiko.risikoniveaustring"Lav risiko" | "Medium risiko" | "Høj risiko" | "Ekstrem risiko"
    kreditrisiko.kreditanbefalingstringAnbefaling: "Normal kredit" | "Begrænset kredit" | "Minimalt kredit" | "Ingen kredit anbefalet"
    kreditrisiko.faktorerobject14 individuelle risikofaktorer med score, vægt og detaljer
    kreditrisiko.advarslerarrayListe af advarsler (tekststrenge)
    kreditrisiko.kritiskeFlagsarrayKritiske risikoindikatorer
    kreditrisiko.burnRateobjectBurn rate analyse: måneder til nul egenkapital, severity mv.
    kreditrisiko.isCappedbooleanOm scoren er begrænset af en cap-regel
    kreditrisiko.scoreBegrænsningobject | nullEventuel cap med value og reason
    kreditrisiko.groupCompanyStatusobjectKoncernselskabsanalyse (type, confidence, indikatorer)
    Eksempel response - creditRisk
    json
    {
      "cvr": "10150817",
      "navn": "COOP TRADING A/S",
      ...
      "kreditrisiko": {
        "score": 7.2,
        "scoreOutOf": 10,
        "risikoniveau": "Lav risiko",
        "kreditanbefaling": "Normal kredit",
        "faktorer": {
          "status": { "score": 10, "weight": 0, "details": "Aktiv virksomhed" },
          "virksomhedsform": { "score": 8, "weight": 3.1, "details": "A/S med begrænset hæftelse" },
          "oekonomi": { "score": 6.8, "weight": 39.2, "details": "..." },
          "revisor": { "score": 9, "weight": 12.4, "details": "Stabil revisor" },
          "retssager": { "score": 10, "weight": 0, "details": "Ingen retssager fundet" }
        },
        "advarsler": [],
        "kritiskeFlags": [],
        "burnRate": {
          "monthsToZero": null,
          "equity": 150000000,
          "annualProfit": 25000000,
          "severity": "growing"
        },
        "isCapped": false,
        "groupCompanyStatus": {
          "isGroupCompany": true,
          "type": "subsidiary",
          "confidence": "high"
        }
      }
    }

    include: capital

    Tilføjer komplet kapitalhistorik: stiftelse, kapitalforhøjelser, kapitalnedsættelser og tranche-events. Inkluderer kurs, tegningsbeløb, indbetalingstype, post-money valuation og ejerskabs-snapshot for hver hændelse. Kræver Starter eller højere.

    Response-felter:

    FeltTypeBeskrivelse
    kapitalhaendelserobjectContainer for kapitalhistorik
    kapitalhaendelser.haendelserarrayKronologisk liste af kapitalhændelser
    kapitalhaendelser.antalHaendelsernumberAntal hændelser
    kapitalhaendelser.nuværendeKapitalnumber | nullNuværende registreret kapital
    kapitalhaendelser.valutastringValuta (typisk "DKK")

    Felter per hændelse:

    FeltTypeBeskrivelse
    datostringDato for hændelsen (ISO 8601, f.eks. "2024-01-22")
    typestringstiftelse | kapitalforhøjelse | kapitalnedsættelse
    kapitalFoernumber | nullSelskabskapital før hændelsen (DKK)
    kapitalEfternumberSelskabskapital efter hændelsen (DKK)
    aendringnumberNominel ændring i DKK (positiv = forhøjelse, negativ = nedsættelse)
    valutastringValuta (typisk "DKK")
    kursnumber | undefinedTegningskurs (100 = pari, >100 = overkurs). F.eks. kurs 2180 = pris 21,80 kr. per nom. 1 kr.
    tegningsbeloebnumber | nullSamlet tegningsbeløb i DKK (nominalÆndring × kurs/100)
    postMoneyValuationnumber | nullEstimeret post-money valuation (kapitalEfter × kurs/100). Kun ved overkurs.
    indbetalingstypestring | null"Kontant indbetaling" | "Apportindskud" | "Gældskonvertering"
    ejerskabarray | undefinedEjerskabs-snapshot på tidspunktet (navn, ejerandel, type, cvr, enhedsNummer)
    erTrancheboolean | undefinedTrue hvis dette er en del af en multi-tranche hændelse
    trancheNummernumber | undefinedTranche-nummer (1-baseret) inden for gruppen
    antalTranchernumber | undefinedAntal trancher på samme dato
    Eksempel response - capital
    json
    {
      "cvr": "41791013",
      "navn": "EKSEMPEL STARTUP ApS",
      ...
      "kapitalhaendelser": {
        "haendelser": [
          {
            "dato": "2018-11-20",
            "type": "stiftelse",
            "kapitalFoer": null,
            "kapitalEfter": 40000,
            "aendring": 40000,
            "valuta": "DKK"
          },
          {
            "dato": "2020-06-15",
            "type": "kapitalforhøjelse",
            "kapitalFoer": 40000,
            "kapitalEfter": 52000,
            "aendring": 12000,
            "valuta": "DKK",
            "kurs": 833.33,
            "tegningsbeloeb": 99999.6,
            "postMoneyValuation": 433331.6,
            "indbetalingstype": "Kontant indbetaling",
            "ejerskab": [
              {
                "navn": "Stifter Holding ApS",
                "ejerandel": "66-90%",
                "type": "virksomhed",
                "cvr": "41234567"
              },
              {
                "navn": "Investor Ventures ApS",
                "ejerandel": "10-15%",
                "type": "virksomhed",
                "cvr": "42345678"
              }
            ]
          },
          {
            "dato": "2023-03-01",
            "type": "kapitalforhøjelse",
            "kapitalFoer": 52000,
            "kapitalEfter": 62000,
            "aendring": 10000,
            "valuta": "DKK",
            "kurs": 2180.5,
            "tegningsbeloeb": 218050,
            "postMoneyValuation": 1351910,
            "indbetalingstype": "Kontant indbetaling",
            "erTranche": true,
            "trancheNummer": 1,
            "antalTrancher": 2,
            "ejerskab": [
              {
                "navn": "Akasha Ventures ApS",
                "ejerandel": "33-50%",
                "type": "virksomhed",
                "cvr": "43456789"
              },
              {
                "navn": "ALL GAS NO BRAKES ApS",
                "ejerandel": "33-50%",
                "type": "virksomhed",
                "cvr": "44567890"
              },
              {
                "navn": "L.M.F HOLDING ApS",
                "ejerandel": "5-10%",
                "type": "virksomhed",
                "cvr": "45678901"
              }
            ]
          },
          {
            "dato": "2023-03-01",
            "type": "kapitalforhøjelse",
            "kapitalFoer": 62000,
            "kapitalEfter": 86251,
            "aendring": 24251,
            "valuta": "DKK",
            "kurs": 2180.5,
            "tegningsbeloeb": 528916,
            "erTranche": true,
            "trancheNummer": 2,
            "antalTrancher": 2
          }
        ],
        "antalHaendelser": 4,
        "nuværendeKapital": 86251,
        "valuta": "DKK"
      }
    }

    Vigtige bemærkninger om kapitaldata

    • Data stammer fra Erhvervsstyrelsens CVR-register (kapitalforhold).
    • Ejerskabs-snapshots viser registrerede ejere på tidspunktet - minoritetsejere under 5% registreres ikke i CVR.
    • Tranche-events oprettes når flere kapitalændringer sker på samme dato (f.eks. forskellige indbetalingstyper).
    • postMoneyValuation er et estimat baseret på kurs × kapital - den faktiske valuation kan afvige.

    include: realOwners

    Tilføjer reelle ejere fra Erhvervsstyrelsens lukkede register. Oplysningerne er fortrolige og kræver en underskrevet kontrakt med os - de er derfor ikke bundet til en bestemt plan, men til en særskilt adgangsaftale på din konto. Uden aftalen returneres 403 contract_required.

    På vores side om reelle ejere kan du læse, hvad en reel ejer er, hvem der efter reglerne kan få adgang, og hvordan adgangsaftalen indgås.

    Response-felter:

    FeltTypeBeskrivelse
    reelleEjereobject | nullContainer for reelle ejere (null hvis datakilden fejlede)
    reelleEjere.antalReelleEjerenumberAntal aktive reelle ejere
    reelleEjere.ejerearrayAlle registrerede reelle ejere (aktive først)
    ejere[].navnstringDen reelle ejers navn
    ejere[].typestringPERSON | VIRKSOMHED | UKENDT
    ejere[].cvrNummerstring | undefinedCVR-nummer hvis ejeren er en virksomhed
    ejere[].enhedsNummerstring | undefinedEnhedsNummer i CVR
    ejere[].ejerandelProcentnumber | nullEjerandel i procent (0-100)
    ejere[].stemmerettighederProcentnumber | nullStemmerettigheder i procent (0-100)
    ejere[].saerligeEjerforholdarraySærlige ejerforhold, f.eks. ret til at udpege bestyrelsesmedlemmer
    ejere[].aktivbooleanOm registreringen fortsat er aktiv
    ejere[].gyldigFrastring | nullRegistreret reel ejer siden (ISO 8601)
    ejere[].gyldigTilstring | nullOphørsdato (null = aktiv)
    ejere[].landstring | nullBopæls-/hjemland
    Eksempel response - realOwners
    json
    {
      "cvr": "10150817",
      "navn": "EKSEMPEL A/S",
      ...
      "reelleEjere": {
        "antalReelleEjere": 2,
        "ejere": [
          {
            "navn": "Mette Eksempel Jensen",
            "type": "PERSON",
            "enhedsNummer": "4000123456",
            "ejerandelProcent": 60,
            "stemmerettighederProcent": 60,
            "saerligeEjerforhold": [],
            "aktiv": true,
            "gyldigFra": "2017-06-12",
            "gyldigTil": null,
            "land": "DK"
          },
          {
            "navn": "Peter Eksempel Jensen",
            "type": "PERSON",
            "enhedsNummer": "4000654321",
            "ejerandelProcent": 40,
            "stemmerettighederProcent": 40,
            "saerligeEjerforhold": ["Har ret til at udpege bestyrelsesmedlemmer"],
            "aktiv": true,
            "gyldigFra": "2017-06-12",
            "gyldigTil": null,
            "land": "DK"
          }
        ]
      }
    }

    Fortrolige oplysninger - kontrakt påkrævet

    • Oplysninger om reelle ejere stammer fra Erhvervsstyrelsens lukkede cvr-re-distribution og er ikke offentligt tilgængelige.
    • Adgang kræver en godkendt, underskrevet aftale. Betalende API-kunder ansøger direkte under API-nøgler; andre kan kontakte os.
    • Data må kun anvendes i overensstemmelse med kontraktens vilkår og må ikke videredistribueres.
    • Alle opslag logges af hensyn til vores forpligtelser over for Erhvervsstyrelsen.
    • Uden aktiv aftale returneres 403 contract_required med beskeden "Fortroligt - kontakt os" (eller den samme besked som en warning ved on_restricted=skip).

    Håndtering af tier-restriktioner

    Når du anmoder om en include din plan ikke har adgang til, kan du vælge mellem to opførsler via query-parameteren on_restricted:

    on_restricted=errordefault

    Returnerer 403 Forbidden hvis nogen include kræver højere plan end din. Ingen data returneres. Anvendelig til strikt produktionskode hvor du vil vide hvis tier-konfiguration er forkert.

    on_restricted=skipsoft-mode

    Returnerer 200 OK med de includes din plan tillader. Restricterede includes droppes og listes i et warnings-array. Anvendelig til eksplorativ kode hvor du gerne vil have det data du kan få.

    Eksempel: Free-plan kalder med courtData (kræver Starter)

    Strikt mode (default)
    bash
    curl "https://api.selskabsinfo.dk/v1/company/10150817?include=management,courtData" \
      -H "Authorization: Bearer sk_live_..."
    
    # HTTP/1.1 403 Forbidden
    # {
    #   "error": {
    #     "code": "tier_restricted",
    #     "message": "'courtData' kræver Starter-planen eller højere..."
    #   }
    # }
    Soft-mode
    bash
    curl "https://api.selskabsinfo.dk/v1/company/10150817?include=management,courtData&on_restricted=skip" \
      -H "Authorization: Bearer sk_live_..."
    
    # HTTP/1.1 200 OK
    # {
    #   "cvr": "10150817",
    #   "navn": "Novo Nordisk A/S",
    #   "direktion": [ ... ],
    #   "bestyrelse": [ ... ],
    #   "warnings": [
    #     {
    #       "code": "tier_restricted",
    #       "include": "courtData",
    #       "required_tier": "Starter",
    #       "message": "'courtData' kræver Starter-planen eller højere."
    #     }
    #   ]
    # }

    Bemærk: Du faktureres kun for de includes der faktisk returneres. Restricterede includes (i warnings) koster ikke kald. Soft-mode-responses cachelagres ikke (Cache-Control: private, no-store) når warnings er til stede, fordi responset afhænger af din plan.

    Fejlkoder

    Alle fejl returneres som JSON med en error-object:

    Fejl-format
    json
    {
      "error": {
        "code": "invalid_api_key",
        "message": "Missing or malformed API key. Use: Authorization: Bearer sk_live_..."
      }
    }
    HTTP StatusKodeBeskrivelse
    400invalid_cvrCVR-nummeret er ikke gyldigt (skal være præcis 8 cifre)
    400invalid_querySøgeord for kort (min. 2 tegn)
    400invalid_from, invalid_tofrom eller to er ikke en gyldig dato i formatet YYYY-MM-DD - /v1/konkurser og /v1/nyevirksomheder
    400invalid_rangefrom ligger efter to
    400invalid_filterEt tekstfilter (q, court, industry, city, legal_form) er længere end 200 tegn
    400invalid_industry_codeindustry_code skal være præcis 6 cifre - /v1/nyevirksomheder
    401invalid_api_keyUgyldig eller manglende API-nøgle
    401key_revokedAPI-nøglen er tilbagekaldt
    403tier_restrictedDin plan giver ikke adgang til den ønskede funktion
    403contract_requiredKræver underskrevet kontrakt om adgang til reelle ejere - se include: realOwners
    404not_foundIngen virksomhed eller person fundet
    405method_not_allowedKun GET-metode er tilladt
    400invalid_includeUkendt include-navn - tjek stavning mod listen i Include-system
    400invalid_idPerson-id (enhedsNummer) skal være et positivt heltal - /v1/person
    400invalid_pagepage × perPage overstiger 10.000 på /v1/search eller 100.000 på /v1/konkurser og /v1/nyevirksomheder. Indsnævr søgningen eller filtrene i stedet. Ingen kvote forbruges
    400invalid_on_restrictedon_restricted skal være error eller skip
    400invalid_enriched_contactenriched_contact skal være true eller false
    429rate_limit_exceededFor mange kald pr. sekund. Deler status 429 med monthly_limit_exceeded — forgren på error.code, ikke på statuskoden, ellers rapporterer din klient et hastighedsloft som opbrugt kvote
    429monthly_limit_exceededMånedlig kvote opbrugt - nulstilles på din månedlige betalingsdato (Free-planen: den 1. i måneden); svarteksten angiver den præcise dato
    429upstream_rate_limitedKun /v1/company/{cvr}/moms: for mange samtidige momsopslag på tværs af alle kunder — ikke fra dig alene. Kvoten tjekkes før loftet, så nøgler med opbrugt kvote ikke kan blokere det, men kaldet føres tilbage, når loftet afviser det. Vent et øjeblik i stedet for at genforsøge i løkke
    500internal_errorIntern fejl - prøv igen eller kontakt support
    502upstream_errorDatakilde svarer ikke - prøv igen om lidt
    503quota_service_unavailableKvotevinduet kunne ikke fornys på grund af en midlertidig databasefejl. Ingen kvote forbruges - prøv igen om lidt
    503service_unavailableDatakilde midlertidigt utilgængelig (circuit breaker aktiv)
    503circuit_openKun /v1/company/{cvr}/moms: momsregisteret har fejlet gentagne gange, så opslaget blev ikke forsøgt. Ingen kvote forbruges
    503upstream_unavailableOpslaget blev forsøgt, men datakilden gav intet brugbart svar. På /v1/company/{cvr}, /v1/search, /v1/person og /v1/search/person svarede CVR-registret ikke - prøv igen om lidt. På /v1/company/{cvr}/moms er det momsregisteret, og du får denne fejl i stedet for et gættet negativt svar. Ingen kvote forbruges — kaldet trækkes, når forespørgslen sendes videre, og føres tilbage, når der ikke kom data ud af den

    Rate Limiting

    API'et håndhæver to typer begrænsninger:

    Månedlig kvote

    Hvert API-kald tæller mod din månedlige kvote. Hver include tæller som et ekstra kald. F.eks. tæller ?include=management,financials som 3 kald (1 + 2 includes). På betalte planer nulstilles kvoten automatisk på din månedlige betalingsdato — samme dag som abonnementet fornys. På Free-planen er det den 1. i hver måned (UTC). 429-svaret angiver den præcise nulstillingsdato. Overskridelse returnerer 429 monthly_limit_exceeded. Kvoten deles af alle dine nøgler, og kald foretaget med en nøgle, du senere har tilbagekaldt, tæller med resten af perioden - en ny nøgle giver ikke en ny kvote. Har du brug for ekstra kald uden at opgradere? Se Booster-pakker.

    Op til 30 req/s

    Alle planer har op til 30 requests per sekund. Overskridelse returnerer 429 rate_limit_exceeded med headeren Retry-After: 1.

    Response Headers

    Alle API-responses inkluderer følgende HTTP-headers:

    HeaderVærdiBeskrivelse
    Content-Typeapplication/jsonAlle responses er JSON
    Cache-Controlprivate, max-age=300|600|900|3600Virksomheds- og persondata 1 time; nyregistrerede virksomheder 1 time; konkurser 10 min; søgning 5 min; momsopslag 15 min; virksomhedsopslag med courtData kun 5 min. Altid private: svaret må genbruges af din egen klient, men ikke af delte caches, fordi det hører til din nøgle. Bliver private, no-store, når svaret indeholder warnings eller reelleEjere, fordi indholdet så afhænger af din plan og din kontrakt
    X-Credits-Used1Antal kald denne forespørgsel kostede (1 basis + 1 pr. include). Kun på /v1/company/{cvr}
    X-Credits-Remaining9482Resterende kald i indeværende måned. Kun på /v1/company/{cvr} — søge-, person- og momsendpoints sender den ikke, så byg ikke en måler alene på den
    Access-Control-Allow-Origin*CORS er aktiveret for alle origins - API'et kan bruges fra browsere
    Access-Control-Allow-MethodsGET, OPTIONSKun GET og preflight (OPTIONS) er tilladt
    Access-Control-Expose-HeadersX-Credits-Used, X-Credits-Remaining, Retry-AfterGør headerne læsbare for JavaScript i browseren
    Retry-After1Kun på 429 rate_limit_exceeded: antal sekunder før næste forsøg

    Selvom CORS er aktiveret, bør du aldrig eksponere din API-nøgle i klient-side JavaScript. Brug en server-side proxy til at beskytte din nøgle. Resultaterne kan dog caches i browseren vha. Cache-Control-headeren.

    Paginering

    Søgeendpointet (/v1/search) og listerne /v1/konkurser og /v1/nyevirksomheder returnerer paginerede resultater. Brug page og perPage til at navigere.

    pageinteger
    Sidenummer, starter fra 1 (standard: 1). En side efter den sidste giver en tom results med det reelle total, ikke en fejl. Dybden er begrænset: page × perPage må højst være 10.000 på /v1/search og 100.000 på /v1/konkurser og /v1/nyevirksomheder. Dybere sider afvises med 400 invalid_page uden at koste et kald. Begge lister er i dag under 100.000 rækker, så du kan hente en hel liste ved at paginere, til results er tom.
    perPageinteger
    Antal resultater per side (standard: 25, max: 100). For /v1/search/person bruges limit i stedet (standard: 10, max: 50).

    Response-felter for paginerede endpoints:

    FeltTypeBeskrivelse
    resultsarrayArray af matchende resultater for den aktuelle side
    totalnumberTotalt antal matchende resultater på tværs af alle sider
    pagenumberNuværende sidenummer
    perPagenumberAntal resultater per side
    Paginering - side 2
    bash
    curl "https://api.selskabsinfo.dk/v1/search?q=consulting&page=2&perPage=10" \
      -H "Authorization: Bearer sk_live_..."

    Planer & Adgang

    FunktionFreeStarterProBusiness
    Pris (md.)0 kr149 kr449 kr999 kr
    Kald / måned50010.00075.000300.000
    Rate limit30 req/s
    /v1/company
    /v1/search
    /v1/person
    /v1/search/person
    /v1/company/{cvr}/moms
    /v1/konkurser
    /v1/nyevirksomheder
    include: management
    include: financials
    include: courtData
    include: ownership
    include: subsidiaries
    include: creditRisk
    include: capital

    Spar 20% med årlig betaling. Se alle prisdetaljer.

    Booster-pakker

    Brug for ekstra API-kald uden at opgradere din plan? Køb en engangspakke med ekstra kald, der lægges oven på din månedlige kvote. Booster-kald bruges først efter din månedlige kvote er opbrugt.

    PakkeEkstra kaldPrisPr. 1.000 kald
    Booster S5.00099 kr19,80 kr
    Booster M25.000229 kr9,16 kr
    Booster L75.000549 kr7,32 kr

    Booster-kald er tilgængelige for alle betalte planer (Starter, Pro, Business).

    Kaldene udløber ved udgangen af din nuværende faktureringsperiode og kan ikke overføres til næste periode.

    Engangskøb - ingen abonnement. Køb flere pakker efter behov.

    Alle priser er ekskl. moms.

    Køb booster-pakker fra din API-nøgle side. Har du regelmæssigt brug for ekstra kald? Overvej at opgradere din plan i stedet.

    Prøv API'et

    Test API'et direkte her - vælg endpoint, indtast et CVR-nummer, et søgeord eller en dato, og se det rigtige svar.

    Kodeeksempler

    curl

    Hent virksomhed med ledelse og regnskab
    bash
    curl -X GET \
      "https://api.selskabsinfo.dk/v1/company/10150817?include=management,financials" \
      -H "Authorization: Bearer sk_live_your_api_key_here"
    Søg virksomheder
    bash
    curl -X GET \
      "https://api.selskabsinfo.dk/v1/search?q=novo+nordisk&perPage=5" \
      -H "Authorization: Bearer sk_live_your_api_key_here"

    JavaScript / TypeScript

    fetch-eksempel
    javascript
    const API_KEY = 'sk_live_your_api_key_here';
    const BASE_URL = 'https://api.selskabsinfo.dk/v1';
    
    // Hent virksomhed
    async function getCompany(cvr, includes = []) {
      const params = includes.length ? '?include=' + includes.join(',') : '';
      const res = await fetch(BASE_URL + '/company/' + cvr + params, {
        headers: { 'Authorization': 'Bearer ' + API_KEY },
      });
    
      if (!res.ok) {
        const err = await res.json();
        throw new Error(err.error?.message || 'API request failed');
      }
    
      return res.json();
    }
    
    // Søg virksomheder
    async function searchCompanies(query, page = 1, perPage = 25) {
      const params = new URLSearchParams({ q: query, page, perPage });
      const res = await fetch(BASE_URL + '/search?' + params, {
        headers: { 'Authorization': 'Bearer ' + API_KEY },
      });
    
      if (!res.ok) {
        const err = await res.json();
        throw new Error(err.error?.message || 'API request failed');
      }
    
      return res.json();
    }
    
    // Brug
    const company = await getCompany('10150817', ['management', 'financials']);
    console.log(company.navn, '-', company.antalAnsatte, 'ansatte');
    
    const results = await searchCompanies('novo nordisk');
    console.log('Fandt', results.total, 'virksomheder');

    Python

    requests-eksempel
    python
    import requests
    
    API_KEY = "sk_live_your_api_key_here"
    BASE_URL = "https://api.selskabsinfo.dk/v1"
    HEADERS = {"Authorization": f"Bearer {API_KEY}"}
    
    
    def get_company(cvr: str, includes: list[str] | None = None) -> dict:
        """Hent virksomhed med valgfrie datasektioner."""
        params = {}
        if includes:
            params["include"] = ",".join(includes)
    
        resp = requests.get(f"{BASE_URL}/company/{cvr}", headers=HEADERS, params=params)
        resp.raise_for_status()
        return resp.json()
    
    
    def search_companies(query: str, page: int = 1, per_page: int = 25) -> dict:
        """Søg virksomheder efter navn eller CVR."""
        resp = requests.get(
            f"{BASE_URL}/search",
            headers=HEADERS,
            params={"q": query, "page": page, "perPage": per_page},
        )
        resp.raise_for_status()
        return resp.json()
    
    
    # Eksempel
    company = get_company("10150817", includes=["management", "financials"])
    print(f"{company['navn']} - {company.get('antalAnsatte', 'N/A')} ansatte")
    
    results = search_companies("novo nordisk")
    for r in results["results"]:
        print(f"  {r['cvr']} {r['navn']} ({r['status']})")

    SDKs & Integrationer

    SelskabsInfo CVR API er et standard REST-API med JSON-responses, som nemt kan integreres i ethvert sprog og framework. Her er nogle tips til populære platforme:

    JS

    JavaScript / TypeScript

    Brug native fetch eller axios. Ideelt til Next.js, Node.js og Deno. Se kodeeksempel.

    PY

    Python

    Brug requests eller httpx. Perfekt til dataanalyse, scraping og automatisering. Se kodeeksempel.

    C#

    .NET / C#

    Brug HttpClient med System.Text.Json. Tilføj Authorization header via DefaultRequestHeaders.

    No

    No-Code (Zapier / Make / n8n)

    Brug en generisk HTTP-action og kopiér opskrifterne herunder - ingen kode nødvendig. Se opskrifterne.

    No-Code opskrifter

    Du behøver ikke at skrive kode for at bruge API'et. Her er færdige opskrifter til de mest populære automation-platforme. Alle bruger samme princip: en HTTP GET-request med din API-nøgle i Authorization-headeren.

    Z

    Zapier

    Brug Zapier's Webhooks by Zapier integration (Premium-step). Konfigurér en GET request:

    URL

    https://api.selskabsinfo.dk/v1/company/{{cvr}}

    Query string params

    include = management,financials

    Headers

    Authorization: Bearer sk_live_din_nøgle_her

    Tip: Hvis du henter CVR-numre fra en trigger (fx Google Sheets), kan du erstatte {{cvr}} med variablen fra det forrige step. Outputtet er JSON som du kan mappe direkte til næste action.

    M

    Make (tidligere Integromat)

    Tilføj et HTTP > Make a request-modul med disse indstillinger:

    URL

    https://api.selskabsinfo.dk/v1/company/{{cvr}}?include=management,financials

    Method

    GET

    Headers

    Name: Authorization Value: Bearer sk_live_din_nøgle_her

    Parse response

    Yes (JSON)

    Tip: Slå "Parse response" til så Make automatisk gør felter som navn, cvr og regnskabsdata tilgængelige som variabler i næste modul.

    n8

    n8n

    Tilføj en HTTP Request-node. Sæt Authentication til Generic Credential Type > Header Auth og opret credentials én gang - så kan du genbruge dem i alle workflows:

    Header Auth credentials

    Name: Authorization Value: Bearer sk_live_din_nøgle_her

    URL

    https://api.selskabsinfo.dk/v1/company/{{ $json.cvr }}

    Method

    GET

    Query parameters

    include = management,financials,ownership

    Tip: Brug en SplitInBatches-node før HTTP Request hvis du processerer mange CVR-numre - det hjælper dig med at holde dig under rate limit (30 req/s) automatisk.

    Fælles for alle platforme: CVR API'et er bare HTTP+JSON. Hvis din no-code platform har en HTTP-action (de fleste gør), kan du bruge API'et. Sæt headeren Authorization: Bearer DIN_NØGLE og kald GET https://api.selskabsinfo.dk/v1/company/{cvr}.

    Changelog

    Seneste ændringer til API'et. Nye felter tilføjes løbende uden version-bump (additive ændringer). Breaking changes annonceres på forhånd.

    2026-09

    Overskudsgrad og afkastningsgrad efter den danske definition

    overskudsgrad og afkastningsgrad i regnskabsdata.financialData beregnes nu på driftsresultatet (EBIT), som Finansforeningens Anbefalinger & Nøgletal og regnskabernes egne hoved- og nøgletal gør: overskudsgrad er driftsresultatet i procent af nettoomsætningen, afkastningsgrad driftsresultatet i procent af aktiverne. Før var begge beregnet på årets resultat, og overskudsgrad for holdingselskaber på indtægter af kapitalandele. Et driftsresultat, som årsrapporten ikke angiver, beregnes ud fra resultatopgørelsens linjer som før (ebitAfledt er så true), og nøgletallene beregnes på det. Begge felter er null kun, hvor et driftsresultat hverken kan læses eller beregnes, og hvor nævneren mangler: overskudsgrad kræver en nettoomsætning, som et holdingselskab eller en klasse B-virksomhed med bruttofortjeneste alene ikke oplyser. Årets resultat, omsætningen og aktiverne står uændret i aaretsResultat, nettoomsaetning og statusBalance.

    2026-09

    Ophørte virksomheder: ophoert og ophoersDato

    GET /v1/company/{cvr} har to nye felter, ophoert og ophoersDato, som siger, om og hvornår virksomheden er ophørt. En lukket enkeltmandsvirksomhed beholder ofte status: NORMAL, fordi CVR registrerer ophøret i virksomhedens livsforløb, så status alene kunne ikke skelne den fra en aktiv. Reglen er den samme, som creditRisk allerede bruger, og en afsluttende status som OPLØST tæller også, når livsforløbet mangler. På /v1/person slutter en ejerandel i en ophørt virksomhed med virksomheden. status er uændret og viser stadig registrets egen værdi. Felterne kommer med i basisopslaget og koster ingen ekstra kald.

    2026-09

    Person-endpoints: ejerandele og virksomhedsnavne

    /v1/person og /v1/search/person viser nu personens ejerandele fra ejerregistret som en rolle med titlen LEGAL EJER og felterne ejerandel og stemmeret som intervaller, de samme som i ejerskab på /v1/company. Før blev ejerandele slet ikke læst: en virksomhed, personen ejer uden at sidde i ledelsen, stod under historiskeRelationer med tomme roller. Den står nu under aktiveRelationer og tæller med i antalAktiveRelationer; en solgt andel står som historisk med tilDato. På /v1/search/person er virksomhedNavn nu virksomhedens navn. Før var det som regel navnet på det organ, rollen hører til, fx "Direktion", "Bestyrelse" eller "EJERREGISTER".

    2026-09

    EBIT og EBITDA i financials - nu fire regnskabsår

    Hvert år i regnskabsdata.financialData har nu ebit, ebitda, ebitAfledt og regnskabsaar. ebit er udfyldt, også når årsrapporten ikke angiver et driftsresultat (så er den beregnet, og ebitAfledt er true) - efter samme regel som EBIT i Lead Finder. financials returnerer nu op til fire regnskabsår (før tre) i den rækkefølge, årsrapporterne er offentliggjort, så en treårig vækstrate (CAGR) kan beregnes ud fra ét kald. Alle eksisterende felter er uændrede, og prisen er den samme. creditRisk vurderer fortsat de seneste tre år.

    2026-09

    Konkurser og nye virksomheder: sidegrænse og datarettelser

    På /v1/konkurser og /v1/nyevirksomheder må page × perPage højst være 100.000; dybere sider giver 400 invalid_page uden at koste et kald. Før gav de en tom side eller, ved ekstreme sidetal, 502 upstream_error. Begge lister er under grænsen, så en fuld gennemgang påvirkes ikke. /v1/konkurser har nu én række pr. konkurs: genoptrykte og rettede bekendtgørelser er samlet til den nyeste, personlige konkurser er fjernet, og dekreter, der viste kuratorens advokatfirma som skyldner, viser nu den rigtige virksomhed og dens CVR. På /v1/nyevirksomheder er virksomhedsform nu altid det fulde navn (godt 200 rækker havde CVR's korte kode, fx APS), og kommunekode er udfyldt for flere virksomheder (for en del udledt af postnummeret), men er dokumenteret som string | null, fordi den stadig kan mangle. Dokumentationen er rettet: en industry_code med andet end præcis 6 cifre giver 400 invalid_industry_code, ikke en tom liste. Begge endpoints kan nu prøves i playgrounden.

    2026-09

    Rettelser i data, caching og kvote

    creditRisk vurderer nu også selskabets livsforløb og alder, så et ophørt selskab, der stadig står som NORMAL, ikke længere scores som aktivt. antalAnsatte er null (ikke 0 eller antal årsværk), når registret ikke oplyser et præcist antal ansatte; intervallet returneres nu i det nye felt antalAnsatteInterval. bibrancher indeholder kun gældende bibrancher, og to forskellige ejere med samme navn slås ikke længere sammen i ejerskab. include må gentages (?include=a&include=b). På /v1/search pagineres et CVR-opslag som alle andre (side 2 er tom), og page × perPage over 10.000 giver 400 invalid_page. Cache-Control er nu private, 429 rate_limit_exceeded sender Retry-After, og X-Credits-* kan læses fra browseren. Kald foretaget med en tilbagekaldt nøgle tæller nu med i månedens kvote.

    2026-09

    Konkurser og nyregistrerede virksomheder lanceret

    To nye endpoints: GET /v1/konkurser (konkursdekreter fra Statstidende, beriget med branche og selskabsform fra CVR) og GET /v1/nyevirksomheder (aktive virksomheder stiftet inden for de seneste 24 måneder). Begge koster 1 kald og svarer med {results, total, page, perPage}. Bemærk at virksomhedsform er CVR's korte kode på /v1/konkurser (APS) men det fulde navn på /v1/nyevirksomheder (Anpartsselskab), og at industry_code altid er 6 cifre. Tekstfiltre er højst 200 tegn (ellers 400 invalid_filter), og en side efter den sidste giver en tom results med det reelle total.

    2026-09

    reklamebeskyttet på alle svar

    Nyt felt kontakt.reklamebeskyttet (boolean | null) på GET /v1/company/{cvr}, og reklamebeskyttet på hvert resultat fra GET /v1/search. Det er CVR-registrets egen markering af, at selskabet har frabedt sig henvendelser i markedsføringsøjemed, og det gælder også de berigede kontaktoplysninger. Feltet hentes i det kald, der allerede laves - ingen ekstra credits, ingen ændring for eksisterende kald.

    2026-08

    Momsopslag lanceret

    Nyt endpoint GET /v1/company/{cvr}/moms, som validerer DK{cvr} mod momsregisteret. Tilgængelig fra Starter-planen, 1 kald. Svaret er tre-tilstands: momsnummerGyldigt er registerets bogstavelige svar, mens momsregistreret aldrig er false — se endpointets afsnit.

    2026-08

    Dokumentationsrettelser

    Feltnavnene under courtData var dokumenteret med interne databasenavne (case_number, hearing_date …); de rigtige er danske (sagsnummer, dato …). ejerandel er et interval som tekst, ikke et tal, og ejertype har aldrig eksisteret. revision, kontaktMeta, antalRetssager, antalMyndighedssager, antalDatterselskaber, returned og fejlkoden rate_limit_exceeded er nu dokumenteret. Ingen af rettelserne ændrer API'ets adfærd.

    2026-05

    financials nu på Free-planen

    financials-include er nu tilgængelig på alle planer - inkl. Free (500 kald/md). Tidligere krævede regnskabsdata Starter-planen eller højere.

    2026-03

    capital include lanceret

    Ny capital include med komplet kapitalhistorik: forhøjelser, nedsættelser, tranche-events, kurs, tegningsbeløb, post-money valuation og ejerskabs-snapshots. Tilgængelig fra Starter-planen.

    2025-03

    creditRisk include tilføjet

    Ny creditRisk include med SI-Vurdering 14-faktor kreditrisiko-model. Tilgængelig fra Starter-planen.

    2025-02

    Person-endpoints lanceret

    Nye endpoints: /v1/person/{id} og /v1/search/person med detaljerede relationer og rollehistorik.

    2024-12

    CVR API v1 lanceret

    Initial release med virksomhedsopslag, søgning, management, financials, courtData, ownership og subsidiaries includes.

    Klar til at komme i gang?

    Opret en gratis konto og få 500 API-kald per måned med det samme. Opgradér når du har brug for mere.