# Company Registry Lookup: LEI, Norway, Czechia, Finland (`mmdincer/company-registry-lookup`) Actor

Weekly lists of newly registered companies (UK Companies House with your API key, Norway, Finland, GLEIF). France has name and SIREN search and is not in the new-company list. Czechia and Poland lookup too. Company data only. Not affiliated with any registry.

- **URL**: https://apify.com/mmdincer/company-registry-lookup.md
- **Developed by:** [Muhammet Mustafa Dincer](https://apify.com/mmdincer) (community)
- **Categories:** AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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: weekly new-company lists from official registers, including UK Companies House with your own API key](https://api.apify.com/v2/key-value-stores/vbQuJ5uhWVgUngr57/records/company-registry-banner.png?signature=147o8vvXHO8hQopAM5vrV)

### What is Company Registry Lookup?

**Company Registry Lookup** builds a **weekly list of newly registered companies** from official registers, and it can also search by name or look a company up by its registration number. Every company comes back as one **normalized company record**, with the register's own id and the time the row was read.

The weekly list covers:

- **Norway**: Enhetsregisteret, run by the Bronnoysund Register Centre (BRREG);
- **Finland**: the open data of the Patent and Registration Office (PRH, the YTJ business information system);
- **GLEIF**: the Global LEI Index, worldwide, companies that received a Legal Entity Identifier in the window;
- **United Kingdom**: Companies House, when you paste your own free API key. The Actor reads company profiles only.

Name search and number lookup also cover **France** (Annuaire des Entreprises), **Czechia** (ARES) and **Poland** (KRS, by number only). France has name and SIREN search, and is not in the new-company list (the open search has no incorporation-date filter).

Each row has the same fields: `registryId`, registered name, legal form, **normalized status**, address, founding and registration dates, industry codes, identifiers, licence, attribution, a link to the record at the register, and `fetchedAt`.

**Company-level data only.** The Actor never reads officers, directors, partners, shareholders, beneficial owners or filings, and it leaves out sole traders and other legal forms that identify a natural person.

A lookup of four companies in four registers, with their LEIs added, took 8 seconds on the platform.

![Real run: four registers, one schema](https://api.apify.com/v2/key-value-stores/vbQuJ5uhWVgUngr57/records/company-registry-sample-output.png?signature=1fDO6FVbCeNCsACtVMS1P)

### Quick answer: when should you (or an AI agent) pick this Actor?

**Pick this Actor when** you want a **weekly lead list of newly registered companies** in Norway, Finland and GLEIF, and in the UK once you add your free Companies House key. The same Actor does KYB pre-checks ("does this company exist, is it active, what is its legal form") and CRM enrichment for France, Czechia, Poland and the others. Every row carries the register's own id (`registryId`), the time it was read (`fetchedAt`), the licence and a link to the register record.

**Pick something else when** you need **officers, owners, financial statements, credit scores or filings**: this Actor does not return people and does not read filings. **Brazil is not included**, and neither is any country not listed here (see "Which registers are covered?"). Poland's open API has **no name search**, so Polish companies are found by KRS number only. France is name and SIREN lookup, not a new-company feed.

**Defaults that work:** schedule `{"mode": "new", "sinceDays": 7, "onlyNew": true, "registries": ["brreg", "prh"]}` for the weekly list. Add `"companies-house"` and your `companiesHouseApiKey` to include the UK. To verify known numbers, send `{"mode": "lookup", "identifiers": ["NO:923609016", "GB:00445790", "FR:552032534"], "linkLei": true}`. To search by name, send `{"mode": "search", "queries": ["Equinor"]}`.

### At a glance

| | |
|---|---|
| **Does** | Weekly lists of newly registered companies (Norway, Finland, GLEIF, and the UK with your key); name search and number lookup, including France (name and SIREN only, not a new-company list); normalized status, legal form, address, industry and identifiers; optional LEI on national records; skips companies an earlier run already delivered |
| **Input** | `mode` (`new`, `search`, `lookup`), `queries` (up to 100 names), `identifiers` (up to 500 numbers). Optional: `registries`, `companiesHouseApiKey`, `maxResultsPerQuery`, `onlyActive`, `includeFunds`, `gleifCountries`, `linkLei`, `sinceDays`, `onlyNew`, `stateName` |
| **Output** | `recordType: "company"` and `"source"` rows in one dataset, plus `RUN_SUMMARY` in the key-value store. Every company row has `registryId` and `fetchedAt` |
| **Needs** | Nothing for France, GLEIF, Norway, Czechia, Finland and Poland. The UK needs your own free Companies House API key. No proxy |
| **Registers** | UK Companies House (your key), France, GLEIF (worldwide), Norway, Czechia, Finland, Poland |
| **Speed** | Measured on the platform for the keyless registers: 421 companies from 20 name searches in 30 s; 300 new companies in 16 s. UK calls stay under Companies House's 600 requests per 5 minutes |
| **Pricing** | Pay per event: $0.003 per delivered company, $0.001 per LEI added (only when you turn it on and one exists), $0.0005 per run, on the Free plan. Same price for the UK and France |
| **Does not** | Return officers, owners or other people, read filings or accounts, search Polish names, list new French companies, cover Brazil or any country not listed |

### Key terms used in this README

- **Register (registry):** the official source of company records: Companies House (UK), Annuaire des Entreprises (France), GLEIF, BRREG (Norway), ARES (Czechia), PRH (Finland) and KRS (Poland).
- **Company row:** a dataset row with `recordType: "company"`: one company with the same fields in every register.
- **Source row:** a dataset row with `recordType: "source"`: one per company name, registration number or register that was read, with what was found, delivered and left out, and why anything failed. Never charged.
- **LEI:** Legal Entity Identifier, a 20-character global company ID kept by GLEIF. Many large companies have one; most small ones do not.
- **Registration number:** the ID the national register uses: company number (UK, `GB:00445790` or `SC123456`), SIREN (France, 9 digits, prefix `FR:`), organisation number (Norway, 9 digits), IČO (Czechia, 8 digits), business ID or Y-tunnus (Finland, `0112038-9`), KRS number (Poland, 10 digits). An 8-digit number without a prefix is a Czech IČO. A 9-digit number without a prefix is Norwegian.
- **Normalized status:** `active`, `in_liquidation`, `in_restructuring`, `insolvency`, `dissolved`, `inactive` or `unknown`, mapped from each register's own wording; the original wording stays in `statusDetail`.
- **Private person (left out):** a sole trader, private individual, estate or foreign unit whose register entry identifies a natural person. These are never requested and never delivered.
- **Add the LEI (`linkLei`):** for records from the national registers, including the UK and France, the Actor asks GLEIF for the LEI registered under the same national number and adds it.
- **Saved state (`onlyNew`):** the run remembers the companies it delivered in a named key-value store and skips them next time.

### What can you use it for?

#### KYB pre-checks and onboarding

Look up the registration number a customer or supplier gave you. The row tells you whether the company exists, its registered name and address, legal form, `status` and `ceasedAt`, with a `sourceUrl` you can open to confirm at the register. This is a data lookup, not a compliance decision: see the legal section.

#### CRM and supplier-list enrichment

Send names with `mode: "search"`, or numbers with `mode: "lookup"`, and join the result on `registry` plus `registryId`. Turn on `linkLei` to get the LEI where one exists, so records line up with other datasets that use LEIs.

#### Weekly lists of new companies

This is the run to schedule. `mode: "new"` lists companies registered in the last 1 to 90 days in GLEIF, Norway and Finland, and in Companies House when your API key is set. With `onlyNew: true` and a `stateName`, the run delivers only companies you have not received before: a lead list, not a repeat of last week's search.

#### Cross-border analysis

Industry codes (SIC, NAF, NACE, TOL, PKD), legal forms, dates and capital use the same field names in every register, so a table of UK, French, Norwegian, Czech, Finnish and Polish companies needs one parser.

#### Feeding an AI agent

Rows are flat, typed and carry their own licence and attribution. An agent can look up a company by number and cite `sourceUrl`.

### How does it work?

1. You choose a mode and give company names or registration numbers.
2. The Actor sends each request to the register's official API, one request at a time per register and at a measured pace (GLEIF about 1 per second, the national registers 1 to 3 per second, Companies House under 600 requests per 5 minutes). The UK call sends your API key as HTTP Basic authentication and only to Companies House. France is asked for the company and its registered office, not for officers. The user agent names this Actor.
3. Each answer is normalized to the same fields. Legal forms that identify a natural person are left out before anything is stored. Officer and beneficial-owner payloads are never requested.
4. Duplicates inside the run, and companies delivered in an earlier run when `onlyNew` is on, are removed.
5. If `linkLei` is on, the national numbers of the delivered companies are sent to GLEIF in batches to find their LEIs.
6. Company rows are written (and charged), one source row per job is written (free), and a run summary is saved.

If a register answers **403** or **429**, the Actor waits where the register asks and tries again at most twice. If that fails, it **stops using that register for the rest of the run**, marks the remaining jobs `not_fetched` and keeps what it already delivered. It never rotates IP addresses or tries another route.

### How to look up a company by registration number (step by step)

1. Open the Actor and choose **Look up by registration number**.
2. Paste numbers, one per line: `GB:00445790`, `SC123456`, `FR:552032534`, `NO:923609016`, `CZ:00177041`, `FI:0112038-9`, `PL:0000019193` or a 20-character LEI. The prefix is optional when the shape is unambiguous. An 8-digit UK number and a 9-digit SIREN need `GB:` and `FR:`. A UK number also needs **UK Companies House API key**.
3. Keep **Add the LEI** on if you want the LEI of the national records.
4. Click **Start**. The default dataset has one `company` row per number and one `source` row per number.
5. Open the **Companies** view for the table, or the **Status and dates** view for status, dates, employees and capital.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | `search`, `lookup`, `new` | `search` | Search by name, look up by registration number, or list new companies. Schedule `new` for the weekly lead list |
| `queries` | list of text | none | Company names for `search`. Up to 100 |
| `identifiers` | list of text | none | Registration numbers for `lookup`, with an optional prefix. Up to 500 |
| `registries` | list of `gleif`, `brreg`, `ares`, `prh`, `krs`, `france`, `companies-house` | every keyless register that supports the mode | Which registers to use. The UK is added to that default only when `companiesHouseApiKey` is set. An explicitly chosen register that cannot do the mode gets a `not_supported` source row |
| `companiesHouseApiKey` | text, secret | empty | Your free Companies House API key. Required for the UK. Sent only to Companies House, not stored in the dataset, not written to the log. Leave empty to skip the UK |
| `maxResultsPerQuery` | integer, 1 to 2000 | 25 | Most companies delivered per name and register (per register in `new` mode) |
| `onlyActive` | boolean | false | Skip companies that are dissolved, in liquidation or bankrupt (search and new) |
| `includeFunds` | boolean | false | Include investment funds from GLEIF |
| `gleifCountries` | list of two-letter codes | worldwide | Limit GLEIF to the legal address country |
| `linkLei` | boolean | false | Add the LEI to records from the national registers |
| `sinceDays` | integer, 1 to 90 | 7 | `new` mode: registered in the last this-many days |
| `onlyNew` | boolean | false | Skip companies that an earlier run with the same `stateName` delivered |
| `stateName` | text | `company-registry-lookup-state` | Name of the key-value store that holds the saved state |

Prefilled input: lookup of four registration numbers with Add the LEI on.

### Output

One dataset holds two kinds of rows, told apart by `recordType`. Every company row has the same keys, so a table never has holes.

#### Company rows

| Field | Meaning |
|---|---|
| `registry`, `country` | Register that delivered the row (`Companies House`, `France`, `GLEIF`, `BRREG`, `ARES`, `PRH`, `KRS`) and the country of the legal address |
| `registryId` | The register's own identifier. With `registry` it is a stable key. On every company row |
| `lei` | The LEI, always for GLEIF rows, and for other rows when `linkLei` found one |
| `name`, `previousNames`, `otherNames` | Registered legal name and the other names the register reports |
| `legalForm` | `{code, name}` in the register's own wording |
| `entityCategory` | GLEIF category (`GENERAL`, `BRANCH`, `FUND`, `RESIDENT_GOVERNMENT_ENTITY`, `INTERNATIONAL_ORGANIZATION`), otherwise null |
| `status`, `statusDetail` | Normalized status and the register's own wording |
| `foundedAt`, `registeredAt`, `ceasedAt` | `YYYY-MM-DD`, or null when the register does not say |
| `address` | `{street, postalCode, city, region, country, formatted}` |
| `industry` | `[{code, description, scheme}]` with SIC 2007 (UK lookup and UK new-company lists), NAF Rev. 2 (France), NACE (Norway, Czechia), TOL 2008 (Finland) or PKD 2007 (Poland). A UK name search does not include SIC codes; look the company number up for those |
| `employees`, `capital`, `website` | When the register states them (employees: Norway; capital: Norway and Poland; website: Norway, Finland, Poland) |
| `identifiers` | `[{type, value}]`: national number, VAT, EUID, NIP, REGON, LEI |
| `lastUpdatedAt` | When the register last changed the entry, if it says |
| `sourceUrl` | The record in the register's open API |
| `license`, `attribution` | The licence and the attribution line to keep when you republish |
| `fetchedAt` | When the run read the record. On every company row, next to `registryId`, so the row can be cited |

#### Source rows

One per company name, registration number or register: `registry`, `mode`, `input`, `outcome` (`ok`, `empty`, `failed`, `not_supported`, `not_fetched`), `failureReason`, `message`, `httpStatus`, `found`, `totalInRegistry`, `delivered`, `duplicates`, `alreadySeen`, `excluded` (private persons left out), `leiLinked`, `truncated` and `durationMs`.

`truncated: true` means the register holds more matches than were delivered: the per-name limit, the register's own cap or your spending limit stopped the job.

#### Run summary

`RUN_SUMMARY` in the key-value store: jobs run, failed and not fetched, companies delivered per register, LEIs added, duplicates removed, companies skipped as already seen, private persons left out, registers stopped after a refusal, requests made per register and the first failures.

### Which registers are covered?

| Register | Name search | Lookup by number | New companies | Licence | What to know |
|---|---|---|---|---|---|
| **GLEIF** (worldwide) | Yes | LEI | Yes (by LEI registration date) | CC0 1.0 | Only companies with a LEI. About 60 requests per minute are allowed per user; the Actor stays below that |
| **Norway** (BRREG) | Yes | 9-digit organisation number | Yes | NLOD 2.0 | Sole proprietorships, private estates and foreign units registered for VAT are left out. Paging stops at 10,000 hits |
| **Czechia** (ARES) | Yes | IČO | No | ARES operating conditions | One search returns at most 1,000 matches: use a longer name. Natural-person legal forms are left out. ARES asks for no concurrent automated queries and no random enumeration; the Actor sends one query at a time and only the names you give it |
| **Finland** (PRH) | Yes | Business ID | Yes | CC BY 4.0 | No sole traders in the open data. Name search ranks the best name matches among the first 500 hits |
| **Poland** (KRS) | No | KRS number | No | Polish public sector information (open data act) | Only the company-level sections of the extract are read; the sections that name people are never read |
| **United Kingdom** (Companies House) | Yes | Company number (`GB:00445790`, `SC123456`) | Yes, by incorporation date | Open Government Licence v3.0 | Your own free API key. Company profile, company search and advanced company search only. Officers, people with significant control and filings are never requested. Paced under 600 requests per 5 minutes |
| **France** (Annuaire des Entreprises) | Yes | SIREN (`FR:`, 9 digits; a 14-digit SIRET is reduced to its SIREN) | No | Licence Ouverte 2.0 | The open search answered again on 2026-11-04. Requests ask for the company and its registered office (`minimal=true`), never officers. Sole traders (entrepreneur individuel) and other natural-person forms are left out. There is no incorporation-date filter, so France is not in the new-company list |

**Why not Brazil?** BrasilAPI publishes a `robots.txt` that disallows `/api/*` for automated clients and carries partner data, so this Actor does not use it. Other countries are simply not covered yet. Coverage stays on registers whose terms we checked and whose APIs answer with company-level data.

### How much does it cost?

The Actor uses pay-per-event pricing. On the Free plan:

| Event | Price | When it is charged |
|---|---|---|
| Actor Start | $0.0005 | Once per run (per GB of memory) |
| Company record | $0.003 | Per company row delivered |
| LEI added | $0.001 | Per LEI actually added when `linkLei` is on and GLEIF has one |

Source rows, the run summary and everything that does not deliver a company are free: failed or empty lookups, registers that refused the request, duplicates, companies already delivered in an earlier run (`onlyNew`), private persons left out. Paid plans get lower prices per company.

Measured examples on the platform (2026-11-04), at Free-plan prices:

| Run | Companies | Run time | You pay |
|---|---|---|---|
| 4 registration numbers in 4 registers with Add the LEI (the prefill): 4 LEIs found | 4 | 8 s | $0.0165 |
| 5 company names (Equinor, Skoda, Nokia, Telenor, Orlen) in 4 registers, up to 50 each | 421 | 30 s | $1.2635 |
| New companies of the last 2 days in GLEIF, Norway and Finland, 100 each, `onlyNew` | 300 | 16 s | $0.9005 |

UK and French companies use the same **company record** event at the same prices. The event description in the pricing file still names the original five sources; the price figures were not changed.

To cap spending, lower `maxResultsPerQuery` or set a maximum cost per run in the Apify run options. The Actor works out how many companies the limit still pays for and stops cleanly; remaining jobs are marked `not_fetched` with `limit_reached`.

### How does it compare with other company-registry Actors?

Checked on the Apify Store on 2026-11-04. Several Actors cover parts of this ground, and for one country or one register a specialised Actor may suit you better.

| | This Actor | `actor-forge/company-registry-lookup` | `postatelier/eu-company-registry` | `offgrid-labs/company-registry-lookup` |
|---|---|---|---|---|
| Registers (Store listing) | UK (your API key), France, GLEIF, Norway, Czechia, Finland, Poland | France, Norway, Finland, Czechia, Poland, Brazil, GLEIF | France, Norway, Finland, Czechia, Poland, LEI, EU VAT check | UK, France, Norway, Finland |
| Name search and number lookup | Yes, both (Poland by number only) | Yes (listing) | Yes (listing) | Yes (listing) |
| New companies mode | Yes (GLEIF, Norway, Finland, UK with your key) | Not documented | Not documented | Not documented |
| Only new since the last run | Yes (`onlyNew`) | Not documented | Not documented | Not documented |
| LEI linking for national records | Yes (`linkLei`) | Not documented | Not documented | Not documented |
| Officers | Never | Not documented | Not documented | Optional |
| Per-row licence and attribution | Yes | Not documented | "Open licences" (listing) | Not documented |
| Price per company (Free plan) | $0.003 | $0.001 | $0.004 | $0.003 |

In short: for **Brazil**, or for the **lowest price per record**, use one of the other Actors. This Actor stays at **$0.003** per company. If you need **a weekly list of new companies, company-level data only, the register's own id and the fetch time on every row, and LEI linking**, including the UK with your own key and France for name and SIREN lookup, this Actor is built for that. "Not documented" means the other Actor's listing does not mention the feature; it may still do it.

### Is it legal to use the registers this way?

**The Actor reads open data that official registers publish through their own public APIs for reuse.** Please read this section before you use the output for anything beyond research.

- It uses **only the documented APIs** of Companies House, the Annuaire des Entreprises, GLEIF, the Bronnoysund Register Centre, the Czech Ministry of Finance (ARES), the Finnish Patent and Registration Office (PRH) and the Polish Ministry of Justice (KRS). It does not scrape websites, log in, solve challenges or use proxies. The Companies House key is yours; the Actor does not supply one.
- It is polite: one request at a time per register, paced below each register's published or implied limit. On **403** it stops; on **429** it waits where the register asks and gives up after two waits.
- **Licences travel with the data.** Companies House data is Crown copyright under the Open Government Licence v3.0. French data is under the Licence Ouverte 2.0. GLEIF data is CC0 1.0. Norwegian data is under the Norwegian Licence for Open Government Data (NLOD 2.0) and Finnish data under CC BY 4.0: keep the `attribution` field when you republish. Czech data is used under the ARES operating conditions and Polish data as public sector information. Each row states its licence.
- **Company data only.** The Actor never reads officers, directors, partners, shareholders, beneficial owners or filings, and leaves out sole traders and other entries that identify a natural person. For Companies House that means the company profile, the company search and the advanced company search; `/officers` and `/persons-with-significant-control` are never called. For France the request is `minimal=true` with the company and its registered office only, and entrepreneur individuel entries are dropped. Care-of address lines (`c/o`, `v/`, and the Companies House `care_of` field) are removed because they often carry a person's name. Some French companies are marked as opposed to commercial prospecting; the open API still returns them, including large companies, and **you are responsible** for not using an opted-out company as a sales lead. A company's **registered legal name** is delivered as published, and some legal names contain a person's name (for example a partnership named after its partners). If you process such names, data-protection law (GDPR) may apply to you: **you are responsible for your use** and for complying with each register's terms and the law that applies to you.
- Registers can be wrong, late or incomplete, and the Actor maps statuses by rule. **Do not treat a row as a compliance, credit or legal decision.** Check the record at `sourceUrl` before you act on it.
- **Takedown:** if a register operator or a rights holder asks for something to be changed, removed or for access to stop, we will honour the request. Use the Issues tab of this Actor.

Not affiliated with, endorsed by or sponsored by Companies House, the Direction interministerielle du numerique, GLEIF, the Bronnoysund Register Centre, the Czech Ministry of Finance, the Finnish Patent and Registration Office or the Polish Ministry of Justice. No register logos are used.

### Using the API

#### MCP (AI agents)

**Apify MCP server (ChatGPT, Claude, Cursor and other MCP clients).** Connect `https://mcp.apify.com`, then:

1. `search-actors` with a query such as `new companies UK Companies House Norway Finland`.
2. `fetch-actor-details` for `mmdincer/company-registry-lookup` to read the input schema.
3. `call-actor` with, for example, `{"mode": "lookup", "identifiers": ["NO:923609016"], "linkLei": true}`.
4. `get-dataset-items` with the returned dataset id; keep the rows with `recordType: "company"`.

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('mmdincer/company-registry-lookup').call({
    mode: 'lookup',
    identifiers: ['NO:923609016', 'CZ:00177041', 'FI:0112038-9'],
    linkLei: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const companies = items.filter((item) => item.recordType === 'company');
console.log(companies[0].name, companies[0].status, companies[0].lei);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("mmdincer/company-registry-lookup").call(run_input={
    "mode": "search",
    "queries": ["Equinor"],
    "registries": ["brreg", "gleif"],
    "onlyActive": True,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
companies = [item for item in items if item["recordType"] == "company"]
print(companies[0]["name"], companies[0]["legalForm"]["name"], companies[0]["status"])
```

#### curl

```bash
curl -s -X POST "https://api.apify.com/v2/acts/mmdincer~company-registry-lookup/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "lookup", "identifiers": ["FI:0112038-9"], "linkLei": true}'
```

#### Monitoring: only new companies

Run once to record what exists, then schedule the same input with `onlyNew: true`:

```json
{
  "mode": "new",
  "sinceDays": 7,
  "registries": ["brreg", "prh"],
  "maxResultsPerQuery": 500,
  "onlyActive": true,
  "onlyNew": true,
  "stateName": "weekly-new-companies"
}
```

To include Companies House, add the register and your own key. The key is not written to the dataset:

```json
{
  "mode": "new",
  "sinceDays": 7,
  "registries": ["companies-house", "brreg", "prh"],
  "companiesHouseApiKey": "YOUR_COMPANIES_HOUSE_API_KEY",
  "maxResultsPerQuery": 100,
  "onlyActive": true,
  "onlyNew": true,
  "stateName": "weekly-new-companies"
}
```

The Actor reads deeper than it delivers when `onlyNew` is on, so a run does not miss companies when a register orders equal dates differently from one run to the next. Companies it could not deliver because of `maxResultsPerQuery` are not recorded and arrive in the next run. UK rows from this mode include the SIC code. A UK **name search** returns the search record (name, number, status, type, dates, address); look the company number up when you also need SIC codes and previous names.

### FAQ

#### Do I need an account, an API key or a proxy?

Not for France, GLEIF, Norway, Czechia, Finland or Poland, and the Actor does not use a proxy. The UK register needs **your own free Companies House API key** from [developer.company-information.service.gov.uk](https://developer.company-information.service.gov.uk/). Leave the key empty and the UK is skipped; the other registers still run.

#### Why is Poland lookup-only?

The KRS open API returns an extract by KRS number only; it has no name search and no list of new entries. The Actor reads only the company-level sections of the extract. Use `PL:0000019193` style numbers.

#### Why is France not in the new-company list?

The Annuaire des Entreprises open search has no incorporation-date filter. On 2026-11-04 a date parameter was ignored and the API returned older companies, so a "new this week" query would be wrong. Name search and SIREN lookup do work, and they do not request officers. A keyed INSEE Sirene API could add the date filter later; it is not wired in this version.

#### Why are there no Brazilian companies?

See "Which registers are covered?". Brazil's open API is excluded because of its robots rules. Other countries are not covered yet.

#### Why did a name search return fewer companies than I expected?

Check the `source` row: `totalInRegistry` is how many matches the register says exist, and `truncated: true` means more were available than delivered (raise `maxResultsPerQuery`). Czechia refuses searches with more than 1,000 matches (`too_many_results`): use a longer name. Sole traders and other person entries are counted in `excluded` and not delivered.

#### What do the status values mean?

`active` is the default for a live entry. `dissolved` means the register shows the company as deleted or ceased. `in_liquidation`, `in_restructuring` and `insolvency` come from the register's liquidation, reorganisation and bankruptcy markers. `inactive` means the register marks the entry as not operating, for example a lapsed LEI or an invalidated business ID. The original wording is in `statusDetail`. Registers differ in how fast they record changes.

#### Why does a record have no `foundedAt` or `employees`?

Registers publish different fields. Norway states establishment date, employees and capital; Czechia the establishment date; Finland the registration date; Poland the registration date and capital; GLEIF the creation date; Companies House the incorporation date and, on a lookup or a new-company list, SIC codes; France the creation date and NAF code. Fields a register does not publish are null. `registryId` and `fetchedAt` are set on every company row.

#### How does "Skip companies seen before" work?

The run saves the keys of delivered companies in a named key-value store (`stateName`, up to 20,000 keys) and skips them next time. The first run returns everything and records it. Use a different `stateName` for each monitor you schedule.

#### What happens if a register blocks or limits the Actor?

On 429 the Actor waits (up to 90 seconds) and tries twice more. On 403, or if that fails, it stops using that register for the run, marks the remaining jobs `not_fetched`, and keeps what it already delivered. Failed jobs are never charged.

#### Is the output deterministic?

For lookups, yes, as long as the register does not change the entry. Searches return what the register ranks first at that moment; Finnish name search additionally ranks the best name matches first.

#### Where can I report a problem or request a feature?

Use the Issues tab of this Actor. Please include the run ID and the `source` row of the job that went wrong.

# Changelog

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

# Actor input Schema

## `mode` (type: `string`):

<b>New companies</b> lists companies registered in the last days (GLEIF, Norway, Finland, and the UK when your Companies House API key is set). France is not in that list. <b>Search by name</b> looks the names up in GLEIF, Norway, Czechia, Finland, France and, with a key, the UK. <b>Look up by registration number</b> reads the companies you name by LEI, UK company number, French SIREN, Norwegian organisation number, Czech IČO, Finnish business ID or Polish KRS number. France has name and SIREN search and is not in the new-company list.

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

Used in <b>Search by name</b>. One company name per line, for example <code>Equinor</code>. Each name is searched in every selected register that supports name search. Up to 100 per run.

## `identifiers` (type: `array`):

Used in <b>Look up by registration number</b>. One per line: a LEI (20 characters), <code>GB:00445790</code> or <code>SC123456</code>, <code>FR:552032534</code>, <code>NO:923609016</code>, <code>CZ:00177041</code>, <code>FI:0112038-9</code> or <code>PL:0000019193</code>. An 8-digit number without a prefix is a Czech IČO, and a 9-digit number without a prefix is Norwegian, so UK and French numbers need <code>GB:</code> or <code>FR:</code>. A UK number also needs your Companies House API key. Up to 500 per run.

## `registries` (type: `array`):

Which registers to use. Leave empty to use every register that supports the chosen mode. The UK is included only when UK Companies House API key is set. Name search: GLEIF, Norway, Czechia, Finland, France and the UK. New companies: GLEIF, Norway, Finland and the UK. France has name and SIREN search and is not in the new-company list. Poland (KRS) has no name search.

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

Your own free API key from <a href="https://developer.company-information.service.gov.uk/">Companies House</a>. Required only for the UK register. The Actor sends it to Companies House as HTTP Basic authentication and nowhere else. It is not written to the dataset or the log. Company profiles only: officers, people with significant control and filings are never requested. Leave empty to skip the UK.

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

In <b>Search by name</b> and <b>New companies</b>: the most companies delivered for each company name and register (for New companies, for each register). You pay per delivered company, and a spending limit also stops the run. Czechia answers at most 1,000 matches per search.

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

Skip companies the register shows as dissolved, ceased, in liquidation or bankrupt. Applies to name search and new companies; a registration-number lookup always returns the company with its status.

## `includeFunds` (type: `boolean`):

GLEIF also lists investment funds. Off by default so a name search returns operating companies, branches, government entities and international organisations.

## `gleifCountries` (type: `array`):

Limit GLEIF results to the legal address country, as two-letter codes (<code>DE</code>, <code>NO</code>). Empty means worldwide. The national registers are always limited to their own country.

## `linkLei` (type: `boolean`):

For records from the UK, French, Norwegian, Czech, Finnish and Polish registers, look the company up in GLEIF by its national registration number and add its LEI where one exists. Charged per LEI actually added.

## `sinceDays` (type: `integer`):

In <b>New companies</b>: companies registered in the last this-many days, 1 to 90. Schedule this with Skip companies seen before for a weekly lead list (Norway, Finland, and the UK when a key is set).

## `onlyNew` (type: `boolean`):

Skip companies that an earlier run with the same saved-state name already delivered, so a scheduled run returns only what is new to you. The first run returns everything and records it.

## `stateName` (type: `string`):

Name of the key-value store that remembers delivered companies for Skip companies seen before. Use a different name for each monitor you schedule. Letters, digits and hyphens.

## Actor input object example

```json
{
  "mode": "lookup",
  "queries": [
    "Equinor",
    "Skoda Auto",
    "Nokia"
  ],
  "identifiers": [
    "GB:00445790",
    "FR:552032534",
    "NO:923609016",
    "FI:0112038-9"
  ],
  "registries": [
    "brreg",
    "prh"
  ],
  "maxResultsPerQuery": 25,
  "onlyActive": false,
  "includeFunds": false,
  "gleifCountries": [
    "DE",
    "GB"
  ],
  "linkLei": true,
  "sinceDays": 7,
  "onlyNew": false,
  "stateName": "company-registry-lookup-state"
}
```

# Actor output Schema

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

One row per company with the register's own id, name, status, legal form, address, industry, LEI and the time the row was read. Filter on recordType company.

## `lifecycle` (type: `string`):

Status, registration and cessation dates, previous names, employees and capital.

## `sources` (type: `string`):

One row per company name, registration number or register: what was found and delivered, what was left out, and why a job failed. Filter on recordType source.

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

Jobs run and failed, companies delivered per register, LEIs added, duplicates removed, private persons left out and why the run stopped.

# 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 = {
    "mode": "lookup",
    "identifiers": [
        "NO:923609016",
        "CZ:00177041",
        "FI:0112038-9",
        "PL:0000019193"
    ],
    "maxResultsPerQuery": 25,
    "linkLei": true,
    "sinceDays": 7,
    "stateName": "company-registry-lookup-state"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mmdincer/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 = {
    "mode": "lookup",
    "identifiers": [
        "NO:923609016",
        "CZ:00177041",
        "FI:0112038-9",
        "PL:0000019193",
    ],
    "maxResultsPerQuery": 25,
    "linkLei": True,
    "sinceDays": 7,
    "stateName": "company-registry-lookup-state",
}

# Run the Actor and wait for it to finish
run = client.actor("mmdincer/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 '{
  "mode": "lookup",
  "identifiers": [
    "NO:923609016",
    "CZ:00177041",
    "FI:0112038-9",
    "PL:0000019193"
  ],
  "maxResultsPerQuery": 25,
  "linkLei": true,
  "sinceDays": 7,
  "stateName": "company-registry-lookup-state"
}' |
apify call mmdincer/company-registry-lookup --silent --output-dataset

```

## MCP server setup

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