Guide · Denmark · Lookup and validation

Denmark company data API: look up and validate a CVR number

A customer types a CVR number, a Danish VAT number or the first letters of a name; your form fills in the legal name, legal form, status and registered address from the Danish Central Business Register (CVR). One key, and the same response shape as every other country the API covers.

Denmark at a glance

Register: Central Business Register (CVR)

Identifiers CVR number

  • Company recordsYes
  • OfficersNo
  • Insolvency noticesYes
  • Corporate eventsRegister changes
  • MonitoringYes
  • Financial statementsAnnual accounts
  • VAT numberBuilt from the number
  • NACE classYes
  • UpdatedEvery working day

The guide below states the limits of every row. Financial statements are on the Scale plan and above; the other plans and the free trial get 10 calls a month.

Price From EUR 9.99 a month (Starter plan)

In other languagesDansk

Sign up

Try Denmark live

Look up a company in Denmark with the shared demo key. No sign-up.

The demo key is shared and capped per page view; your own key has the limits of your plan.

What you get, and what you do not

Company records from the Danish Central Business Register (CVR): legal name, legal form, status (including the register's bankruptcy state), registered address, activity code and dates; with register-change events and monitoring, but no officers, no registry-compliance signal and no share capital (corporate insolvency notices are linked by CVR number), and sole proprietorships (enkeltmandsvirksomhed) and estates are never served.

That is the record of a Danish company as an onboarding form, an invoice or a CRM row needs it. If you need board members, a change history, a share capital figure or insolvency notices for Denmark, this is not the API for it. If you want to know what the register itself is, start with What is the CVR? (also på dansk).

What the Danish record gives your product

  • Exact match on the CVR number. company_number=24256790 with country=DK. Spaces and hyphens are optional. The format is validated server-side, and a number that is not eight digits is a 400 validation error, so a typo never looks like a missing company. The mod-11 check is advisory and a mismatch is not an error.
  • The VAT number as an alias. vat=DK24256790 reaches the same company. The Danish VAT number is DK plus the eight digits of the CVR number.
  • Autocomplete by name. ?name= is a normalised, partial match ranked by a match score. Call it on every keystroke; each call is one request.
  • The fields a form needs. The legal name; the CVR Virksomhedsform code with its Danish label; status; registered address, postal code and city, with the municipality; the main activity in DB25, which corresponds to NACE Rev. 2.1; the start and end dates; and previous names.
  • The register's own state. status is active, bankrupt or ceased, so a company in bankruptcy is not served as plain active. Active and ceased companies are both served.
  • One schema for every country. The same response shape as country=ES|FR|GB|IE|PL|NO|FI|SE|BE|HR|DK|EE|SK|CH|LV|CY|RO|US|LT|CA|AU|JP|IL|SG|CO|TW|BR|CZ|DE|AR|UA|RS|SI|EC|NL|CL|NL|MX.
FieldWhat it holds for Denmark
company_numberThe CVR number: 24256790.
company_nameThe official name of the entity.
legal_form, local_legal_form, local_legal_form_nameThe standard abbreviation in legal_form (null when the form is not mapped), the CVR Virksomhedsform code in local_legal_form (such as 80 for the ApS, 60 for the A/S or 30 for the I/S) and its Danish label in local_legal_form_name.
local_status, status, stageThe register's own value in local_status: one of active, bankrupt or ceased. status carries the standard reading and stage the lifecycle stage, null where the value is not recognised.
address, postal_code, city, provinceThe registered address; province holds the municipality.
activity_codeThe main activity in DB25, which corresponds to NACE Rev. 2.1. Companies that ceased before 2025 carry none.
founding_date, dissolution_dateThe start date of the entity and, for a ceased company, its end date.
previous_namesThe names the entity carried before its current one.

Validate before you call

A CVR number is eight digits, and the eight digits carry a mod-11 check: multiply them by the weights 2, 7, 6, 5, 4, 3, 2, 1 and the sum should divide by 11. The check is advisory, so it is a hint and not a gate: reject anything that is not eight digits, and for a mismatch show a warning and look the number up all the same. The identifier validator runs the same arithmetic in the browser; this is the version to paste into a form handler:

// Danish CVR number: 8 digits. The mod-11 check (weights 2,7,6,5,4,3,2,1) is advisory.
export function checkCvr(input) {
  const digits = String(input).replace(/[\s.-]/g, '')
  if (!/^\d{8}$/.test(digits)) return null
  const sum = [2, 7, 6, 5, 4, 3, 2, 1].reduce((s, w, i) => s + w * Number(digits[i]), 0)
  return { cvr: digits, mod11: sum % 11 === 0 }
}

checkCvr('24256790')   // { cvr: '24256790', mod11: true }   (Novo Nordisk A/S)
checkCvr('24256791')   // { cvr: '24256791', mod11: false }  well-formed: warn, but still look it up
checkCvr('2425679')    // null: not eight digits

A passing check says the number is well-formed, never that the company exists or is still active. That is what the lookup is for.

Three calls

# 1. By CVR number
curl -H "Authorization: Bearer rk_live_..." \
  "https://api.prometiam.com/functions/v1/risk-api/companies/search?company_number=24256790&country=DK"

# 2. By the VAT number
curl -H "Authorization: Bearer rk_live_..." \
  "https://api.prometiam.com/functions/v1/risk-api/companies/search?vat=DK24256790&country=DK"

# 3. By name, for a type-ahead field
curl -H "Authorization: Bearer rk_live_..." \
  "https://api.prometiam.com/functions/v1/risk-api/companies/search?name=carlsberg&country=DK&limit=5"

To resolve a list, POST /companies/lookup takes up to 100 items in one call, each one counted as one request:

curl -X POST "https://api.prometiam.com/functions/v1/risk-api/companies/lookup" \
  -H "Authorization: Bearer rk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"items":[{"country":"DK","company_number":"24256790"},{"country":"DK","vat":"DK61056416"},{"country":"DK","name":"Danske Bank"}]}'

The search returns the record's id; pass it to GET /companies/{id} for the detail.

An autocomplete endpoint in Node

Your server keeps the key and proxies the search; the form calls your server. A well-formed CVR number goes to the company_number filter, anything else is a name, a value that is not eight digits is rejected before it costs a call, and a mod-11 mismatch comes back as a warning next to the result:

// server: /api/dk-company?q=...   (keep the key out of the browser)
app.get('/api/dk-company', async (req, res) => {
  const q = String(req.query.q || '').trim()
  const looksLikeId = /^[\d\s.-]+$/.test(q)
  const cvr = looksLikeId ? checkCvr(q) : null
  if (looksLikeId && !cvr) return res.status(422).json({ error: 'A CVR number is eight digits' })

  const params = new URLSearchParams({ country: 'DK', limit: '6', ...(cvr ? { company_number: cvr.cvr } : { name: q }) })
  const r = await fetch('https://api.prometiam.com/functions/v1/risk-api/companies/search?' + params,
    { headers: { Authorization: 'Bearer ' + process.env.PROMETIAM_API_KEY } })
  const { data } = await r.json()
  res.json({
    warning: cvr && !cvr.mod11 ? 'The mod-11 check does not match: check the number' : null,
    results: data.map(c => ({ id: c.id, name: c.company_name, number: c.company_number, form: c.local_legal_form_name || c.legal_form,
      status: c.status, city: c.city, postal_code: c.postal_code, address: c.address })),
  })
})

What Denmark does not carry

  • Officers and board members. Not part of the Danish record.
  • Gazette notices. The register-change events are not gazette notices: they show a change to the name, status, legal form or registered address dated when it first appears in the register data, and none is dated before 2026-09-30. Monitoring is available for every live country except France and Chile.
  • A registry-compliance signal. Not served for Denmark.
  • More than the register states. The notices are konkurs and tvangsakkord proceedings from CVR credit information: one notice per proceeding, dated by the decision that opened it, with the latest stage of the proceeding, with no court or case number. They are linked by CVR number, and the register's bankruptcy state is also in the company's status.
  • Share capital. capital_amount stays empty for Denmark, because the record carries no share capital.
  • Sole proprietorships and estates. An enkeltmandsvirksomhed is never served, and neither is an estate, so a lookup of one returns nothing even though the business exists.

Pricing

Denmark is included in every tier at no upcharge. Starter begins with a 14-day trial: 500 credits in total, 10 requests/minute, card required, nothing charged for 14 days. Subscribing keeps the same key working. Then Starter at €9.99/month (1,000 credits, 60 requests/minute), Professional at €29.99/month (10,000 credits, 120 requests/minute) and Scale at €99.99/month (50,000 credits, 300 requests/minute), monthly or annual; annual is ten months' price for twelve. A company record costs 1 credit, an autocomplete keystroke costs 1 credit, and error responses cost nothing, so a product onboarding a few hundred Danish customers a month stays inside Starter.

FAQ

How do I look up a Danish company by CVR number from an API?
Call GET /companies/search?company_number=24256790&country=DK. Spaces and hyphens are optional and the format is validated server-side; a number that is not eight digits is a 400 validation error rather than an empty list.

Can I look up a Danish company by VAT number?
Yes: vat=DK24256790 with country=DK resolves to the same company as the CVR number.

Is the CVR mod-11 check enforced?
No. It is advisory: the API validates the eight-digit format, and a number that fails mod 11 is still looked up. Show it as a warning in your form and not as an error.

Does the Danish record include officers, company events or insolvency notices?
Partly. Denmark is company-level: legal name, legal form, status, registered address, activity code and dates. There are no officers and no registry-compliance signal and no share capital. Register-change events (name, status, legal form and registered address, dated when the change first appears in the register data, none before 2026-09-30) and monitoring are available, and corporate insolvency notices (konkurs and tvangsakkord from CVR credit information: one notice per proceeding, dated by the decision that opened it, with the latest stage of the proceeding, with no court or case number) are linked by CVR number. The register's bankruptcy state is also in the company's status.

Does it cover Danish sole proprietorships?
No. Sole proprietorships (enkeltmandsvirksomhed) and estates are never served, so a lookup of one returns nothing even though the business exists.

Can I call the API from the browser?
You can, but a key in the browser is public. Proxy the search through your server, as in the sample above. Rate limits are per key.

Is there a way to try it before signing up?
Yes: the free CVR lookup runs the same call with a shared key.

Everything about Denmark

Contains data from Det Centrale Virksomhedsregister (CVR), CC BY 4.0. Contains CVR data (Erhvervsstyrelsen), CC BY 4.0