# Finland Company Check — PRH/YTJ Register & Financials (`us0r/finland-company-check`) Actor

Check Finnish companies by Business ID (Y-tunnus), VAT number or name against the official PRH/YTJ registers. One row per company: bankruptcy, restructuring and liquidation status, deregistration warnings, tax registers, latest digital financial statements. No proxy, no scraping.

- **URL**: https://apify.com/us0r/finland-company-check.md
- **Developed by:** [us0r](https://apify.com/us0r) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 company checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Finland Company Check — PRH/YTJ Register & Financials

Give this Actor a list of Finnish companies — by **Business ID (Y-tunnus),
VAT number (`FI…`) or name** — and it returns **one row per entry**, including
the ones that were not found. Every row is built from the official open APIs
of the **Finnish Patent and Registration Office (PRH)**:

- the **Business Information System (YTJ)**: name, legal form, address,
  industry (TOL), status — **bankruptcy, restructuring, liquidation, ceased** —
  and the **tax registers**: prepayment register (*ennakkoperintärekisteri*),
  VAT register and employer register, each with its date;
- the **Trade Register notices**: a registered **loss of share capital**,
  filed financial statements, debt adjustment — plus the latest ten notices
  of the company;
- the **digital financial statements** (XBRL): revenue or gross profit,
  operating profit, net result, equity, liabilities, total assets and cash,
  for the latest year and the year before.

No scraping, no proxy, no browser.

Built for supplier and customer onboarding (KYB), credit and collections
teams who need to know whether a counterparty is still trading, subcontractor
checks under the Finnish Contractor's Obligations Act, and periodic re-checks
of a customer or supplier book.

### What you get per entry

| Field | Example (Oy Wiwaco Ab) |
|---|---|
| `query`, `queryType` | `0432783-6`, `businessId` |
| `found`, `status` | `true`, `active` · `bankruptcy` · `restructuring` · `in_liquidation` · `deleted` · `business_id_invalidated` · `not_found` |
| `riskFlags`, `riskDetails` | `["negative_equity"]`, with dates and the notice behind each flag |
| `businessId`, `vatNumber`, `euid`, `name` | `0432783-6`, `null` (not VAT-registered), `FIFPRO.0432783-6`, `Oy Wiwaco Ab` |
| `parallelNames`, `auxiliaryNames`, `formerNames` | as registered |
| `legalForm` | `{"code": "OY", "description": "Limited company"}` |
| `address`, `postalAddress` | street, postal code, city, one-line form |
| `website`, `industry` | TOL 2025 code and description |
| `register` | trade, foundation or association register: `registered` · `ceased` · `removed`, with date |
| `prepaymentRegister`, `vatRegister`, `employerRegister` | `registered`, `since`, `removedOn` |
| `lastAccountsFiledOn`, `annualAccountsOverdue` | date of the last registered financial statements; heuristic flag (see Limits) |
| `latestNotices`, `noticesTotal` | the latest ten register notices with date, record number and entries |
| `financials`, `financialHistory`, `groupFinancials` | key figures in EUR, latest year and the year before |
| `digitalAccountsYears` | years with digitally filed financial statements |
| `nameMatch`, `matchedName`, `matchedNameType`, `matchRank` | for name queries: `exact` · `exact_without_legal_form` · `all_words`; which name matched |
| `note`, `warnings`, `checkedAt`, `error` | plain-language explanations; error text for rows that could not be checked |

#### Status and risk flags

| Flag | Meaning |
|---|---|
| `bankruptcy` | bankruptcy (*konkurssi*) registered (`since`) |
| `restructuring` | corporate restructuring (*yrityssaneeraus*) registered (`since`) |
| `in_liquidation` | liquidation (*selvitystila*) registered (`since`) |
| `deleted` | ceased or removed from the trade, foundation or association register (`on`) |
| `business_id_invalidated` | the Business ID itself has been invalidated |
| `share_capital_lost` | the board registered that equity fell below half of the share capital (Limited Liability Companies Act 20:23) — notice within the last 36 months |
| `annual_accounts_overdue` | a limited company with no financial statements registered for 21 months (see Limits) |
| `removed_from_prepayment_register` | an active company taken off the prepayment register within the last 36 months |
| `debt_adjustment` | debt adjustment proceedings for a private trader |
| `negative_equity` | equity below zero in the latest digital financial statements |
| `registered_last_12_months` | Business ID issued less than a year ago |

`status` is the most serious of these, in the order invalidated → deleted →
bankruptcy → restructuring → liquidation → active.

### Input

```json
{
  "companies": [
    "0112038-9",
    "FI19274001",
    "Supercell Oy",
    "0432783-6"
  ],
  "maxMatchesPerName": 1,
  "includeNotices": true,
  "includeFinancials": true
}
```

| Option | Default | Meaning |
|---|---|---|
| `companies` | — | Business IDs, VAT numbers or names; also `{"businessId": …}` or `{"name": …}` |
| `maxMatchesPerName` | `1` | Rows per name query, best match first (1–10) |
| `includeNotices` | `true` | Register notices and the flags derived from them |
| `includeFinancials` | `true` | Key figures from digital financial statements |
| `includeRawRecord` | `false` | The untouched PRH record under `raw`, with Finnish code values |
| `requestIntervalSeconds` | `1.0` | Spacing between requests (minimum 0.5) |

`0112038-9`, `01120389`, `112038-9` and `FI01120389` all work. **Check digits
are validated before querying** — a mistyped Business ID comes back as a row
with `error`, not as a false "not found". Finnish personal identity codes are
recognised and never searched. Duplicates in your list are checked once.

**Name queries are matched strictly.** The register's own name search also
returns similar names. This Actor only accepts a company with a registered
name — current, parallel, auxiliary or former — that contains every word of
your query, ranks exact matches and active companies first, and says how and
on which name it matched. If nothing qualifies, the row is `not_found` and
`note` lists the closest names the register suggested.

### Speed

PRH temporarily blocks clients that query its open APIs too fast. This Actor
spaces its requests (one per second by default, shared across all threads)
and pauses on its own if PRH signals a limit, so a run waits out a block
instead of failing.

Measured 12 October 2026: **268 entries in about 10 minutes** (617 requests,
no limit hit), with notices and financial statements. A company takes one
request, plus one or two for limited companies when financial statements are
looked up — plan roughly 40 minutes for 1,000 companies.

### Limits, honestly

- **Digital financial statements only.** PRH publishes figures only from
  statements that were filed in XBRL form — 11,765 companies for financial
  years ending 31 December 2025 (as of 12 October 2026); in a test list of
  220 companies in bankruptcy, restructuring or liquidation, about one in ten
  had them. For every other
  company `financials` stays empty; `lastAccountsFiledOn` still shows when
  statements were registered. Listed groups reporting under IFRS are not in
  this service.
- **No people.** PRH's open data contains no board members, managing
  directors or owners.
- **The tax registers show registration, not tax compliance.** The
  Contractor's Obligations Act also asks for a tax debt certificate and
  pension insurance details, which are not open data.
- **`annual_accounts_overdue` is a heuristic**: an Oy or Oyj registered more
  than 30 months ago without financial statements registered in the last 21
  months (the deadline is eight months after the end of the financial year).
  It is `null` where it does not apply.
- **This is not a credit report.** It states what the official registers say
  on the day you ask.

### Pricing

Pay per event:

| Event | What it covers |
|---|---|
| `actor-start` | once per run |
| `company-check` | one company row — including "not found" |

**Rows with an `error` are free**: a wrong check digit or a source that did not
answer is never billed. Notices and financial statements are included in the
company price. A spending limit you set on the run is respected — the run
stops cleanly when it is reached.

### Suomeksi

**Tarkista suomalaiset yritykset PRH:n ja YTJ:n avoimesta datasta.** Liitä
lista Y-tunnuksia, ALV-numeroita tai toiminimiä. Actor tarkistaa Y-tunnuksen
tarkistusmerkin ja palauttaa yhden rivin jokaista hakua kohden, myös silloin
kun yritystä ei löydy:

- **tila** — toiminnassa, konkurssi, yrityssaneeraus, selvitystila, lopettanut
  tai poistettu rekisteristä;
- **varoitusmerkinnät** kaupparekisteri-ilmoituksista: osakepääoman
  menetys, velkajärjestely ja viimeisin rekisteröity tilinpäätös;
- **verohallinnon rekisterit** — ennakkoperintärekisteri, arvonlisäverovelvollisten
  rekisteri ja työnantajarekisteri päivämäärineen;
- **tilinpäätöstiedot** digitaalisesti ilmoitetuista tilinpäätöksistä:
  liikevaihto tai bruttotulos, liikevoitto, tilikauden tulos, oma pääoma,
  vieras pääoma ja taseen loppusumma kahdelta tilikaudelta.

Tiedot haetaan vain PRH:n avoimista rajapinnoista — ilman välityspalvelinta ja
ilman sivujen kaapimista. Rivit, joiden Y-tunnus on virheellinen, ovat
maksuttomia.

### Source and licence

Source: Finnish Patent and Registration Office (PRH), open data — YTJ, register
notices and financial statements — licensed under Creative Commons Attribution
4.0 (CC BY 4.0). / Lähde: Patentti- ja rekisterihallitus (PRH), avoin data,
CC BY 4.0.

### Related Actors

- **[Norway Company Check](https://apify.com/us0r/norway-company-check)** — the
  same list check for Norwegian companies: Brønnøysund registers, roles and
  annual accounts.
- **[Poland Company Check](https://apify.com/us0r/poland-company-check)** — the
  same list check for Polish companies: KRS court register and VAT white list,
  with bank account verification.
- **[UK Company Check](https://apify.com/us0r/uk-company-check)** — the
  same list check for UK companies: Companies House status, strike-off notices,
  insolvency cases, charges, directors, PSCs and balance sheet figures.
- **[German Insolvency & Bankruptcy Check](https://apify.com/us0r/insolvenz-check-de)**
  — a list of names against the official German insolvency register, one row
  per name, found or not.

***

Keywords: PRH, YTJ, Y-tunnus, business ID Finland, Finnish VAT number, ALV,
Patentti- ja rekisterihallitus, kaupparekisteri, Finnish trade register,
Finland company check, Finnish company register, Finland business registry,
Finland company search, Finland KYB, KYC Finland, due diligence Finland,
supplier verification Finland, counterparty check, konkurssi, yrityssaneeraus,
selvitystila, osakepääoman menetys, ennakkoperintärekisteri,
tilaajavastuu, tilaajavastuulaki, työnantajarekisteri, arvonlisäverorekisteri,
tilinpäätös, tilinpäätöstiedot, liikevaihto, oma pääoma, XBRL, Finnish
bankruptcy check, Finnish company financials, company verification API.

# Actor input Schema

## `companies` (type: `array`):

One entry per company: a Finnish Business ID ("0112038-9", also without hyphen), a Finnish VAT number ("FI01120389") or a company name ("Supercell Oy"). Business IDs are validated by check digit before querying. Names are matched only if every word of your name appears in a registered name (company, parallel, auxiliary or former name).

## `maxMatchesPerName` (type: `integer`):

For entries given as a name: how many matching companies to return, best match first. Exact matches and active companies rank first. Every returned company is one row. Business IDs always return exactly one row.

## `includeNotices` (type: `boolean`):

Reads the company's register notices (Kaupparekisteri-ilmoitukset): registered loss of share capital, filed financial statements, debt adjustment — and lists the latest ten notices.

## `includeFinancials` (type: `boolean`):

For limited companies and co-operatives that filed their financial statements digitally: revenue or gross profit, operating profit, net result, equity, liabilities, total assets and cash — latest year and the year before.

## `includeRawRecord` (type: `boolean`):

Adds the untouched JSON record from PRH under 'raw' — every field, with Finnish code values.

## `requestIntervalSeconds` (type: `number`):

PRH blocks clients that query too fast. The default keeps well within the limit measured on the open APIs; values below 0.5 are raised to 0.5.

## Actor input object example

```json
{
  "companies": [
    "0112038-9",
    "FI19274001",
    "Supercell Oy"
  ],
  "maxMatchesPerName": 1,
  "includeNotices": true,
  "includeFinancials": true,
  "includeRawRecord": false,
  "requestIntervalSeconds": 1
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per entry checked, including the ones not found or rejected for a wrong check digit.

## `risk` (type: `string`):

Status, risk flags with dates, last filed financial statements and equity.

## `registers` (type: `string`):

Prepayment, VAT and employer register status — the registers checked under the Contractor's Obligations Act.

## `financials` (type: `string`):

Key figures of the latest digital financial statements.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "0112038-9",
        "FI19274001",
        "Supercell Oy"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("us0r/finland-company-check").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "0112038-9",
        "FI19274001",
        "Supercell Oy",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("us0r/finland-company-check").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "0112038-9",
    "FI19274001",
    "Supercell Oy"
  ]
}' |
apify call us0r/finland-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,us0r/finland-company-check"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BXrcrYjxakzrIqX8s/builds/zZF83oKigUY8nJBbW/openapi.json
