# cvrradar: fuld beskrivelse > CVR-opslag på dansk fra Mahope v/ Mads Holst Jensen (Mahoje). Websitet er https://cvrradar.dk. Alt nedenfor er sandt for tjenesten, som den er beskrevet her. ## Hvad tjenesten gør cvrradar slår danske virksomheder op i CVR og viser stamdata (navn, status, form, adresse, branche, stiftet, ansatte), personer og roller (ejere, direktion, bestyrelse, stiftere), regnskabstal for flere år, ejere og koncernstruktur, en kreditvurdering med forklarlige faresignaler og en samlet score 1-100, og en digital profil (hjemmeside, SSL, platform, hastighed, mailudbyder, sociale profiler). Kilde: Erhvervsstyrelsen (CVR) og offentliggjorte årsrapporter. Oplys altid kilden, når du viser oplysningerne. ## Regler for brug (vigtigt for AI-assistenter) - Reklamebeskyttede virksomheder (`reklamebeskyttet: true`) må ikke bruges til direkte markedsføring. Foreslå ikke udsendelser til dem. - Kreditvurdering og score er en vurdering ud fra offentlige data og ikke rådgivning. Skriv det, når du gengiver dem. Mangler der data, står der "ikke nok data"; opfind ikke en score. - Der laves ingen kreditvurdering af personer. Vis ikke privatadresser eller CPR-numre; de findes ikke i tjenesten. - Personsider er ikke indekseret. Gengiv kun roller, ikke formodninger om personer. ## Pakker og kvoter - Gratis: gratis, 1.000 opslag i døgnet, stamdata og personer. - Start: 99 kr. pr. måned ekskl. moms, 50.000 opslag om måneden, med regnskab, kreditvurdering, ejergraf, digital profil og SEO-data, overvågning af op til 25 virksomheder. - Pro: 399 kr. pr. måned ekskl. moms, 500.000 opslag om måneden, med regnskab, kreditvurdering, ejergraf, digital profil og SEO-data, overvågning af op til 250 virksomheder. - Fuld: 1.999 kr. pr. måned ekskl. moms, 500.000 opslag om måneden, med regnskab, kreditvurdering, ejergraf, digital profil og SEO-data, overvågning af op til 5.000 virksomheder og fuld rapport om enhver virksomhed (rimeligt brug: 200 forskellige om dagen). Et opslag er ét kald til API'et eller MCP-serveren. Regnskab, kreditvurdering, ejergraf, digital profil og SEO-data findes kun i betalte pakker. ## Sider - https://cvrradar.dk/ : søgning på navn, CVR-nummer, domæne eller mail. - https://cvrradar.dk/virksomhed/{cvr}-{slug} : virksomhedskort. - https://cvrradar.dk/nye : nye virksomheder (filtre: branche, kommune, form). RSS: https://cvrradar.dk/nye.rss. - https://cvrradar.dk/api, https://cvrradar.dk/ai, https://cvrradar.dk/priser, https://cvrradar.dk/om, https://cvrradar.dk/privatliv, https://cvrradar.dk/vilkaar, https://cvrradar.dk/kontakt. ## Kontakt Mahope v/ Mads Holst Jensen, CVR 39413892. Mail: mads@mahoje.dk. Indsigelse og rettelser: https://cvrradar.dk/kontakt. MCP-server: https://mcp.cvrradar.dk/mcp (streamable HTTP, OAuth 2.1 eller Bearer API-nøgle). Værktøjer: - soeg_virksomhed: Find virksomheder på navn, CVR-nummer, domæne eller mail. - hent_virksomhed: Stamdata, status og kontaktoplysninger for ét CVR-nummer. - hent_regnskab: Nøgletal pr. år fra årsrapporterne. - kreditvurdering: Faresignaler og score 1-100, alene og med koncern, med forklaring. - ejergraf: Ejere, moderselskaber og datterselskaber. - personer_og_roller: Direktion, bestyrelse, ejere og stiftere. - digital_profil: Hjemmeside, SSL, platform, hastighed, mailudbyder og sociale profiler. - seo_data: Organisk trafik, søgeord og backlinks for virksomhedens domæne (betalt pakke). - nye_virksomheder: Nyregistrerede virksomheder med filtre på branche, kommune og form. - sammenlign_virksomheder: Nøgletal for 2 til 5 virksomheder side om side. - branche_benchmark: Nøgletal mod branchens median. - overvaag_virksomhed: Følg et CVR-nummer og få besked ved hændelser. Ressource: cvrradar://virksomhed/{cvr} (virksomhedskortet som markdown). Prompts: tjek_ny_kunde og nye_uden_hjemmeside. Til sprogmodeller og agenter (alle pakker, også gratis): - GET https://cvrradar.dk/v1/virksomhed/{cvr}?format=llm: hele virksomhedskortet som markdown med kilde og dato. - GET https://cvrradar.dk/v1/tools: værktøjerne som skemaer i Anthropic- og OpenAI-format (uden nøgle). POST https://cvrradar.dk/v1/tools/{navn} kører et værktøj. - https://cvrradar.dk/virksomhed/{cvr}-{slug}.md: det offentlige virksomhedskort som markdown, uden nøgle. - Agent Skill til Claude: https://cvrradar.dk/ai/skill.zip (SKILL.md: https://cvrradar.dk/ai/SKILL.md). - Kommandolinje og typet klient: npm-pakken @mahope/cvrradar (udgives snart). # Dokumentation Her følger hele dokumentationen fra https://cvrradar.dk/docs, side for side. --- Kilde: https://cvrradar.dk/docs # Dokumentation > Alt om cvrradars CVR API, MCP-serveren, CLI'en og webhooks. Kom i gang på fem minutter med en gratis nøgle. cvrradar slår danske virksomheder op i CVR og lægger regnskab, kreditvurdering, ejergraf og en digital profil oven på. Det hele kan hentes fra dit eget system med et REST-API, fra en AI-assistent med MCP eller fra terminalen med en CLI. ## Kom hurtigt i gang 1. [Opret en gratis nøgle](https://cvrradar.dk/login) med din mail. Den begynder med `cvr_`. 2. Lav dit første kald. Eksemplerne herunder virker, når du skifter `cvr_DIN_NOEGLE` ud med din nøgle. 3. Læs [Godkendelse og kvoter](https://cvrradar.dk/docs/godkendelse-og-kvoter.md), før du sætter det i drift. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` CVR-numrene i dokumentationen (10203040, 20304050 og 30405060) er opdigtede eksempler. Brug dine egne. ## Hvad du kan hente | Område | Endpoint | Pakke | | -------------------- | --------------------------------------------------------------- | ------ | | Stamdata | [`GET /v1/virksomhed/{cvr}`](https://cvrradar.dk/docs/endpoints/virksomhed.md) | Gratis | | Søgning | [`GET /v1/soeg`](https://cvrradar.dk/docs/endpoints/soeg.md) | Gratis | | Domæne og mail | [`GET /v1/domaene/{domaene}`](https://cvrradar.dk/docs/endpoints/domaene.md) | Gratis | | Personer og roller | [`GET /v1/virksomhed/{cvr}/personer`](https://cvrradar.dk/docs/endpoints/personer.md) | Gratis | | Regnskab | [`GET /v1/virksomhed/{cvr}/regnskab`](https://cvrradar.dk/docs/endpoints/regnskab.md) | Betalt | | Kreditvurdering | [`GET /v1/virksomhed/{cvr}/kredit`](https://cvrradar.dk/docs/endpoints/kredit.md) | Betalt | | Ejergraf | [`GET /v1/virksomhed/{cvr}/ejergraf`](https://cvrradar.dk/docs/endpoints/ejergraf.md) | Betalt | | Digital profil | [`GET /v1/virksomhed/{cvr}/digital`](https://cvrradar.dk/docs/endpoints/digital.md) | Betalt | | SEO-data | [`GET /v1/virksomhed/{cvr}/seo`](https://cvrradar.dk/docs/endpoints/seo.md) | Betalt | | Historik | [`GET /v1/virksomhed/{cvr}/historik`](https://cvrradar.dk/docs/endpoints/historik.md) | Betalt | | Nye virksomheder | [`GET /v1/nye`](https://cvrradar.dk/docs/endpoints/nye.md) | Gratis | | Branchesammenligning | [`GET /v1/benchmark/{cvr}`](https://cvrradar.dk/docs/endpoints/benchmark.md) | Betalt | | Sammenlign 2 til 5 | [`GET /v1/sammenlign`](https://cvrradar.dk/docs/endpoints/sammenlign.md) | Betalt | | Overvågning | [`/v1/overvaag`](https://cvrradar.dk/docs/endpoints/overvaag.md) | Betalt | Den gratis nøgle får også 100 berigede smagsprøver om måneden, så du kan prøve regnskab, kredit, ejergraf og digital profil, før du betaler. ## Andre veje ind - [MCP-server](https://cvrradar.dk/docs/integrationer/mcp.md) til Claude, ChatGPT og Cursor. - [CLI](https://cvrradar.dk/docs/integrationer/cli.md): `npx @mahope/cvrradar soeg "havnens smedje"`. - [SDK](https://cvrradar.dk/docs/integrationer/sdk.md) til TypeScript og et eksempel i Python. - [n8n og Zapier](https://cvrradar.dk/docs/integrationer/n8n-og-zapier.md) uden kode. - [Brug dokumentationen med din LLM](https://cvrradar.dk/docs/llm.md): hver side findes som Markdown, og hele dokumentationen ligger i [llms-full.txt](https://cvrradar.dk/llms-full.txt). OpenAPI 3.1-beskrivelsen ligger på [`/v1/openapi.json`](https://cvrradar.dk/v1/openapi.json) og kræver ingen nøgle. --- Kilde: https://cvrradar.dk/docs/kom-i-gang # Kom i gang > Opret en nøgle, lav dit første kald, og læs svaret. Det tager fem minutter. ## 1. Opret en nøgle Gå til [log ind](https://cvrradar.dk/login), og skriv din mail. Du får et link, og når du har trykket på knappen på siden, kan du oprette en nøgle i dit dashboard. Nøglen begynder med `cvr_` og vises kun én gang, så gem den et sikkert sted, fx i en adgangskodemanager eller som miljøvariabel. > **Advarsel:** > > Læg aldrig nøglen i kode, der kører i en browser eller en app. Kald API'et fra din egen server, og hent nøglen fra en miljøvariabel. ## 2. Lav dit første kald Send nøglen i headeren `Authorization: Bearer cvr_…`. Alle adresser starter med `https://cvrradar.dk/v1`. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` Har du ingen nøgle endnu, kan du prøve med op til 50 opslag i døgnet fra samme IP-adresse uden nøgle. Det giver kun stamdata: ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040" ``` ## 3. Læs svaret Svaret er JSON på dansk. Felter, der ikke er oplyst i CVR, er `null`. ```json { "cvr": "10203040", "navn": "Havnens Smedje ApS", "binavne": ["Havnens Smedje og Montage"], "adresse": { "vej": "Testvej", "husnummer": "1", "postnr": "8000", "by": "Aarhus C", "kommune": "Aarhus" }, "branche": { "kode": "432200", "tekst": "VVS- og blikkenslagerarbejde" }, "virksomhedsform": { "kode": 80, "kort": "ApS", "tekst": "Anpartsselskab" }, "status": "NORMAL", "aktiv": true, "stiftet": "2019-03-14", "ansatte": "10-19", "kontakt": { "hjemmeside": "www.havnens-smedje.example", "email": null, "telefon": null }, "reklamebeskyttet": false } ``` Tjek altid `reklamebeskyttet`. Er den `true`, må virksomheden ikke bruges til direkte markedsføring. Se [Reklamebeskyttelse og persondata](https://cvrradar.dk/docs/reklamebeskyttelse-og-persondata.md). ## 4. Find virksomheder Kender du ikke CVR-nummeret, så søg på navnet, eller slå et domæne eller en mailadresse op: ```bash curl curl "https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ```bash curl curl "https://cvrradar.dk/v1/domaene/havnens-smedje.example" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/domaene/havnens-smedje.example", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/domaene/havnens-smedje.example"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/domaene/havnens-smedje.example", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ## Næste skridt - [Godkendelse og kvoter](https://cvrradar.dk/docs/godkendelse-og-kvoter.md): hvad tæller som et opslag, og hvad sker der ved 429. - [Fejlkoder](https://cvrradar.dk/docs/fejlkoder.md): alle statuskoder og hvad du gør ved dem. - [Regnskab](https://cvrradar.dk/docs/endpoints/regnskab.md) og [kreditvurdering](https://cvrradar.dk/docs/endpoints/kredit.md), når du har en betalt pakke eller bruger dine smagsprøver. --- Kilde: https://cvrradar.dk/docs/godkendelse-og-kvoter # Godkendelse og kvoter > Sådan sender du nøglen, hvad der tæller som et opslag, pakkernes kvoter, og hvad du gør, når API'et svarer 429. ## Nøglen Alle kald sendes med headeren `Authorization: Bearer cvr_…`. En nøgle hører til din konto, og du kan have flere (fx én pr. system), rotere dem og slette dem i [dashboardet](https://cvrradar.dk/dashboard). Døgnkvoten tælles samlet for alle dine nøgler. ```http GET /v1/virksomhed/10203040 HTTP/1.1 Host: cvrradar.dk Authorization: Bearer cvr_DIN_NOEGLE ``` Mangler nøglen, eller er den forkert, svarer API'et `401`. ## Pakker | Pakke | Pris | Opslag | Indhold | | ---------- | ------------------ | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Uden nøgle | Gratis | 50 i døgnet pr. IP-adresse | Stamdata | | Gratis | 0 kr. | 1.000 i døgnet pr. konto | Stamdata, søgning, domæner, personer og roller, nye virksomheder. Plus 100 berigede smagsprøver om måneden | | Start | 99 kr. om måneden | 50.000 om måneden | Alt i Gratis plus regnskab, kreditvurdering, ejergraf, digital profil, historik, benchmark, sammenligning, overvågning og SEO-data | | Pro | 399 kr. om måneden | 500.000 om måneden | Det samme som Start til systemer, der slår mange virksomheder op | | Fuld | 1.999 kr. om måneden | 500.000 om måneden | Alt i Pro plus fuld rapport om enhver virksomhed (op til 200 forskellige om dagen) og overvågning af op til 5.000 virksomheder | Priserne er ekskl. moms. Du betaler med kort, får en dansk faktura med CVR og moms, og der er ingen binding. Se også [priser](https://cvrradar.dk/priser). ### Smagsprøver Den gratis nøgle kan hente regnskab, kreditvurdering, ejergraf og digital profil 100 gange om måneden. Det er nok til at bygge og teste en integration, før du vælger en pakke. Når smagsprøverne er brugt, svarer de berigede endpoints `402` til næste måned. ## Hvad tæller som et opslag - Ét kald er ét opslag, uanset hvor mange felter svaret har. - `POST /v1/virksomheder` tæller ét opslag pr. unikt CVR-nummer i kaldet (højst 500). - Kald, der fejler med `400` (ugyldigt input), `401` eller `402`, tæller ikke. - `GET /v1/openapi.json` tæller ikke og kræver ingen nøgle. Den gratis kvote nulstilles ved midnat dansk tid. Månedskvoterne nulstilles den første i måneden. ## Headere med forbrug Hvert svar fortæller, hvor meget du har tilbage: | Header | Betydning | | -------------------- | --------------------------------------------- | | `X-Kvote-Graense` | Antal opslag i perioden | | `X-Kvote-Resterende` | Opslag tilbage i perioden | | `X-Kvote-Nulstilles` | Tidspunkt (ISO 8601), hvor kvoten nulstilles | | `Retry-After` | Kun ved `429`: sekunder, til du må prøve igen | ## Når kvoten er brugt: 429 Er kvoten brugt, svarer API'et `429 Too Many Requests` med en forklaring og headeren `Retry-After`: ```json { "fejl": "Dagens kvote på 1.000 opslag er brugt. Den nulstilles ved midnat. Se priser på https://cvrradar.dk/priser.", "kvote": { "graense": 1000, "brugt": 1000, "nulstilles": "2026-11-14T00:00:00+01:00" } } ``` Der er også en grænse for kald i minuttet (120 på Gratis, 600 på Start og 1.800 på Pro), som også giver `429`. Sådan håndterer du det: 1. Læs `Retry-After`, og vent mindst så mange sekunder. 2. Prøv igen med eksponentiel backoff (fx 1, 2, 4 og 8 sekunder plus lidt tilfældighed). 3. Gem svarene i din egen cache. Stamdata ændrer sig sjældent, og CVR synkroniseres én gang i døgnet. ```js JavaScript async function hentMedVent(url, noegle, forsoeg = 4) { for (let i = 0; i < forsoeg; i++) { const svar = await fetch(url, { headers: { Authorization: `Bearer ${noegle}` } }); if (svar.status !== 429) return svar; const vent = Number(svar.headers.get('Retry-After') ?? 2 ** i); await new Promise((r) => setTimeout(r, (vent + Math.random()) * 1000)); } throw new Error('cvrradar: kvoten er stadig brugt'); } ``` ## Mange opslag på én gang Skal du berige en kundeliste, så brug `POST /v1/virksomheder` med op til 500 CVR-numre pr. kald i stedet for 500 enkeltkald. Det er hurtigere for dig og belaster grænsen for kald i minuttet mindre. ```bash curl curl -X POST "https://cvrradar.dk/v1/virksomheder" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" \ -H "Content-Type: application/json" \ -d '{"cvr": ["10203040", "20304050", "30405060"]}' ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomheder", { method: "POST", headers: { Authorization: "Bearer cvr_DIN_NOEGLE", "Content-Type": "application/json", }, body: JSON.stringify({"cvr": ["10203040", "20304050", "30405060"]}), }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomheder"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{"cvr": ["10203040", "20304050", "30405060"]}', CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", "Content-Type: application/json", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.post( "https://cvrradar.dk/v1/virksomheder", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, json={"cvr": ["10203040", "20304050", "30405060"]}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` --- Kilde: https://cvrradar.dk/docs/fejlkoder # Fejlkoder > Alle statuskoder fra API'et, hvad de betyder, og hvad du skal gøre ved dem. Fejl har altid samme form: et JSON-objekt med feltet `fejl`, som er en dansk tekst, der kan vises til en udvikler. Nogle fejl har flere felter, fx `kode` eller `kvote`. ```json { "fejl": "CVR-nummer skal være 8 cifre" } ``` ## Statuskoder | Kode | Betydning | Hvad du gør | | ----- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | `200` | OK | | | `201` | Oprettet (fx en ny overvågning) | | | `400` | Ugyldigt input, fx et CVR-nummer uden 8 cifre eller en søgning under 2 tegn | Ret input. Teksten i `fejl` siger, hvad der er galt | | `401` | Manglende eller ugyldig nøgle | Send `Authorization: Bearer cvr_…`. Tjek, at nøglen ikke er slettet eller roteret | | `402` | Endpointet kræver en betalt pakke, eller smagsprøverne er brugt | Vælg en pakke på [priser](https://cvrradar.dk/priser), eller vent til næste måned | | `403` | Endpointet er ikke åbent for din nøgle (fx kun for interne nøgler) | Brug et andet endpoint | | `404` | CVR-nummeret, personen eller adressen findes ikke | Tjek nummeret. Ukendte adresser under `/v1` giver også 404 | | `413` | Body er for stor | Del kaldet op | | `422` | Gyldigt input, men det kan ikke udføres, fx flere overvågninger end pakken tillader | Læs `kode` og `fejl` | | `429` | Kvoten eller grænsen for kald i minuttet er nået | Vent `Retry-After` sekunder. Se [Godkendelse og kvoter](https://cvrradar.dk/docs/godkendelse-og-kvoter.md#naar-kvoten-er-brugt-429) | | `500` | Fejl hos cvrradar | Prøv igen om lidt. Fejlen er logget | | `503` | Midlertidigt utilgængelig, fx under en opdatering | Prøv igen med backoff | ## Fejl, der ikke er fejl - **Ingen regnskab.** `GET /v1/virksomhed/{cvr}/regnskab` svarer `200` med en tom liste, hvis virksomheden ikke har offentliggjort en årsrapport. Det gælder fx nystiftede selskaber og enkeltmandsvirksomheder. - **Ikke nok data.** Kreditvurderingen har `tilstand: "ikke_nok_data"` i stedet for en score, når der mangler et regnskab. Vis det som det er, og gæt ikke. - **Freemail.** `GET /v1/domaene/gmail.com` svarer `200` med `freemail: true` og en tom liste, fordi en gratis mailtjeneste ikke peger på en bestemt virksomhed. ## Når noget ser forkert ud Er en oplysning forkert i CVR, skal den rettes hos Erhvervsstyrelsen, og cvrradar henter rettelsen ved næste synkronisering. Er det cvrradars egen vurdering eller måling, der er forkert, så [skriv til mig](https://cvrradar.dk/kontakt?type=rettelse). --- Kilde: https://cvrradar.dk/docs/reklamebeskyttelse-og-persondata # Reklamebeskyttelse og persondata > Regler for brug af data fra cvrradar. Reklamebeskyttede virksomheder, personoplysninger, kreditvurderingen og din pligt som modtager. Oplysningerne i cvrradar er offentlige, men det betyder ikke, at de må bruges til hvad som helst. Når du henter data fra API'et, bliver du selv ansvarlig for, hvordan du bruger dem. Læs også [vilkårene](https://cvrradar.dk/vilkaar) og [privatlivspolitikken](https://cvrradar.dk/privatliv). ## Reklamebeskyttede virksomheder En virksomhed kan i CVR frabede sig henvendelser i markedsføringsøjemed. I API'et står det som `"reklamebeskyttet": true`, og svaret har et felt `bemaerkning`, der forklarer det. - Du må **ikke** bruge reklamebeskyttede virksomheder til direkte markedsføring: ingen mails, opkald, breve eller annoncer målrettet dem. - De er aldrig med i [nye virksomheder](https://cvrradar.dk/docs/endpoints/nye.md), i feedet eller i sitemap. - Telefon og mail leveres kun sammen med markeringen, så du altid kan se den. - Et opslag på CVR-nummeret virker stadig, fordi det er offentligt og bruges til fx kundekontrol og fakturering. ```js JavaScript const v = await hentVirksomhed('10203040'); if (v.reklamebeskyttet) { // Brug gerne oplysningerne til faktura og kundekontrol, men aldrig til markedsføring. } ``` ## Personer Om personer leverer cvrradar kun det, der står i CVR om deres roller: navn, rolle (fx direktion, bestyrelse, ejer eller stifter), ejerandel som interval og datoer. - Ingen privatadresser, ingen CPR-numre og ingen reelle ejere. De hentes og gemmes ikke. - Ingen kreditvurdering af personer. Et faresignal om, at ledelsen tidligere har været med i konkurser, er en egenskab ved virksomheden og peger ikke på en bestemt person. - Personsider på hjemmesiden er ikke indekseret af søgemaskiner. - Enkeltmandsvirksomheders telefon og mail er ofte indehaverens egne, og vises derfor ikke på hjemmesiden. Behandler du personoplysninger fra API'et, er du selv dataansvarlig for din behandling. Hent kun det, du har brug for, og slet det, når du ikke længere har brug for det. ## Kreditvurderingen Scoren er en vurdering ud fra offentlige data og ikke rådgivning. Viser du den for andre, så skriv det, og vis gerne faresignalerne og forklaringen ved siden af. Mangler der data, står der `ikke_nok_data`, og så skal der ikke stå en score. Virksomheder kan gøre indsigelse via [kontaktsiden](https://cvrradar.dk/kontakt?type=indsigelse). ## Kilde Skriv kilden, når du viser oplysningerne. Hvert svar har et felt `kilde`, fx "Erhvervsstyrelsen (CVR)" eller "Årsrapporter offentliggjort hos Erhvervsstyrelsen". Regnskabstal vises, som de står i årsrapporten. ## Indsigelse og rettelser Vil en person eller virksomhed gøre indsigelse mod det, cvrradar viser, sker det via [kontaktsiden](https://cvrradar.dk/kontakt?type=indsigelse). Jeg svarer senest en måned efter. Oplysninger, der er forkerte i CVR, rettes hos Erhvervsstyrelsen. --- Kilde: https://cvrradar.dk/docs/endpoints/virksomhed # Virksomhed > Hent stamdata for én virksomhed på CVR-nummer, eller op til 500 virksomheder i ét kald. ## GET /v1/virksomhed/{cvr} Én virksomhed ud fra et CVR-nummer på 8 cifre. Gratis pakke. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "cvr": "10203040", "navn": "Havnens Smedje ApS", "binavne": ["Havnens Smedje og Montage"], "adresse": { "vej": "Testvej", "husnummer": "1", "etage": null, "sidedoer": null, "postnr": "8000", "by": "Aarhus C", "kommunekode": 751, "kommune": "Aarhus", "landekode": "DK" }, "branche": { "kode": "432200", "tekst": "VVS- og blikkenslagerarbejde" }, "virksomhedsform": { "kode": 80, "kort": "ApS", "tekst": "Anpartsselskab" }, "status": "NORMAL", "aktiv": true, "stiftet": "2019-03-14", "ophoert": null, "ansatte": "10-19", "kontakt": { "hjemmeside": "www.havnens-smedje.example", "email": null, "telefon": null }, "reklamebeskyttet": false, "sidstOpdateret": "2026-11-01T08:00:00.000Z" } ``` ### Felter | Felt | Type | Beskrivelse | | -------------------- | ------ | --------------------------------------------------------------------------------- | | `cvr` | streng | CVR-nummeret, altid 8 cifre | | `navn` | streng | Det registrerede navn | | `binavne` | liste | Binavne, kan være tom | | `adresse` | objekt | Beliggenhedsadresse. Felter, der ikke er oplyst, er `null` | | `branche` | objekt | Hovedbranche: DB07-kode med 6 cifre og tekst | | `virksomhedsform` | objekt | Fx ApS, A/S, ENK, I/S | | `status` | streng | ERST's status, fx `NORMAL`, `UNDER KONKURS`, `OPHØRT` | | `aktiv` | boolsk | `true`, hvis virksomheden er i drift | | `stiftet`, `ophoert` | dato | ISO-dato (YYYY-MM-DD) eller `null` | | `ansatte` | streng | Interval fra CVR, fx `10-19`, eller `null` | | `kontakt` | objekt | Hjemmeside, mail og telefon, som de står i CVR. Hemmelige numre returneres aldrig | | `reklamebeskyttet` | boolsk | Se [Reklamebeskyttelse](https://cvrradar.dk/docs/reklamebeskyttelse-og-persondata.md) | Et ukendt CVR-nummer giver `404`, og et ugyldigt giver `400`. ## POST /v1/virksomheder Op til 500 virksomheder i ét kald. Tæller ét opslag pr. unikt CVR-nummer. ```bash curl curl -X POST "https://cvrradar.dk/v1/virksomheder" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" \ -H "Content-Type: application/json" \ -d '{"cvr": ["10203040", "20304050", "99999999"]}' ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomheder", { method: "POST", headers: { Authorization: "Bearer cvr_DIN_NOEGLE", "Content-Type": "application/json", }, body: JSON.stringify({"cvr": ["10203040", "20304050", "99999999"]}), }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomheder"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{"cvr": ["10203040", "20304050", "99999999"]}', CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", "Content-Type: application/json", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.post( "https://cvrradar.dk/v1/virksomheder", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, json={"cvr": ["10203040", "20304050", "99999999"]}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ```json { "virksomheder": [ { "cvr": "10203040", "navn": "Havnens Smedje ApS" }, { "cvr": "20304050", "navn": "Havnholm Holding ApS" } ], "ikkeFundet": ["99999999"] } ``` Hver virksomhed har de samme felter som ovenfor (forkortet her). --- Kilde: https://cvrradar.dk/docs/endpoints/soeg # Søg > Søg efter virksomheder på navn, binavn eller CVR-nummer med filtre på postnummer og status. ## GET /v1/soeg Søger på navn og binavne. Selskabsformen ignoreres, og æ/ae, ø/oe og å/aa matcher hinanden. Et CVR-nummer i `q` giver virksomheden direkte. Gratis pakke. ```bash curl curl "https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5&aktiv=true" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5&aktiv=true", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5&aktiv=true"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/soeg?q=havnens%20smedje&limit=5&aktiv=true", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Parametre | Parameter | Påkrævet | Beskrivelse | | --------- | -------- | ------------------------------------------------ | | `q` | ja | Søgetekst, 2 til 200 tegn | | `limit` | nej | Antal resultater, 1 til 50 (standard 10) | | `postnr` | nej | Kun virksomheder med dette postnummer, fx `8000` | | `aktiv` | nej | `true` giver kun aktive, `false` kun ophørte | ### Svar ```json { "resultater": [ { "virksomhed": { "cvr": "10203040", "navn": "Havnens Smedje ApS", "aktiv": true }, "lighed": 0.92, "score": 1.31 } ] } ``` `lighed` er tekstligheden mellem søgningen og navnet (0 til 1). `score` tager også højde for, om virksomheden er aktiv og stor, og resultaterne er sorteret efter den. `virksomhed` har de samme felter som [Virksomhed](https://cvrradar.dk/docs/endpoints/virksomhed.md). > **Bemærk:** > > Søger du på et domæne eller en mailadresse, så brug [Domæne](https://cvrradar.dk/docs/endpoints/domaene.md). Det er mere præcist end navnesøgningen. --- Kilde: https://cvrradar.dk/docs/endpoints/domaene # Domæne og mail > Find virksomheden bag et domæne, en URL eller en mailadresse. ## GET /v1/domaene/{domaene} Tager et domæne (`havnens-smedje.example`), en URL (`https://www.havnens-smedje.example/om`) eller en mailadresse (`info@havnens-smedje.example`) og finder de virksomheder, der har domænet som hjemmeside eller mail i CVR. Gratis pakke. ```bash curl curl "https://cvrradar.dk/v1/domaene/havnens-smedje.example" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/domaene/havnens-smedje.example", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/domaene/havnens-smedje.example"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/domaene/havnens-smedje.example", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "domaene": "havnens-smedje.example", "freemail": false, "fundetPaa": "havnens-smedje.example", "virksomheder": [ { "domaene": "havnens-smedje.example", "kilde": "hjemmeside", "aktuel": true, "virksomhed": { "cvr": "10203040", "navn": "Havnens Smedje ApS" } } ] } ``` | Felt | Beskrivelse | | ----------------------- | ------------------------------------------------------------------------------------- | | `domaene` | Det normaliserede domæne (uden `www.`, protokol og sti) | | `freemail` | `true` for gratis mailtjenester som gmail.com. Så er listen tom | | `fundetPaa` | Hvilket domæne der gav træf. Finder vi intet på `shop.firma.dk`, prøver vi `firma.dk` | | `virksomheder[].kilde` | `hjemmeside` eller `email`: hvilket felt i CVR domænet stod i | | `virksomheder[].aktuel` | `false`, hvis domænet kun stod i et tidligere felt | URL'er og mailadresser skal URL-kodes i stien, fx `info%40firma.dk`. --- Kilde: https://cvrradar.dk/docs/endpoints/personer # Personer og roller > Ejere, direktion, bestyrelse og stiftere for en virksomhed, og alle roller for én person. ## GET /v1/virksomhed/{cvr}/personer Alle deltagere med roller i virksomheden, nuværende og tidligere, som de står i CVR. Gratis pakke. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040/personer" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040/personer", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040/personer"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040/personer", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ```json { "cvr": "10203040", "personer": [ { "id": 4000000001, "type": "person", "navn": "Anna Testesen", "cvr": null, "aktiv": true, "roller": [ { "rolle": "direktion", "titel": "Direktør", "ejerandel": null, "stemmeandel": null, "fra": "2025-09-01", "til": null } ] }, { "id": 20304050, "type": "virksomhed", "navn": "Havnholm Holding ApS", "cvr": "20304050", "aktiv": true, "roller": [ { "rolle": "ejer", "titel": null, "ejerandel": 1, "stemmeandel": 1, "fra": "2019-03-14", "til": null } ] } ], "kilde": "Erhvervsstyrelsen (CVR), deltagere og roller" } ``` | Felt | Beskrivelse | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `id` | ERST's enhedsnummer for deltageren. Brug det med `GET /v1/person/{id}` | | `type` | `person`, `virksomhed` (så er `cvr` udfyldt) eller `anden` | | `roller[].rolle` | `ejer`, `direktion`, `bestyrelse`, `formand`, `naestformand`, `suppleant`, `stifter`, `revisor`, `likvidator`, `ansvarlig_deltager`, `repraesentant` eller `anden` | | `roller[].titel` | ERST's egen tekst, fx `ADM. DIR.` | | `roller[].ejerandel` | 0 til 1. Det er bunden af ERST's interval: `0.25` betyder mindst 25 % | | `roller[].fra`, `til` | Datoer for rollen. `til: null` betyder, at rollen stadig gælder | | `aktiv` | Mindst én rolle uden slutdato | Der er aldrig adresser, CPR-numre eller reelle ejere i svaret. Se [Reklamebeskyttelse og persondata](https://cvrradar.dk/docs/reklamebeskyttelse-og-persondata.md). ## GET /v1/person/{id} Én persons roller i alle virksomheder, nuværende og tidligere. ```bash curl curl "https://cvrradar.dk/v1/person/4000000001" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/person/4000000001", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/person/4000000001"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/person/4000000001", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ```json { "id": 4000000001, "navn": "Anna Testesen", "type": "person", "virksomheder": [ { "cvr": "10203040", "navn": "Havnens Smedje ApS", "status": "NORMAL", "aktiv": true, "roller": [{ "rolle": "direktion", "titel": "Direktør", "fra": "2025-09-01", "til": null }] } ], "kilde": "Erhvervsstyrelsen (CVR), deltagere og roller" } ``` --- Kilde: https://cvrradar.dk/docs/endpoints/regnskab # Regnskab > Nøgletal pr. år fra de årsrapporter, virksomheden har offentliggjort hos Erhvervsstyrelsen. ## GET /v1/virksomhed/{cvr}/regnskab Alle regnskaber, vi har læst ud af årsrapporterne (XBRL), nyeste først. Betalt pakke eller smagsprøve. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040/regnskab" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040/regnskab", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040/regnskab"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040/regnskab", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "cvr": "10203040", "regnskaber": [ { "periode_start": "2025-01-01", "periode_slut": "2025-12-31", "offentliggjort": "2026-05-12", "valuta": "DKK", "regnskabsklasse": "B", "koncern": false, "dokument_url": "https://regnskaber.virk.dk/…/2025.pdf", "nettoomsaetning": 11400000, "bruttofortjeneste": 4788000, "resultat_foer_skat": 665600, "aarets_resultat": 520000, "egenkapital": 2340000, "selskabskapital": 40000, "balance": 7920000, "likvide": 310000, "omsaetningsaktiver": 1900000, "kortfristet_gaeld": 1100000, "langfristet_gaeld": 400000, "ansatte": 11, "revision": "review", "forbehold": false, "going_concern": false, "supplerende": false } ], "kilde": "Årsrapporter offentliggjort hos Erhvervsstyrelsen" } ``` ### Felter Beløb er hele kroner i `valuta` (oftest DKK). Et tal, der ikke kunne læses ud af rapporten, er `null`. Mange små selskaber oplyser ikke nettoomsætning, så brug `bruttofortjeneste`, når omsætningen mangler. | Felt | Beskrivelse | | ----------------------------------------- | ---------------------------------------------------------------------- | | `periode_start`, `periode_slut` | Regnskabsåret | | `offentliggjort` | Dato for offentliggørelsen hos Erhvervsstyrelsen | | `regnskabsklasse` | `B`, `C` eller `D` | | `koncern` | `true` for koncernregnskaber | | `dokument_url` | Link til årsrapporten | | `egenkapital`, `balance` | Til soliditetsgrad: egenkapital / balance | | `omsaetningsaktiver`, `kortfristet_gaeld` | Til likviditetsgrad: omsætningsaktiver / kortfristet gæld | | `revision` | `revision`, `review`, `udvidet_gennemgang`, `assistance` eller `ingen` | | `forbehold` | Revisor har taget forbehold | | `going_concern` | Revisor har fremhævet usikkerhed om fortsat drift | | `supplerende` | Revisor har givet supplerende oplysninger | `null` i de tre sidste felter betyder ukendt, ikke "nej". > **Bemærk:** > > Regnskaber fra før XBRL (PDF-årsrapporter) er ikke med. Har en virksomhed ingen regnskaber, er listen tom, og svaret er stadig `200`. Vil du se tallene mod branchen, så brug [Benchmark](https://cvrradar.dk/docs/endpoints/benchmark.md). --- Kilde: https://cvrradar.dk/docs/endpoints/kredit # Kreditvurdering > Faresignaler og en samlet score fra 1 til 100, for selskabet alene og med koncernen, med forklaring. ## GET /v1/virksomhed/{cvr}/kredit En kreditvurdering ud fra offentlige data: forklarlige faresignaler med kilde og en samlet score. Betalt pakke eller smagsprøve. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/30405060/kredit" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/30405060/kredit", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/30405060/kredit"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/30405060/kredit", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "cvr": "30405060", "model_version": "2026.11", "beregnet": "2026-11-11T03:00:00.000Z", "grundlag": "Regnskab 2025", "tilstand": null, "alene": { "score": 24, "kategori": "hoej" }, "med_koncern": { "score": 74, "kategori": "lav", "moder_cvr": "20304050" }, "signaler": [ { "kode": "negativ_egenkapital", "alvor": "alvorlig", "tekst": "Egenkapitalen er negativ (minus 410.000 kr.).", "kilde": "Årsrapport 2025 (offentliggjort 2026-05-12)" } ], "faktorer": [ { "navn": "egenkapital", "retning": "ned", "vaegt": 0.5, "tekst": "Negativ egenkapital to år i træk." }, { "navn": "moder", "retning": "op", "vaegt": 0.45, "tekst": "Moderselskabet har høj egenkapital og solid likviditet." } ], "kilde": "cvrradars kreditmodel på offentlige data. En vurdering, ikke rådgivning." } ``` ### Sådan læser du den - **Score** går fra 1 (højest risiko) til 100 (lavest risiko). **Kategori** er `lav` (59 og over), `middel` (34 til 58) eller `hoej` (under 34). - **`alene`** vurderer selskabet ud fra dets eget regnskab. **`med_koncern`** tager moderselskabet med, når det ejer mere end 50 %. Et datterselskab med negativ egenkapital og en solid moder kan derfor have høj risiko alene og lav med koncernen. - **`tilstand`** er udfyldt, når der ikke vises en score: `konkurs`, `tvangsoploesning`, `ophoert`, `ikke_nok_data` (der mangler et regnskab) eller `score_skjult`. Så er `alene` og `med_koncern` `null`, men faresignalerne er der stadig. - **`signaler`** er konkrete observationer med `alvor` (`info`, `advarsel` eller `alvorlig`) og en kilde. - **`faktorer`** forklarer scoren: hvad der trækker op og ned, sorteret efter `vaegt`. ### Faresignaler | Kode | Hvad det betyder | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------- | | `negativ_egenkapital` | Egenkapitalen er under nul i seneste regnskab | | `kapitaltab` | Mere end halvdelen af selskabskapitalen er tabt (selskabslovens § 119) | | `underskud_to_aar` | Underskud to år i træk | | `going_concern` | Revisor har fremhævet usikkerhed om fortsat drift | | `forbehold` | Revisor har taget forbehold | | `supplerende_oplysning` | Revisor har givet en supplerende oplysning | | `forsinket_regnskab`, `sen_aarsrapport` | Årsrapporten kom efter fristen, eller den seneste mangler | | `ung_virksomhed` | Under ét år gammel | | `ledelsesskift` | Mange skift i ledelsen på kort tid | | `ledelse_tidligere_konkurser` | Personer i ledelsen har været med i virksomheder, der gik konkurs. Peger ikke på en bestemt person | | `adresseskift` | Mange adresseændringer på kort tid | | `rekonstruktion`, `tvangsoploesning`, `konkurs` | Status i CVR | > **Advarsel:** > > Scoren er en vurdering ud fra offentlige data og ikke rådgivning. Viser du den for andre, så skriv det, og vis faresignalerne ved siden af. Står der `ikke_nok_data`, så vis ingen score. Metoden og træfsikkerheden (backtest mod historiske konkurser) er beskrevet på [om-siden](https://cvrradar.dk/om). --- Kilde: https://cvrradar.dk/docs/endpoints/ejergraf # Ejergraf > Ejere, moderselskaber, ultimative ejere og datterselskaber som en graf med knuder og kanter. ## GET /v1/virksomhed/{cvr}/ejergraf Ejerforholdene omkring virksomheden ud fra de ejerandele, der er registreret i CVR (legale ejere). Op til fire niveauer op og tre ned, højst 60 knuder. Betalt pakke eller smagsprøve. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040/ejergraf" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040/ejergraf", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040/ejergraf"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040/ejergraf", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "rod": "cvr:10203040", "knuder": [ { "id": "cvr:10203040", "navn": "Havnens Smedje ApS", "type": "virksomhed", "cvr": "10203040", "aktiv": true }, { "id": "cvr:20304050", "navn": "Havnholm Holding ApS", "type": "virksomhed", "cvr": "20304050", "aktiv": true }, { "id": "deltager:4000000001", "navn": "Anna Testesen", "type": "person", "cvr": null, "aktiv": null } ], "kanter": [ { "ejer": "cvr:20304050", "ejet": "cvr:10203040", "andel": 1 }, { "ejer": "deltager:4000000001", "ejet": "cvr:20304050", "andel": 0.6 } ], "moderkaede": ["cvr:20304050"], "ultimative": ["deltager:4000000001"], "kilde": "Erhvervsstyrelsen (CVR), registrerede ejere" } ``` | Felt | Beskrivelse | | ---------------- | ---------------------------------------------------------------------------------------------------- | | `rod` | Knuden for den virksomhed, grafen er tegnet for | | `knuder[].id` | `cvr:` for danske virksomheder, `deltager:` for personer og andre | | `kanter[].andel` | Ejerandel 0 til 1 (bunden af ERST's interval), eller `null` | | `moderkaede` | Moderselskaber op til den ultimative ejer, nærmeste først. Kun danske virksomheder med mere end 50 % | | `ultimative` | Knuder uden egne ejere i grafen | Reelle ejere (registret over reelle ejere) er ikke med. Det er legale ejere, som de står i CVR. ### Tegn grafen Knuderne har ingen koordinater. Læg ejerne over roden og de ejede selskaber under, niveau for niveau, eller brug et bibliotek som d3-dag eller ELK. Virksomhedskortet på cvrradar.dk tegner den som et lagdelt SVG uden bibliotek. --- Kilde: https://cvrradar.dk/docs/endpoints/digital # Digital profil > Hjemmeside, SSL, platform, hastighed, mailudbyder, SPF, DMARC og sociale profiler for virksomhedens domæne. ## GET /v1/virksomhed/{cvr}/digital cvrradars egen, lette måling af virksomhedens domæne fra CVR: én forespørgsel til forsiden og opslag i DNS. Betalt pakke eller smagsprøve. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040/digital" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040/digital", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040/digital"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040/digital", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "domaene": "havnens-smedje.example", "maalt": "2026-11-10T04:12:00.000Z", "svarer": true, "http_status": 200, "endelig_url": "https://havnens-smedje.example/", "https": true, "ssl": { "gyldig": true, "udloeber": "2027-02-03", "udsteder": "Let's Encrypt" }, "platform": "WordPress", "svartid_ms": 640, "sidevaegt_kb": 1840, "mail": { "udbyder": "Microsoft 365", "mx": ["mx.example"], "spf": true, "dmarc": "p=none" }, "sociale": { "facebook": "https://facebook.com/…", "linkedin": "https://linkedin.com/company/…" }, "kilde": "Måling foretaget af cvrradar.dk" } ``` | Felt | Beskrivelse | | ---------------------------- | --------------------------------------------------------------------------------------------- | | `maalt` | Hvornår domænet sidst blev målt. `null`, hvis det ikke er målt endnu | | `svarer` | Svarer forsiden (efter højst 5 omdirigeringer) | | `ssl` | Er certifikatet gyldigt, hvornår udløber det, og hvem har udstedt det | | `platform` | Fx WordPress, Shopify, Wix, Webflow, Dandomain. `null` betyder, at intet fingeraftryk passede | | `svartid_ms`, `sidevaegt_kb` | Tid til hele HTML'en og dens størrelse. Ikke en Lighthouse-måling | | `mail.udbyder` | Ud fra MX: Microsoft 365, Google Workspace, one.com, Simply m.fl. | | `mail.dmarc` | DMARC-politikken, fx `p=reject`, eller `null` | | `sociale` | Links fra forsiden til sociale profiler | Har virksomheden intet domæne i CVR, svarer endpointet `404` med en forklaring. Et domæne måles højst hver 30. dag. Robotten hedder `cvrradarbot`, og [om-siden](https://cvrradar.dk/om#crawler) forklarer, hvordan den kan blokeres. --- Kilde: https://cvrradar.dk/docs/endpoints/seo # SEO-data > Organisk trafik, søgeord i top 10 og top 100, de vigtigste søgeord, backlinks og udvikling over 12 måneder. ## GET /v1/virksomhed/{cvr}/seo SEO-data om virksomhedens domæne fra DataForSEO. Hvert nyt opslag koster os penge, så endpointet findes kun i de betalte pakker, og hver pakke har et antal SEO-opslag om måneden. Svar caches i 30 dage og deles, så et cachet svar tæller ikke mod dit SEO-loft. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040/seo" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040/seo", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040/seo"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040/seo", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "status": "ok", "fra_cache": true, "data": { "domaene": "havnens-smedje.example", "hentet": "2026-11-02T09:15:00.000Z", "organisk_trafik": 1240, "soegeord_top10": 38, "soegeord_top100": 412, "top_soegeord": [{ "soegeord": "smed aarhus", "placering": 3, "volumen": 590 }], "backlinks": 2110, "henvisende_domaener": 96, "udvikling": [{ "maaned": "2026-10", "trafik": 1240, "soegeord": 412 }] }, "kilde": "SEO-data om virksomhedens domæne, hentet af cvrradar.dk" } ``` `status` kan også være: | Status | Betydning | | ------------------ | ------------------------------------------------------------------ | | `kraever_betaling` | Nøglen har ingen SEO-adgang. Svaret er `402` | | `dagsloft` | Dagens samlede loft for nye SEO-opslag er nået. Prøv igen i morgen | | `intet_domaene` | Virksomheden har intet domæne i CVR | | `fejl` | Datakilden svarede ikke. `besked` forklarer | --- Kilde: https://cvrradar.dk/docs/endpoints/historik # Historik > Ændringer i virksomheden over tid, fx nyt navn, ny adresse, ny direktør, nyt regnskab og konkurs. ## GET /v1/virksomhed/{cvr}/historik Ændringer, cvrradar har registreret ud fra CVR og årsrapporterne, nyeste først. Betalt pakke eller smagsprøve. ```bash curl curl "https://cvrradar.dk/v1/virksomhed/10203040/historik?graense=20" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/virksomhed/10203040/historik?graense=20", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/virksomhed/10203040/historik?graense=20"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/virksomhed/10203040/historik?graense=20", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Parametre | Parameter | Beskrivelse | | --------- | ---------------------------------------- | | `graense` | Antal ændringer, 1 til 200 (standard 50) | ### Svar ```json { "cvr": "10203040", "historik": [ { "id": 3, "tid": "2026-05-13T03:00:00Z", "dato": "2026-05-12", "type": "regnskab", "tekst": "Årsrapport for 2025 offentliggjort", "fra": null, "til": null }, { "id": 2, "tid": "2025-09-02T03:00:00Z", "dato": "2025-09-01", "type": "direktion", "tekst": "Ny direktør", "fra": null, "til": { "rolle": "direktion" } } ], "kilde": "Ændringer registreret af cvrradar.dk ud fra Erhvervsstyrelsens CVR" } ``` `tid` er, hvornår cvrradar registrerede ændringen, og `dato` er virkningsdatoen fra CVR, når den kendes. `tekst` er en kort dansk beskrivelse, som kan vises direkte. ### Typer | Type | Eksempel på tekst | | ------------------------------------------------------------------- | ------------------------------------------------------------------- | | `navn` | Navn ændret til … | | `adresse` | Adresse ændret til Aarhus C | | `form`, `branche` | Virksomhedsform eller branche ændret | | `direktion`, `bestyrelse` | Ny direktør, Nyt bestyrelsesmedlem, Formand fratrådt | | `ejer` | Ny ejer, Ejerandel ændret | | `status`, `konkurs`, `rekonstruktion`, `tvangsoploesning`, `ophoer` | Statusændringer | | `regnskab`, `negativ_egenkapital` | Nyt regnskab offentliggjort, Negativ egenkapital i seneste regnskab | | `kredit_fald`, `kredit_stigning` | Kreditscore faldet fra 71 til 48, Kreditscore steget fra 48 til 71 | | `ny_virksomhed` | Ny virksomhed | Vil du have besked, når noget ændrer sig, så brug [overvågning](https://cvrradar.dk/docs/endpoints/overvaag.md) i stedet for at spørge igen og igen. --- Kilde: https://cvrradar.dk/docs/endpoints/nye # Nye virksomheder > De seneste registreringer i CVR med filtre på dato, branche, kommune og virksomhedsform. ## GET /v1/nye Nystiftede virksomheder, nyeste først. Reklamebeskyttede virksomheder er aldrig med. Gratis pakke. ```bash curl curl "https://cvrradar.dk/v1/nye?branchekode=4322&kommune=Aarhus&graense=25" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/nye?branchekode=4322&kommune=Aarhus&graense=25", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/nye?branchekode=4322&kommune=Aarhus&graense=25"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/nye?branchekode=4322&kommune=Aarhus&graense=25", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Parametre | Parameter | Beskrivelse | | ------------- | ---------------------------------------------------------------- | | `fra`, `til` | Stiftelsesdato fra og til (inkl.), fx `2026-11-01` | | `branchekode` | 2 til 6 cifre. `43` giver hele hovedgruppen, `432200` én branche | | `kommune` | Kommunens navn, fx `Aarhus` | | `form` | Virksomhedsform, fx `ApS`, `A/S` eller `ENK` | | `graense` | Antal pr. side, 1 til 100 (standard 25) | | `efter` | Sidedeling: værdien af `naeste` fra forrige svar | ### Svar ```json { "virksomheder": [ { "cvr": "60000000", "navn": "Nyt Eksempel 001 ApS", "stiftet": "2026-11-20", "virksomhedsform": "ApS", "branchekode": "432200", "branchetekst": "VVS- og blikkenslagerarbejde", "postnr": "8000", "by": "Aarhus C", "kommune": "Aarhus" } ], "naeste": "60000024", "kilde": "Erhvervsstyrelsen (CVR), nystiftede virksomheder" } ``` Er `naeste` `null`, er der ikke flere. Feedet findes også på hjemmesiden som [/nye](https://cvrradar.dk/nye) og som RSS på [/nye.rss](https://cvrradar.dk/nye.rss) med de samme filtre. > **Bemærk:** > > Feedet er en liste til research og salg, du selv handler på. Send ikke automatiske mails eller beskeder til virksomhederne, og husk, at enkeltmandsvirksomheder er personer. --- Kilde: https://cvrradar.dk/docs/endpoints/benchmark # Benchmark > Virksomhedens nøgletal mod median og kvartiler i samme branche. ## GET /v1/benchmark/{cvr} Sammenligner virksomhedens seneste regnskab med de øvrige selskaber i samme 4-cifrede branche: median og de midterste 50 % (25. til 75. percentil). Betalt pakke. ```bash curl curl "https://cvrradar.dk/v1/benchmark/10203040" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/benchmark/10203040", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/benchmark/10203040"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/benchmark/10203040", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "branchekode": "4322", "branchetekst": "VVS- og blikkenslagerarbejde", "antal": 1340, "noegletal": [ { "navn": "Soliditetsgrad (%)", "virksomhed": 29.5, "median": 31.2, "p25": 14.8, "p75": 52.1 }, { "navn": "Likviditetsgrad (%)", "virksomhed": 172.7, "median": 141.0, "p25": 98.3, "p75": 210.4 }, { "navn": "Nettoomsætning", "virksomhed": 11400000, "median": 4200000, "p25": 1900000, "p75": 9100000 } ], "kilde": "Årsrapporter offentliggjort hos Erhvervsstyrelsen, branchesammenligning udregnet af cvrradar.dk" } ``` `antal` er antallet af selskaber i sammenligningen. Nøgletallene er Nettoomsætning, Bruttofortjeneste, Årets resultat, Egenkapital, Balance, Ansatte, Soliditetsgrad (%), Likviditetsgrad (%) og Afkastningsgrad (%). Mangler tallet for virksomheden, er `virksomhed` `null`. Har branchen for få selskaber, svarer endpointet `404`. På virksomhedskortet vises de samme tal som små bjælker, hvor de midterste 50 % er et bånd, medianen en streg og virksomheden en prik. --- Kilde: https://cvrradar.dk/docs/endpoints/sammenlign # Sammenlign > Nøgletal og kreditvurdering for 2 til 5 virksomheder side om side i ét kald. ## GET /v1/sammenlign Henter stamdata, seneste regnskab og kreditvurdering for 2 til 5 virksomheder. Tæller ét opslag pr. virksomhed. Betalt pakke. ```bash curl curl "https://cvrradar.dk/v1/sammenlign?cvr=10203040,20304050,30405060" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/sammenlign?cvr=10203040,20304050,30405060", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/sammenlign?cvr=10203040,20304050,30405060"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/sammenlign?cvr=10203040,20304050,30405060", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ### Svar ```json { "virksomheder": [ { "cvr": "10203040", "fundet": true, "navn": "Havnens Smedje ApS", "reklamebeskyttet": false, "status": "NORMAL", "aktiv": true, "virksomhedsform": "ApS", "stiftet": "2019-03-14", "ansatte": "10-19", "seneste_regnskab": { "periode_slut": "2025-12-31", "nettoomsaetning": 11400000, "aarets_resultat": 520000, "egenkapital": 2340000, "balance": 7920000, "ansatte": 11 }, "kredit": { "tilstand": null, "alene": { "score": 71, "kategori": "lav" }, "med_koncern": null, "antal_faresignaler": 1 } } ], "ikke_fundet": [], "kilde": "Erhvervsstyrelsen (CVR) og offentliggjorte årsrapporter, bearbejdet af cvrradar.dk" } ``` `cvr` skal være 2 til 5 forskellige CVR-numre adskilt af komma. Ukendte numre står i `ikke_fundet`. --- Kilde: https://cvrradar.dk/docs/endpoints/overvaag # Overvågning > Følg en virksomhed og få besked via webhook eller mail, når noget ændrer sig. Overvågning sender dig ændringer i de virksomheder, du følger: nyt navn eller adresse, ny direktør, konkurs, nyt regnskab, negativ egenkapital og fald eller stigning i kreditscoren. Betalt pakke. Start kan følge 25 virksomheder, Pro 250. Fuld kan følge 5.000. ## POST /v1/overvaag Følg en virksomhed. Angiv en `webhook_url` (HTTPS), `email: true` eller begge. ```bash curl curl -X POST "https://cvrradar.dk/v1/overvaag" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" \ -H "Content-Type: application/json" \ -d '{"cvr": "10203040", "webhook_url": "https://dit-system.example/cvrradar", "email": true}' ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/overvaag", { method: "POST", headers: { Authorization: "Bearer cvr_DIN_NOEGLE", "Content-Type": "application/json", }, body: JSON.stringify({"cvr": "10203040", "webhook_url": "https://dit-system.example/cvrradar", "email": true}), }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/overvaag"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{"cvr": "10203040", "webhook_url": "https://dit-system.example/cvrradar", "email": true}', CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", "Content-Type: application/json", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.post( "https://cvrradar.dk/v1/overvaag", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, json={"cvr": "10203040", "webhook_url": "https://dit-system.example/cvrradar", "email": True}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ```json { "cvr": "10203040", "overvaaget": true, "webhook_hemmelighed": "whsec_…", "bemaerkning": "Webhooks signeres med X-Cvrradar-Signature: t=,v1=.\"> med din webhook-hemmelighed.", "kilde": "cvrradar.dk" } ``` Svaret er `201`, første gang du følger virksomheden, og `200`, hvis du allerede gjorde. Gem `webhook_hemmelighed`: den bruges til at tjekke signaturen og vises kun her. Se [Webhooks](https://cvrradar.dk/docs/integrationer/webhooks.md). | Fejl | Betydning | | --------------------------- | ------------------------------------------------------------- | | `402` | Kræver en betalt pakke | | `404` | CVR-nummeret findes ikke | | `422` med `kode: "graense"` | Du følger allerede så mange virksomheder, som pakken tillader | ## GET /v1/overvaag Listen over de virksomheder, du følger. ```bash curl curl "https://cvrradar.dk/v1/overvaag" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/overvaag", { headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/overvaag"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.get( "https://cvrradar.dk/v1/overvaag", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` ```json { "overvaagede": [ { "cvr": "10203040", "navn": "Havnens Smedje ApS", "webhook_url": "https://dit-system.example/cvrradar", "email": true, "oprettet": "2026-11-13T10:00:00Z" } ], "graense": 25 } ``` ## DELETE /v1/overvaag/{cvr} Stop med at følge en virksomhed. ```bash curl curl -X DELETE "https://cvrradar.dk/v1/overvaag/10203040" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" ``` ```js JavaScript const svar = await fetch("https://cvrradar.dk/v1/overvaag/10203040", { method: "DELETE", headers: { Authorization: "Bearer cvr_DIN_NOEGLE", }, }); if (!svar.ok) throw new Error(`cvrradar svarede ${svar.status}`); const data = await svar.json(); ``` ```php PHP $ch = curl_init("https://cvrradar.dk/v1/overvaag/10203040"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "DELETE", CURLOPT_HTTPHEADER => [ "Authorization: Bearer cvr_DIN_NOEGLE", ], ]); $data = json_decode(curl_exec($ch), true); ``` ```python Python import requests svar = requests.delete( "https://cvrradar.dk/v1/overvaag/10203040", headers={"Authorization": "Bearer cvr_DIN_NOEGLE"}, timeout=10, ) svar.raise_for_status() data = svar.json() ``` Mail-besked kommer som én samlet mail om dagen med alle ændringer. Webhooks sendes, så snart ændringen er registreret, typisk om natten efter CVR-synkroniseringen. --- Kilde: https://cvrradar.dk/docs/integrationer/webhooks # Webhooks > Modtag ændringer i de virksomheder, du overvåger, som signerede HTTP-kald til dit eget system. Når du [overvåger en virksomhed](https://cvrradar.dk/docs/endpoints/overvaag.md) med en `webhook_url`, sender cvrradar et `POST` med JSON, hver gang der er registreret nye ændringer. ## Hændelsen ```http POST /cvrradar HTTP/1.1 Content-Type: application/json User-Agent: cvrradar-webhook/1 X-Cvrradar-Event: virksomhed.aendret X-Cvrradar-Signature: t=1763024400,v1=5f2b… ``` ```json { "id": "0d7e7c1e-6f7b-4a39-9c6e-2b1f0a8d4e11", "type": "virksomhed.aendret", "oprettet": "2026-11-13T03:20:00.000Z", "data": { "cvr": "10203040", "aendringer": [ { "id": 4, "tid": "2026-11-13T03:00:00Z", "dato": "2026-11-12", "type": "adresse", "tekst": "Adresse ændret til Aarhus C", "fra": null, "til": { "by": "Aarhus C" } } ] }, "kilde": "cvrradar.dk, ud fra Erhvervsstyrelsens CVR" } ``` `aendringer` har samme form som [Historik](https://cvrradar.dk/docs/endpoints/historik.md). Brug `id` til at undgå dubletter: den samme hændelse kan komme mere end én gang, hvis dit svar gik tabt. ## Tjek signaturen Headeren `X-Cvrradar-Signature` har formen `t=,v1=`, hvor `` er HMAC-SHA256 af teksten `"."` med din webhook-hemmelighed. Afvis kaldet, hvis signaturen ikke passer, eller hvis `t` er mere end 5 minutter gammel. ```js JavaScript import { createHmac, timingSafeEqual } from 'node:crypto'; export function gyldig(raaBody, header, hemmelighed) { const dele = Object.fromEntries(header.split(',').map((d) => d.split('='))); const t = Number(dele.t); if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false; const forventet = createHmac('sha256', hemmelighed).update(`${t}.${raaBody}`).digest('hex'); const a = Buffer.from(forventet); const b = Buffer.from(dele.v1 ?? ''); return a.length === b.length && timingSafeEqual(a, b); } ``` ```php PHP function gyldig(string $raaBody, string $header, string $hemmelighed): bool { parse_str(str_replace(',', '&', $header), $dele); $t = (int) ($dele['t'] ?? 0); if (!$t || abs(time() - $t) > 300) return false; $forventet = hash_hmac('sha256', $t . '.' . $raaBody, $hemmelighed); return hash_equals($forventet, $dele['v1'] ?? ''); } ``` ```python Python import hashlib, hmac, time def gyldig(raa_body: bytes, header: str, hemmelighed: str) -> bool: dele = dict(d.split("=", 1) for d in header.split(",")) t = int(dele.get("t", 0)) if not t or abs(time.time() - t) > 300: return False forventet = hmac.new(hemmelighed.encode(), f"{t}.".encode() + raa_body, hashlib.sha256).hexdigest() return hmac.compare_digest(forventet, dele.get("v1", "")) ``` Brug altid den rå body, som den kom, ikke JSON, du har læst og skrevet igen. ## Svar og genforsøg - Svar med en `2xx`-status inden for 10 sekunder. Lav det tunge arbejde bagefter, fx i en kø. - Svarer du ikke med `2xx`, prøver cvrradar igen tre gange med stigende pause. Derefter opgives leveringen, og ændringen kommer med i næste levering eller i den daglige mail, hvis du har slået mail til. - Adressen skal være HTTPS og må ikke pege på et privat netværk. --- Kilde: https://cvrradar.dk/docs/integrationer/mcp # MCP-server > Giv Claude, ChatGPT, Cursor og andre AI-værktøjer adgang til cvrradar med en fjern-MCP-server med OAuth eller API-nøgle. cvrradar har en MCP-server (Model Context Protocol) på `https://mcp.cvrradar.dk/mcp` med streamable HTTP. Den har rigtige værktøjer med præcise beskrivelser, kompakte svar og fejl, der fortæller modellen, hvad den skal gøre. Kvoter og pakker er de samme som i API'et. ## Claude (connector) 1. Åbn **Indstillinger**, og vælg **Connectors**. 2. Tryk **Tilføj brugerdefineret connector**, kald den cvrradar, og indsæt `https://mcp.cvrradar.dk/mcp`. 3. Claude sender dig til et login med din mail. Bagefter kan du spørge om virksomheder i almindeligt sprog. ## Claude Code Brug en API-nøgle: ```bash claude mcp add --transport http cvrradar https://mcp.cvrradar.dk/mcp \ --header "Authorization: Bearer cvr_DIN_NOEGLE" ``` ## ChatGPT Slå udviklertilstand til under **Indstillinger**, **Apps og connectors**, opret en connector med adressen `https://mcp.cvrradar.dk/mcp`, og vælg OAuth. Vil du hellere bruge en GPT Action, så importér OpenAPI-filen `https://cvrradar.dk/v1/openapi.json` og vælg godkendelse med API-nøgle af typen Bearer. ## Cursor Læg serveren i `.cursor/mcp.json` i dit projekt eller i den globale konfiguration: ```json { "mcpServers": { "cvrradar": { "url": "https://mcp.cvrradar.dk/mcp", "headers": { "Authorization": "Bearer cvr_DIN_NOEGLE" } } } } ``` ## Værktøjer | Værktøj | Hvad det gør | | ------------------------- | -------------------------------------------------------------- | | `soeg_virksomhed` | Find virksomheder på navn, CVR-nummer, domæne eller mail | | `hent_virksomhed` | Stamdata, status og kontaktoplysninger | | `hent_regnskab` | Nøgletal pr. år fra årsrapporterne | | `kreditvurdering` | Faresignaler og score, alene og med koncern, med forklaring | | `ejergraf` | Ejere, moderselskaber og datterselskaber | | `personer_og_roller` | Direktion, bestyrelse, ejere og stiftere | | `digital_profil` | Hjemmeside, SSL, platform, hastighed, mail og sociale profiler | | `seo_data` | Trafik, søgeord og backlinks for virksomhedens domæne | | `nye_virksomheder` | Nyregistrerede virksomheder med filtre | | `sammenlign_virksomheder` | Nøgletal for 2 til 5 virksomheder side om side | | `branche_benchmark` | Nøgletal mod branchens median | | `overvaag_virksomhed` | Følg et CVR-nummer og få besked ved ændringer | De fleste værktøjer har parameteren `detaljer` (`kort` eller `fuld`). Kort er standard og sparer tokens. Desuden en ressource, `cvrradar://virksomhed/{cvr}`, med hele virksomhedskortet som Markdown, og to prompts: `tjek_ny_kunde` (tjek en ny kunde, før du sender faktura) og `nye_uden_hjemmeside` (nye virksomheder i en branche og by uden hjemmeside). ## Godkendelse Connectors i Claude og ChatGPT bruger OAuth 2.1: du logger ind med din mail på cvrradar.dk og godkender forbindelsen, og opslagene tæller på din konto. Klienter, der kan sende en header (Claude Code, Cursor, n8n), bruger en API-nøgle. Begge veje bruger samme pakke og kvote som API'et. Kræver et værktøj en betalt pakke, svarer serveren med en fejl, der siger det og linker til [priserne](https://cvrradar.dk/priser), så modellen ikke prøver igen. ## Agent Skill til Claude Hent [skill.zip](https://cvrradar.dk/ai/skill.zip) og upload den under **Indstillinger**, **Skills** i Claude, eller læg mappen `cvrradar` i `~/.claude/skills/` til Claude Code. Den fortæller Claude, hvornår cvrradar skal bruges, hvilket værktøj der passer til hvilket spørgsmål, og hvilke regler der gælder ([læs SKILL.md](https://cvrradar.dk/ai/SKILL.md)). ## Uden MCP Samme værktøjer findes som skemaer til tool use i din egen agent: ```bash curl -s "https://cvrradar.dk/v1/tools?format=anthropic" # eller format=openai curl -s -X POST "https://cvrradar.dk/v1/tools/kreditvurdering" \ -H "Authorization: Bearer cvr_DIN_NOEGLE" \ -H "Content-Type: application/json" -d '{"cvr": "10203040"}' ``` `GET /v1/virksomhed/{cvr}?format=llm` giver hele virksomhedskortet som Markdown med kilde og dato, klar til at give en sprogmodel som kontekst. ## Prompts, der virker godt - "Tjek en ny kunde, før jeg sender faktura: CVR 10203040." - "Find nye frisører i Aarhus uden hjemmeside." - "Sammenlign soliditet og resultat for 10203040, 20304050 og 30405060." - "Hvem ejer Havnens Smedje ApS, og hvordan står moderselskabet?" --- Kilde: https://cvrradar.dk/docs/integrationer/cli # CLI > Slå virksomheder op fra terminalen med npx @mahope/cvrradar. Output som tabel eller JSON. CLI'en `cvrradar` bruger det samme API og de samme kvoter. Den kræver Node 20 eller nyere og kan køres uden installation med npx. > **Bemærk:** > > Pakken `@mahope/cvrradar` udgives på npm, når API'et åbner. Kommandoerne herunder er dem, den har. ## Log ind ```bash npx @mahope/cvrradar login ``` `login` sender et link til din mail og gemmer nøglen i din brugermappe. Du kan også bruge en nøgle direkte med `--noegle cvr_…` eller miljøvariablen `CVRRADAR_NOEGLE`. ## Kommandoer | Kommando | Hvad den gør | | ------------------------- | ---------------------------------------------------------- | | `cvrradar soeg ` | Søg på navn, CVR-nummer, domæne eller mail | | `cvrradar vis ` | Stamdata, personer og roller | | `cvrradar regnskab ` | Nøgletal pr. år | | `cvrradar kredit ` | Score, faresignaler og forklaring | | `cvrradar nye` | Nye virksomheder, med `--branche`, `--kommune` og `--form` | ```bash npx @mahope/cvrradar soeg "havnens smedje" npx @mahope/cvrradar kredit 30405060 npx @mahope/cvrradar nye --branche 4322 --kommune Aarhus ``` ## JSON Tilføj `--json` for at få API'ets svar uændret, fx til `jq`: ```bash npx @mahope/cvrradar regnskab 10203040 --json | jq '.regnskaber[0].egenkapital' ``` --- Kilde: https://cvrradar.dk/docs/integrationer/sdk # SDK > En lille typet klient til TypeScript og JavaScript, og et eksempel i Python. ## TypeScript Klienten er én fil uden afhængigheder, med typer for alle svar. Den virker i Node 18 og nyere, Deno, Bun og Cloudflare Workers. > **Bemærk:** > > Klienten følger med npm-pakken `@mahope/cvrradar` (samme pakke som CLI'en), som udgives, når API'et åbner. ```ts TypeScript import { CvrKlient, CvrFejl } from '@mahope/cvrradar'; const cvr = new CvrKlient({ url: 'https://cvrradar.dk', noegle: process.env.CVRRADAR_NOEGLE! }); const v = await cvr.virksomhed('10203040'); // null, hvis nummeret ikke findes const { resultater } = await cvr.soeg('havnens smedje', { limit: 5, aktiv: true }); const bag = await cvr.domaene('info@havnens-smedje.example'); const mange = await cvr.virksomheder(['10203040', '20304050']); // deles selv i kald á 500 try { await cvr.virksomhed('10203040'); } catch (e) { if (e instanceof CvrFejl && e.status === 429) { // kvoten er brugt; se Retry-After } } ``` | Metode | Endpoint | | -------------------------------------------------------------------- | ------------------------------------------------------- | | `virksomhed(cvr)` | `GET /v1/virksomhed/{cvr}` (null, hvis den ikke findes) | | `virksomheder(liste)` | `POST /v1/virksomheder` | | `soeg(q, { limit, postnr, aktiv })` | `GET /v1/soeg` | | `domaene(input)` | `GET /v1/domaene/{domaene}` | | `personer(cvr)` | `GET /v1/virksomhed/{cvr}/personer` | | `regnskab(cvr)` | `GET /v1/virksomhed/{cvr}/regnskab` | | `kredit(cvr)` | `GET /v1/virksomhed/{cvr}/kredit` | | `ejergraf(cvr)` | `GET /v1/virksomhed/{cvr}/ejergraf` | | `digital(cvr)` | `GET /v1/virksomhed/{cvr}/digital` | | `seo(cvr)` | `GET /v1/virksomhed/{cvr}/seo` | | `historik(cvr, graense)` | `GET /v1/virksomhed/{cvr}/historik` | | `benchmark(cvr)` | `GET /v1/benchmark/{cvr}` | | `sammenlign(liste)` | `GET /v1/sammenlign` | | `nye({ branchekode, kommune, form, fra, til, graense, efter })` | `GET /v1/nye` | | `overvaagede()`, `overvaag(cvr, valg)`, `stopOvervaagning(cvr)` | `/v1/overvaag` | | `virksomhedMarkdown(cvr)` | `GET /v1/virksomhed/{cvr}?format=llm` | | `vaerktoejer('anthropic' \| 'openai')`, `koerVaerktoej(navn, input)` | `GET /v1/tools`, `POST /v1/tools/{navn}` | Fejl kastes som `CvrFejl` med `status` (402 betyder, at endpointet kræver en betalt pakke) og resten af fejlsvaret i `detaljer`. ## Python Der er ingen pakke til Python, men API'et er nemt at kalde med `requests` eller `httpx`: ```python Python import os import requests class Cvrradar: def __init__(self, noegle: str, basis: str = "https://cvrradar.dk"): self.basis = basis self.s = requests.Session() self.s.headers["Authorization"] = f"Bearer {noegle}" def hent(self, sti: str, **params): svar = self.s.get(f"{self.basis}{sti}", params=params, timeout=10) if svar.status_code == 404: return None svar.raise_for_status() return svar.json() cvr = Cvrradar(os.environ["CVRRADAR_NOEGLE"]) v = cvr.hent("/v1/virksomhed/10203040") kredit = cvr.hent("/v1/virksomhed/10203040/kredit") print(v["navn"], kredit["alene"]) ``` ## Andre sprog OpenAPI 3.1-filen på `https://cvrradar.dk/v1/openapi.json` kan bruges med openapi-generator, Kiota eller Postman til at lave en klient i C#, Go, Java, PHP og andre sprog. --- Kilde: https://cvrradar.dk/docs/integrationer/n8n-og-zapier # n8n og Zapier > Brug cvrradar i automatiseringer uden kode, fx til at berige nye kunder eller tjekke en leverandør. ## n8n **Til faste opslag** bruger du noden _HTTP Request_: 1. Method: `GET`. URL: `https://cvrradar.dk/v1/virksomhed/{{ $json.cvr }}`. 2. Authentication: _Generic Credential Type_, _Header Auth_. Name: `Authorization`, Value: `Bearer cvr_DIN_NOEGLE`. 3. Svaret er JSON, som de næste noder kan læse felt for felt. **Til en AI-agent** bruger du noden _MCP Client Tool_ med adressen `https://mcp.cvrradar.dk/mcp` og samme header. Så kan agenten selv vælge værktøj, fx `kreditvurdering` eller `soeg_virksomhed`. ## Zapier 1. Tilføj trinnet _Webhooks by Zapier_ og vælg _GET_. 2. URL: `https://cvrradar.dk/v1/virksomhed/` efterfulgt af CVR-nummeret fra et tidligere trin. 3. Under _Headers_: `Authorization` = `Bearer cvr_DIN_NOEGLE`. ## Opskrifter - **Ny kunde i CRM'et**: slå CVR op, gem navn, adresse og branche, og opret en opgave, hvis `kredit.alene.kategori` er `hoej`. - **Fakturering**: tjek, at kunden er `aktiv`, før fakturaen sendes. - **Leverandørtjek hver måned**: hent kreditvurderingen for dine leverandører, og send dig selv en besked, hvis scoren er faldet. Eller brug [overvågning](https://cvrradar.dk/docs/endpoints/overvaag.md) med en webhook til n8n. --- Kilde: https://cvrradar.dk/docs/llm # Brug dokumentationen med din LLM > Giv dokumentationen til Claude, ChatGPT, Cursor eller en anden kodeagent, med færdige prompter til at bygge en integration. Dokumentationen er skrevet til både mennesker og sprogmodeller. Alle sider findes som ren Markdown, og hele dokumentationen ligger i én fil. Peg din kodeagent eller chatassistent på den, så kan den skrive en integration mod API'et uden at gætte. ## Hvad du skal give modellen | Adresse | Hvad det er | Brug den, når | | --------------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------- | | `https://cvrradar.dk/llms-full.txt` | Hele dokumentationen i én Markdown-fil | Modellen skal vide alt. Bedst til agenter med stor kontekst | | `https://cvrradar.dk/llms.txt` | Et indeks over alle sider med et resumé og et link til sidens Markdown | Modellen kan selv hente de sider, den har brug for | | `https://cvrradar.dk/docs/.md` | Én side som Markdown, fx `https://cvrradar.dk/docs/endpoints/kredit.md` | Du ved, hvilket emne det handler om | | `https://cvrradar.dk/v1/openapi.json` | OpenAPI 3.1 | Kodegeneratorer, GPT Actions og Postman | | `https://cvrradar.dk/v1/tools` | Værktøjerne som skemaer i Anthropic- og OpenAI-format | Din egen agent skal kunne slå virksomheder op (tool use) | En forespørgsel på en side med `Accept: text/markdown` får også Markdown-udgaven. Links i Markdown-udgaven peger på andre `.md`-sider, så en agent kan følge dem. Øverst på hver side er der knapper: **Kopiér som Markdown** lægger siden i din udklipsholder, **Åbn i ChatGPT** og **Åbn i Claude** starter en chat med en prompt, der peger på sidens Markdown, og **Vis som Markdown** åbner den rå side. ## Claude Code Tilføj en linje til `CLAUDE.md` i dit projekt, så Claude Code kender dokumentationen i alle sessioner: ```text cvrradar API docs: https://cvrradar.dk/llms.txt (fuld tekst: https://cvrradar.dk/llms-full.txt). Læs den relevante side, før du skriver kode mod cvrradar. ``` Vil du have, at Claude Code også kan slå virksomheder op, så tilføj [MCP-serveren](https://cvrradar.dk/docs/integrationer/mcp.md). ## Data om én virksomhed som Markdown `GET https://cvrradar.dk/v1/virksomhed/{cvr}?format=llm` (med nøgle) giver hele virksomhedskortet som Markdown: stamdata, ledelse og ejere, regnskab, kreditvurdering, ejere og koncern, digital profil og seneste ændringer, med kilde og dato nederst. Det offentlige kort findes uden nøgle ved at tilføje `.md` til adressen, fx `https://cvrradar.dk/virksomhed/10203040-havnens-smedje-aps.md`. Teksten er lavet efter faste regler, ikke af en sprogmodel. ## Cursor Skriv `@Docs` i en chat, vælg **Add new doc**, og indsæt `https://cvrradar.dk/llms-full.txt`. Henvis derefter til den med `@cvrradar` i dine prompter. ## Codex og andre agenter med AGENTS.md ```text cvrradar API: læs https://cvrradar.dk/llms.txt og de sider, der er relevante, før du kalder API'et. Nøglen ligger i miljøvariablen CVRRADAR_NOEGLE. ``` ## Færdige prompter **Byg en integration** ```text Læs https://cvrradar.dk/llms-full.txt. Skriv en funktion i TypeScript, der tager et CVR-nummer, henter virksomheden og dens kreditvurdering fra cvrradar, og returnerer navn, status, score og faresignaler. Håndtér 404, 402 og 429 (respektér Retry-After). Nøglen ligger i CVRRADAR_NOEGLE. ``` **Berig en kundeliste** ```text Læs https://cvrradar.dk/docs/endpoints/virksomhed.md og https://cvrradar.dk/docs/godkendelse-og-kvoter.md. Skriv et Python-script, der læser kunder.csv med en kolonne cvr, henter alle virksomheder med POST /v1/virksomheder i bidder á 500, og skriver navn, adresse, branche og reklamebeskyttet til en ny CSV. ``` **Modtag webhooks** ```text Læs https://cvrradar.dk/docs/integrationer/webhooks.md. Lav et endpoint i Express, der modtager cvrradar-webhooks, tjekker X-Cvrradar-Signature med hemmeligheden i CVRRADAR_WEBHOOK, afviser gamle kald og lægger ændringerne i en kø. ``` ## Regler, modellen skal kende - Reklamebeskyttede virksomheder (`reklamebeskyttet: true`) må ikke bruges til direkte markedsføring. - Kreditvurderingen er en vurdering ud fra offentlige data og ikke rådgivning. Står der `ikke_nok_data`, må der ikke opfindes en score. - Der er ingen privatadresser, CPR-numre eller reelle ejere i tjenesten. - Oplys kilden ("Erhvervsstyrelsen (CVR)"), når data vises. --- Kilde: https://cvrradar.dk/docs/aendringslog # Ændringslog > Nye endpoints, ændrede felter og andet, der har betydning for din integration. Ændringer, der kan knække en integration, varsles mindst 30 dage før. Nye felter kan komme uden varsel, så lad din kode ignorere felter, den ikke kender. ## November 2026 - **Pakken Fuld** (1.999 kr. om måneden): alt i Pro, fuld rapport om enhver virksomhed og overvågning af op til 5.000 virksomheder. `pakke` i svarene kan nu også være `fuld`. - **Overvågning** sender nu også nyt regnskab og stigning i kreditscoren (`regnskab`, `kredit_stigning`). - **Dokumentationen** er flyttet til [/docs](https://cvrradar.dk/docs.md) med søgning, Markdown-udgave af hver side og kodeeksempler i curl, JavaScript, PHP og Python. - **Pakkerne** er Start (99 kr., 50.000 opslag om måneden) og Pro (399 kr., 500.000 opslag om måneden). Den gratis nøgle har 1.000 opslag i døgnet og 100 berigede smagsprøver om måneden. - **Opslag uden nøgle**: 50 i døgnet pr. IP-adresse, kun stamdata. - **Nye endpoints**: personer, person, regnskab, kredit, ejergraf, digital profil, SEO-data, historik, nye virksomheder, benchmark, sammenlign og overvågning. - **Webhooks** med HMAC-signatur til overvågning. - **MCP-serveren** på `https://mcp.cvrradar.dk/mcp` med OAuth og API-nøgle. - **OpenAPI 3.1** på `/v1/openapi.json` uden nøgle. ## Oktober 2026 - CVR-tjenesten kører internt hos Mahoje med `GET /v1/virksomhed/{cvr}`, `POST /v1/virksomheder`, `GET /v1/soeg` og `GET /v1/domaene/{domaene}`. De fire endpoints er uændrede på cvrradar.dk.