# European Company Registry API – France, Czechia, Poland (`nordic-data/european-company-registry`) Actor

Look up or search French, Czech and Polish companies in the official registers (SIRENE/RNE, ARES, KRS). Get one clean record per company: VAT, legal form, status, address, NACE codes, officers, share capital, plus revenue & net income for France. No API key needed.

- **URL**: https://apify.com/nordic-data/european-company-registry.md
- **Developed by:** [Niklas Bergström](https://apify.com/nordic-data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.90 / 1,000 company records

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 Registry API – France, Czechia & Poland

Look up or search companies in the **official, free government registers** of France, Czechia and Poland and get **one clean, normalized JSON record per company**: name, official ID, VAT number, legal form, status, registered address, registration date, NACE industry codes, officers, share capital, and **revenue & net income for French companies**.

No scraping of commercial sites, no API keys, no logins. Every record links back to its official source.

| Country | Registry (official source) | Lookup by | Name search | Officers | Financials |
|---|---|---|---|---|---|
| 🇫🇷 France | Recherche d'entreprises API (INSEE SIRENE + INPI RNE, DINUM) | SIREN (9 digits) or SIRET (14 digits) | ✅ | ✅ directors, presidents, auditors | ✅ revenue & net income (latest year + history) |
| 🇨🇿 Czechia | ARES – Ministry of Finance | IČO (8 digits) | ✅ | ✅ statutory & supervisory board (Public Register) | ➖ link to filed accounts |
| 🇵🇱 Poland | KRS – National Court Register, Ministry of Justice | KRS number (10 digits) | ❌ (not offered by the official API) | ⚠️ functions only (API masks names) | ➖ index of filed annual statements |

### What you can use it for

- **KYC / KYB and supplier onboarding** – verify that a French, Czech or Polish company exists, is active, and get its VAT number and registered address.
- **CRM and lead enrichment** – add legal form, NACE codes, headcount band (FR), share capital, website & e-mail (PL).
- **Credit & risk screening** – status flags (closed, insolvency register, liquidation), French revenue and net income.
- **Data pipelines** – stable schema across countries, shared with our [Nordic Company Registry](https://apify.com/nordic-data/nordic-company-registry) Actor (Norway & Finland).

### Input

| Field | Description |
|---|---|
| `lookups` | Company IDs. Prefix with `FR:`, `CZ:` or `PL:` – or leave the prefix out and the country is detected (9/14 digits with a valid Luhn checksum = France, 8 digits with a valid IČO checksum = Czechia, 10 digits = Poland). |
| `searchQueries` | Company names. Prefix with `FR:` / `CZ:` to search one country, otherwise every country in `searchCountries` is searched. |
| `searchCountries` | Countries used for un-prefixed name searches (default France + Czechia). |
| `maxResults` | Max companies per name search and country (default 10, max 1000). |
| `includeOfficers` | Add officers / board members. |
| `includeFinancials` | Add financial data (France: revenue & net income). |
| `includeInactive` | Include closed companies in name searches (default on). |
| `includeRawData` | Attach the unmodified registry JSON. |

#### Example: look up companies by ID

```json
{
  "lookups": ["FR:383474814", "CZ:27082440", "PL:0000028860", "55203253400646"],
  "includeOfficers": true,
  "includeFinancials": true
}
```

#### Example: name search

```json
{
  "searchQueries": ["FR:airbus", "CZ:alza", "michelin"],
  "maxResults": 20,
  "includeInactive": false
}
```

### Output

One item per company (`recordType: "company"`) plus one item per lookup that could not be resolved (`recordType: "error"`). Abbreviated example (Airbus, France):

```json
{
  "recordType": "company",
  "country": "FR",
  "companyId": "383474814",
  "vatNumber": "FR89383474814",
  "name": "AIRBUS",
  "legalForm": { "code": "5710", "description": "Société par actions simplifiée (SAS)" },
  "status": "active",
  "isActive": true,
  "registrationDate": "1991-10-18",
  "businessAddress": { "street": "2 ROND-POINT DEWOITINE", "postalCode": "31700", "city": "BLAGNAC", "countryCode": "FR" },
  "industryCodes": [{ "code": "30.30Z", "scheme": "NAF rév. 2 (NACE Rev. 2)", "primary": true }],
  "employeeRange": "10000+",
  "officers": [{ "name": "Guillaume FAURY", "role": "Président de SAS", "type": "person" }],
  "financials": {
    "fiscalYear": 2024, "currency": "EUR",
    "keyFigures": { "revenue": 57412795000, "netIncome": 2206027000 },
    "history": [{ "year": 2024, "revenue": 57412795000, "netIncome": 2206027000 }]
  },
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/383474814",
  "license": "Licence Ouverte / Etalab Open Licence 2.0",
  "fetchedAt": "2026-10-29T07:11:42Z"
}
```

Czech records add `registerFileNumber` (e.g. `B 8573 (MSPH)`), `shareCapital` and officers with the date they took office. Polish records add `nip`, `regon`, `website`, `email`, `shareCapital`, PKD industry codes with descriptions, `representationRule` and an index of filed annual financial statements.

The dataset has ready-made views: **Overview**, **Financials**, **Officers & contacts** and **Errors**.

Error items use `errorType`: `not_found` (valid ID, not in the register), `invalid_id` (wrong format or checksum), `not_supported` (e.g. Polish name search), `no_results` (empty name search), `api_error`.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| Company record | **$0.0039** | Each company delivered to the dataset |
| Financial key figures | **$0.02** | Extra, only when revenue / net income were actually returned (France) |
| Not-found lookup | **$0.002** | A valid, checksum-verified ID that the registry does not contain |

Invalid IDs, unsupported searches, empty searches and API errors are **free**. There is no start fee and you do not pay for platform usage. The Actor respects your **maximum cost per run**: it stops cleanly before going over it and never charges for financials it could not deliver.

1,000 French, Czech or Polish companies cost **$3.90** (plus $20 if you want French financials on all of them).

### Data sources & licensing

- **France** – [recherche-entreprises.api.gouv.fr](https://recherche-entreprises.api.gouv.fr/docs/) (DINUM), built on INSEE SIRENE, INPI RNE and published annual accounts. [Licence Ouverte / Etalab 2.0](https://www.etalab.gouv.fr/licence-ouverte-open-licence/) – free re-use with attribution. Rate limit 7 requests/s; the Actor stays below it.
- **Czechia** – [ARES](https://ares.gov.cz/) REST API of the Ministry of Finance (basic register + Public Register / veřejný rejstřík). Open data, free re-use.
- **Poland** – [KRS open API](https://prs.ms.gov.pl/krs/openApi) of the Ministry of Justice (current extract, `OdpisAktualny`). Public register data, open re-use.

All three are part of the EU *High-Value Datasets* on company information. The Actor only calls the official APIs, throttles requests per registry and retries politely (with `Retry-After` support) on 429/5xx.

**Privacy:** birth dates, personal ID numbers (PESEL) and home addresses of officers are never exported. Officer names are only returned where the registry publishes them openly (France, Czechia).

### Limitations

- **Poland has no name search** in the official KRS API, so Polish companies are looked up by KRS number only. Find a KRS number at [wyszukiwarka-krs.ms.gov.pl](https://wyszukiwarka-krs.ms.gov.pl/). Only entities in the KRS (companies, associations, foundations) are covered – sole traders (CEIDG) are not.
- **Polish officer names are masked** by the API (e.g. `F*****`); only their functions are returned.
- **Financial figures are France-only.** French figures exist only for companies that published their accounts (many small companies file confidentially). Czech and Polish accounts are filed as documents, which this Actor links/indexes but does not parse.
- **French name search** uses the registry's own relevance ranking; very generic names can return small namesakes first – use the SIREN when you know it. Some sole traders are non-diffusible and return limited data.
- NACE codes are returned as codes (with descriptions for Poland).

### Related Actors

- [Nordic Company Registry & Financials](https://apify.com/nordic-data/nordic-company-registry) – Norway & Finland, same output schema.

# Changelog

This Actor's version history is a separate document: https://apify.com/nordic-data/european-company-registry/changelog.md

# Actor input Schema

## `lookups` (type: `array`):

Official IDs, optionally prefixed with the country: 'FR:383474814' (SIREN, or a 14-digit SIRET), 'CZ:27082440' (IČO), 'PL:0000028860' (KRS number, leading zeros optional with the prefix). Without a prefix the country is detected: 9/14 digits with a valid Luhn checksum = France, 8 digits with a valid IČO checksum = Czechia, 10 digits = Poland.

## `searchQueries` (type: `array`):

Company names. Prefix with 'FR:' or 'CZ:' to search one country; otherwise every country in 'Search in countries' is searched. Poland's official KRS API has no name search (returns a free 'not_supported' item).

## `searchCountries` (type: `array`):

Registries used for name searches without a country prefix.

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

Maximum companies returned per search query and country.

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

When off, closed / dissolved companies are skipped in name searches (direct ID lookups always return the record).

## `includeOfficers` (type: `boolean`):

France: directors, presidents and auditors (INPI RNE). Czechia: current statutory & supervisory body members (Public Register). Poland: board functions only - the KRS API masks personal names. Birth dates and home addresses are never exported.

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

France: latest revenue and net income plus yearly history from filed accounts, charged as an extra 'financial-record' event only when figures exist. Czechia: link to the Collection of Deeds. Poland: index of filed annual financial statements (no extra charge).

## `includeRawData` (type: `boolean`):

Attach the unmodified registry JSON under 'raw' (larger output).

## `maxConcurrency` (type: `integer`):

Parallel lookups. Requests are additionally rate-limited per registry host.

## `maxRetries` (type: `integer`):

Retries with exponential backoff on HTTP 429/5xx and network errors.

## Actor input object example

```json
{
  "lookups": [
    "FR:383474814",
    "CZ:27082440",
    "PL:0000028860"
  ],
  "searchQueries": [],
  "searchCountries": [
    "FR",
    "CZ"
  ],
  "maxResults": 10,
  "includeInactive": true,
  "includeOfficers": false,
  "includeFinancials": false,
  "includeRawData": false,
  "maxConcurrency": 4,
  "maxRetries": 4
}
```

# Actor output Schema

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

All company records and error items from the default dataset, opened in the Overview view (other views: Financials, Officers & contacts, Errors).

## `runStats` (type: `string`):

Counts of companies, financial records, not-found lookups, errors and HTTP requests for this run.

# 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 = {
    "lookups": [
        "FR:383474814",
        "CZ:27082440",
        "PL:0000028860"
    ],
    "searchQueries": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("nordic-data/european-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 = {
    "lookups": [
        "FR:383474814",
        "CZ:27082440",
        "PL:0000028860",
    ],
    "searchQueries": [],
}

# Run the Actor and wait for it to finish
run = client.actor("nordic-data/european-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 '{
  "lookups": [
    "FR:383474814",
    "CZ:27082440",
    "PL:0000028860"
  ],
  "searchQueries": []
}' |
apify call nordic-data/european-company-registry --silent --output-dataset

```

## MCP server setup

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