# EU Company Registry & VAT Number Lookup: NIP, KRS, SIREN, LEI (`solidfetch/eu-company-registry`) Actor

VAT number lookup and company registry search across Europe: Polish NIP and KRS check (active or in liquidation, VAT status), Norway, Finland, Czechia, Slovakia, France (SIREN) plus GLEIF LEI. Official registers only. Search by name or list new companies. Pay per company.

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

## Pricing

from $2.50 / 1,000 companies

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

## EU Company Registry and VAT Number Lookup

Check a company by VAT number, NIP, KRS, organisation number, IČO or SIREN and get one clean row from the official register: legal name, legal form, status, registration date, registered seat, activity codes, VAT status where the register has it, and the LEI. It covers Poland, Norway, Finland, Czechia, Slovakia, France, Latvia and Lithuania, plus GLEIF for any country. You can also search by name or list the companies registered since a date. No login, no proxy and no scraping of web pages. It returns company-level data only: no directors, shareholders or beneficial owners.

Every row says where it came from (`source`, `sourceUrl`, `fetchedAt`) and keeps the register's own company fields in `raw`. No login, no proxy, no scraping of web pages: the actor reads the registers' public APIs and data exports.

### What you can do with it

- **Company verification and supplier checks.** Look up a list of VAT or registry numbers and get the legal name, legal form, status (active, liquidation, bankruptcy, dissolved), registration date, registered seat, NACE codes and the LEI. Each input gets an outcome in the run report: saved, not found, invalid, ambiguous, skipped or failed. The actor returns company-level data only. Directors, shareholders and beneficial owners are deliberately not included, so it is not a full KYB or AML screening on its own.
- **CRM enrichment.** Add the official name, seat address, activity codes, website (where the register has one) and LEI to the company IDs you already hold.
- **Lead lists of new companies.** Get the companies registered in Poland, Norway, Finland, Czechia and Slovakia since a date, with legal form, seat address and activity codes. Schedule it daily with `since: "1 day"`.
- **VAT registration status.** For Poland (Ministry of Finance VAT list), Norway (VAT register), Finland (VAT register entry in YTJ) and Czechia (VAT payer register in ARES) the row says whether the company is VAT registered. Bank account numbers from the Polish VAT list are not copied: check them on the ministry's own site before you pay.

### Countries and sources

| Country | Register (API) | Lookup by | Name search | New companies feed |
|---|---|---|---|---|
| Poland | KRS, Ministry of Justice open API, and the VAT white list of the Ministry of Finance | KRS number, NIP (VAT), REGON | Through GLEIF: companies with an LEI | Yes, from the daily KRS bulletins |
| Norway | Enhetsregisteret, Brønnøysund Register Centre | Organisation number, VAT number | Yes | Yes |
| Finland | YTJ open data, Finnish Patent and Registration Office (PRH) | Business ID (Y-tunnus), VAT number | Yes, plus GLEIF to find well-known companies | Yes |
| Czechia | ARES, Ministry of Finance | IČO, VAT number (companies) | Yes | Yes, from the commercial register change lists |
| Slovakia | Register of Legal Entities (RPO), Statistical Office | IČO | Yes | Yes, from the daily RPO exports |
| France | Recherche d'entreprises (data of the Annuaire des Entreprises: Sirene and others) | SIREN, SIRET, VAT number | Yes | No (the API has no date filter) |
| Latvia | Register of Enterprises (Uzņēmumu reģistrs), open data on data.gov.lv | Registration number, VAT number (`LV` and the registration number) | Yes, when `LV` is in `countries` | No |
| Lithuania | Register of Legal Entities (Juridinių asmenų registras), open data on data.gov.lt | Legal entity code (9 digits; a Lithuanian VAT number is a different number and is refused) | Yes, when `LT` is in `countries` | No |
| Any country | GLEIF LEI index | LEI | Yes, for companies with an LEI | No |

### Input

| Field | Type | Used in | What it does |
|---|---|---|---|
| `mode` | `lookup`, `search` or `newSince` | all | What to do. When left out, the actor picks it from the fields you filled. |
| `ids` | list of strings | lookup | VAT numbers with country prefix (`PL5260250995`, `NO923609016MVA`, `FI01120389`, `CZ00177041`, `FR27552032534`, `LV40003032949`), registry numbers (`KRS 19193`, NIP, REGON, orgnr, `0112038-9`, IČO, SIREN, SIRET, `regcode 40003032949` for Latvia, `kodas 301844044` for Lithuania) or LEIs. Up to 10,000 per run. Spaces, dots and dashes are ignored, and a label such as `NIP`, `KRS`, `VAT:` or `DIČ` may come before the number. Check digits are verified before any call. |
| `names` | list of strings | search | Company names. Up to 1,000 per run. |
| `countries` | list of two-letter codes | all | Search: national registers for PL, NO, FI, CZ, SK, FR (default: these six), LV and LT when you list them, GLEIF for any other code. New companies: PL, NO, FI, CZ, SK (default: all five). Lookup: optional, narrows bare numbers. |
| `since` | date or "N days" | newSince | First registration day, like `2026-09-01`, or `7 days` for scheduled runs. |
| `until` | date or "N days" | newSince | Last registration day (inclusive). Default: today. |
| `maxItems` | integer | all | Stop after this many saved companies. Default 100. |
| `maxResultsPerName` | integer | search | Best name matches kept per name and country. Default 5. |
| `addLei` | boolean | all | Add the LEI from GLEIF. Default: on for lookup, off for search and new companies. Adds about one second per company. |
| `includeFinancials` | boolean | all | Norwegian companies only: add `financials`, the key figures of the latest annual accounts (see below). Default off. One more request per Norwegian company, same price per company. |
| `onlyActive` | boolean | search, newSince | Drop companies that are not active. Lookups always return the company with its status. |

A bare 11-digit number starting with 4 to 9 is read as a Latvian registration number; 11-digit numbers starting with 0 to 3 are Latvian personal codes and are refused. A bare 9-digit number is read as a Lithuanian code only when `LT` is in `countries`, because Lithuanian codes have no check digit to tell them apart from other 9-digit numbers.

A bare 8-digit number fits both a Czech and a Slovak IČO. The actor asks both registers and saves the company if exactly one has it. If both have a company under that number, the input is reported as ambiguous and nothing is billed. Add the country prefix or set `countries` to choose.

Unknown input fields stop the run with a hint, for example `Unknown input field "maxitems", did you mean "maxItems"?`, so a typo never runs a search you did not ask for.

### Output

One row per company. In lookup mode an input that gives no company gets a row too (see below).

| Field | Meaning |
|---|---|
| `country` | ISO country code of the register. |
| `registryId`, `registryIdType` | The number the register files the company under (KRS, orgnr, Y-tunnus, ICO, SIREN, regcode for Latvia, jaKodas for Lithuania, or LEI for rows from GLEIF alone). |
| `name`, `legalForm`, `legalFormCode` | Official name and legal form as the register writes it, with its code where the register uses codes. |
| `status`, `statusDetail` | `active`, `liquidation`, `bankruptcy`, `restructuring`, `dissolved`, `inactive` or `unknown`, plus the register's wording and dates. |
| `registeredAt` | Registration date in the register (YYYY-MM-DD). France gives the creation date from Sirene instead, empty when INSEE does not know it. |
| `vatId`, `vatRegistered` | VAT number and, where the national tax register says so, whether it is active. `null` when the source does not say. |
| `lei` | LEI from GLEIF. |
| `otherIds` | Other public numbers, for example NIP and REGON in Poland, head office SIRET in France. In Poland `regon` is the 9-digit REGON of the company, and `regon14` is the 14-digit form KRS files it under (the 9 digits plus `00000` for the main unit). A 14-digit value that does not end in `00000` belongs to a local unit and stays in `regon` as it is. `regon14` is absent when the source gives only 9 digits. |
| `address` | The registered seat: `street`, `postalCode`, `city`, `region`, `country`, `full`. |
| `activityCodes` | National activity codes (`PKD`, `SN`, `TOL`, `CZ-NACE`, `SK-NACE`, `NAF`, `NAF2025`) with description where the register gives one, the main one marked `primary` where the register says which, and `nace`, the NACE class the national code extends. |
| `website` | Website when the register holds one. |
| `query` | The ID or name from your input that produced the row. Empty in the new-companies feed. |
| `source`, `sourceUrl`, `alsoFrom`, `fetchedAt` | Where the row came from: the API URL of the record, other sources merged in (GLEIF, the Polish VAT list), and when it was read. |
| `financials`, `financialsError` | Only on Norwegian rows of a run with `includeFinancials`. See "Financial key figures (Norway)". |
| `raw` | Company-level fields of each source, by source: share capital, employee counts, register entries, VAT list status dates, LEI registration details and more. Each field is picked by name, so a field a register adds later never reaches the row. |

#### Financial key figures (Norway)

Set `includeFinancials` to add the latest annual accounts to every Norwegian company row. The figures come from the Brønnøysund Regnskapsregisteret (open key figures of the filed annual accounts), one extra request per company. There is no extra charge: a row with financials costs the same `company` event as a row without.

```json
"financials": {
  "year": 2025,
  "periodStart": "2025-01-01",
  "periodEnd": "2025-12-31",
  "accountType": "company",
  "currency": "USD",
  "revenue": 67956000000,
  "operatingResult": 5563000000,
  "netResult": 5731000000,
  "equity": 39182000000,
  "totalAssets": 103432000000,
  "audited": true
},
"financialsError": null
```

- `year` is the calendar year the accounting period ends in. Amounts are whole units of `currency` (NOK for most companies, USD or EUR for some), not thousands. A figure the accounts do not carry is `null`, never 0: small companies often file no revenue line.
- `accountType` is `company` for the company's own accounts and `group` when only consolidated accounts are filed for the latest period. When both exist, the company's own accounts are used.
- `audited` is `false` for unaudited accounts and when the company waived the audit, `null` when the register does not say.
- When there is nothing to show, `financials` is `null` and `financialsError` says why: no annual accounts filed, or accounts of a kind the open API does not publish (banks and insurers use another layout), or the register did not answer. A missing figure never costs the company row.
- Sole traders are never returned, so they get no financials. Rows from other countries are not changed.
- Only the latest year is returned. The register's open API offers key figures only, not the full annual report with notes.

#### Inputs without a company

In lookup mode every input that gives no company also gets a row, so the dataset has one row per input. Its company fields are all `null`, and these fields say what happened:

| Field | Meaning |
|---|---|
| `query` | The input as you wrote it. |
| `idType` | The kind of ID it was read as (`nip`, `krs`, `regon`, `orgnr`, `ytunnus`, `ico`, `siren`, `regcode`, `jacode`, `lei`, or `vat` for a VAT number that did not parse). `null` when it could not be told. |
| `country` | The country when it is known, otherwise `null`. |
| `outcome` | `not-found` (the register does not have it), `invalid` (the format or check digit is wrong), `ambiguous` (it fits companies in several countries: add a country prefix or set `countries`), `failed` (the register did not answer) or `skipped` (a sole trader or estate, which are never returned). |
| `error` | A short reason. |

These rows are free. They are saved as each batch of 50 inputs is done, so a run that times out still has the rows of the inputs it read. Inputs that are duplicates, or that were not read because the run stopped at `maxItems` or the maximum cost, get no row; the `RUN_REPORT` record lists them. Search and new-companies runs add no such rows.

The run also saves a `RUN_REPORT` record with the outcome of every input and the status of every source: calls made, failures, companies saved, not found and skipped.

#### Example row

A real row from a lookup of `0112038-9` (with `addLei` on):

```json
{
  "country": "FI",
  "registryId": "0112038-9",
  "registryIdType": "Y-tunnus",
  "name": "Nokia Oyj",
  "legalForm": "Public limited company",
  "legalFormCode": "17",
  "status": "active",
  "statusDetail": null,
  "registeredAt": "1896-12-19",
  "vatId": "FI01120389",
  "vatRegistered": true,
  "lei": "549300A0JPRWG1KI7U06",
  "otherIds": {},
  "address": {
    "street": "Karakaari 7",
    "postalCode": "02610",
    "city": "ESPOO",
    "region": null,
    "country": "FI",
    "full": "Karakaari 7, 02610 ESPOO"
  },
  "activityCodes": [
    { "scheme": "TOL", "code": "70100", "description": "Activities of head offices", "primary": true, "nace": "70.10" }
  ],
  "website": "https://www.nokia.com",
  "query": "0112038-9",
  "source": "prh",
  "sourceUrl": "https://avoindata.prh.fi/opendata-ytj-api/v3/companies?businessId=0112038-9",
  "alsoFrom": [{ "source": "gleif", "url": "https://api.gleif.org/api/v1/lei-records/549300A0JPRWG1KI7U06" }],
  "fetchedAt": "2026-10-04T19:28:10.528Z",
  "raw": {
    "prh": { "businessIdIssuedAt": "1978-03-15", "euId": "FIFPRO.0112038-9", "tradeRegisterStatus": "1", "auxiliaryNames": ["Nokia Networks", "Nokia Corporation"], "lastModified": "2026-08-19T10:04:06" },
    "gleif": { "lei": "549300A0JPRWG1KI7U06", "registeredAs": "0112038-9", "entityStatus": "ACTIVE", "registrationStatus": "ISSUED", "nextRenewalDate": "2027-10-09" }
  }
}
```

The `raw` part is shortened here.

### What we measured

Test runs on 2026-10-04 from one machine, at the actor's own request pace:

| Run | Rows | Time |
|---|---|---|
| 7 IDs from 6 countries, one of them an LEI, with LEI check | 6 saved, 1 reported invalid (a German VAT number) | 6.4 s |
| New companies 2026-09-30 to 2026-10-02, all five countries, `maxItems` 250 | 250 (PL 75, NO 75, FI 50, SK 50, CZ 0) | 59 s |
| New companies in Poland for one day, `maxItems` 60 | 60 | 17.5 s |
| New companies in Poland on 2026-10-01, `maxItems` 400 | 384 (all of that day) | 95 s |
| New companies in Norway, Finland, Czechia and Slovakia, 2026-09-01 to 2026-10-03, `maxItems` 30,000 | 13,680 (NO 5,197, FI 2,264, CZ 3,162, SK 3,057), no duplicates | 14.6 min |

In the month-long run the Norwegian and Finnish counts equal the totals the two registers report for the same window.

Czechia gave no rows in that window because its newest change list was from 2026-09-30 (see Limits).

Share of rows with the field filled, new-companies run above:

| Country | Legal form | Address | Activity code | VAT number | Website |
|---|---|---|---|---|---|
| Poland (75 rows) | 100% | 100% | 100% | 91% | 4% |
| Norway (75 rows) | 100% | 100% | 68% | 0% | 7% |
| Finland (50 rows) | 100% | 100% | 46% | 6% | 12% |
| Slovakia (50 rows) | 100% | 100% | 100% | 0% | 0% |

New companies often have no activity code or VAT number yet: registers add them days or weeks after registration. In the lookup and search test runs (32 rows from the six countries and Germany), legal form, registration date and address were filled in every row.

Peak memory of the month-long run was 293 MB, so the default of 512 MB leaves room.

### Ready-made searches

Open one of these, change the input and run it:

- [Look up EU companies by VAT or registry number](https://apify.com/solidfetch/eu-company-registry/examples/eu-company-lookup-by-vat)
- [New companies registered in Poland (KRS)](https://apify.com/solidfetch/eu-company-registry/examples/new-companies-poland)
- [New companies registered in Norway (Brreg)](https://apify.com/solidfetch/eu-company-registry/examples/new-companies-norway)
- [Find EU companies by name](https://apify.com/solidfetch/eu-company-registry/examples/eu-company-search-by-name)

### Send results to Make, Zapier, n8n or a CRM

Long runs do not need to keep a Make or Zapier scenario waiting:

1. Start the actor or one of its saved tasks on a schedule, or from your scenario with the asynchronous "Run Actor" step.
2. Trigger the next step on the finished run. In Make use the Apify module "Watch Actor Runs", in Zapier the Apify trigger for a finished actor run, in n8n the Apify node.
3. Read the rows with "Get Dataset Items" using the run's dataset ID.

For your own endpoint, open the actor's Integrations tab and add an HTTP webhook on "Run succeeded". Apify retries failed deliveries, and the payload contains `resource.defaultDatasetId`, which you can read at `https://api.apify.com/v2/datasets/<datasetId>/items?format=json`. Add `&format=csv` for a spreadsheet, or `&flatten=<field>` to turn nested objects into flat columns.

### Pricing

Pay per event: you pay for each company saved to the dataset (event `company`): $4.00 per 1,000 companies on the free plan, $3.50 on Bronze, $3.00 on Silver and $2.50 on Gold and above, plus $0.00005 per run start (per GB of memory). Invalid IDs, IDs not found, ambiguous IDs, failed lookups, duplicates, sole traders and estates are not companies and cost nothing: the rows that report them (see Inputs without a company) are free, and they do not count towards `maxItems`. The actor stops when it reaches `maxItems` or the maximum cost you set for the run, and it never saves a row that would go over that cost. If the platform migrates or restarts a run, the companies saved before are not saved or charged again.

### Data sources, licences and attribution

Each register was checked for terms that allow commercial reuse before it was added.

| Source | Terms | What you should credit when you publish the data |
|---|---|---|
| KRS open API, Polish Ministry of Justice | Published at prs.ms.gov.pl/krs/openApi under art. 4b of the KRS Act and the Polish Open Data Act of 2021, which allows commercial and non-commercial reuse. Names and PESEL numbers of people are anonymised by the API itself. | Source: Krajowy Rejestr Sądowy, Ministry of Justice |
| VAT white list, Polish Ministry of Finance | Public by law (art. 96b of the VAT Act), API terms at gov.pl/web/kas/api-wykazu-podatnikow-vat. 100 searches per day per IP. | Source: Wykaz podatników VAT, Ministry of Finance |
| Enhetsregisteret, Brønnøysund Register Centre | Norwegian Licence for Open Government Data (NLOD) 2.0, commercial use allowed. | "Contains data under the Norwegian licence for Open Government data (NLOD) distributed by Brønnøysundregistrene" with a link to the licence |
| YTJ open data, Finnish Patent and Registration Office | Creative Commons Attribution 4.0 (avoindata.suomi.fi dataset prh-avoin-data). PRH asks users to name the source and not to use the PRH or YTJ logos. | Source: Finnish Patent and Registration Office (PRH), CC BY 4.0 |
| ARES, Czech Ministry of Finance | Open data. The national catalogue lists it as not protected by copyright or database right (equivalent to CC0). | Source: ARES, Ministry of Finance of the Czech Republic (courtesy, not required) |
| Register of Legal Entities (RPO), Statistical Office of the Slovak Republic | Creative Commons Attribution 4.0, stated in every API answer. | Source: Register právnických osôb, Štatistický úrad SR, CC BY 4.0 |
| Recherche d'entreprises, French government | Data under Licence Ouverte 2.0 (Etalab). | Source: Annuaire des Entreprises (data.gouv.fr), Licence Ouverte 2.0, with the date of the data (`fetchedAt`) |
| Register of Enterprises, Latvia (data.gov.lv, dataset "Uzņēmumu reģistrs") | CC0 1.0, stated on the dataset page and in its metadata (`license_id` CC0-1.0). Updated daily. | Source: Uzņēmumu reģistrs, data.gov.lv (courtesy, not required) |
| Register of Legal Entities, Lithuania (get.data.gov.lt, `gov/rc/jar`) |open data of the Centre of Registers; the data.gov.lt portal publishes its datasets under CC BY 4.0 unless a dataset says otherwise (https://data.gov.lt/more/about/)| Source: Registrų centras, Juridinių asmenų registras, CC BY 4.0 |
| Regnskapsregisteret (annual accounts key figures), Brønnøysund Register Centre | Part of the open data of the Brønnøysund Register Centre, which states that its datasets follow NLOD 2.0. The API itself carries no licence field, and the Register Centre calls it a preview service without guarantees: it may change or be withdrawn. Only used when `includeFinancials` is on. | Same as Enhetsregisteret above |
| GLEIF LEI index | CC0 1.0, no attribution required. | Source: GLEIF (courtesy) |

**EU VIES is not used.** Its disclaimer allows VAT number checks for intra-Community supplies only and forbids retransmission of its content for commercial purposes or otherwise. VAT status therefore comes from the national registers listed above, which publish it as open data.

### Personal data

The actor returns company-level data only.

- **Sole traders are never returned**: Polish CEIDG businesses (and any taxpayer outside the KRS company register), Norwegian ENK and people registered for VAT only, Czech and Slovak natural-person businesses (including lawyers and other professions in their own registers), French entrepreneurs individuels, Latvian individual merchants, farms, fishing farms, individual and family undertakings and representatives, Lithuanian individual enterprises and households, and GLEIF records of one-person businesses. A lookup of one is reported as skipped and not billed.
- **Norwegian foreign units** (NUF, UTLA) are checked too: a foreign sole trader can be registered in Norway under his own name and home address. A unit whose home legal form is a sole proprietorship, or that is filed abroad under a bare two or three word personal-looking name without a company word, is skipped as a sole trader. A small foreign company with such a bare name is skipped with them (free).
- **Estates are never returned**: Norwegian bankruptcy estates and estates of deceased people are often named after a person, so they are skipped too.
- **People are never copied**: no board members, shareholders, proxies, liquidators, PESEL or birth dates, no phone numbers or e-mail addresses, even where the register publishes them. The French source is asked for company fields only, without directors. Address lines that name the person who receives the mail ("c/o ...", "chez Mme ...") are left out.
- **No bank account numbers.** The Polish VAT list publishes them, but a list of a company's accounts helps invoice fraud more than it helps a buyer. Rows keep the VAT status only.
- **The address is the registered seat of the company.** For small companies the seat can be in a residential building. That is the seat the company registered, not a person's home address from another source.
- Rows can still contain names of people when the company name includes them (for example partnerships named after their partners, or a Norwegian branch of a foreign one-person business).

If you use the data to contact companies, the GDPR and national rules on direct marketing apply to you.

When a run fails, an error report with the error message and the shape of the input (which fields are set, how long the lists are), never your input values or your results, is sent to the developer to fix bugs.

### Limits

- **Poland**: KRS has no name search, so search finds Polish companies only when they have an LEI. The new-companies feed reads every KRS entry of the requested days that could be new, about 440 reads for one working day, and stops at `maxItems`. The VAT list allows 100 searches per day per IP address (one search covers 30 companies), and Apify runs share IP addresses, so on some days Polish rows come with `vatRegistered` empty. The actor then stops asking the list for the rest of the run, and the run report says so.
- **Czechia**: the commercial register change lists cover about the last month and come out with a delay. On 2026-10-04 the newest list was from 2026-09-30, so the feed had no Czech companies registered after 2026-09-29. Name searches that match more than 1,000 companies are refused by ARES. The run report asks for a more specific name.
- **Slovakia**: daily exports are kept for 45 days. VAT numbers are not in RPO, so `vatId` is empty.
- **Finland**: the register's name search matches any part of a name in register order. The actor ranks the matches and also asks GLEIF, which finds companies with an LEI. A small company with a common word in its name may still be missed: search by business ID instead.
- **France**: no new-companies feed. Companies that opted out of publication are not in the source. `vatRegistered` is empty because no open French source states VAT registration.
- **Norway**: one date window returns at most 10,000 companies. Use shorter windows for more. The annual accounts API (`includeFinancials`) is a preview service of the Register Centre. The accounts of banks are not published through it, and a company that has not filed yet has none.
- **GLEIF** allows 60 calls a minute, so `addLei` adds about one second per company.
- **Latvia**: the register's open table has the name, legal form, registration and removal dates, and the seat as one line. It has no activity codes, no VAT status and no website. The city and street are split off only for addresses that start with a city (Rīga, Jūrmala); rural addresses stay in `address.full`. Companies removed after a reorganisation are shown as `dissolved`. A Latvian name search matches any part of the name, active companies first.
- **Lithuania**: the open table has the name, legal form, legal status, registration and removal dates only. It has no address, no activity codes, no VAT status and no website, so `address` is empty. The name search is case-insensitive but exact on letters: type "įmonė", not "imone". Companies in reorganisation or relocation stay `active` with the register's status in `statusDetail`.
- **UK** is not covered: Companies House needs an API key.
- **Name search** keeps only companies whose own name contains the significant words of the query. Legal forms and country words (`sp. z o.o.`, `AS`, `GmbH`, `Polska`, `France`) do not count as significant, so "Żabka Polska" does not return every foreign branch called "... Polska". Companies the registers matched through an officer's name, an address or an old name are dropped, not saved and not charged.
- **A source that stops answering** (two timeouts or network errors in a row) is skipped for the rest of the run: its remaining inputs become free `failed` rows ("... did not answer"), the other countries continue, and the run message and `RUN_REPORT` name the source. Requests time out after 30 seconds (25 for Slovakia, 60 for Finland, Latvia and Lithuania; the Slovak daily exports after 120). The Norwegian annual accounts API (`includeFinancials`) is counted apart from the company register: when it stops answering, the rows get the reason in `financialsError` and the Norwegian lookups go on.
- **New companies with a small `maxItems`** are shared across the requested countries in turn instead of filling from the first country.
- When a requested window starts before the history a register keeps, the run report and the run message say so.
- Registers change their formats from time to time. A source that answers in an unexpected format fails for that source only. The other countries continue and the run report shows which source failed.

If this actor saved you time, a short review on the actor page helps other people find it.

# Actor input Schema

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

Lookup reads the companies behind your IDs. Search finds companies by name. New companies lists companies registered in the date window, for PL, NO, FI, CZ and SK. Left empty, the actor picks the mode from the field you filled: IDs, names or a since date.

## `ids` (type: `array`):

One ID per line. VAT numbers with the country prefix (PL5260250995, NO923609016MVA, FI01120389, CZ00177041, FR27552032534), registry numbers (KRS 19193, NIP, REGON, Norwegian orgnr, Finnish Y-tunnus 0112038-9, Czech or Slovak IČO, French SIREN or SIRET, Latvian registration number, Lithuanian legal entity code) or LEIs. Latvian VAT numbers (LV40003032949) work too. Lithuanian VAT numbers do not match the legal entity code and are refused: enter the 9-digit code, for example kodas 301844044. A bare number is matched to every country whose format and check digit it fits; set Countries to narrow it.

## `names` (type: `array`):

Names to search in each country's register. Poland has no name search in KRS, so Polish names are found through GLEIF and cover companies with an LEI only.

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

Two-letter codes. Search: PL, NO, FI, CZ, SK, FR, LV, LT use the national register (default: PL, NO, FI, CZ, SK, FR; add LV and LT to include Latvia and Lithuania); any other code, such as DE or IT, searches GLEIF (companies with an LEI). New companies: PL, NO, FI, CZ, SK (default: all five). Lookup: optional, narrows bare numbers.

## `since` (type: `string`):

A date like 2026-09-01, or a number of days like "7 days" so a scheduled run always asks for the latest days. Each register keeps a limited history for this: Czechia about one month, Slovakia 45 days.

## `until` (type: `string`):

Optional end date (inclusive). Default: today.

## `maxItems` (type: `integer`):

The run stops after saving this many companies. You pay per saved company.

## `maxResultsPerName` (type: `integer`):

How many of the best name matches to keep for each name in each country.

## `addLei` (type: `boolean`):

Look up each company in GLEIF and add its LEI when it has one. GLEIF allows 60 calls a minute, so this adds about one second per company. Default: on for lookup, off for search and new companies.

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

Norwegian companies only: add the key figures of the latest annual accounts (year, currency, revenue, operating result, net result, equity, total assets, audited) from the Brønnøysund Regnskapsregisteret. One extra request per company, same price per company. Companies with no accounts, or accounts the register does not publish (banks), get the reason in financialsError. Sole traders are never returned.

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

Search and new companies: drop companies in liquidation, bankruptcy or dissolved. Lookup always returns the company with its status.

## Actor input object example

```json
{
  "ids": [
    "PL5260250995",
    "NO923609016MVA",
    "FI01120389",
    "CZ00177041",
    "FR27552032534"
  ],
  "maxItems": 100,
  "maxResultsPerName": 5,
  "includeFinancials": false,
  "onlyActive": false
}
```

# Actor output Schema

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

No description

## `kyb` (type: `string`):

No description

## `financials` (type: `string`):

No description

## `leads` (type: `string`):

No description

## `report` (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 = {
    "ids": [
        "PL5260250995",
        "NO923609016MVA",
        "FI01120389",
        "CZ00177041",
        "FR27552032534"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidfetch/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 = { "ids": [
        "PL5260250995",
        "NO923609016MVA",
        "FI01120389",
        "CZ00177041",
        "FR27552032534",
    ] }

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

```

## MCP server setup

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