Guide · Finland · Lookup and validation

Finland company data API: look up and validate a Y-tunnus

A customer types a Y-tunnus, a Finnish VAT number or the first letters of a name; your form fills in the legal name, legal form, status and registered address from the Finnish Trade Register. One key, and the same response shape as every other country the API covers.

Finland at a glance

Register: Finnish Trade Register (PRH)

Identifiers Y-tunnus

  • Company recordsYes
  • OfficersNo
  • Insolvency noticesYes
  • Corporate eventsRegister changes
  • MonitoringYes
  • Financial statementsDigital filings, tax data
  • VAT numberFrom the register, if VAT-registered
  • 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 languagesSuomi

Sign up

Try Finland live

Look up a company in Finland 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.

Is there an official Finnish company registry API?

As at 5 Nov 2026, yes: the Finnish Patent and Registration Office (PRH) lists three open data APIs on its open data page: YTJ basic company information, registered trade register notifications since 7 November 2014, and digital financial statement data for statements filed in the iXBRL format; it asks users to credit the source. One API across the live countries adds a company record in the same response shape as every other country, with insolvency notices linked by business ID, register-change events and monitoring. Scope limits for Finland: company records only (no officers or board members, no beneficial owners), and sole traders are not part of the records.

What you get, and what you do not

Company records from the Finnish Trade Register: legal name, legal form, status, registered address, activity code and dates; with register-change events and monitoring, but no officers and no registry-compliance signal. Corporate insolvency notices are linked by business ID.

That is the record of a Finnish company as an onboarding form, an invoice or a CRM row needs it. If you need board members, financial statements of companies that are not listed, or a change history for Finland, this is not the API for it. If you want to know what the register itself is, start with What is the Finnish Trade Register? (also in Finnish).

What the Finnish record gives your product

  • Exact match on the Y-tunnus. company_number=0112038-9 with country=FI. The hyphen is optional, an older six-digit body regains its leading zero, and the check digit is verified server-side: a number that fails it is a 400 validation error, so a typo never looks like a missing company.
  • The VAT number as an alias. vat=FI01120389 reaches the same company. The Finnish VAT number is FI plus the eight digits of the Y-tunnus without the hyphen.
  • 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. Legal name, legal form, status, registered address, postal code and city, the activity code with its description, and the registration date.
  • 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. Fields the Finnish register does not publish, such as share capital or employee counts, come back empty.
  • The linked insolvency notices. GET /companies/{id}?include=insolvency on a Finnish company returns the corporate notices filed under that business ID. Corporate only.
FieldWhat it holds for Finland
company_numberThe Y-tunnus, written with the hyphen: 0112038-9.
company_nameThe registered name.
legal_form, local_legal_form, local_legal_form_nameThe standard abbreviation in legal_form (null when the form is not mapped), the register’s form code, such as OY, OYJ, KY, AOY, in local_legal_form and the full Finnish name in local_legal_form_name.
local_status, status, stageThe register’s status in local_status, including the bankruptcy, liquidation and restructuring situations it flags. status carries the standard reading and stage the lifecycle stage, null where the value is not recognised.
address, postal_code, cityThe street address (or a P.O. box) where the register holds a usable one, the five-digit postal code and the post office in capitals.
activity_codeFive digits in the register’s TOL 2025 classification, based on NACE Rev. 2.1, with activity_description as the register words it.
founding_dateThe date of registration in the Trade Register. It is a registration date, not a founding date: for old companies it can be far later than the company’s start.

Validate before you call

The check digit is a modulus-11 sum over the seven digits before the hyphen with the weights 7, 9, 10, 5, 8, 4 and 2. A remainder of 1 has no check digit, so such a number is never issued. That makes a Y-tunnus one of the identifiers you can reject offline, in your own code, before it costs a call. The identifier validator runs the same arithmetic in the browser; this is the version to paste into a form handler:

// Y-tunnus: seven digits, a hyphen and a mod-11 check digit
const WEIGHTS = [7, 9, 10, 5, 8, 4, 2]

export function checkYtunnus(input) {
  const digits = String(input).replace(/[\s-]/g, '')
  if (!/^\d{7,8}$/.test(digits)) return null
  const full = digits.length === 7 ? '0' + digits : digits   // an older six-digit body regains its zero
  const sum = [...full.slice(0, 7)].reduce((a, d, i) => a + Number(d) * WEIGHTS[i], 0)
  const r = sum % 11
  if (r === 1) return null                                     // no check digit exists: never issued
  const check = r === 0 ? 0 : 11 - r
  return check === Number(full[7]) ? `${full.slice(0, 7)}-${full[7]}` : null
}

checkYtunnus('0112038-9')   // '0112038-9'  (Nokia Oyj)
checkYtunnus('01120389')    // '0112038-9'
checkYtunnus('0112038-8')   // null: the check digit should be 9

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

Three calls

# 1. By Y-tunnus
curl -H "Authorization: Bearer rk_live_..." \
  "https://api.prometiam.com/functions/v1/risk-api/companies/search?company_number=0112038-9&country=FI"

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

# 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=nokia&country=FI&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":"FI","company_number":"0112038-9"},{"country":"FI","vat":"FI01120389"},{"country":"FI","name":"Nokia"}]}'

The search returns the record’s id; pass it to GET /companies/{id} for the detail, and add ?include=insolvency for the linked notices.

An autocomplete endpoint in Node

Your server keeps the key and proxies the search; the form calls your server. A well-formed Y-tunnus goes to the exact filter, anything else is a name, and a malformed number is rejected before it costs a call:

// server: /api/fi-company?q=...   (keep the key out of the browser)
app.get('/api/fi-company', async (req, res) => {
  const q = String(req.query.q || '').trim()
  const looksLikeId = /^[\d\s-]+$/.test(q)
  const ytunnus = looksLikeId ? checkYtunnus(q) : null
  if (looksLikeId && !ytunnus) return res.status(422).json({ error: 'That is not a valid Y-tunnus' })

  const params = new URLSearchParams({ country: 'FI', limit: '6', ...(ytunnus ? { company_number: ytunnus } : { 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(data.map(c => ({ id: c.id, name: c.company_name, ytunnus: c.company_number, form: c.legal_form,
    status: c.status, city: c.city, postal_code: c.postal_code, address: c.address })))
})

What Finland does not carry

  • Officers and board members. The register holds key persons; the Finnish record here does not include them.
  • 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.
  • Financial statements. From the Scale plan: statements filed digitally with PRH, the Finnish Patent and Registration Office (XBRL, the company accounts; about one filer in twenty, registered since July 2023; no employee count; profit before tax is before appropriations), and the ESEF annual financial reports of listed groups (IFRS, mostly consolidated; not every report is held). Other Finnish companies have none. Every Finnish company also has tax records from tax year 2020 (Finnish Tax Administration, CC BY 4.0; 0 means none, not unknown). Contains data from the Finnish Patent and Registration Office (PRH), CC BY 4.0.
  • Beneficial owners. Not served for Finland.
  • Sole traders. Not part of the Finnish company records, so a lookup of one returns nothing even though the business exists.

Pricing

Finland 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 Finnish customers a month stays inside Starter.

FAQ

How do I look up a Finnish company by Y-tunnus from an API?
Call GET /companies/search?company_number=0112038-9&country=FI. The hyphen is optional, and a number whose check digit does not match is a 400 validation error rather than an empty list.

Can I look up a Finnish company by its VAT number?
Yes: vat=FI01120389 with country=FI resolves to the same company as the Y-tunnus.

Does the Finnish record include officers or company events?
Partly. Finland is company-level: legal name, legal form, status, registered address, activity code and dates. There are no officers and no registry-compliance signal. 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 are linked by business ID.

Does it cover Finnish sole traders?
No. They are not part of the Finnish company records, 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 Y-tunnus lookup runs the same call with a shared key, and a Finnish-language Y-tunnus search is there for Finnish-speaking users.

Everything about Finland