# Company Registry Search: GLEIF LEI, Norway & Finland (`conserving_celerytop/open-company-registries`) Actor

$3.50 per 1,000 companies found. Search company records in GLEIF (LEI), Norway's Brreg and Finland's PRH registers by name, registration number, or municipality and industry. One row per company: name, legal form, status, industry code, address, website, employees. No people. No login or API key.

- **URL**: https://apify.com/conserving\_celerytop/open-company-registries.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Open Company Registries: company registry search for GLEIF, Norway and Finland

Open Company Registries is a company registry search across three open registries in one run. It returns one row per company from the GLEIF Global LEI Index (legal entities in every country), the Norwegian Central Coordinating Register for Legal Entities (Brønnøysund Register Centre, Brreg) and the Finnish trade register (PRH, YTJ open data). Search by company name, look up LEI codes, Norwegian organisation numbers and Finnish Business IDs, or list the businesses in a Norwegian municipality or Finnish city by industry. Every row has the same columns whatever the registry, so you can merge results without mapping fields yourself.

The data comes from each registry's own open data service. No login and no API key. It returns company-level facts only: no directors, officers, owners, shareholders or contact persons, and no sole traders.

### What data does this company registry search return?

| Field | Example | Notes |
|---|---|---|
| `recordType` | company | `company`, or `error` for a registration number that returned no company |
| `registry`, `registryName`, `country` | Brreg, Brønnøysund Register Centre, NO | Registry the row comes from and its country (for GLEIF, the legal-address country) |
| `companyName` | EQUINOR ASA | Current registered name |
| `otherNames` | \["STATOIL ASA"] | Previous, parallel and auxiliary names |
| `registrationNumber` | 923609016 | National number (Brreg, PRH) or the number GLEIF has on file |
| `lei` | OW6OFBNCKXC4US5C7523 | GLEIF rows only |
| `legalForm`, `legalFormCode` | Allmennaksjeselskap, ASA | GLEIF gives the ISO 20275 ELF code |
| `status`, `statusDetail` | active, registered | `active` or `inactive`, plus the registry's own wording |
| `foundedDate` | 1972-09-18 | Brreg and GLEIF |
| `registeredDate` | 1995-03-12 | Date entered in the registry. For GLEIF, the date the LEI was first issued |
| `closedDate` | 2026-04-30 | Deleted or ceased companies |
| `industryCode`, `industryDescription` | 06.100, Utvinning av råolje | NACE based codes (Brreg and PRH) |
| `industryCodeSystem` | NACE (Norwegian SN standard) | Which code list `industryCode` comes from |
| `employees`, `employeeBand` | 21272, 1000+ | Registered employees and the band (0, 1-4, 5-9, 10-19, 20-49, 50-99, 100-249, 250-499, 500-999, 1000+). Brreg only |
| `website` | www.equinor.com | When registered |
| `street`, `postalCode`, `city`, `addressCountry` | Forusbeen 50, 4035, STAVANGER, NO | Registered business address |
| `municipality`, `municipalityCode` | STAVANGER, 1103 | Municipality of the address. Brreg only |
| `vatRegistered`, `inLiquidation`, `bankrupt` | true, false, false | Brreg and PRH |
| `lastUpdated` | 2026-08-19T10:04:06 | When the registry last changed the record |
| `sourceUrl`, `licence`, `attribution` | ... | Link to the registry record, the licence it is published under and the attribution line to keep |
| `query`, `queryType` | Equinor, name | What produced the row (`name`, `registrationNumber` or `area`) |
| `error` | Enhetsregisteret has no organisation number (number). | Reason, on error rows only |
| `fetchedAt` | 2026-09-26T17:01:50.220Z | When the Actor read the record |

### How to search company registries step by step

1. Open the Actor and go to the Input tab.
2. Under **Company names**, add one or more names or parts of names, for example `Equinor` or `Kone`. Every word you type must appear in the company name or one of its other names.
3. Under **Registration numbers**, paste any LEI codes, Norwegian organisation numbers or Finnish Business IDs. The Actor sends each number to the registry it belongs to and checks the check digit first, so typos fail before any request is made.
4. Under **Registries**, keep all three or pick the ones you need. This applies to name searches.
5. Set **Results per search** (per name, per registry) and **Max results** (whole run).
6. Keep **Active companies only** on to leave out dissolved, bankrupt and ceased companies in name searches. Lookups by number always return the company with its status.
7. Click Start. Results appear in the **Companies** view of the dataset. Download them as JSON, CSV or Excel, or read them through the Apify API.

Advanced options let you limit GLEIF searches to legal-address countries (for example `DE` and `SE`), set retries, and change the User-Agent the Actor sends.

### How to find businesses by area and industry

Use this to build a list of the restaurants in Oslo, the hair salons in Helsinki, or every company registered in your municipality in the last 30 days.

1. In the Input tab, open **Businesses by area and industry**.
2. Under **Municipalities or cities**, add one or more places. Norway: a municipality name or its four-digit number, such as `Oslo`, `Bergen` or `0301`. Finland: a city or town, such as `Helsinki` or `Espoo`.
3. Pick the **Country for area search**: Norway or Finland.
4. Pick one or more **Industries**, add your own **Industry codes**, or leave both empty for every industry.
5. Optional: add **Postal codes** to narrow each place, and a **Registered since** date (for example `2026-01-01` or `30 days`) for a feed of new businesses. With a date, the newest companies come first.
6. Set **Results per area** and **Max results**, then click Start. Rows appear in the **Businesses by area** view.

The area search returns active companies only. Bankrupt, dissolved and deleted companies are left out, and so are sole traders and companies whose name is a person's name. The address is the company's business address.

Industries you can pick:

| Industry | Industry codes |
|---|---|
| Restaurants and food service | 56.1 |
| Bars and cafés | 56.3 |
| Hotels | 55.1 |
| Hair and beauty | 96.2 |
| Gyms and fitness centres | 93.13 |
| Construction | 41, 42, 43 |
| Electricians and plumbers | 43.2 |
| Cleaning | 81.2 |
| Real estate agents | 68.31 |
| IT consulting and software | 62 |
| Marketing and advertising | 73.1 |
| Accounting and bookkeeping | 69.2 |
| Legal services | 69.1 |
| Architecture and engineering | 71.1 |
| Retail shops | 47 |
| Car repair | 95.31 |

Both registries use NACE based industry codes (Norway SN2025, Finland TOL 2025). A code includes every code under it, so `56.1` covers `56.110` in Norway and `56111` in Finland. The row keeps the company's main industry code; a company is listed when its main industry matches.

### How much does it cost to search company registries?

The Actor uses pay-per-event pricing. You pay a small fee when the run starts and one **company-record** event for each company found and saved to the dataset. You pay only for companies found. A registration number that the registry does not know, or that belongs to a natural person, returns one error row for free. Name searches that match nothing add no rows and no company-record events. Invalid input stops the run before any lookup, with nothing charged.

The price is $3.50 per 1,000 companies found ($0.0035 per company) on every plan. Worked example: searching 20 company names with 10 results per search in all three registries gives up to 600 companies, which costs up to $2.10 plus the start fee. Looking up 1,000 organisation numbers costs up to $3.50 plus the start fee; numbers that return no company cost nothing. Listing the 500 newest restaurants in Oslo costs $1.75 plus the start fee. You can set a maximum cost per run in Apify Console; the Actor stops cleanly when it is reached.

### Input example for a company registry search

```json
{
    "companyNames": ["Equinor"],
    "registrationNumbers": ["0112038-9", "OW6OFBNCKXC4US5C7523"],
    "registries": ["gleif", "norway", "finland"],
    "maxResultsPerSearch": 3,
    "maxResults": 100,
    "activeOnly": true
}
```

Area search example, new restaurants and bars in Oslo since January:

```json
{
    "areas": ["Oslo"],
    "areaCountry": "norway",
    "industries": ["restaurants", "cafes-bars"],
    "registeredSince": "2026-01-01",
    "maxResultsPerArea": 500
}
```

All input fields:

| Field | Console name | What it does |
|---|---|---|
| `companyNames` | Company names | Names or parts of names, up to 100 |
| `registrationNumbers` | Registration numbers | LEI codes, Norwegian organisation numbers, Finnish Business IDs, up to 1,000 |
| `registries` | Registries | gleif, norway, finland (name searches) |
| `maxResultsPerSearch` | Results per search | Per name and registry, up to 1,000 |
| `maxResults` | Max results | Whole run, up to 10,000 |
| `activeOnly` | Active companies only | On by default; applies to name searches |
| `areas` | Municipalities or cities | Places for the area search, up to 20 |
| `areaCountry` | Country for area search | norway or finland |
| `industries` | Industries | Plain-language industries from the table above |
| `industryCodes` | Industry codes | NACE based codes such as 56.1 or 4321, up to 20 |
| `postalCodes` | Postal codes | Business-address postal codes, up to 50 |
| `registeredSince` | Registered since | A date or a period such as 30 days |
| `maxResultsPerArea` | Results per area | Per place (and postal code), up to 10,000 |
| `leiCountries` | LEI countries | Legal-address countries for GLEIF name searches |
| `maxRetries` | Max retries | 0 to 3 |
| `userAgent` | User-Agent | User-Agent sent to the registries |

### Output example: one company registry record

```json
{
    "recordType": "company",
    "registry": "PRH",
    "registryName": "Finnish Patent and Registration Office (PRH), YTJ open data",
    "country": "FI",
    "companyName": "Nokia Oyj",
    "otherNames": ["Oy Nokia Ab", "Nokia Networks", "Nokia Matkapuhelimet", "Nokia Telecommunications", "Telenokia", "Nokia Mobile Phones", "Nokia Mobira", "TCC Nokia", "NMP Trading", "Nokia Home Communications", "Nokia Internet Communications", "Vertu", "Nokia Abp", "Nokia Corporation"],
    "registrationNumber": "0112038-9",
    "lei": null,
    "legalForm": "Public limited company",
    "legalFormCode": "OYJ",
    "status": "active",
    "statusDetail": "Registered",
    "foundedDate": null,
    "registeredDate": "1896-12-19",
    "closedDate": null,
    "industryCode": "70100",
    "industryDescription": "Activities of head offices",
    "industryCodeSystem": "TOIMI4 (Finnish TOL, NACE based)",
    "employees": null,
    "employeeBand": null,
    "website": "www.nokia.com",
    "street": "Karakaari 7",
    "postalCode": "02610",
    "city": "ESPOO",
    "municipality": null,
    "municipalityCode": null,
    "addressCountry": "FI",
    "vatRegistered": true,
    "inLiquidation": false,
    "bankrupt": false,
    "lastUpdated": "2026-08-19T10:04:06",
    "sourceUrl": "https://avoindata.prh.fi/opendata-ytj-api/v3/companies?businessId=0112038-9",
    "licence": "CC BY 4.0",
    "attribution": "Source: Finnish Patent and Registration Office (PRH), YTJ open data, CC BY 4.0.",
    "query": "0112038-9",
    "queryType": "registrationNumber",
    "error": null,
    "fetchedAt": "2026-09-26T17:01:50.220Z"
}
```

A registration number that the registry does not know, or that belongs to a natural person, returns a row with `recordType` set to `error` and the reason in `error`, shown in the **Errors** view.

A run also writes a `STATS` record to the key-value store with the number of requests per registry, rows per search, and how many records were left out as natural persons.

### FAQ about company registry data

#### Is it legal to use this company registry data?

The Actor reads open data published for reuse. GLEIF publishes LEI data under CC0. The Brønnøysund Register Centre publishes Enhetsregisteret under the Norwegian licence for Open Government data (NLOD). PRH publishes YTJ open data under Creative Commons Attribution 4.0 and asks users to name the source. Every row carries its `licence` and an `attribution` line; keep that line when you publish the data. This Actor is not affiliated with GLEIF, the Brønnøysund Register Centre or PRH.

#### Why are some companies missing?

To keep personal data out, the Actor never returns records that can be a natural person: GLEIF sole proprietors, Norwegian sole proprietorships (ENK) and similar forms, foreign-registered units in Norway (NUF, UTLA) and Finnish branches of a foreign trader. PRH does not publish private traders at all. Companies whose name is only a person's name, such as a consultancy named after its owner, are left out as well. Address lines that name a person (c/o) and apartment numbers are removed. Contact e-mails and phone numbers are never read.

#### Which countries are covered?

GLEIF covers legal entities that hold an LEI in any country, which is mostly banks, funds, listed companies and firms that trade financial instruments. Norway and Finland are covered in full from their national registers, and they are the two countries for the area search. Other national registers may be added later.

#### Why does a search return fewer rows than Results per search?

Each registry has fewer matches than the limit, the matches were inactive while Active companies only was on, or they were left out as natural persons. The `STATS` record shows the counts per search.

#### How fresh is the data?

Each run reads the registries live. PRH updates its open data once a day and GLEIF publishes a new golden copy several times a day.

#### What are the limits?

Up to 100 company names and 1,000 registration numbers per run, up to 1,000 results per name in each registry, up to 20 places with up to 10,000 results each in the area search, and up to 10,000 rows per run. Lookups by number take up to about one second each, so 1,000 numbers take about 15 minutes. Name searches are faster.

#### Troubleshooting

A name search with zero rows: every word you type must appear in the company name, so try fewer or shorter words, or turn off Active companies only. If a registry does not answer after several tries, the Actor stops asking it, finishes the other registries and names the missing one in the status message. An input error lists every problem at once so you can fix them in one go.

An area search with zero rows: check the spelling of the place (the status message suggests close Norwegian municipality names), try a wider industry code such as `56` instead of `56.11`, or remove the postal code or the Registered since date. In Finland, use the city name from the postal address, such as `Espoo` rather than a district name.

# Actor input Schema

## `companyNames` (type: `array`):

Company names or parts of names to search for. Each name is searched in every registry picked under Registries.

## `registrationNumbers` (type: `array`):

LEI codes (20 characters), Norwegian organisation numbers (9 digits) or Finnish Business IDs (1234567-8). Each number goes to the registry it belongs to.

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

Registries to search company names in: gleif (Global LEI Index, all countries), norway (Brønnøysund Register Centre) and finland (PRH trade register).

## `maxResultsPerSearch` (type: `integer`):

Most companies to return for one name in one registry.

## `maxResults` (type: `integer`):

Most rows for the whole run, across all names, numbers and registries.

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

Return active companies only in name searches. Lookups by registration number always return the company, with its status.

## `areas` (type: `array`):

Find active companies whose business address is in these places. Norway: municipality name or four-digit municipality number (Oslo, Bergen, 0301). Finland: city or town (Helsinki, Espoo). Leave empty to skip the area search.

## `areaCountry` (type: `string`):

Register to search by area.

## `industries` (type: `array`):

Plain-language industries. Each maps to official industry codes. Leave empty and add no industry codes to get every industry.

## `industryCodes` (type: `array`):

NACE based industry codes, as used by both registers today (Norway SN2025, Finland TOL 2025), for example 56.1, 62.01 or 4321. Each code includes the codes under it.

## `postalCodes` (type: `array`):

Optional. Keep only companies whose business address has one of these postal codes (Norway 4 digits, Finland 5 digits). Can be used without a municipality.

## `registeredSince` (type: `string`):

Only companies registered on or after this date. A date (2026-01-01) or a period back from today such as 30 days or 6 months. Newest companies come first.

## `maxResultsPerArea` (type: `integer`):

Most companies for one municipality or city (and postal code). Max results still caps the whole run.

## `leiCountries` (type: `array`):

Two-letter country codes of the legal address, such as DE or SE. Applies to GLEIF name searches only.

## `maxRetries` (type: `integer`):

Retries per request after a timeout or a server error, with growing pauses.

## `userAgent` (type: `string`):

User-Agent header sent to the registry APIs. Keep a contact address in it.

## Actor input object example

```json
{
  "companyNames": [
    "Equinor",
    "Kone"
  ],
  "registrationNumbers": [
    "OW6OFBNCKXC4US5C7523",
    "923609016",
    "0112038-9"
  ],
  "registries": [
    "gleif",
    "norway",
    "finland"
  ],
  "maxResultsPerSearch": 3,
  "maxResults": 100,
  "activeOnly": true,
  "areas": [
    "Oslo",
    "Bergen"
  ],
  "areaCountry": "norway",
  "industries": [
    "restaurants"
  ],
  "industryCodes": [
    "56.1",
    "96.21"
  ],
  "postalCodes": [
    "0254"
  ],
  "maxResultsPerArea": 5,
  "maxRetries": 3,
  "userAgent": "open-company-registries/0.1 (Apify Actor; contact don.mangu.data@gmail.com)"
}
```

# Actor output Schema

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

Dataset items in the Companies view: registry, country, companyName, registrationNumber, lei, legalForm, status, foundedDate, industryCode, industryDescription, employees, website, street, postalCode, city, vatRegistered and sourceUrl. All fields are in the full dataset.

## `byArea` (type: `string`):

Dataset items in the Businesses by area view: companyName, registrationNumber, legalForm, industryCode, industryDescription, employeeBand, website, street, postalCode, city, municipality, registeredDate, foundedDate and sourceUrl.

## `stats` (type: `string`):

JSON record with requests per registry, rows per search and per area, and records left out as natural persons.

# 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 = {
    "companyNames": [
        "Equinor"
    ],
    "registrationNumbers": [
        "0112038-9"
    ],
    "registries": [
        "gleif",
        "norway",
        "finland"
    ],
    "maxResultsPerSearch": 3,
    "areas": [
        "Oslo"
    ],
    "areaCountry": "norway",
    "industries": [
        "restaurants"
    ],
    "maxResultsPerArea": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/open-company-registries").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 = {
    "companyNames": ["Equinor"],
    "registrationNumbers": ["0112038-9"],
    "registries": [
        "gleif",
        "norway",
        "finland",
    ],
    "maxResultsPerSearch": 3,
    "areas": ["Oslo"],
    "areaCountry": "norway",
    "industries": ["restaurants"],
    "maxResultsPerArea": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/open-company-registries").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 '{
  "companyNames": [
    "Equinor"
  ],
  "registrationNumbers": [
    "0112038-9"
  ],
  "registries": [
    "gleif",
    "norway",
    "finland"
  ],
  "maxResultsPerSearch": 3,
  "areas": [
    "Oslo"
  ],
  "areaCountry": "norway",
  "industries": [
    "restaurants"
  ],
  "maxResultsPerArea": 5
}' |
apify call conserving_celerytop/open-company-registries --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/open-company-registries"
        }
    }
}
```

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/h2Yhxausn0nIdbM4M/builds/31W1qYjcbmt7wakIg/openapi.json
