# Norway and Finland Company Registry Scraper (Brreg, PRH YTJ) (`nightwave-owner/nordic-company-registers`) Actor

Returns company records from the official Norwegian (Brreg) and Finnish (PRH YTJ) business registers in one schema: org number, legal form, status, industry, address, VAT and bankruptcy flags. Search by name, number, industry, municipality or registration date. No sole proprietorships.

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

## Pricing

$4.00 / 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.

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

## Norway and Finland Company Registry Scraper (Brreg, PRH YTJ)

Company records from the two official Nordic business registers that publish open APIs: Enhetsregisteret in Norway (Brønnøysundregistrene, Brreg) and YTJ in Finland (Finnish Patent and Registration Office, PRH). Both are returned in one schema, so a Norwegian AS and a Finnish Oy have the same fields.

Search by company name, organisation number, industry code, municipality or registration date. Typical uses:

- Look up a list of Norwegian and Finnish organisation numbers and get legal form, status, industry and address back.
- A daily list of newly registered companies in a given industry or town (with `onlyNew` and a schedule).
- Check whether a supplier is VAT registered, bankrupt or in liquidation.
- Build a company list for one NACE/TOL code in one municipality.

### Personal data

The actor only returns legal entities. It never returns:

- Sole proprietorships: ENK (enkeltpersonforetak) in Norway and private traders (toiminimi) in Finland, since the business is the person. Bankruptcy and other estates (KBO, BO) and the PERS form are left out in Norway as well, since they are often named after a person.
- Names of people, roles, board members, owners or signatories.
- Phone numbers and e-mail addresses, even when the register has them.

Partnerships (ANS, DA, KS in Norway; AY, KY in Finland) are legal entities and are included. Their names sometimes contain a partner's surname, as registered by the company itself.

### Example from a real run

This is the input and the first rows of a run on the Apify platform on 3 October 2026 (run `ejufhjmIRlFB7cD7I`, 20 rows in total). Nothing is edited except that only the first rows are shown.

Input:

```json
{
  "countries": [
    "NO"
  ],
  "query": "Equinor",
  "maxResults": 20,
  "includeBankrupt": false,
  "includeInactive": false,
  "onlyNew": false
}
```

Output (excerpt):

```json
[
  {
    "country": "NO",
    "orgNumber": "923609016",
    "name": "EQUINOR ASA",
    "legalForm": {
      "code": "ASA",
      "text": "Allmennaksjeselskap"
    },
    "status": "active",
    "registrationDate": "1995-03-12",
    "industryCode": "06.100",
    "industryText": "Utvinning av råolje",
    "employees": 21272,
    "address": {
      "street": "Forusbeen 50",
      "postalCode": "4035",
      "city": "STAVANGER",
      "municipality": "STAVANGER",
      "municipalityCode": "1103"
    },
    "website": "www.equinor.com",
    "vatRegistered": true,
    "bankrupt": false,
    "underLiquidation": false,
    "source": "Enhetsregisteret, Brønnøysundregistrene (Norway)",
    "license": "NLOD 2.0 (Norsk lisens for offentlige data)",
    "sourceUrl": "https://data.brreg.no/enhetsregisteret/oppslag/enheter/923609016"
  },
  {
    "country": "NO",
    "orgNumber": "959733600",
    "name": "EQUINOR PENSJON",
    "legalForm": {
      "code": "PK",
      "text": "Pensjonskasse"
    },
    "status": "active",
    "registrationDate": "1995-03-12",
    "industryCode": "65.300",
    "industryText": "Pensjonskasser",
    "employees": null,
    "address": {
      "street": "Forusbeen 50",
      "postalCode": "4035",
      "city": "STAVANGER",
      "municipality": "STAVANGER",
      "municipalityCode": "1103"
    },
    "website": "www.equinorpensjon.no",
    "vatRegistered": false,
    "bankrupt": false,
    "underLiquidation": false,
    "source": "Enhetsregisteret, Brønnøysundregistrene (Norway)",
    "license": "NLOD 2.0 (Norsk lisens for offentlige data)",
    "sourceUrl": "https://data.brreg.no/enhetsregisteret/oppslag/enheter/959733600"
  }
]
```

### Input

| Field | Example | Notes |
|---|---|---|
| `countries` | `["NO", "FI"]` | Empty means both. |
| `query` | `"Equinor"` | Company name, current or previous. |
| `orgNumbers` | `["923609016", "0112038-9"]` | Direct lookup. Norway: 9 digits. Finland: Business ID. Other filters are ignored when set. |
| `industryCodes` | `["62"]` | Main industry code starts with one of these. 62, 62.01 and 6201 all work. Norway uses SN (NACE), Finland TOL. |
| `municipality` | `"Bergen"` or `"0301"` | Norway: municipality name or number. Finland: town or city (`"Espoo"`). |
| `registeredAfter` | `"2026-09-26"` | Registered on or after this date. |
| `includeBankrupt` | `false` | Bankrupt companies are left out by default. |
| `includeInactive` | `false` | Finnish companies that have ceased are left out by default. |
| `onlyNew` | `false` | Only companies earlier runs of the same search have not returned. |
| `maxResults` | `50` | Total cap, 1-10 000. With both countries each gets half, and places one country does not use go to the other. |

With an empty input the actor returns companies registered in the last seven days in both countries, newest first for Norway.

Input used for the example below:

```json
{ "countries": ["NO"], "query": "Equinor", "maxResults": 20 }
```

### Output

One row per company. Excerpt from a cloud run on 3 October 2026:

```json
{
  "country": "NO",
  "orgNumber": "923609016",
  "name": "EQUINOR ASA",
  "legalForm": { "code": "ASA", "text": "Allmennaksjeselskap" },
  "status": "active",
  "registrationDate": "1995-03-12",
  "industryCode": "06.100",
  "industryText": "Utvinning av råolje",
  "employees": 21272,
  "address": {
    "street": "Forusbeen 50",
    "postalCode": "4035",
    "city": "STAVANGER",
    "municipality": "STAVANGER",
    "municipalityCode": "1103"
  },
  "website": "www.equinor.com",
  "vatRegistered": true,
  "bankrupt": false,
  "underLiquidation": false,
  "source": "Enhetsregisteret, Brønnøysundregistrene (Norway)",
  "license": "NLOD 2.0 (Norsk lisens for offentlige data)",
  "sourceUrl": "https://data.brreg.no/enhetsregisteret/oppslag/enheter/923609016"
}
```

And a Finnish row from the run with `{ "countries": ["FI"], "query": "Nokia", "maxResults": 20 }`:

```json
{
  "country": "FI",
  "orgNumber": "0197067-4",
  "name": "Tikkurila Oyj",
  "legalForm": { "code": "OYJ", "text": "Public limited company" },
  "status": "active",
  "registrationDate": "1917-07-26",
  "industryCode": "20300",
  "industryText": "Manufacture of paints, varnishes and similar coatings, printing ink and mastics",
  "employees": null,
  "address": { "street": "Heidehofintie 2", "postalCode": "01300", "city": "VANTAA", "municipality": null, "municipalityCode": "092" },
  "website": null,
  "vatRegistered": true,
  "bankrupt": false,
  "underLiquidation": false,
  "source": "YTJ open data, Finnish Patent and Registration Office (PRH)",
  "license": "CC BY 4.0",
  "sourceUrl": "https://tietopalvelu.ytj.fi/yritys/0197067-4"
}
```

| Field | Description |
|---|---|
| `country` | NO or FI. |
| `orgNumber` | Organisation number (NO) or Business ID, Y-tunnus (FI). |
| `name` | Current registered name. |
| `legalForm` | `code` (AS, ASA, OY, OYJ ...) and `text`. Norwegian text is in Norwegian, Finnish in English. |
| `status` | `active`, `bankrupt`, `liquidation`, `forcedDissolution`, `reorganisation` or `ceased`. |
| `registrationDate` | Date of registration in Enhetsregisteret (NO) or the company's registration date (FI). |
| `industryCode`, `industryText` | Main industry. NO: SN/NACE in Norwegian. FI: TOL in English. |
| `employees` | Number of employees when Brreg has it. Always null for Finland, since YTJ does not publish it. |
| `address` | Business address (postal address if there is none). `municipality` is the name in Norway; for Finland only `municipalityCode` is given. |
| `website` | As registered. |
| `vatRegistered` | Norway: in Merverdiavgiftsregisteret. Finland: a current VAT register entry. |
| `bankrupt`, `underLiquidation` | Flags from the register. |
| `source`, `license`, `sourceUrl` | Where the row comes from, the license and a link to the public register page. |

### Monitoring and scheduling

To get new companies every morning, create a schedule in Apify Console (Schedules, Create new, cron `0 6 * * *`) that runs this actor with for example:

```json
{ "countries": ["NO", "FI"], "industryCodes": ["62"], "onlyNew": true, "maxResults": 500 }
```

With `onlyNew` the actor remembers which companies each search has returned, in a named key-value store (`nightwave-state-nordic-company-registers`, one record per search). Each run returns and charges only companies not returned before. When no name, number, industry or date is given, the moving "last seven days" window counts as the same search from day to day. The first run returns everything the search matches.

### Limits

- Brreg returns at most 10 000 units per search. Narrow the search (industry, municipality, date) to get more.
- PRH matches industry codes by text as well, so the actor checks the code prefix itself. A broad Finnish search may therefore read more pages than it returns.
- Name search follows each register's own rules. PRH also matches parallel and auxiliary names, so "Nokia" returns companies in the town of Nokia too.
- Norwegian sub-units (underenheter, local branches) are not included in this version.
- Neither register publishes a fixed request quota. The actor reads one page at a time and retries 429 and 5xx responses three times with a growing pause, then stops with a clear error.

### Use cases

- Get newly registered companies in Norway and Finland every day with `registeredAfter` and `onlyNew: true`, as leads for accounting, banking or software sales.
- Verify a list of Norwegian organisation numbers or Finnish Business IDs (Y-tunnus) and check status, VAT registration and bankruptcy flags.
- Build a list of companies in an industry and municipality from the NACE or TOL code.
- Enrich a CRM with legal name, legal form, address and website from the official registers.
- Compare company formation per industry between Norway and Finland.

### FAQ

**How often is the data updated?**
Every run reads the registers live. Brreg and PRH update their open data as companies register changes, normally within a working day.

**What does 1 000 rows cost?**
4 USD (0.004 USD per company, event `company`). Platform usage is included. Rows that are filtered out are not charged.

**Can I schedule it?**
Yes. Set `onlyNew: true` and add the actor to an Apify schedule. See "Monitoring and scheduling" above.

**Can I use the data commercially?**
Yes. Brreg data is published under NLOD 2.0 and PRH YTJ data under CC BY 4.0. Both require attribution, which is included in every row (`source`, `license`).

### Data source and license

- Norway: [Enhetsregisteret open data API](https://data.brreg.no/enhetsregisteret/api/dokumentasjon/no/index.html), Brønnøysundregistrene, under [NLOD 2.0](https://data.norge.no/nlod/no/2.0).
- Finland: [YTJ open data API v3](https://avoindata.prh.fi/en/ytj/swagger-ui), Finnish Patent and Registration Office, under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Please name PRH as the source when you use the data.

Every row carries `source` and `license`. This actor is not made by or affiliated with Brreg or PRH.

### Pricing

Pay per result: 0.004 USD per row returned (event `company`), which is 4 USD per 1 000 companies. Platform usage is included, so you pay only per result. `maxResults` caps how many rows a run returns, so you always know the highest possible cost.

Rows are delivered only after they have been charged. If you set a maximum cost per run (maxTotalChargeUsd), the run stops there and its status message says how many rows were delivered.

### Contact

Questions and bug reports: kontakt@nightwave.se. Nightwave AB, Sweden.

### På svenska

Actorn hämtar bolagsuppgifter ur Norges Enhetsregisteret (Brønnøysundregistrene) och Finlands YTJ (Patent- och registerstyrelsen, PRH) och levererar dem i samma format: organisationsnummer, namn, bolagsform, status, bransch (NACE/TOL), adress, momsregistrering och konkursuppgift.

Sök på namn, organisationsnummer, branschkod, kommun eller registreringsdatum. Med tom input får du bolag registrerade de senaste sju dagarna i båda länderna. Med `onlyNew` och ett schema i Apify får du varje morgon bara bolag som inte levererats tidigare.

Enskilda näringsidkare (ENK i Norge, toiminimi i Finland), konkursbon och personer tas aldrig med, och inga personnamn, roller, styrelser, telefonnummer eller e-postadresser levereras.

Källor och licenser: Brreg under NLOD 2.0 och PRH under CC BY 4.0. Pris: 0,004 USD per bolag. Frågor: kontakt@nightwave.se.

# Actor input Schema

## `countries` (type: `array`):

Registers to search: NO (Brreg, Norway) and FI (PRH YTJ, Finland). Leave empty for both. Example: \["NO"].

## `query` (type: `string`):

Search by company name, current or previous. Example: Equinor.

## `orgNumbers` (type: `array`):

Look up these companies directly. Norway: 9 digits (923609016). Finland: Business ID (0112038-9). Other filters are ignored when this is set. At most 1 000.

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

Only companies whose main industry code starts with one of these. With or without the dot: 62, 62.01 or 6201 (computer programming and consulting).

## `municipality` (type: `string`):

Norway: municipality name (Bergen) or 4 digit number (0301 for Oslo). Finland: town or city name (Espoo).

## `registeredAfter` (type: `string`):

Only companies registered on or after this date, YYYY-MM-DD. Example: 2026-09-01. If no name, number, industry or date is given, the run returns companies registered in the last seven days.

## `includeBankrupt` (type: `boolean`):

Bankrupt companies are left out unless this is on.

## `includeInactive` (type: `boolean`):

Finland keeps companies that have ceased or been removed from the trade register. They are left out unless this is on. Companies in liquidation are always included and marked.

## `onlyNew` (type: `boolean`):

For scheduled runs: return and charge only companies that earlier runs of the same search have not returned. The first run returns everything in the search.

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

Maximum number of companies in total. With both countries, each gets half and unused places go to the other. Each company is one billable result.

## Actor input object example

```json
{
  "countries": [
    "NO",
    "FI"
  ],
  "query": "Equinor",
  "orgNumbers": [
    "923609016",
    "0112038-9"
  ],
  "industryCodes": [
    "62"
  ],
  "municipality": "Bergen",
  "registeredAfter": "2026-09-01",
  "includeBankrupt": false,
  "includeInactive": false,
  "onlyNew": false,
  "maxResults": 20
}
```

# Actor output Schema

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

All companies returned by the run, as JSON. Open in Apify Console or download via the dataset API.

# 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 = {
    "countries": [
        "NO",
        "FI"
    ],
    "query": "Equinor",
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("nightwave-owner/nordic-company-registers").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 = {
    "countries": [
        "NO",
        "FI",
    ],
    "query": "Equinor",
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("nightwave-owner/nordic-company-registers").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 '{
  "countries": [
    "NO",
    "FI"
  ],
  "query": "Equinor",
  "maxResults": 20
}' |
apify call nightwave-owner/nordic-company-registers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nightwave-owner/nordic-company-registers"
        }
    }
}
```

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/40M8igyvpdtacymg3/builds/Iqfl5mwlUcucZEQFZ/openapi.json
