API and MCP

Get companies, annual reports, management and owners as JSON, or let an AI assistant look them up through MCP. The data comes from CVR and the Danish Business Authority and is delivered as it is registered. Every answer has a field meta.kilde (the source). The API only reads from our database; a company we do not have answers 404.

Access

API access follows the Pro (10,000 calls a month) and Business (100,000 calls) plans. Create a key under My account, API keys and send it with every call:

Authorization: Bearer cvrdb_…

Every answer has X-RateLimit-Limit and X-RateLimit-Remaining for the month. At most 120 calls a minute can be sent per key. When the quota is used up, the API answers 429 with a message about when it resets.

What counts as one call

  • One request is one call, whatever it returns. An answer with an error (unknown CVR number, invalid filter) counts too; a request stopped by the key check or the minute limit does not.
  • /firma: one company with all its annual reports. /soeg: one page of at most 100 companies. /sammenlign: up to 10 (Pro) or 25 (Business) companies. /aendringer: one company, at most 500 changes.
  • MCP: each tool call is one call from the same monthly quota; the handshake and the list of tools are free.
  • Filters on financial figures and growth in /soeg are part of both plans.

Language

The JSON keys are Danish and never change (selskab, regnskaber, ledelse, ejere, signaler …). The human-readable texts are Danish by default. Add lang=en to any REST call and the texts become English: error messages, remarks, signals, industry names, company forms and roles.

curl -H "Authorization: Bearer $CVRDB_KEY" "https://cvrdatabase.dk/api/v1/firma/35954716?lang=en"

Endpoints

GET /api/v1/firma/{cvr}

The company, annual reports year by year, current management, owners, auditor and rank in the industry.

curl -H "Authorization: Bearer $CVRDB_KEY" https://cvrdatabase.dk/api/v1/firma/35954716

GET /api/v1/soeg

Advanced search. At least one filter: q, branche (code or name; with lang=en also the English name), kommune (slug), form, ansMin/ansMax (employees), ekMin/ekMax (equity, DKK million), resMin/resMax, brMin/brMax, omMin/omMax, alderMin/alderMax (years). Year-over-year change in percent, latest financial year against the year before: brVaekstMin/brVaekstMax (gross profit), ekVaekstMin/ekVaekstMax (equity), resVaekstMin/resVaekstMax (net profit) and omVaekstMin/omVaekstMax (revenue). They match only companies with reports for two consecutive years and a figure above zero in the earlier year (revenue: stated in both years); a missing figure is never estimated. A hit then carries aendring_pct with the changes you filtered on. Also sort, dir, side (page) and antal (per page, at most 100).

curl -H "Authorization: Bearer $CVRDB_KEY" \ "https://cvrdatabase.dk/api/v1/soeg?kommune=aarhus&ansMin=500&sort=ansatte&lang=en"

GET /api/v1/sammenlign?cvr=a,b,c

Companies side by side with their latest annual report. Up to 10 (Pro) or 25 (Business).

GET /api/v1/aendringer?cvr=…&since=YYYY-MM-DD

Changes in a company as registered: name, address, status, management, owners, industry and published annual reports.

MCP for AI assistants

The MCP server is at https://cvrdatabase.dk/api/mcp (JSON-RPC over HTTP) with the tools search_companies, get_company, compare_companies and get_changes. Only tool calls count against the quota. Add it in an MCP client that supports remote servers. Add ?lang=en to the URL to get English tool descriptions and answers for the whole connection; every tool also takes a lang argument (da or en) for a single call:

{ "mcpServers": { "cvrdatabase": { "url": "https://cvrdatabase.dk/api/mcp?lang=en", "headers": { "Authorization": "Bearer cvrdb_…" } } } }

Clients differ in what they require of remote servers; follow the client's guide for HTTP servers with their own headers.

Terms for the data

Companies that are protected against advertising have reklamebeskyttet: true and a remark. Information about them must not be used for marketing, and the marking must follow along if you pass it on. You must not use the API to copy the whole database or to get around the limits. See the terms.