# European Company Registers API: Norway, Finland, France (`jp-data-lab/european-company-registers`) Actor

Search companies in three official European registers with one schema: name, register number, legal form, status, registration date, city, NACE industry and employee band. Official open APIs only. No directors, emails, phones or sole traders. Honours the French commercial opt-out.

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

## Pricing

from $2.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

## European Company Registers API: Norway, Finland, France

Search companies in three official European registers and get **one JSON schema** back. Every source is the government's own free, public API, with its licence checked first. No website is scraped and no proxy or API key is needed.

| `source` | Country | Official source | Updates | Licence |
|---|---|---|---|---|
| `norway` | Norway | [Central Coordinating Register for Legal Entities](https://data.brreg.no/enhetsregisteret/api/dokumentasjon/en/index.html), Brønnøysund Register Centre | Daily | [NLOD 2.0](https://data.norge.no/nlod/en/2.0) |
| `finland` | Finland | [PRH open data](https://avoindata.prh.fi/en), Finnish Patent and Registration Office | Daily | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) |
| `france` | France | [API Recherche d'entreprises](https://recherche-entreprises.api.gouv.fr/docs/) (INSEE Sirene and others), French government | Daily | [Licence Ouverte 2.0](https://www.data.gouv.fr/pages/legal/licences/etalab-2.0) |

Use it for market mapping, supplier and competitor research, KYB name checks, enriching a CRM with register numbers, or AI agents that need to answer "which registered companies match this?". It is a list of companies, not of people.

### Output

One item per company:

```json
{
  "id": "finland:3622132-3",
  "source": "finland",
  "country": "FI",
  "registerNumber": "3622132-3",
  "name": "Ceili Group Oy",
  "category": "limited-company",
  "url": "https://tietopalvelu.ytj.fi/yritys/3622132-3",
  "attribution": "Source: Finnish Patent and Registration Office (PRH) open data, CC BY 4.0, https://creativecommons.org/licenses/by/4.0/",
  "legalForm": "Limited company",
  "legalFormCode": "16",
  "status": "active",
  "registeredAt": "2026-09-30",
  "city": "JYVÄSKYLÄ",
  "postalCode": "40100",
  "naceDivision": "62",
  "industryCode": "62100",
  "industryName": "Computer programming activities",
  "employees": null,
  "website": null,
  "sourceUpdatedAt": "2026-10-06",
  "scrapedAt": "2026-10-31T09:00:00+00:00"
}
```

| Field | Meaning |
|---|---|
| `id` | Stable key, `source:registerNumber`. Use it to remove repeats between runs |
| `registerNumber` | Norwegian organisation number, Finnish Business ID or French SIREN |
| `category` | One of `limited-company`, `cooperative`, `nonprofit`, `public-sector`, `other`. Worked out from the legal form |
| `legalForm`, `legalFormCode` | The register's own legal form. Norway's name is in Norwegian, Finland's in English. France gives the INSEE code, with a name for the most common forms only |
| `status` | `active`, `restructuring`, `in-liquidation`, `bankrupt` or `ceased`. `null` if the source does not say |
| `registeredAt` | Registration date in Norway and Finland, creation date in France |
| `city`, `postalCode` | Location on file. France uses the head office |
| `naceDivision` | First two digits of the industry code, comparable across the three countries |
| `industryCode`, `industryName` | The national code as published. Name in Norwegian for Norway and English for Finland, not given for France |
| `employees` | Text. Norway gives the registered head count such as `17`, France an INSEE band such as `10-19`. Not published for Finland. `null` if unknown, which is usual for new or very small companies |
| `website` | Norway and Finland only, where the company gave one |
| `sourceUpdatedAt` | Date the source last changed the record. Finland and France only |
| `url` | The record on the official public site |

### Input

| Field | Default | |
|---|---|---|
| `countries` | all | Any of the `source` values above |
| `keywords` | `energy` | Current company name contains any keyword. Case and accents are ignored |
| `naceDivision` | none | Two-digit industry division, such as `62` |
| `registeredWithinDays` | 0 | Companies registered in the last N days. `0` = no date limit. Norway and Finland only |
| `activeOnly` | `true` | Leave out ceased, bankrupt, liquidating and restructuring companies |
| `maxItems` | 100 | Total for the run, shared evenly across countries. You pay per result |

A default run takes under a minute. Names are in the local language, so search `energi`, `energia` and `energie` as well as `energy`.

**New companies:** clear `keywords` and set `registeredWithinDays` to `30` to list recent registrations in Norway and Finland, newest first for Norway. Schedule it weekly and remove repeats using `id`.

### Personal data

This Actor is built not to return personal data:

- **No people.** Directors, officers, owners and signatories are never returned. For France they are not even requested from the API.
- **No street addresses, emails or phones.** Norway's API publishes emails and phones, and all three publish street addresses. A small company's address is often the owner's home, so location stops at city and postal code.
- **No sole traders.** People trading under their own name are left out. So are general and limited partnerships, whose names are usually the partners' names, using the legal form on the register:
  - Norway: only forms with their own legal personality are requested. `ENK`, `ANS`, `DA`, `KS`, `NUF`, `UTLA`, `ANNA`, `PERS`, `IKJP`, `BO` and `KBO` are not.
  - Finland: sole traders are not published. `AY`, `KY` and branches of foreign traders are dropped.
  - France: legal categories 1 and 2, `52` and `53` are dropped, along with any record not fully public (`statut_diffusion` other than `O`).
- **French commercial opt-out is honoured.** Companies that object to commercial use of their data (`opposition_diffusion_commerciale`) are dropped, and so are records that do not state it. This is about half of French rows, so France reads more rows per result.
- **Free text is left out.** Norway's business purpose text can name people, so it is not returned.

Rows dropped are counted per source in `RUN_SUMMARY` as `legalFormExcluded`, `commercialOptOut` and `nameMissing`. A company name that itself contains a person's name, such as `Jane Doe AS`, is still returned as the registered name of the company.

### Limitations

- **France cannot filter by date.** Its API has none, so France is not read when `registeredWithinDays` is set, and `RUN_SUMMARY` shows it as skipped.
- **France needs a keyword or `naceDivision`.** With neither, France is skipped.
- **Each keyword reads at most 2,000 rows per country.** Use narrower keywords if the log says the limit was reached. The French API serves at most 10,000 rows for a search, and it is a search engine, not a full register export.
- **`naceDivision` is close, not exact, across countries.** Norway and Finland use different revisions from France in some divisions.
- **`keywords` match the current name.** Finland also searches earlier names at the source, and those rows are dropped here.
- **Non-public French records are not available.** The French API leaves out companies that are not public.
- If one source is down, the run still succeeds with the others. See `RUN_SUMMARY` for per-source counts and errors.
- Not affiliated with, or endorsed by, any of these authorities. Always check the official record before relying on it.

### Data sources and attribution

Each item carries its own `attribution` field with the source and licence, so you can keep the credit when you pass the data on. This Actor selects, renames and combines fields, so results are a modified version of the source data, and `sourceUpdatedAt` shows how current each record is where the source gives a date.

- Norway: contains data under the Norwegian licence for Open Government data (NLOD) distributed by the Brønnøysund Register Centre.
- Finland: Finnish Patent and Registration Office (PRH), CC BY 4.0. This is not a PRH service.
- France: INSEE Sirene and other public sources through API Recherche d'entreprises, Licence Ouverte 2.0.

***

### 日本語

ノルウェー・フィンランド・フランスの公式な企業登記 API から、会社を同じ形式で検索して取得します。各国の許諾は事前に確認しており、Web サイトの巡回はしません。出力は会社名・登記番号・法人形態・状態・登記日・市・郵便番号・業種までで、役員の氏名、番地、メール、電話は出力しません。個人事業主と無限責任の組合は登記の法人形態で除き、フランスで商用利用を拒否している企業も除きます。

# Actor input Schema

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

Which official registers to read. Leave all selected for every country.

## `keywords` (type: `array`):

Keep companies whose current name contains any of these words, e.g. energy, solar, consulting. Case and accents are ignored. Names are in the local language, so try local words too, e.g. energi, energia, energie. France needs a keyword or a NACE division.

## `naceDivision` (type: `string`):

Optional two-digit industry division, e.g. 62 for computer programming or 41 for construction of buildings.

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

Only companies registered in the last N days. 0 = no date limit. Norway and Finland only: the French API has no date filter, so France is not read when this is set.

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

Leave out companies that are ceased, bankrupt, in liquidation or in restructuring.

## `maxItems` (type: `integer`):

Total for the whole run, shared evenly across countries. You are charged per result.

## Actor input object example

```json
{
  "countries": [
    "norway",
    "finland",
    "france"
  ],
  "keywords": [
    "energy"
  ],
  "registeredWithinDays": 0,
  "activeOnly": true,
  "maxItems": 100
}
```

# Actor output Schema

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

One item per company: country, register number, name, category, legal form, status, registration date, city, postal code, NACE industry, employees where available, source URL and attribution.

## `runSummary` (type: `string`):

Rows read, rows left out and results returned per register in this run, with any source errors.

# 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": [
        "norway",
        "finland",
        "france"
    ],
    "keywords": [
        "energy"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jp-data-lab/european-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": [
        "norway",
        "finland",
        "france",
    ],
    "keywords": ["energy"],
}

# Run the Actor and wait for it to finish
run = client.actor("jp-data-lab/european-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": [
    "norway",
    "finland",
    "france"
  ],
  "keywords": [
    "energy"
  ]
}' |
apify call jp-data-lab/european-company-registers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jp-data-lab/european-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/ngaH3Bxtu9r931yhX/builds/WHylvMPeOcvG0fCZT/openapi.json
