How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
0112038-9in Business IDs (Y-tunnus). Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
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.
- Business ID lookup. Each Business ID is an exact match. The Actor checks the check digit first. A wrong ID gives an
invalid_inputrow, and a valid ID that is not in the register gives anot_foundrow, 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 for
- 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 good 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.
inVatRegistershows 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.
Who uses it
KYB and onboarding teams
Check that a Finnish supplier exists and is still active.
Finance teams
Match old invoices to a company through its earlier names.
Sales teams
Build lists of companies by town, form or business line.
Price
Prices will be shown after release.
Questions
Do I need an API key for YTJ?
No. The open data is free. You only need an Apify account.
Does it show emails, phones or directors?
No. The open data does not include them.
Can I use the data for business?
Yes. It is under CC BY 4.0, which allows commercial reuse with attribution.
Does it prove a VAT number is valid?
No. Use the EU VIES service for a VAT check on a date.
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).
Details
Step by step on Apify
- Open the Input tab. The form already has three Business IDs: Nokia Oyj (active), Nokia Networks Oy (ceased) and Primera Holidays Oy (bankrupt).
- Click Start.
- Open the Companies view in the Output tab. Check
name,isActive,tradeRegisterStatusandcurrentSituations. - Replace the IDs with your own list (up to 100), or clear the list and use the search filters.
Use cases
| Task | Input | Key fields |
|---|---|---|
| Verify a company (KYB) | businessIds | status, isActive, tradeRegisterStatus, currentSituations, endDate |
| Match old invoices or contracts to a company | businessIds or name | names, previousNames, parallelNames, auxiliaryNames |
| Clean CRM records | businessIds | name, companyForm, mainBusinessLine, streetAddress, website |
| Prospect list by town and activity | location + mainBusinessLine | businessId, name, registrationDate, postalAddress |
| New companies in a period | registrationDateFrom / registrationDateTo + filters | registrationDate, companyForm, streetAddress |
Tips for better results
- You can paste IDs with or without the dash, or as FI VAT numbers.
- Add filters to a search. Helsinki alone has about 90,000 companies.
- New companies can be missing until the next daily update.
Limits and good to know
- 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_founduntil the next update - The internal time budget is 240 seconds and 700 requests. When a run reaches it, the run stops with
CAPPEDand 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
errorrows and the run isPARTIALorERROR. 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.warningssays so
Troubleshooting
| Symptom | Check | Action |
|---|---|---|
invalid_input for an ID | statusReason | Usually a typo. The message shows the expected check digit. |
not_found for a real company | statusReason | A private trader is not in this open data. A very new company appears after the next daily update. |
isActive: false for a registered company | currentSituations, situations | KONK (bankruptcy) or SELTILA (liquidation) is in progress. |
Labels in Finnish with language: "en" | the field | The source has no English text for that value. |
error rows with RATE_LIMITED | RUN_SUMMARY.http.rateLimited | The source blocked requests for a while. Run the failed IDs again later. |
INVALID_INPUT | RUN_SUMMARY.message | Common causes: Business IDs and search filters in one run, no input at all, a name shorter than 2 characters, a bad postcode or date. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
inputBusinessId | string | Your input value as given (lookup mode); null for search rows. |
status | string | Row result: complete (company found), not_found (valid Business ID not in YTJ open data), invalid_input (not a valid Business ID, not charged) or error (source problem, not charged). |
statusReason | string | Plain-English reason for not_found, invalid_input and error rows; null when complete. |
businessId | string | Finnish Business ID (Y-tunnus) as text with the leading zero, e.g. 0112038-9. |
name | string | Current official company name. |
isActive | boolean | true = valid Business ID, not dissolved, not removed or ceased on the Trade Register and not in bankruptcy or liquidation. null when unknown. |
businessIdStatus | string | Business ID status label, e.g. Valid, Pending, Invalidated. |
businessIdStatusCode | string | Business ID status code from the source (1 pending, 2 valid, 5 invalidated). |
tradeRegisterStatus | string | Trade Register status label, e.g. Registered, Ceased, Removed, Start-up not registered. |
tradeRegisterStatusCode | string | Trade Register status code from the source. |
companyForm | string | Current company form, e.g. Limited company; for a dissolved company the last known form. |
companyFormCode | string | Numeric company form code from the source. |
companyFormAbbreviation | string | Company form abbreviation, e.g. OY, OYJ, KY, AY, TMI. |
mainBusinessLineCode | string | Main business line code (TOL 2008), e.g. 70100. |
mainBusinessLine | string | Main business line description in the chosen language. |
mainBusinessLineCodeSet | string | Code set of the main business line (TOIMI…). |
website | string | Website as registered (not verified). |
registrationDate | string | Company registration date, YYYY-MM-DD. |
endDate | string | Company end (dissolution) date, YYYY-MM-DD; null when not ended. |
businessIdRegistrationDate | string | Date the Business ID was granted, YYYY-MM-DD. |
euId | string | EUID (European unique identifier) when published. |
inTradeRegister | boolean | Currently registered in the Trade Register. |
inVatRegister | boolean | Currently has a VAT register entry. This is the YTJ register entry, not a VIES check of VAT validity on a given date. |
inEmployerRegister | boolean | Currently in the employer register. |
inPrepaymentRegister | boolean | Currently in the prepayment (tax) register. |
currentSituations | array | Current special situations: KONK (bankrupt), SELTILA (liquidation), SANE (restructuring). |
streetAddress | object | Visiting (street) address; city in the chosen language with Finnish and Swedish variants. |
postalAddress | object | Postal address; city in the chosen language with Finnish and Swedish variants. |
previousNames | array | Earlier official names. |
parallelNames | array | Current parallel names (other language versions of the official name). |
auxiliaryNames | array | Current auxiliary (trade) names. |
names | array | All names with type, registration and end dates (current and historical). |
companyForms | array | Company form history with dates. |
situations | array | Bankruptcy, liquidation and restructuring entries with dates. |
registeredEntries | array | Register entries (Trade Register, VAT, employer, prepayment, foundations, associations…) with status and dates. |
lastModified | string | Last change of this company in the source (Finnish local time, as published). |
ytjUrl | string | Public company page in the YTJ information service. |
sourceUrl | string | Exact API request that produced this row. |
provider | string | Data provider. |
licence | string | Data licence (CC BY 4.0). |
Input settings (10)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Business IDs (Y-tunnus) | businessIds | array | ["0112038-9", "0101120-3", "0211270-0"] |
| Company name | name | string | |
| Town or city | location | string | |
| Company form | companyForm | string | "" |
| Main business line | mainBusinessLine | string | |
| Postcode | postCode | string | |
| Registered from | registrationDateFrom | string | |
| Registered to | registrationDateTo | string | |
| Max companies (search) | maxResults | integer | 100 |
| Label language | language | string | "en" |
Use cases with this tool
Each guide shows all the steps and the other tools.
