Finland Company Register (PRH YTJ) avatar

Finland Company Register (PRH YTJ)

Pricing

from $2.80 / 1,000 company records

Go to Apify Store
Finland Company Register (PRH YTJ)

Finland Company Register (PRH YTJ)

Look up Finnish companies by Business ID (Y-tunnus) or search by name, city, company form or business line. Official PRH YTJ open data: names and name history, status, form, TOL line, register entries, addresses.

Pricing

from $2.80 / 1,000 company records

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Security

Limited permissions

Share

Finland Company Register (PRH YTJ) looks up Finnish companies in the official YTJ open data register of the Finnish Patent and Registration Office (PRH) and the Finnish Tax Administration. Add Finnish Business IDs (Y-tunnus), or search by company name, town, company form, business line, postcode or registration date. You get one clean row per company: name and full name history, company form, main business line, register entries, addresses, website and a clear status: active, ceased, bankrupt or not found.

It is made for KYB checks, supplier onboarding, CRM cleaning and B2B lists in Finland. No login and no API key are needed. A run with three Business IDs finishes in a few seconds and costs about $0.014.

Finland Company Register: Business IDs in, official YTJ company record with status, company form, main business line, register entries and name history out

Contents

What it does

The Actor reads the public YTJ open data API v3 live on each run. It has two modes:

  • Business ID lookup. Each Business ID is an exact match. The Actor checks the check digit first. A wrong ID gives an invalid_input row, and a valid ID that is not in the register gives a not_found row, so no input is lost. The same ID written twice is looked up once.
  • Search. Filters by company name, town, company form, main business line, postcode and registration dates. The source decides the order of results.

Good fit

  • Check that a Finnish supplier or customer exists and is still active (KYB, onboarding).
  • See all names of a company: current, previous, parallel (Swedish or English) and auxiliary names, with dates.
  • Fill CRM records with the official name, company form, TOL 2008 business line, address and website.
  • Build a list of companies by town, form, business line or registration date.

Not a fit

  • Email addresses and phone numbers. The register does not publish them, and the Actor does not add them.
  • Directors, owners, beneficial owners or financial statements. They are not in this open data.
  • Proof that a VAT number is valid on a date. inVatRegister shows a VAT register entry in YTJ. For a VAT check, use the EU VIES service.
  • Private traders (sole proprietors). The open data covers companies registered or pending in the Trade Register, not private traders.
  • Norwegian, Swedish or other Nordic companies. This Actor covers Finland only.

Quick start

  1. Open the Input tab. The form already has three Business IDs: Nokia Oyj (active), Nokia Networks Oy (ceased) and Primera Holidays Oy (bankrupt).
  2. Click Start.
  3. Open the Companies view in the Output tab. Check name, isActive, tradeRegisterStatus and currentSituations.
  4. Replace the IDs with your own list (up to 100), or clear the list and use the search filters.

Expected result: three complete company rows in a few seconds.

Use cases

Buyer jobInputKey fields
Verify a company (KYB)businessIdsstatus, isActive, tradeRegisterStatus, currentSituations, endDate
Match old invoices or contracts to a companybusinessIds or namenames, previousNames, parallelNames, auxiliaryNames
Clean CRM recordsbusinessIdsname, companyForm, mainBusinessLine, streetAddress, website
Prospect list by town and activitylocation + mainBusinessLinebusinessId, name, registrationDate, postalAddress
New companies in a periodregistrationDateFrom / registrationDateTo + filtersregistrationDate, companyForm, streetAddress

Input

Use either businessIds or search filters in one run. A run with both is rejected with INVALID_INPUT. Several filters in one search are combined (all must match).

FieldTypeDefaultAllowed valuesWhat it does
businessIdsarray of stringsnone (form example: 3 IDs)up to 100Exact lookup. Accepts 0112038-9, 01120389, the old six-digit form 112038-9 and FI VAT numbers like FI01120389.
namestringnone2–200 charactersSearch by company name, for example nokia.
locationstringnoneup to 100 charactersTown or city of the company address, for example Helsinki.
companyFormstring"" (any form)27 YTJ form codes, such as OY, OYJ, KY, AY, OK, ASY, SÄÄCompany form, for example OY (limited company).
mainBusinessLinestringnoneup to 200 charactersTOL 2008 code such as 62010, or text from its description such as software.
postCodestringnone5 digitsFinnish postcode, for example 00100.
registrationDateFromstringnoneYYYY-MM-DDCompanies registered on or after this date.
registrationDateTostringnoneYYYY-MM-DDCompanies registered on or before this date.
maxResultsinteger1001–5000Search mode only. Maximum companies in a search. Each company row is charged.
languagestringenen, fi, svLanguage of labels: company form, statuses, business line, register names and city. A value the source has only in Finnish stays in Finnish.

Recommendation: for KYB, use Business IDs. A search is a list builder, not a verified match.

Input examples

Lookup:

{
"businessIds": ["0112038-9", "0101120-3", "0211270-0"]
}

Software companies in Tampere, labels in Finnish:

{
"location": "Tampere",
"mainBusinessLine": "62010",
"maxResults": 200,
"language": "fi"
}

Public limited companies registered in 2024:

{
"companyForm": "OYJ",
"registrationDateFrom": "2024-01-01",
"registrationDateTo": "2024-12-31"
}

Output

One Dataset row per company or input. Use the Companies view for a flat table. The key-value store has a RUN_SUMMARY record with the run status and counts.

Row status

statusMeaningCharged
completeThe company was found. Fields are as complete as the register allows. A ceased or bankrupt company is complete too: read isActive.company price
not_foundA valid Business ID that is not in the YTJ open data: unknown, a private trader, or too new (the source updates once a day).not-found price
invalid_inputNot a valid Business ID (format or check digit). statusReason says why and shows the expected check digit.no
errorThe source failed or the run stopped before this ID. statusReason starts with a code such as RATE_LIMITED or SOURCE_UNAVAILABLE.no

Company fields

FieldTypeMeaningExample
inputBusinessIdstring or nullYour value as entered; null in search mode"01120389"
status, statusReasonstring, string or nullRow result, see above"complete", null
businessIdstringBusiness ID with the leading zero and hyphen"0112038-9"
namestring or nullCurrent company name"Nokia Oyj"
isActiveboolean or nulltrue when the Business ID is valid, the company has no end date, is not ceased in the Trade Register and is not in bankruptcy or liquidation. A start-up that is not yet in the Trade Register is also truetrue
businessIdStatus, businessIdStatusCodestring or nullStatus of the Business ID"Valid", "2"
tradeRegisterStatus, tradeRegisterStatusCodestring or nullTrade Register status"Registered", "1"
currentSituationsarray of stringsCurrent situation codes: KONK bankruptcy, SELTILA liquidation, SANE restructuring["KONK"]
companyForm, companyFormCode, companyFormAbbreviationstring or nullCurrent company form (or the last known form of an ended company)"Public limited company", "17", "OYJ"
mainBusinessLineCode, mainBusinessLine, mainBusinessLineCodeSetstring or nullMain business line, TOL 2008"70100", "Activities of head offices", "TOIMI4"
websitestring or nullWebsite as registered"www.nokia.com"
registrationDate, endDatestring or nullCompany registration and end dates, YYYY-MM-DD"1896-12-19", null
businessIdRegistrationDatestring or nullDate the Business ID was given"1978-03-15"
euIdstring or nullEUID used in the EU business registers network"FIFPRO.0112038-9"
inTradeRegister, inVatRegister, inEmployerRegister, inPrepaymentRegisterboolean or nullCurrent entry in the register. inVatRegister is a register entry, not a VAT validity checktrue
streetAddress, postalAddressobject or nullstreet, buildingNumber, entrance, apartmentNumber, postOfficeBox, co, postCode, city, cityFi, citySv, municipalityCode, country, freeAddressLine, formatted, registrationDate{"formatted": "Karakaari 7, 02610 ESPOO", "citySv": "ESBO"}
previousNames, parallelNames, auxiliaryNamesarray of stringsName lists by type["Oy Nokia Ab"]
namesarray of objectsEvery name with name, type, typeCode, registrationDate, endDate, currentsee example
companyFormsarray of objectsForm history with dates
situationsarray of objectsBankruptcy, liquidation and restructuring history with dates
registeredEntriesarray of objectsRegister entries with register, status, registrationDate, endDate, authority, current
lastModifiedstring or nullWhen the source last changed this company record"2026-08-19T10:04:06"
ytjUrlstring or nullPublic company page on tietopalvelu.ytj.fi
sourceUrl, provider, licence, fetchedAtstringProvenance: the API request, PRH and the Tax Administration, CC BY 4.0, and our read time

null means the source has no value. It never means zero or false.

Output example

A trimmed row:

{
"inputBusinessId": "0112038-9",
"status": "complete",
"businessId": "0112038-9",
"name": "Nokia Oyj",
"isActive": true,
"tradeRegisterStatus": "Registered",
"companyFormAbbreviation": "OYJ",
"mainBusinessLineCode": "70100",
"mainBusinessLine": "Activities of head offices",
"website": "www.nokia.com",
"registrationDate": "1896-12-19",
"inVatRegister": true,
"currentSituations": [],
"streetAddress": { "formatted": "Karakaari 7, 02610 ESPOO", "postCode": "02610", "city": "ESPOO", "citySv": "ESBO" },
"previousNames": ["Oy Nokia Ab"],
"parallelNames": ["Nokia Abp", "Nokia Corporation"],
"names": [
{ "name": "Oy Nokia Ab", "type": "Company name", "typeCode": "1", "registrationDate": "1966-06-10", "endDate": "1997-08-31", "current": false }
],
"lastModified": "2026-08-19T10:04:06",
"ytjUrl": "https://tietopalvelu.ytj.fi/yritys/0112038-9",
"licence": "CC BY 4.0",
"fetchedAt": "2026-10-12T09:21:05.000Z"
}

Run summary

RUN_SUMMARY.status is one of COMPLETE, PARTIAL, NOT_FOUND (no ID was found), NO_RESULTS (empty search), CAPPED (stopped at your cost limit or at the internal limit of 240 seconds or 700 requests), ERROR, INVALID_INPUT (the run fails; no row is charged) or CANCELLED. counts shows rows by status and charged rows. search.totalResults shows how many companies the source matched. search.resultsCappedByMaxResults: true only means the search had more matches than your maxResults; the run status stays COMPLETE. warnings explains anything unusual.

Pricing

Pay per event. Platform usage is included.

EventPriceWhen
Actor start$0.002Once per run (per GB of memory; the default 256 MB counts once)
Company record$0.004 (lower on higher Apify plans)Each complete company row
Not-found lookup$0.001Each not_found row

invalid_input and error rows are free. An empty search costs only the start.

RunExample cost
3 Business IDs (form example)$0.014
10 Business IDs$0.042
100 Business IDs$0.402
100 unknown Business IDs$0.102
Search, 1,000 companies$4.002
Search, 5,000 companies$20.002

Set a maximum cost per run in the run options to cap your spend. The Actor stops before a paid row that does not fit and reports CAPPED.

Limits

  • Up to 100 Business IDs per run, or up to 5,000 companies per search. A town like Helsinki has about 90,000 companies, so add filters to narrow a search.
  • The Actor sends about one request per second, because the source blocks fast clients for a while. 100 Business IDs take about 100 seconds; a 5,000-company search took about 90 seconds in our test.
  • The source updates once a day. A company registered today can be not_found until the next update.
  • The internal time budget is 240 seconds and 700 requests. When a run reaches it, the run stops with CAPPED and the rows found so far are kept.
  • If the source fails or blocks the run, the Actor stops after two failed requests in a row. The rest of the IDs get free error rows and the run is PARTIAL or ERROR. Run those IDs again later.
  • Search pages can hold fewer than 100 companies. If the source serves fewer unique companies than it reports, RUN_SUMMARY.warnings says so.

API and integrations

Start a run with the same JSON input through the Apify API (POST /v2/acts/cliqtomedia~finland-ytj-company-register/runs), then read the Dataset. Export to CSV, Excel or JSON, or connect the run to other tools with the usual Apify integrations. For CSV, use the Companies view. Join rows on businessId.

There is no built-in monitoring mode. To re-check the same list regularly, create an Apify schedule for a saved task and compare isActive, currentSituations or lastModified between runs.

Use with AI agents (MCP)

AI agents can call this Actor through the Apify MCP server: add https://mcp.apify.com?tools=cliqtomedia/finland-ytj-company-register to your MCP client (Claude, Cursor, VS Code and others). The MCP server needs your Apify account (OAuth sign-in or an Apify API token); the data source itself needs no key. The agent builds the input from the input schema. The smallest useful input:

{ "businessIds": ["0112038-9"] }

Key output fields for an agent: status, name, isActive, tradeRegisterStatus, currentSituations, companyForm, mainBusinessLine, streetAddress.formatted. A call with 10 IDs finishes in about 15 seconds and costs about $0.042. A run with 100 IDs takes about 100 seconds and can outlast the MCP call wait, so the agent may need to poll the run for its result. An agent should verify a company by Business ID, not by a search result.

Troubleshooting

SymptomCheckAction
invalid_input for an IDstatusReasonUsually a typo. The message shows the expected check digit.
not_found for a real companystatusReasonA private trader is not in this open data. A very new company appears after the next daily update.
isActive: false for a registered companycurrentSituations, situationsKONK (bankruptcy) or SELTILA (liquidation) is in progress.
Labels in Finnish with language: "en"the fieldThe source has no English text for that value.
error rows with RATE_LIMITEDRUN_SUMMARY.http.rateLimitedThe source blocked requests for a while. Run the failed IDs again later.
INVALID_INPUTRUN_SUMMARY.messageCommon causes: Business IDs and search filters in one run, no input at all, a name shorter than 2 characters, a bad postcode or date.

FAQ

Do I need an API key or a Finnish account?

No. The source is open and free. You only need your Apify account.

Does a VAT register entry mean the VAT number is valid today?

No. inVatRegister shows that YTJ has a current VAT register entry for the company. To check a VAT number on a date, use the EU VIES service.

Why are there no emails or phone numbers?

PRH open data does not publish them. The Actor gives only what the register publishes.

How fresh is the data?

Each run reads the source live. The source updates once a day. Each row has fetchedAt (our read time) and lastModified (when the source last changed the record).

Can I use the data commercially?

Yes. The data is published under CC BY 4.0, which allows commercial reuse with attribution. See below.

Data source and licence

Data: PRH open data, YTJ API v3, Finnish Patent and Registration Office (PRH) and Finnish Tax Administration, under the Creative Commons Attribution 4.0 licence. When you reuse the data, name the source: "Source: Finnish Patent and Registration Office (PRH) and Finnish Tax Administration, YTJ open data, CC BY 4.0". The Actor changes the format (flat fields, labels by language) but not the values. This Actor is independent and not endorsed by PRH, the Finnish Tax Administration or the YTJ service.

Support

Use the Issues tab of this Actor. Add the run ID, the mode (Business IDs or search) and the statusReason you saw. Do not send API tokens or private data.