# YTJ Scraper: Finland Company Registry (PRH) Search (`mrslm_data/finland-company-registry`) Actor

Search Finland's official YTJ/PRH business register by name, city, industry or registration date: Business ID (Y-tunnus), company form, TOL code, website, VAT.

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

## Pricing

from $1.20 / 1,000 companies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## YTJ Scraper: Finland Company Registry (PRH) Search

**Search Finland's official business register (YTJ) by name, city, industry or registration date: Business ID, company form, TOL code, addresses, website, VAT. $1.50 per 1,000 companies.**

This Actor searches **YTJ, the Finnish Business Information System** run by the Finnish Patent and Registration Office (PRH) and the Tax Administration. It is the official record of every Finnish company: Business ID (Y-tunnus), company form, TOL industry code, addresses, website, and whether the company is in the trade, VAT, employer and prepayment registers. Search by name or Business ID, or filter by city, postcode, industry, company form and registration date. It reads PRH's open-data API, so no login, captcha or browser is involved.

### What the YTJ Scraper does

The Actor sends your criteria to the PRH open-data company API (avoindata.prh.fi), pages through every match, keeps only active companies by default, skips records without a company form (private traders), and maps each company to a flat row with English descriptions. Typical jobs:

1. **New-company feed**: every limited company registered yesterday in Helsinki, or every new software company in Finland this week.
2. **Prospect lists** by city and industry, with websites and register flags.
3. **Verification** of a list of Business IDs: name, form, status, VAT and employer registration in one pass.

### Who it is for

- **B2B sales and marketing teams** selling to Finnish companies.
- **Accountants, banks and payroll providers** who want to reach new companies in their first weeks.
- **Finance, procurement and compliance teams** verifying suppliers' Business IDs and VAT status.
- **Analysts and researchers** tracking start-up formation by city and sector.

### Quick start

1. Press **Start**. The form is already filled with this example input, so the first run returns real rows in under a minute:

```json
{
  "cities": [
    "Helsinki"
  ],
  "industryCodes": [
    "62"
  ],
  "registeredWithinDays": 60,
  "maxResults": 30
}
```

2. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
3. Download the results as JSON, CSV or Excel from the **Output** tab, or schedule the run to repeat.

### Real example: new IT companies in Tampere in the last 180 days

Run on 2 November 2026 with this input:

```json
{
  "cities": [
    "Tampere"
  ],
  "industryCodes": [
    "62"
  ],
  "registeredWithinDays": 180,
  "maxResults": 200
}
```

Result: **54 companies** in 6 seconds, charged 54 company events (about $0.08).

- All 54 are limited companies (OY); 50 are under TOL 62100 (computer programming), the rest under 62200 / 62900.
- 11 list a website, 39 are already VAT-registered and 3 are in the employer register: early signals of which start-ups are already trading.
- Each row links to its official page on tietopalvelu.ytj.fi.

Newest rows:

| Name | Business ID | TOL | Registered |
|---|---|---|---|
| WholeRev Oy | 3665184-1 | 62100 | 2026-10-30 |
| Massatori Oy | 3665271-3 | 62100 | 2026-10-30 |
| Mirleo Oy | 3665511-3 | 62100 | 2026-10-30 |
| Nowari Oy | 3665132-3 | 62100 | 2026-10-29 |
| Versus Entertainment Oy | 3656973-3 | 62100 | 2026-10-27 |
| Jankalites Oy | 3664424-6 | 62100 | 2026-10-27 |

Swap `Tampere` for `Helsinki`, `Espoo`, `Oulu` or `Turku`, or remove `cities` to cover all of Finland.

### Sample row (real run, trimmed)

```json
{
  "businessId": "3664020-2",
  "euId": "FIFPRO.3664020-2",
  "name": "Apex Ventures Oy",
  "parallelNames": [],
  "auxiliaryNames": [],
  "formerNames": [],
  "companyFormCode": "OY",
  "companyForm": "Limited company",
  "businessIdDate": "2026-10-19",
  "registrationDate": "2026-10-26",
  "active": true,
  "tradeRegisterStatusCode": "1",
  "situations": [],
  "vatStatus": [],
  "industryCode": "62200",
  "industry": "Computer consultancy and computer facilities management activities",
  "industryCodeSet": "TOIMI4",
  "website": null,
  "visitingAddress": null,
  "postalAddress": "Linnankuja 2 B 7, 00160 HELSINKI",
  "postCode": "00160",
  "city": "HELSINKI",
  "municipalityCode": "091",
  "registers": [
    "Trade register",
    "Tax Administration"
  ],
  "vatRegistered": false,
  "employerRegistered": false,
  "prepaymentRegistered": false,
  "lastModified": "2026-10-26T23:11:46",
  "registryUrl": "https://tietopalvelu.ytj.fi/yritys/3664020-2"
}
```

Also included: previous and parallel names, company form code, all addresses with municipality code, Business ID date, trade-register status, register entries (Trade Register, VAT, prepayment, employer), EUID and last-modified date.

### Output fields

| Field | What it holds |
|---|---|
| `businessId` | Finnish Business ID (Y-tunnus), format 1234567-8. |
| `euId` | EU-wide identifier (EUID). |
| `name` | Registered name. |
| `parallelNames / auxiliaryNames / formerNames` | Other registered names (Swedish names, trade names, earlier names). |
| `companyFormCode / companyForm` | Form code (OY, OYJ, KY, AY, OSK…) and its name. |
| `businessIdDate` | Date the Business ID was issued. |
| `registrationDate` | Trade register registration date. |
| `active` | False for ceased companies. |
| `tradeRegisterStatusCode` | PRH status code. |
| `situations` | Liquidation, bankruptcy or restructuring, when any. |
| `vatStatus` | VAT register entries. |
| `industryCode / industry` | Main TOL 2008 (NACE) code and its English description. |
| `industryCodeSet` | Which classification version the code uses. |
| `website` | Website, when registered. |
| `visitingAddress / postalAddress / postCode / city / municipalityCode` | Address details. |
| `registers` | Registers the company is in (Trade register, Tax Administration, VAT, Employer register…). |
| `vatRegistered / employerRegistered / prepaymentRegistered` | Quick flags from the registers. |
| `lastModified` | Last change in the register. |
| `registryUrl` | Official YTJ page. |
| `scrapedAt` | When this run read the record. |

### Filters

- `searchTerms`: company names.
- `businessIds`: exact Y-tunnus values (with or without the dash).
- `cities` and `postCodes`: address filters, e.g. `Helsinki`, `Espoo`, `00100`.
- `industryCodes`: TOL 2008 codes or prefixes, e.g. `62` IT services, `62010` software, `70220` business consulting.
- `companyForms`: `OY`, `OYJ`, `KY`, `AY`, `OSK` and others.
- `registeredWithinDays`: only companies registered in the last N days.
- `activeOnly` (on by default): skip ceased companies and those in liquidation, bankruptcy or restructuring.
- `maxResultsPerSearch` and `maxResults`: caps.

Leave everything empty and the Actor runs the example search (Helsinki IT companies registered in the last 60 days, up to 30).

### Export to CSV, Excel, JSON or Google Sheets

Every run saves its rows to an Apify dataset. Open the **Output** tab and pick a format:

- **CSV** or **Excel** for spreadsheets and CRM imports. Nested fields (arrays and objects) are flattened into columns such as `locations/0`.
- **JSON** or **JSONL** to keep the nested structure for code and databases.
- **Google Sheets**: add the Apify "Google Sheets export" integration to the Actor or schedule, and every finished run is appended to a sheet.

You can also copy the dataset link from the **Storage** tab. It is a stable API URL your own scripts can download at any time.

### Use it from Make, Zapier or n8n

The Actor has official Apify modules in all three tools:

- **Make**: add the *Apify → Run an Actor* module, choose `mrslm_data/finland-company-registry`, paste the JSON input, then add *Apify → Get Dataset Items* and map the fields into Google Sheets, HubSpot, Airtable or Slack.
- **Zapier**: use the *Apify* app with the trigger *Finished Actor Run* (set up a schedule in Apify) or the action *Run Actor*, then *Fetch Dataset Items*.
- **n8n**: use the *Apify* node (Run Actor + Get dataset items), or a plain HTTP Request node calling the run-sync endpoint shown below.

### Schedule it

In Apify Console open **Schedules → Create new**, choose this Actor and a cron such as `0 7 * * 1-5` (07:00 every working day). With `registeredWithinDays: 1` each daily run returns only companies registered since the day before. Pair the schedule with an integration (e-mail, Slack, Google Sheets or a webhook) so new rows reach you without opening Apify.

### Call it from the API (Python, JavaScript or curl)

The input below is the same JSON you would paste into the form.

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("mrslm_data/finland-company-registry").call(run_input={
  "cities": [
    "Helsinki"
  ],
  "industryCodes": [
    "62"
  ],
  "registeredWithinDays": 7
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

**JavaScript / Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('mrslm_data/finland-company-registry').call({"cities": ["Helsinki"], "industryCodes": ["62"], "registeredWithinDays": 7});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'companys');
```

**curl** (runs the Actor and returns the rows in one call, for runs under 5 minutes):

```bash
curl -X POST "https://api.apify.com/v2/acts/mrslm_data~finland-company-registry/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>&format=csv" \
  -H "Content-Type: application/json" \
  -d '{"cities": ["Helsinki"], "industryCodes": ["62"], "registeredWithinDays": 7}'
```

### Use it from AI agents and chat assistants (MCP)

Apify's MCP server (`https://mcp.apify.com`) exposes Store Actors as tools for Claude, ChatGPT, Cursor and other MCP clients. Add the server with your Apify token, enable `mrslm_data/finland-company-registry`, and ask in plain language, for example: *"Find software companies registered in Helsinki in the last 7 days and show their Business IDs and websites."* The assistant fills the input, runs the Actor and reads the rows back. You pay the same per-company price as a normal run.

### What it costs

- **Company: $1.50 per 1,000 saved** (Silver $1.35, Gold $1.20)
- Plus $0.00005 per run. You pay only for companies saved after your filters. Searches with no matches are free.

Worked example: the Tampere run below saved 54 companies, about **$0.08**. A daily feed of every newly registered Finnish limited company is typically a few hundred rows a working day, under $1.

### Tips

- **Verify in bulk:** paste hundreds of Business IDs into `businessIds`; each one is a direct lookup.
- **Only trading companies:** after the run, filter on `vatRegistered` or `employerRegistered` to drop dormant shells.
- **Whole country:** leave `cities` empty and use `industryCodes` plus `registeredWithinDays`.

### Limits

- No people: board members and owners are not in the PRH open-data API, and private traders without a company form are skipped.
- No financial statements or employee counts; YTJ does not publish them openly.
- PRH rate-limits its API, so very large country-wide pulls take a few minutes. The Actor paces requests and retries automatically.

### FAQ

**Where does the data come from?** From the official PRH open-data API (avoindata.prh.fi), published under CC BY 4.0.

**Is any personal data included?** Records without a company form (private traders and other natural persons) are skipped, so every row is a company or other legal entity. No people's names are output.

**How fresh is it?** Live. PRH updates the register daily.

**Can I get only new records each day?** Yes. Use the date window input and schedule the Actor; each run returns what is new in that window.

**What is the difference between YTJ and PRH?** YTJ is the joint public service of PRH and the Tax Administration; this Actor reads PRH's open-data interface to the same data.

**Does it include the Swedish name of a company?** Yes, in `parallelNames` when the company registered one.

### Data source, freshness and licence

Source: Finnish Patent and Registration Office open-data API (avoindata.prh.fi, YTJ company data). PRH updates it daily, and every run queries it live. Licence: Creative Commons Attribution 4.0 (CC BY 4.0); credit "Finnish Patent and Registration Office (PRH)" when you republish.

### Is it legal?

This Actor only reads official open-data APIs that the publisher offers to everyone without a login or key. It obeys robots.txt, stays under the published rate limits, and never tries to get past logins, paywalls, captchas or bot checks. Records without a company form (private traders and other natural persons) are skipped, so every row is a company or other legal entity. No people's names are output. You are responsible for how you use the data: follow the source's licence and terms and the privacy and marketing laws that apply to you (GDPR, CAN-SPAM, PECR, etc.). This tool is independent and not affiliated with or endorsed by the data publisher.

# Actor input Schema

## `searchTerms` (type: `array`):

Search by company name. One per line.

## `businessIds` (type: `array`):

Exact Finnish Business IDs (Y-tunnus), format 1234567-8.

## `cities` (type: `array`):

Town or city of the company address, e.g. Helsinki, Espoo, Tampere.

## `postCodes` (type: `array`):

5-digit postcodes.

## `industryCodes` (type: `array`):

TOL codes or prefixes, e.g. 62 (IT services), 62010 (software).

## `companyForms` (type: `array`):

Codes such as OY (limited company), OYJ (public limited), KY, AY, OSK.

## `registeredWithinDays` (type: `integer`):

Only companies registered in the last N days. 0 = any date.

## `activeOnly` (type: `boolean`):

Skip ceased companies and those in liquidation, bankruptcy or restructuring.

## `maxResultsPerSearch` (type: `integer`):

Cap per search term (or per source). 0 = no cap.

## `maxResults` (type: `integer`):

Safety cap on saved companies across the whole run. 0 = no cap. Your max cost per run is always respected.

## Actor input object example

```json
{
  "cities": [
    "Helsinki"
  ],
  "industryCodes": [
    "62"
  ],
  "registeredWithinDays": 60,
  "activeOnly": true,
  "maxResultsPerSearch": 0,
  "maxResults": 30
}
```

# Actor output Schema

## `results` (type: `string`):

All companies as a dataset (JSON, CSV, Excel and more via the API or Console).

## `summary` (type: `string`):

Matches and saved rows per search, failures and the stop reason.

# 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 = {
    "cities": [
        "Helsinki"
    ],
    "industryCodes": [
        "62"
    ],
    "registeredWithinDays": 60,
    "maxResults": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrslm_data/finland-company-registry").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 = {
    "cities": ["Helsinki"],
    "industryCodes": ["62"],
    "registeredWithinDays": 60,
    "maxResults": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("mrslm_data/finland-company-registry").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 '{
  "cities": [
    "Helsinki"
  ],
  "industryCodes": [
    "62"
  ],
  "registeredWithinDays": 60,
  "maxResults": 30
}' |
apify call mrslm_data/finland-company-registry --silent --output-dataset

```

## MCP server setup

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

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/SzsLnGuUfHAsMyreA/builds/tafeQOEYBC3rVirmN/openapi.json
