# European Company Registry Search: VAT, LEI & Business Data (`postatelier/eu-company-registry`) Actor

Company search in official European business registers: France (Sirene), Norway, Finland, Czechia, Poland (KRS), plus LEI lookup and EU VAT (VIES) validation. Search by company name, registry number, VAT number or LEI. Normalised JSON, open licences.

- **URL**: https://apify.com/postatelier/eu-company-registry.md
- **Developed by:** [Post Atelier](https://apify.com/postatelier) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### What does European Company Registry Search do?

It's a **company registry search and EU VAT validation** tool for the official government business registers of France, Norway, Finland, Czechia and Poland, with LEI lookup for the rest of the world. It returns one clean, normalised record per company. You get the legal name, registry number, legal form, status, incorporation date, registered address, activity codes, VAT number, LEI and, where the register publishes them, revenue and net income.

Data comes straight from the public APIs of the registers. There's no scraping of third-party aggregators, so results don't break when someone redesigns a website, and every record says which register it came from and under which open licence.

| Country | Register | Search by name | Lookup by ID | Extras |
|---|---|---|---|---|
| 🇫🇷 France | Sirene / RNE via Annuaire des Entreprises | ✅ | SIREN, SIRET, FR VAT | Revenue and net income, headcount band |
| 🇳🇴 Norway | Brønnøysund (Enhetsregisteret + Regnskapsregisteret) | ✅ | Organisasjonsnummer, NO…MVA | Annual accounts (company and group), share capital, employees |
| 🇫🇮 Finland | PRH / YTJ | ✅ | Y-tunnus, FI VAT | Previous names, VAT registration |
| 🇨🇿 Czechia | ARES | ✅ | IČO, CZ VAT | All CZ-NACE activity codes |
| 🇵🇱 Poland | KRS (National Court Register) | ❌ | KRS number | PKD activities, share capital |
| 🌍 Everywhere else | GLEIF LEI index | ✅ (LEI holders) | LEI | Germany, Netherlands, Italy, Spain… for companies with an LEI (for the UK, use UK Companies House) |

Optional: **EU VAT validation** against the European Commission's VIES service.

### What you get

A real run with four mixed queries (a name, a Norwegian org number and two VAT numbers), first match shown for each:

| Query | Company | Country | Registry ID | Legal form | Status | Incorporated | VAT | LEI |
|---|---|---|---|---|---|---|---|---|
| Decathlon | DECATHLON | FR | 306138900 | SE (société européenne) | active | 1977-01-01 | FR51306138900 | 9695007JOO3V2B0GMP47 |
| 923609016 | EQUINOR ASA | NO | 923609016 | Allmennaksjeselskap (ASA) | active | 1972-09-18 | NO923609016MVA | OW6OFBNCKXC4US5C7523 |
| FI01120389 | Nokia Oyj | FI | 0112038-9 | Public limited company | active | 1896-12-19 | FI01120389 | 549300A0JPRWG1KI7U06 |
| CZ00177041 | Škoda Auto a.s. | CZ | 00177041 | Akciová společnost (a.s.) | active | 1990-11-20 | CZ00177041 | 529900I8XOZDM4ZQSQ21 |

Each row is a full JSON record with the registered address, activity codes, source link and licence (see the output example below). Download as JSON, CSV or Excel, or send it to Sheets or your CRM.

### Run it on a schedule: Slack, e-mail, Google Sheets or a webhook

Set it up once and get a re-check of your supplier or customer list automatically:

1. **Save a task.** Fill in the input (or paste the JSON below in the JSON editor) and click **Save as a new task**.
   ```json
   { "queries": ["FR51306138900", "923609016", "CZ00177041"], "checkVat": true, "onlyActive": false }
   ```
2. **Schedule it weekly or monthly.** Open **Schedules** in the left menu of the Apify Console, create a schedule, pick the time and add your task. Each run re-checks every company, so a supplier that is struck off or loses its VAT registration shows up with its new status.
3. **Send the results somewhere.** In the task's **Integrations** tab:
   - **Slack:** "Send notification via Slack" when a run succeeds.
   - **E-mail or Google Drive:** "Send results email via Gmail" attaches the rows; "Upload results to GDrive" saves them as a file.
   - **Google Sheets, CRM, n8n:** connect the task through Make, Zapier or n8n (listed under Automation platforms) and add a row per result.
   - **Webhook:** add an HTTP webhook for the event **Run succeeded** with your URL. The payload includes `resource.defaultDatasetId`; fetch the rows from `https://api.apify.com/v2/datasets/<defaultDatasetId>/items`.

### Why use it?

- **KYB and onboarding.** Confirm that a supplier or customer exists, is active and has the VAT number they gave you.
- **CRM enrichment.** Turn a list of company names or VAT numbers into registry IDs, addresses, NACE codes and LEIs.
- **Compliance.** LEI cross-reference plus VIES validation in one call, with a source link for your audit trail.
- **AI agents.** One tool call answers "is this a real, active company, and where is it registered?" It works through the Apify MCP server.

### How to use it

1. Paste your companies into **Companies to look up**, one per line. Mix names, registry numbers, VAT numbers and LEIs freely.
2. Optionally restrict a name to one country with a prefix: `FR: Decathlon`, `NO: Equinor`.
3. Choose which registries to search for names (all by default), and whether to validate VAT numbers.
4. Run it, then download the results as JSON, CSV or Excel, or fetch them through the API.

#### Input example

```json
{
  "queries": ["Decathlon", "923609016", "CZ00177041", "KRS 0000019193", "FI01120389", "Siemens Aktiengesellschaft"],
  "maxResultsPerQuery": 3,
  "includeLei": true,
  "checkVat": true
}
```

The Actor recognises the input type automatically. It validates check digits for SIREN, Norwegian org numbers, Y-tunnus, IČO and LEI, so a 9-digit number goes to the right country.

#### Output example

```json
{
  "query": "923609016",
  "matchedBy": "id",
  "country": "NO",
  "registryId": "923609016",
  "registryIdType": "Organisasjonsnummer",
  "name": "EQUINOR ASA",
  "previousNames": ["STATOIL ASA", "STATOILHYDRO ASA"],
  "legalForm": "Allmennaksjeselskap (ASA)",
  "status": "active",
  "incorporationDate": "1972-09-18",
  "address": { "street": "Forusbeen 50", "postalCode": "4035", "city": "STAVANGER", "country": "NO", "full": "Forusbeen 50, 4035 STAVANGER, Norge" },
  "activities": [{ "code": "06.100", "scheme": "SN2007 (NACE Rev. 2)", "description": "Utvinning av råolje", "primary": true }],
  "employees": "21231",
  "website": "https://www.equinor.com",
  "vatNumber": "NO923609016MVA",
  "lei": "OW6OFBNCKXC4US5C7523",
  "shareCapital": { "amount": 5976872600, "currency": "NOK" },
  "financials": [{ "year": 2025, "scope": "group", "revenue": 106462000000, "netIncome": 5058000000, "currency": "USD" }],
  "source": {
    "registry": "Brønnøysund Register Centre",
    "url": "https://data.brreg.no/enhetsregisteret/oppslag/enheter/923609016",
    "licence": "Norwegian Licence for Open Government Data (NLOD) 2.0",
    "attribution": "Contains data under the Norwegian licence for Open Government data (NLOD) made available by the Brønnøysund Register Centre"
  },
  "retrievedAt": "2026-10-15T08:46:16.897Z"
}
```

With **Validate VAT number** on, each record also gets a `vatCheck` object: `{ "valid": true, "name": "...", "address": "...", "checkedAt": "..." }`. When a member state's VIES service is down or busy, `valid` is `null` and `error` says why. We never report a VAT number as invalid just because VIES didn't answer.

The run's key-value store has a `SUMMARY` record listing queries that weren't found or aren't supported, so you can see what's missing without diffing.

### Use it from code, Make, Zapier or an AI agent

Run it with one HTTP call and get the results back as JSON:

```bash
curl -X POST "https://api.apify.com/v2/acts/postatelier~eu-company-registry/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "queries": ["Decathlon", "923609016", "CZ00177041"], "checkVat": true }'
```

```python
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("postatelier/eu-company-registry").call(run_input={ "queries": ["Decathlon", "923609016", "CZ00177041"], "checkVat": true })
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

It also works from Make, Zapier, n8n and Google Sheets through Apify's integrations. AI agents can call it as a tool through the [Apify MCP server](https://mcp.apify.com), with the Actor name `postatelier/eu-company-registry`.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Company record returned | **$0.004** ($4 per 1,000 companies) |
| VIES VAT check (only when enabled) | **$0.001** |

LEI matching, retries, "not found" queries and VIES checks that VIES couldn't answer cost nothing.

**Examples:** 1,000 company records cost $4, or $5 with VIES validation on every record. A 250-row list of VAT or registry numbers costs $1; name searches can return up to 3 matches each (`maxResultsPerQuery`). Apify's free plan includes $5 of monthly credit, which covers about 1,000 company records. Set a maximum cost per run in the run options and the Actor stops cleanly when it's reached.

### Data sources and licences

Every record carries `source.licence` and `source.attribution`. Keep the attribution when you republish the data.

- **France:** [Annuaire des Entreprises API](https://recherche-entreprises.api.gouv.fr) (DINUM; data from INSEE Sirene and INPI RNE). [Licence Ouverte 2.0 (Etalab)](https://www.etalab.gouv.fr/licence-ouverte-open-licence/).
- **Norway:** [Brønnøysund Register Centre open API](https://data.brreg.no/enhetsregisteret/api/dokumentasjon/en/index.html). [NLOD 2.0](https://data.norge.no/nlod/en/2.0).
- **Finland:** [PRH / YTJ open data API](https://avoindata.prh.fi/en). [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
- **Czechia:** [ARES](https://ares.gov.cz), Ministry of Finance of the Czech Republic. Published as open data under Act No. 106/1999 Coll. and Government Regulation 425/2016 Coll. ([conditions](https://ares.gov.cz/stranky/otevrena-data)).
- **Poland:** [KRS open API](https://prs.ms.gov.pl/krs/openApi), Ministry of Justice. Public information re-used under the 2021 Open Data Act.
- **LEI:** [GLEIF](https://www.gleif.org/en/lei-data/gleif-api), CC0. This product is not endorsed by GLEIF.
- **VAT:** [VIES](https://ec.europa.eu/taxation_customs/vies/), European Commission. Results are for validating your own trading partners.

### Privacy: company data only

This Actor returns **legal entities only**:

- Sole traders and other natural persons are filtered out (French entrepreneurs individuels, Norwegian ENK, Czech natural-person forms, Finnish records without a company form, GLEIF sole proprietors).
- No directors, board members, shareholders or beneficial owners are collected or returned.
- French records whose owners opted out of public diffusion are skipped.

### Limits and good to know

- **Poland:** the KRS API has no name or NIP search, so look companies up by KRS number. Polish VAT numbers are reported as unsupported in `SUMMARY`.
- **Germany, the Netherlands, Spain, Italy and others** are covered only for companies that hold an LEI. Those registers have no free official API.
- **Activity descriptions:** France and Czechia return codes without descriptions. Norway, Finland and Poland include them.
- **Speed:** the Actor respects each register's rate limits (for example, at most about 1 GLEIF request per second). Expect roughly 1–3 seconds per company with LEI matching on. Turn LEI matching off for faster bulk runs.

### Related Actors

- [UK Companies House](https://apify.com/postatelier/uk-companies-house): UK company profiles, SIC codes, filings and daily new incorporations.
- [Secretary of State Business Entity Search](https://apify.com/postatelier/us-business-entities): US companies from nine state registries.
- [Public Tenders & Procurement](https://apify.com/postatelier/public-tenders-feed): EU, UK and US government tenders and contract awards.

### FAQ

**Where does the data come from?** Every source is an official open-data API published for re-use, under the licences listed above. The Actor doesn't log in anywhere, solve CAPTCHAs or scrape third-party sites.

**How fresh is the data?** It's queried live from each register at run time (`retrievedAt`).

**Can you add country X?** Open an issue. Countries with an official open API (Belgium, Estonia, Denmark) are on the roadmap. For the UK, use our [UK Companies House](https://apify.com/postatelier/uk-companies-house) Actor.

**What if a register is down?** The other registers keep working. A query whose register is unavailable returns a free record with `status: "source_unavailable"`, so you can retry just that one. Filter on `status` before importing results into a spreadsheet or CRM.

**Something looks wrong.** Open an issue with the query. A health check runs against every source daily, and we aim to fix breakages within a day.

# Actor input Schema

## `queries` (type: `array`):

One company per line. Use a company name, a national registry number (SIREN/SIRET, Norwegian organisasjonsnummer, Finnish Y-tunnus, Czech IČO, Polish KRS), an EU VAT number (FR…, FI…, CZ…, NO…MVA) or a 20-character LEI. Prefix a name with a country code to search only there, e.g. "FR: Decathlon".

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

Which registries to search for company names. ID, VAT and LEI lookups always go to the matching registry, whatever is selected here. "Other countries via GLEIF" adds companies anywhere in the world that hold an LEI (e.g. Germany, Netherlands, Italy, Spain).

## `maxResultsPerQuery` (type: `integer`):

For name searches: how many best-matching companies to return per query (across all selected registries). ID, VAT and LEI lookups return the single matching company.

## `includeLei` (type: `boolean`):

Find each company's Legal Entity Identifier in the GLEIF index and add it to the record. Free; adds about one second per company.

## `checkVat` (type: `boolean`):

Check each company's VAT number against the European Commission's VIES service and add the result (valid / invalid / unavailable). Charged per check.

## `onlyActive` (type: `boolean`):

Skip companies that are dissolved, deleted or ceased.

## `selfCheck` (type: `boolean`):

Maintainer health check of all sources. Leave off.

## Actor input object example

```json
{
  "queries": [
    "Decathlon",
    "923609016",
    "CZ00177041",
    "FI01120389"
  ],
  "countries": [
    "FR",
    "NO",
    "FI",
    "CZ",
    "PL",
    "LEI"
  ],
  "maxResultsPerQuery": 3,
  "includeLei": true,
  "checkVat": false,
  "onlyActive": false,
  "selfCheck": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "queries": [
        "Decathlon",
        "923609016",
        "CZ00177041",
        "FI01120389"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("postatelier/eu-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 = { "queries": [
        "Decathlon",
        "923609016",
        "CZ00177041",
        "FI01120389",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("postatelier/eu-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 '{
  "queries": [
    "Decathlon",
    "923609016",
    "CZ00177041",
    "FI01120389"
  ]
}' |
apify call postatelier/eu-company-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,postatelier/eu-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/00MmJyw4Z3ubf7lwC/builds/VaPdxZ9kZgC7Qay6D/openapi.json
