# EU Company Register: UK, FR, NO, FI, PL, CZ, SK, IE, RO, CH (`mikee368/eu-company-register-lookup`) Actor

Look up companies by name or registration number in official registers (UK, France, Norway, Finland, Poland, Czechia, Slovakia, Ireland, Romania, Switzerland, GLEIF) and confirm an EU VAT number on VIES when a state has no free register. Company data only.

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

## Pricing

$3.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

## EU Company Register Lookup: UK, France, Norway, Finland, Poland, Czechia, Slovakia, Ireland, Romania, Switzerland and LEI

**Look up companies by name or registration number in official business registers and get one clean, ranked row per company.** The registers are UK Companies House, French SIRENE, Norwegian Brønnøysund, Finnish PRH/YTJ, the Polish KRS open API and VAT white list, Czech ARES, Slovak RPO, Irish CRO open data, Romanian ANAF, the Swiss UID register, and the global GLEIF LEI register. An EU VAT number for a state with no free register is confirmed on VIES. Use it for KYB and supplier checks, CRM enrichment, LEI lookups and data cleaning.

### What does EU Company Register Lookup do?

It queries each register's **official public API** and maps the answers to one schema: legal name, registration number, **LEI**, legal form (local and English where available), entity type, status, incorporation date, industry code, registered address, VAT number and former names, plus a link to the official record.

| Register | Country | Lookup by | Access |
|---|---|---|---|
| Companies House | 🇬🇧 UK | name, company number | Official API, **free key required** |
| SIRENE / RNE (recherche-entreprises.api.gouv.fr) | 🇫🇷 France | name, SIREN, SIRET, FR VAT | Official API, no key |
| Enhetsregisteret (Brønnøysund) | 🇳🇴 Norway | name, org.nr., NO…MVA | Official open data API, no key |
| PRH / YTJ | 🇫🇮 Finland | name, Y-tunnus, FI VAT | Official open data API, no key |
| KRS and the VAT white list | 🇵🇱 Poland | NIP, KRS, REGON (not by name) | Official open APIs, no key. White list: about 100 searches per day |
| ARES | 🇨🇿 Czechia | name, IČO | Official REST API, no key |
| RPO (Statistical Office) | 🇸🇰 Slovakia | name, IČO | Official API, no key. **CC BY 4.0** |
| CRO open data | 🇮🇪 Ireland | name, company number | CKAN open data, no key. **CC BY 4.0**. A daily snapshot, not the live register |
| ANAF fiscal register | 🇷🇴 Romania | CUI only (prefix `RO` when the digits also match another country) | Official API, no key. At most 100 CUI per request and 1 request per second |
| UID register | 🇨🇭 Switzerland | name, UID | Official SOAP search, no key. 20 requests per minute |
| VIES | 🇪🇺 EU and XI | VAT number, only when that state has no free register selected | European Commission, no key |
| GLEIF | 🌍 Global | name, LEI, national reg. number | Official API, no key |

### Why use it?

- **Ranked, relevant results.** For each query you get the best matches only: exact name first, then names that start with your query, then whole-word matches. Every row has a `relevance` score (0–100) and a `matchType`. The default **strict** mode skips look-alikes such as Finnish housing companies named after the town of Nokia when you search "nokia".
- **Companies only by default.** Works councils (CSE), trade unions, associations, foundations, housing companies, funds and public bodies are filtered out. Switch on *Include non-company entities* if you need them; `entityType` labels every row.
- **Name or number.** Paste names, SIREN/SIRET, French or Finnish VAT numbers, Norwegian org numbers, Y-tunnus, UK company numbers, Polish NIP, KRS or REGON, Czech or Slovak IČO, an Irish CRO number, a Romanian CUI, a Swiss UID, an EU VAT number, or LEIs. Numbers are validated by check digit and sent only to the right register, plus GLEIF to find the LEI. Poland and Romania have no free name search. A VAT number for a state with no free register is confirmed on VIES and returned as one row.
- **Tax-id fields.** Rows whose number the shared checker recognises also include `taxIdNormalized`, `taxIdCountry`, `taxIdType`, `taxIdKind`, `formatValid`, `checkDigitValid`, `existence` and `existenceSource`. Existing fields are unchanged.
- **LEI included.** GLEIF matches are merged into the national row (one row per company, with `sources: ["NO_BRREG","GLEIF_LEI"]`). The optional *Add LEI to national results* looks up every national result in GLEIF by its registration number.
- **Readable legal forms.** Legal forms are named from the official ISO 20275 ELF code list (3,599 codes) and the INSEE list of French legal categories (260 codes), both bundled.
- **Privacy-first.** Company data only: no directors, officers, owners or birth dates. Sole traders are excluded by default.

### How to use it

1. Add company names and/or registration numbers to **queries**.
2. Choose **registers**. For the UK, paste your free Companies House API key.
3. Optionally set **Max results per query**, **Name matching** (strict / balanced / loose), **Only active**, **Incorporated on or after** and **Add LEI**.
4. Run, then export to CSV/Excel/JSON or connect Google Sheets, Make, Zapier or your CRM.

### Input example

```json
{
  "queries": ["923609016", "FR51306138900", "nokia"],
  "sources": ["FR_SIRENE", "NO_BRREG", "FI_PRH", "GLEIF_LEI"],
  "maxResultsPerQuery": 3,
  "matchMode": "strict",
  "enrichLei": true
}
```

### Output example

```json
{
  "source": "FI_PRH",
  "sources": ["FI_PRH", "GLEIF_LEI"],
  "country": "FI",
  "registrationNumber": "1234567-8",
  "lei": "5299000EXAMPLE000001",
  "leiSource": "GLEIF (enriched by registration number)",
  "name": "Example Oyj",
  "entityType": "company",
  "legalForm": "Julkinen osakeyhtiö",
  "legalFormEn": "Public limited company",
  "status": "active",
  "incorporationDate": "1990-01-01",
  "industryCode": "26300",
  "city": "ESPOO",
  "vatNumber": "FI12345678",
  "vatDerived": true,
  "relevance": 100,
  "matchType": "exact",
  "sourceUrl": "https://tietopalvelu.ytj.fi/yritys/1234567-8",
  "query": "example"
}
```

`vatDerived: true` means the VAT number was computed from the registration number (Finland, France) and not checked against VIES. Norwegian VAT numbers are only given when Brønnøysund flags the company as VAT-registered (`vatDerived: false`).

### How much does it cost?

Pay per result: **$3 per 1,000 company records** ($0.003 per record), with no start fee and no monthly rent. A run that checks 200 suppliers and keeps one match each costs about $0.60. Normal Apify platform usage applies. LEI enrichment and merging don't add rows, so they cost nothing extra.

### Limitations

- **Name search starts with each register's own search engine.** The Actor re-ranks and filters what the register returns (25–100 candidates per query), so a company deep in a register's results may be missed. Use registration numbers when you have them.
- **Ties.** Among equal-relevance matches, active, larger, shorter-named and older companies come first. Large groups have many subsidiaries, so raise *Max results per query* if you need them all.
- **Legal-form names in English** are available for Finland, for GLEIF forms whose ELF entry has an English name, and for the UK. France and Norway use local names.
- **The UK register is skipped** without a Companies House API key.
- **LEI enrichment** is limited by GLEIF's fair-use rate (~60 requests/minute), so it adds about 1 second per company.
- No officers, shareholders or financial statements (by design).
- **Duplicates across queries.** If two of your queries find the same company, it is returned (and charged) once, for the first query. `RUN_SUMMARY` shows `duplicatesAcrossQueries`.
- **Partial results are kept.** Results are saved after each query, so a timeout or abort keeps everything found so far. If your maximum charge per run is reached, the remaining queries are not run (`queriesNotRunDueToChargeLimit` in `RUN_SUMMARY`).

### Data sources and licences

- Companies House: UK Open Government Licence (API key and rate limits apply).
- France: recherche-entreprises.api.gouv.fr (DINUM), with data from INSEE SIRENE and INPI RNE under an open licence. Legal-form names: INSEE catégories juridiques.
- Norway: Brønnøysundregistrene open data, NLOD licence. Records removed for legal reasons (HTTP 410) are never returned.
- Finland: PRH open data. Source: Finnish Patent and Registration Office (PRH). PRH/YTJ logos are not used.
- Czechia: Ministry of Finance ARES public service.
- Slovakia: Statistical Office of the Slovak Republic, Register of Legal Entities (RPO). **CC BY 4.0** (https://creativecommons.org/licenses/by/4.0/).
- Ireland: Companies Registration Office open data on opendata.cro.ie. **CC BY 4.0** (https://creativecommons.org/licenses/by/4.0/). This is a published snapshot, not a live CRO extract.
- Romania: ANAF PlatitorTva API, by CUI. At most 100 CUI per request and one request per second.
- Switzerland: Federal UID register public web service. 20 requests per minute.
- VIES: European Commission VAT existence check. Some states return a name and address and some do not. A VIES row is `vat-only`.
- GLEIF: LEI data and the ELF code list under CC0. This Actor is not affiliated with or endorsed by GLEIF.

### Coverage matrix

Each row has `coverageLevel`. It is the depth of that source, not a promise that every field is filled.

| Coverage | Countries | Source | Lookup |
|---|---|---|---|
| `full` | GB | Companies House | name and number; free key required |
| `full` | FR, NO, FI | SIRENE, Brønnøysund, PRH | name and number |
| `full` | CZ, SK, IE, CH | ARES, RPO, CRO open data, UID | name and number. SK and IE are CC BY 4.0 |
| `id-only` | PL, RO | KRS / white list, ANAF | number only |
| `vat-only` | AT, BE, BG, HR, CY, DK, EE, DE, GR, HU, IT, LV, LT, LU, MT, NL, PT, SI, ES, SE, XI | VIES | VAT number only. Greece is queried as EL |
| `lei-only` | IS, LI, and any entity with no selected register | GLEIF | only when the entity has an LEI |

Germany, Italy, Spain, Portugal, Hungary, Luxembourg, Malta, Iceland and Liechtenstein have no free per-company API in this Actor. A VAT number from an EU state in that list can still come back from VIES. Paid registers are not called.

### FAQ

**Is it legal?** Yes. Every source is an official open-data API published for reuse, and the Actor outputs company-level data only.
**Why fewer rows than other tools?** Strict mode gives you the companies you asked for, not every entity whose address or side name contains the word. Use `matchMode: "loose"` and *Include non-company entities* to see everything.
**More countries?** Denmark, Estonia, Belgium and others need a free sign-up or a bulk file. States with no free register stay on VIES or GLEIF. Tell us which you need.

# Actor input Schema

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

Company names or registration numbers, one per line. Recognised IDs (validated by check digit): SIREN/SIRET or FR VAT, Norwegian org.nr. or NO…MVA, Y-tunnus or FI VAT, UK company number, LEI, Polish NIP/REGON/KRS, Czech IČO, Slovak IČO, Irish CRO number, Romanian CUI, Swiss UID, and an EU VAT number (VIES) for a state with no free register. IDs go only to the matching register. Names go to every selected register that supports name search. Poland and Romania have no free name search.

## `sources` (type: `array`):

Which official registers to query.

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

Best-ranked matches kept for each query in each register (exact name first, then names starting with the query, then whole-word matches).

## `maxItemsPerSource` (type: `integer`):

Overall cap per register across all queries, which also caps cost.

## `matchMode` (type: `string`):

strict = exact, starts-with or whole-word name matches only (relevance ≥ 75); balanced = also partial words such as 'Nokian …' for 'nokia' (≥ 50); loose = everything the register's search returns.

## `includeNonCompanies` (type: `boolean`):

Also return associations, foundations, works councils (CSE), trade unions, housing companies, funds and public bodies. Off by default.

## `excludeSoleTraders` (type: `boolean`):

Skip one-person businesses (e.g. Norwegian ENK, French entrepreneur individuel), whose names are personal data. Recommended for GDPR.

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

Drop dissolved, struck-off, bankrupt or lapsed entities.

## `dateFrom` (type: `string`):

Optional. Only companies registered/incorporated on or after this date (YYYY-MM-DD). Useful for new-company lead lists.

## `enrichLei` (type: `boolean`):

Look up each national result in GLEIF by its registration number and add the LEI (free, no key; GLEIF allows ~60 requests/minute, so this adds ~1 s per company).

## `mergeDuplicates` (type: `boolean`):

If GLEIF returns a company that a national register already returned (same LEI or registration number), keep one row: the national data plus the LEI, with 'sources' listing both.

## `companiesHouseApiKey` (type: `string`):

Free key from developer.company-information.service.gov.uk. Without it the UK register is skipped.

## Actor input object example

```json
{
  "queries": [
    "nokia",
    "923609016"
  ],
  "sources": [
    "GLEIF_LEI"
  ],
  "maxResultsPerQuery": 2,
  "maxItemsPerSource": 5,
  "matchMode": "strict",
  "includeNonCompanies": false,
  "excludeSoleTraders": true,
  "onlyActive": false,
  "enrichLei": false,
  "mergeDuplicates": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one row per company record

## `summary` (type: `string`):

Per-register status, counts and the effective input

# 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": [
        "nokia",
        "923609016"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikee368/eu-company-register-lookup").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": [
        "nokia",
        "923609016",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mikee368/eu-company-register-lookup").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": [
    "nokia",
    "923609016"
  ]
}' |
apify call mikee368/eu-company-register-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mikee368/eu-company-register-lookup"
        }
    }
}
```

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/CElk9RDSsbdivBvvK/builds/lPBCsppmM8t8lvOJm/openapi.json
