# Company Registry Lookup – KYB Data from 8 Countries + LEI (`gazidev/company-registry-lookup`) Actor

Look up companies by name or registry number across official open registries: France, Norway, Finland, Czechia, Estonia, UK, Brazil, 6 US states and the global GLEIF LEI index. One normalized schema: status, address, legal form, incorporation date, officers, LEI, source and licence.

- **URL**: https://apify.com/gazidev/company-registry-lookup.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **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 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

## Company Registry Lookup – Official KYB Data from 8 Countries + LEI

**Company Registry Lookup** searches official, open **company registers** with one input and returns **one normalized schema**. Enter company names or registry numbers. The Actor queries France (SIRENE/RNE), Norway (Brønnøysund), Finland (PRH/YTJ), Czechia (ARES), Estonia (e-Business Register), the United Kingdom (Companies House), Brazil (CNPJ), six US Secretary-of-State / state registers and the global **GLEIF LEI index**.

It is an open-data alternative to North Data and OpenCorporates scrapers. Every row comes from the government registry itself (or GLEIF) and carries its `source` and `licence`, so you can show where the data came from in KYB and compliance files.

### What you get for each company

| Field | Example |
|---|---|
| `name`, `otherNames` | EQUINOR ASA |
| `country`, `countryCode`, `registry`, `registryId` | Norway, NO, Enhetsregisteret, 923609016 |
| `legalForm`, `legalFormCode` | Allmennaksjeselskap, ASA |
| `status`, `isActive` | Active, true |
| `incorporationDate`, `dissolutionDate` | 1972-09-18 |
| `address`, `street`, `postalCode`, `city`, `region` | Forusbeen 50, 4035 STAVANGER |
| `activityCodes[]` | NACE / NAF / SIC / CNAE / NAICS code + description |
| `vatId`, `lei`, `website`, `employees` | NO923609016MVA, OW6OFBNCKXC4US5C7523 |
| `officers[]` (optional) | name, role, type, since |
| `registryUrl`, `sourceUrl`, `source`, `licence`, `fetchedAt` | links back to the official record |

### Coverage and search modes

| Code | Registry | Name search | Number lookup | Officers |
|---|---|---|---|---|
| FR | SIRENE / RNE via recherche-entreprises.api.gouv.fr | yes | SIREN, SIRET, FR VAT | yes (dirigeants) |
| NO | Enhetsregisteret, data.brreg.no | yes | org number, NO…MVA | yes (roles) |
| FI | PRH YTJ open data API | yes | Business ID 1234567-8, FI VAT | – |
| CZ | ARES (incl. commercial register) | yes | IČO, CZ VAT | yes (statutory body) |
| EE | e-Business Register **open-data bulk file** | yes | registry code, EE VAT | – |
| GB | Companies House Basic Company Data (monthly snapshot) | – | company number | – |
| BR | Receita Federal CNPJ open data (Minha Receita) | – | CNPJ | yes (QSA partners) |
| US | NY, CO, CT, OR, PA, TX state open-data portals | name starts with | `US-NY:<id>` etc. | NY, CT, OR, PA |
| GLOBAL | GLEIF LEI index | yes (legal name) | LEI | – |

**Not covered:** Germany (Handelsregister), Austria, Switzerland (Zefix blocks robots) and the Netherlands (KvK is a paid API). Entities from these countries that hold an LEI are found through `GLOBAL`. Canada is planned.

### How identifiers are detected

Numbers are checked against each country's check-digit rules and are only looked up where they are valid. For example, a 9-digit number is checked as a French SIREN (Luhn) and a Norwegian org number (mod 11). An 8-digit number is tried as a UK company number, a Czech IČO (mod 11) and an Estonian code. To pick the registry yourself, add a prefix: `FR:`, `NO:`, `FI:`, `CZ:`, `EE:`, `GB:`, `BR:`, `LEI:`, `US-NY:`.

### Input example

```json
{
  "queries": ["Equinor ASA", "Nokia Oyj", "CZ:00177041", "GB:00445790", "33.000.167/0001-01"],
  "countries": [],
  "maxResultsPerSource": 3,
  "nameMatch": "all-words",
  "includeOfficers": true,
  "includeLei": true
}
```

### Output example

```json
{
  "query": "CZ:00177041", "matchType": "id", "country": "Czechia", "countryCode": "CZ",
  "registry": "ARES - Administrative Register of Economic Subjects (incl. Public/Commercial Register)",
  "registryId": "00177041", "name": "Škoda Auto a.s.", "legalForm": "Joint-stock company (a.s.)",
  "status": "Active", "isActive": true, "incorporationDate": "1990-11-20",
  "address": "tř. Václava Klementa 869, Mladá Boleslav II, 29301 Mladá Boleslav",
  "vatId": "CZ00177041", "lei": "529900I8XOZDM4ZQSQ21",
  "officers": [{"name": "Holger Peters", "role": "člen představenstva", "type": "person", "since": "2023-06-01"}],
  "registryUrl": "https://ares.gov.cz/ekonomicke-subjekty?ico=00177041",
  "licence": "Public open data (ARES terms of operation) - Source: ARES, Ministry of Finance CZ"
}
```

The run summary (key-value store record `OUTPUT`) lists results per registry, IDs that were not found, warnings and the licence attribution for every registry used.

### Use cases

- **KYB / customer onboarding:** check that a company exists, is active and is registered at the address it gave you.
- **Supplier and credit checks:** incorporation date, legal form, status and directors in one call.
- **Data enrichment:** add VAT ID, LEI, activity code and website to a CRM list.
- **M\&A and research:** find every registered entity that matches a group name across countries.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Company returned (`company`) | **$0.002** |
| Officers included for a company (`company-officers`) | $0.001 |
| LEI matched for a company (`lei-match`) | $0.0005 |

You pay nothing for IDs that are not found, for invalid input or for error rows. The run stops cleanly at your maximum charge.

| Alternative on Apify Store | Price per company |
|---|---|
| North Data scrapers | $0.0035 – $0.008 |
| Pappers / SIRENE scraper (FR only) | $0.008 |
| business-registry-intel | $0.008 + $0.012 officers |
| **Company Registry Lookup** | **$0.002** (+ $0.001 officers) |

### Use with AI agents (Apify MCP)

Add the Actor to Claude, Cursor or any MCP client through the [Apify MCP server](https://mcp.apify.com) (`gazidev/company-registry-lookup`). An agent can then answer questions like "Is Škoda Auto a.s. active, and who sits on its board?" from official registry data, with the source URL and licence included in each answer.

### FAQ

**Is this scraping?** No. Every source is an official open-data API or bulk file published for reuse. We respect each source's rate limits (for example, GLEIF 60 requests per minute and ARES fair use). Estonia is read only from the published bulk file, never from the ariregister web API.

**Why is a UK search by name not possible?** UK data comes from the monthly Companies House bulk snapshot. This version supports lookup by company number only.

**How fresh is the data?** FR, NO, FI, CZ, BR, US and GLEIF are queried live. The Estonian file is updated daily. The UK snapshot is monthly; its date is in `otherIds.dataSnapshot`.

**Officer names are personal data.** They are returned only when `includeOfficers` is on. Use them only for a lawful purpose (for example KYB or AML under GDPR/LGPD). Birth dates and home addresses are never returned.

**Licences.** France: Licence Ouverte 2.0. Norway: NLOD 2.0. Finland and Estonia: CC BY 4.0. UK: OGL v3. GLEIF: CC0. Czechia, Brazil and the US: public government open data. Keep the `source`/`licence` fields when you republish.

# Actor input Schema

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

One per line. A company name is searched in every selected registry. A registry number is detected automatically (check digits) and looked up only where it is valid: FR SIREN/SIRET/VAT, NO org number, FI Business ID (1234567-8), CZ IČO, EE registry code or VAT, UK company number, BR CNPJ, LEI. Add a prefix to be explicit: FR:, NO:, FI:, CZ:, EE:, GB:, BR:, LEI:, US-NY: (also US-CO, US-CT, US-OR, US-PA, US-TX).

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

Leave empty for all. GB (UK) and BR (Brazil) support registry-number lookup only; all others also support name search. GLOBAL = GLEIF LEI index (worldwide, incl. Germany, Austria, Switzerland and the Netherlands for entities that hold an LEI).

## `usStates` (type: `array`):

US state registers to search when US is selected. Leave empty for all six.

## `maxResultsPerSource` (type: `integer`):

Name searches return at most this many best matches from each registry (US: per state). ID lookups always return the one company.

## `nameMatch` (type: `string`):

all-words: every word of your query appears in the company name (best for KYB). starts-with: name begins with your query. exact: same name (ignoring case, accents and punctuation).

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

Skip dissolved, deleted or closed companies in name searches.

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

Adds current directors, board members, partners or officers where the registry publishes them (FR, NO, CZ, BR, US CT/OR/PA/NY). Personal data: use only for a lawful purpose (GDPR/LGPD). Charged per company that has officers.

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

Looks up the Legal Entity Identifier of each national-registry result in the GLEIF index (same country + registration number). Charged per match found.

## Actor input object example

```json
{
  "queries": [
    "Equinor ASA",
    "Nokia Oyj",
    "CZ:00177041",
    "GB:00445790"
  ],
  "maxResultsPerSource": 3,
  "nameMatch": "all-words",
  "activeOnly": false,
  "includeOfficers": false,
  "includeLei": false
}
```

# Actor output Schema

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

No description

## `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": [
        "Equinor ASA",
        "Nokia Oyj",
        "CZ:00177041",
        "GB:00445790"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/company-registry-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": [
        "Equinor ASA",
        "Nokia Oyj",
        "CZ:00177041",
        "GB:00445790",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("gazidev/company-registry-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": [
    "Equinor ASA",
    "Nokia Oyj",
    "CZ:00177041",
    "GB:00445790"
  ]
}' |
apify call gazidev/company-registry-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gazidev/company-registry-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/ee7PHDXH3Nz9c05Lu/builds/oC2dGHwtFpkG7Xa87/openapi.json
