# YTJ Finnish Business Register Scraper — Company Data from PRH (`studio-amba/ytj-scraper`) Actor

Look up Finnish company data from YTJ, Finland's official Business Information System run by PRH. Search by company name or Business ID (Y-tunnus) and get company form, status, industry code, registered address, and registration dates. Reads PRH's own open data API — no API key, no login.

- **URL**: https://apify.com/studio-amba/ytj-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (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 result scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## YTJ Finnish Business Register Scraper — Company Data from PRH

Look up Finnish company data from [YTJ](https://www.ytj.fi) (Yritys- ja yhteisötietojärjestelmä),
the **official Business Information System** run jointly by PRH (the Finnish Patent and
Registration Office) and the Finnish Tax Administration. **Search by company name or Business ID
(Y-tunnus)** and get the company form, registration status, industry classification, registered
address, and registration dates — the same data YTJ's own public search shows, structured for bulk
export. This actor reads PRH's own open data API directly (no HTML scraping), so results are fast,
clean, and never blocked. Run it on demand via the Apify Console or API, schedule it to refresh a
watchlist, or chain it into a larger data pipeline.

### Why use YTJ Finnish Business Register Scraper?

- **Verify a Finnish counterparty before signing a contract** — confirm a company's registered
  name, Business ID, legal form, and trade-register status in seconds.
- **Build B2B prospecting lists** for Finland, filtered by industry (TOL 2008 code) or town.
- **Monitor company status changes** — track when a company is registered, ceases trading, or is
  removed from the trade register.
- **Complement other national company registers** — pair with Studio AMBA's Austrian (WKO),
  Spanish (Empresia), Polish (KRS), and North Data actors for wider European KYB coverage.

### How to scrape YTJ.fi data

This actor does not scrape HTML pages. It queries **avoindata.prh.fi**, the free, public JSON API
that backs YTJ's own search — the same source of truth ytj.fi itself reads from, published as open
data by PRH. That means no anti-bot defenses to work around and no proxy required, just a direct,
reliable lookup.

#### Search by company name

Enter a company name or keyword (e.g. `Nokia`, `Kone`, `Fazer`) in **Company Name or Business ID**.
YTJ matches current names, previous names, parallel names, and auxiliary trade names.

#### Look up an exact Business ID (Y-tunnus)

Enter a Finnish Business ID in the standard `NNNNNNN-N` format (e.g. `1927400-1`) and the actor
automatically detects it and performs an exact Business ID lookup instead of a name search.

#### Narrow a name search

Optionally set **Location Filter** to a town or city (e.g. `Helsinki`) and/or **Company Form
Filter** to a PRH company-form code (e.g. `OY`, `OYJ`, `TMI`) to narrow a name search. Both are
ignored for an exact Business ID lookup, which is already a unique match.

#### Result limit

**Max Results** caps how many company records the actor returns per run (default 25, maximum 100).

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|--------------|
| **Company Name or Business ID** | String | `Nokia` | Company name, or an exact Business ID (Y-tunnus) in `NNNNNNN-N` format |
| **Location Filter** | String | — | Restrict a name search to one Finnish town or city |
| **Company Form Filter** | String | — | Restrict a name search to one PRH company-form code |
| **Max Results** | Integer | `25` | Maximum companies to return (1–100) |
| **Proxy Configuration** | Object | Off | Not required — the source is a plain, unauthenticated government API |

### What data does YTJ Finnish Business Register Scraper extract?

| Field | Type | Description |
|-------|------|--------------|
| **companyName** | String | Current registered company name |
| **auxiliaryNames** | Array | Active auxiliary/business names (aputoiminimi), if any |
| **businessId** | String | Business ID / Y-tunnus (e.g. `1927400-1`) |
| **businessIdRegistrationDate** | String | Date the Business ID was granted |
| **companyForm** | String | Legal form in English (e.g. "Limited company") |
| **companyFormCode** | String | PRH internal company-form code |
| **status** | String | Business ID status: "Valid", "Pending", or "Business ID invalidated" |
| **tradeRegisterStatus** | String | Trade register status: "Registered", "Ceased", "Removed from register", "Start-up not registered", or "Unregistered" |
| **industry** | String | Main line of business, English description (TOL 2008 classification) |
| **industryCode** | String | TOL 2008 industry classification code |
| **address** | String | Full formatted registered address |
| **street** | String | Street and building number |
| **postalCode** | String | Postal code |
| **city** | String | Town / municipality |
| **country** | String | Always "Finland" |
| **registrationDate** | String | Trade register registration date |
| **endDate** | String | null | Date the registration ended, if the company has ceased |
| **lastModified** | String | When PRH last updated this record |
| **url** | String | Link to the source record on PRH's open data API |
| **scrapedAt** | String | ISO timestamp of extraction |

**Note on coverage:** not every registered entity has every field. Associations, foundations, and
some sole traders may lack a `mainBusinessLine` or `companyForms` entry — this matches what YTJ
itself publishes for that entity type, not a scraper limitation.

### Example output

```json
{
    "companyName": "KONE Oyj",
    "auxiliaryNames": [],
    "businessId": "1927400-1",
    "businessIdRegistrationDate": "2005-06-01",
    "companyForm": "Public limited company",
    "companyFormCode": "17",
    "status": "Valid",
    "tradeRegisterStatus": "Registered",
    "industry": "Manufacture of lifting and handling equipment",
    "industryCode": "28220",
    "address": "Kartanontie 1, 00330, Helsinki",
    "street": "Kartanontie 1",
    "postalCode": "00330",
    "city": "Helsinki",
    "country": "Finland",
    "registrationDate": "2005-06-01",
    "endDate": null,
    "lastModified": "2026-08-19T11:38:17",
    "url": "https://avoindata.prh.fi/opendata-ytj-api/v3/companies?businessId=1927400-1",
    "scrapedAt": "2026-08-22T10:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### How much does it cost to scrape YTJ.fi data?

Pricing is pay per result. Each run makes one lightweight JSON request per page of results (typically
15–55 companies per page) against PRH's open data API — no HTML parsing, no browser rendering, no
proxy traffic. A run returning 25 companies typically makes a single API request, keeping compute
cost per run very low.

Your run's usage cost only settles once the run reports **SUCCEEDED** — reading the dataset while a
run is still in progress will undercount what you'll actually be billed. A run that fails or is
aborted mid-way is billed only for the resources it actually used up to that point.

### Tips / Advanced options

- For an exact match on a known company, search by Business ID (Y-tunnus) rather than name — it
  skips ambiguity entirely and returns a single record.
- Combine **Location Filter** with a broad industry keyword to build a regional sector map (e.g.
  all bakeries in Tampere).
- Because this actor reads an open government API rather than scraping HTML, it stays reliable even
  if YTJ redesigns its public website — the underlying data source doesn't change.

### Limitations

- The API's `location` and `companyForm` filters only apply to name searches, not Business ID
  lookups (a Business ID is already a unique match, so filtering it further isn't meaningful).
- Contact details (phone/email/website) are not part of PRH's open company data and are not
  returned by this actor — YTJ's open data covers registration facts, not marketing contact info.

### FAQ

**Is this actor affiliated with PRH or the Finnish government?** No. It is an independent tool that
reads PRH's own published open data API (avoindata.prh.fi), which is free and published for public
and commercial reuse.

**Does this actor need a proxy or API key?** No. The PRH open data API for basic company lookups is
free, unauthenticated, and has no anti-bot protection — this actor calls it directly.

Found an issue or need a custom field? Use the Issues tab on this actor's Apify Store page — Studio
AMBA also builds custom scrapers on request.

### Related scrapers

- **[WKO Scraper](https://apify.com/studio-amba/wko-scraper)** — Austrian business directory data.
- **[Empresia.es Scraper](https://apify.com/studio-amba/empresia-es-scraper)** — Spanish company register data.
- **[KRZ Scraper](https://apify.com/studio-amba/krz-scraper)** — Polish court/business register data.
- **[North Data Scraper](https://apify.com/studio-amba/northdata-scraper)** — European company data (Germany + 15 more countries).
- **[Handelsregister Scraper](https://apify.com/studio-amba/handelsregister-scraper)** — German commercial register data.

### Data source and legality

This actor reads PRH's own official open data API, published specifically for public and commercial
reuse under Finland's open data policy. It does not access any login-protected or paid area of YTJ.
Use the data in line with PRH's open data terms and applicable data-protection rules (in particular,
take care with personal data of natural persons / sole proprietors returned in some results).

# Actor input Schema

## `searchQuery` (type: `string`):

Search by Finnish company name (e.g. 'Nokia') or by exact Business ID / Y-tunnus (e.g. '1927400-1'). A value matching the Y-tunnus format (7 digits, hyphen, checksum digit) is looked up as an exact Business ID match; anything else is searched as a name.

## `location` (type: `string`):

Optional. Restrict a name search to companies registered in this Finnish town or city (e.g. 'Helsinki', 'Tampere'). Ignored when searchQuery is a Business ID.

## `companyForm` (type: `string`):

Optional. Restrict a name search to one PRH company-form code, e.g. 'OY' (limited company), 'OYJ' (public limited company), 'TMI' (sole trader), 'AY' (general partnership). Ignored when searchQuery is a Business ID.

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

Maximum number of companies to return.

## `proxyConfiguration` (type: `object`):

This actor reads PRH's own open data JSON API, a plain government endpoint with no anti-bot protection — no paid proxy group is required. Defaults to Apify's free automatic proxy pool.

## Actor input object example

```json
{
  "searchQuery": "Nokia",
  "maxResults": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "searchQuery": "Nokia",
    "maxResults": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/ytj-scraper").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 = {
    "searchQuery": "Nokia",
    "maxResults": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/ytj-scraper").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 '{
  "searchQuery": "Nokia",
  "maxResults": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/ytj-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/ytj-scraper"
        }
    }
}

```

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/HTatWDA6hqfcg3u26/builds/Vg6LuTP0oRwtZTB2N/openapi.json
