# GLEIF LEI Lookup: Legal Entity Identifier Data | $1/1K (`one_dollar_store/gleif-lei-lookup`) Actor

$1 per 1,000 results, platform usage included. Legal Entity Identifier (LEI) records from the official GLEIF database: legal name, address, registry number, status, renewal date and parent companies. Search by name or LEI, add children. No key.

- **URL**: https://apify.com/one_dollar_store/gleif-lei-lookup.md
- **Developed by:** [One Dollar Store](https://apify.com/one_dollar_store) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GLEIF LEI Lookup: Legal Entity Identifier records, parents and subsidiaries

**$1 per 1,000 legal entities. Platform usage included. No rental, no minimum.**

Look up Legal Entity Identifiers (LEIs) in the official GLEIF database. Search by company name, by exact LEI code or by the number a company has in its national business register. Each legal entity comes back as one row with its legal name, legal and headquarters address, legal form, registry number, entity status, LEI renewal date and, when the entity reports them, its direct and ultimate parent companies. You can also list the subsidiaries of every entity found. No API key and no account with GLEIF.

[Open it in Apify Console](https://console.apify.com/actors/s0UVkPN71AbPxeSYw/input)

### What it costs

| Legal entities | This actor |
|---|---|
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

Plus $0.001 per run. One flat price, platform usage included, so there is no separate compute or proxy bill. Only entity rows are charged. Parent lookups and subsidiary lists add rows or details, never a second fee. Checking 200 counterparties every week costs about $0.20 a run, or about $0.80 a month.

### Why use it

- **Official data, no key.** Rows come straight from the GLEIF API. The data is published by GLEIF under the CC0 licence.
- **Three ways to find an entity.** A name (legal name or full text), an exact LEI code, or a business register number. Narrow by country, entity status, LEI status and category.
- **Ownership in the same row.** Direct and ultimate parent LEI and name sit next to the entity. Ask for subsidiaries and each one comes back as its own row, linked to its parent.
- **Renewal and status for checks.** LEI status (issued, lapsed, retired and so on), the next renewal date and the entity status are on every row, which is what a counterparty or KYC check needs.
- **Safe for scheduled jobs.** A name nobody has registered ends with zero rows and a short message, not a crash. A mistyped LEI is skipped with a warning.

### Quick start

1. Open the actor, keep the example values, press **Start**.
2. Or paste this input, which returns up to 50 German entities with Siemens in the name, with their parents:

```json
{ "searchTexts": ["Siemens"], "country": "DE", "includeParents": true, "maxItems": 50 }
```

3. Download the results as JSON, CSV or Excel, or read them through the API.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/one_dollar_store~gleif-lei-lookup/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"leis": ["W38RGI023J3WT1HWRP32", "HWUPKR0MPOU8FGXBT394"], "includeParents": true, "maxItems": 10}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("one_dollar_store/gleif-lei-lookup").call(
    run_input={"searchTexts": ["Siemens Healthineers"], "country": "DE", "children": "direct", "maxItems": 50}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["lei"], item["legalName"], item.get("directParentName"), item.get("relation"))
```

### Use it from an AI assistant

Claude, ChatGPT, Cursor and other assistants can call this actor through Apify's MCP server. Add it with this server address:

```
https://mcp.apify.com?tools=one_dollar_store/gleif-lei-lookup
```

Then ask, for example: "Find the LEI record for Siemens Healthineers AG and list its direct subsidiaries with their countries."

### Switching from another GLEIF actor

Most GLEIF actors take a list of names or LEIs and a result limit. Here they are `searchTexts`, `leis` and `maxItems`. Add `registrationNumbers` to search by business register number, and `children` to list subsidiaries. The core output fields are `lei`, `legalName`, `legalCountry`, `entityStatus`, `registrationStatus`, `nextRenewalDate`, `directParentLei` and `ultimateParentLei`.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTexts` | list of text | none | Company names, one search per line. |
| `searchMode` | `name` or `fulltext` | `name` | `name` looks in the registered legal name. `fulltext` searches more of the record, such as other names, so it can return more. |
| `leis` | list of text | none | Exact LEI codes (20 letters and digits), looked up 100 at a time. A malformed code is skipped with a warning. |
| `registrationNumbers` | list of text | none | Numbers from national business registers, for example `HRB 6684`. The same number can exist in several registers or countries, so add `country`. |
| `country` | text | none | Two letter country code of the legal address, for example `DE`. Applies to name and registry number searches. |
| `entityStatus` | `any`, `ACTIVE`, `INACTIVE` | `any` | `INACTIVE` entities are closed or no longer exist as a legal entity. |
| `registrationStatus` | `any`, `ISSUED`, `LAPSED`, `RETIRED`, `MERGED`, `ANNULLED` | `any` | Status of the LEI itself. `ISSUED` is current, `LAPSED` was not renewed on time. |
| `category` | `any`, `GENERAL`, `FUND`, `BRANCH`, `SOLE_PROPRIETOR`, `RESIDENT_GOVERNMENT_ENTITY`, `INTERNATIONAL_ORGANIZATION` | `any` | Kind of entity. |
| `includeParents` | true or false | true | Adds the direct and ultimate parent LEI and name. Each parent is one extra request to GLEIF. |
| `children` | `none`, `direct`, `ultimate` | `none` | For every entity found, also return its direct or ultimate subsidiaries as extra rows. |
| `maxChildrenPerEntity` | number | 50 | Most subsidiaries per entity, 1 to 1,000. |
| `maxItems` | number | 100 | Total rows for the run, 10 to 10,000. Subsidiary rows count too. |

Name, registry number and the status, country and category filters work together. An LEI lookup returns exactly the codes you gave, so the filters do not apply to it.

Example, current German funds with Siemens in the name, no parent lookups, for a fast and large pull:

```json
{
  "searchTexts": ["Siemens"],
  "country": "DE",
  "category": "FUND",
  "registrationStatus": "ISSUED",
  "includeParents": false,
  "maxItems": 500
}
```

### Output fields

| Field | Meaning |
|---|---|
| `lei`, `recordUrl` | The 20 character LEI and the record on the GLEIF search site. |
| `legalName`, `otherNames` | Registered legal name and the other names on the record. |
| `entityStatus`, `category`, `subCategory` | ACTIVE or INACTIVE, the kind of entity, and the sub category when there is one (for example LOCAL_GOVERNMENT). |
| `legalFormCode`, `legalFormOther` | Legal form code from the ELF list, or the form in words when the list has no entry. |
| `jurisdiction`, `registeredAtAuthority`, `registrationNumber` | Governing country or region, the GLEIF code of the business register, and the number in it. |
| `legalAddress`, `legalCity`, `legalRegion`, `legalPostalCode`, `legalCountry` | Legal address in one line and in parts. |
| `headquartersAddress`, `headquartersCity`, `headquartersCountry` | Headquarters address when it differs or is given. |
| `entityCreatedAt`, `entityExpiredAt`, `entityExpirationReason`, `successorLeis` | Entity dates and, after a merger, the successor LEIs. |
| `registrationStatus`, `initialRegistrationDate`, `lastUpdateDate`, `nextRenewalDate` | State of the LEI and its dates. |
| `managingLou`, `corroborationLevel` | The issuing organisation, and how well the data was checked. |
| `bic`, `mic`, `openCorporatesId`, `spGlobalIds` | Other identifiers linked to the LEI. |
| `directParentLei`, `directParentName`, `ultimateParentLei`, `ultimateParentName` | Parent companies. Only with `includeParents`. |
| `hasDirectParent`, `hasUltimateParent` | True when the entity reports a parent, false when it reports an exception instead (for example no known parent). Missing when GLEIF says nothing. |
| `query`, `relation`, `relatedLei` | Which search found the row. On subsidiary rows, `relation` is `directSubsidiary` or `ultimateSubsidiary` and `relatedLei` is the entity whose subsidiaries were requested. |

Fields a record does not have are left out.

### Sample results

Real rows from test runs on 20 October 2026, with some fields left out.

```json
[
  {"lei": "W38RGI023J3WT1HWRP32", "legalName": "Siemens Aktiengesellschaft", "entityStatus": "ACTIVE", "category": "GENERAL", "legalFormCode": "6QQB", "registrationNumber": "HRB 6684", "legalAddress": "Werner-von-Siemens-Str. 1, München, DE-BY, 80333, DE", "legalCountry": "DE", "registrationStatus": "ISSUED", "nextRenewalDate": "2027-10-25T12:49:24Z", "bic": ["SIEMDEMMXXX"], "hasDirectParent": false},
  {"lei": "529900QBVWXMWANH7H45", "legalName": "Siemens Healthineers AG", "entityStatus": "ACTIVE", "category": "GENERAL", "legalFormCode": "6QQB", "registrationNumber": "HRB 237558", "legalAddress": "n.a, München, DE-BY, 80331, DE", "legalCountry": "DE", "registrationStatus": "ISSUED", "nextRenewalDate": "2027-03-05T11:01:05Z", "bic": ["SIHCDE8EXXX"], "directParentLei": "W38RGI023J3WT1HWRP32", "directParentName": "Siemens Aktiengesellschaft", "ultimateParentLei": "W38RGI023J3WT1HWRP32", "ultimateParentName": "Siemens Aktiengesellschaft", "hasDirectParent": true},
  {"lei": "529900V1L1FFC6HZZP74", "legalName": "Siemens Healthineers Radiopharma CH GmbH", "entityStatus": "ACTIVE", "category": "GENERAL", "legalFormCode": "3EKS", "registrationNumber": "CHE-289.868.113", "legalAddress": "Freilagerstrasse 40, Zürich, CH-ZH, 8047, CH", "legalCountry": "CH", "registrationStatus": "ISSUED", "nextRenewalDate": "2027-01-22T12:40:06Z", "directParentLei": "529900QBVWXMWANH7H45", "directParentName": "Siemens Healthineers AG", "ultimateParentLei": "W38RGI023J3WT1HWRP32", "ultimateParentName": "Siemens Aktiengesellschaft", "hasDirectParent": true, "relation": "directSubsidiary", "relatedLei": "529900QBVWXMWANH7H45"}
]
```

### Limits

- **GLEIF limits how fast you can ask.** Its published limit is 60 requests a minute, so the actor keeps to about 46. A request returns up to 200 entities, so plain searches are not held back by it.
- **Delivery speed is about 9 rows a second.** In one test 2,000 entities came back in 217 seconds. A run has a 600 second time limit by default, so it delivers about 5,000 entities. Raise **Timeout** under Run options for more, or split a big search by country.
- **Parent lookups are the slow part.** An entity that reports a parent costs up to two extra requests, one for the direct and one for the ultimate parent. A run of 1,000 entities that all report both would take about 45 minutes. Turn **Add parent companies** off for long lists, or raise Timeout.
- **Many entities report no parent.** In a test of 20 German Siemens entities, 2 reported a parent. Funds and many companies report none. `hasDirectParent` false means the entity gave a reason for having no parent, and a missing value means GLEIF says nothing. These parents are the accounting consolidation parents entities report, not a complete ownership tree.
- **A search can match far more than a run returns.** The name Bank matches more than 11,000 entities. A run delivers at most `maxItems`, up to 10,000, in GLEIF's order. Add a country or a status to narrow it.
- **Name search is broad.** Siemens also finds funds and small firms with the word in their name. Use a country, a category, or the exact LEI to be sure.
- **Some fields are rarely filled.** `entityExpiredAt`, `entityExpirationReason` and `mic` did not appear in any of our test rows. Other optional fields such as `otherNames`, `bic` and `openCorporatesId` appear on a minority of rows. Missing fields are left out.
- **A parent name can be missing.** If the parent record cannot be read, you still get the parent LEI where GLEIF gave one.
- **Registration data, not a credit check.** An LEI shows who registered the entity and when it was last renewed. It says nothing about solvency or sanctions.

### FAQ

**How much does it cost to look up 10,000 legal entities?**
$10, plus $0.001 for each run.

**Do I pay for compute or proxy on top?**
No. Platform usage is included in the $1 per 1,000 price. The official API is read directly, so no proxy is used.

**How do I find the parent company of a company?**
Search for the company with **Add parent companies** on. The row has `directParentLei`, `directParentName`, `ultimateParentLei` and `ultimateParentName` when the company reports a parent.

**How do I list the subsidiaries of a company?**
Set **Also list subsidiaries** to direct or ultimate. Each subsidiary is one more row, with `relatedLei` pointing at the parent you searched.

**Can I search by company registration number?**
Yes. Put the number in `registrationNumbers` and add the country. The same number can exist in more than one register, so check `jurisdiction` and `registeredAtAuthority` on the rows.

**Where does the data come from?**
From the GLEIF API (api.gleif.org), the Global Legal Entity Identifier Foundation's public database. No key and no login are needed. GLEIF publishes the data under the CC0 licence.

**Is it legal?**
The actor reads public data only, with no login. GLEIF states that its data is available under CC0. How you use it is up to you: follow the licence, GLEIF's terms and the law where you live.

**Is this an official GLEIF product?**
No. It is an independent tool and is not affiliated with or endorsed by GLEIF.

**Do I need an Apify account?**
Yes. Actors run from an Apify account, and a free account is enough to start: it includes $5 of platform usage every month. You can [sign up here](https://www.apify.com?fpr=ymnoit). This is a referral link and it costs you nothing.

**Is there a limit on the free plan?**
Yes. A run started from a free plan account delivers the first 10 results, then ends with a message and a link to the plans. Any paid plan returns everything you ask for, up to your own limit. The price per result is the same on every plan.

### More from The One Dollar Store

Every actor here costs $1 per 1,000 results, platform usage included. See the whole store: https://apify.com/one_dollar_store

**Company records**

- [Bundesanzeiger Scraper](https://apify.com/one_dollar_store/bundesanzeiger-filings-scraper): German company filings and notices.
- [US Business Registry Search](https://apify.com/one_dollar_store/us-business-registry-search): Company records from 6 US state registries.
- [France Company Search](https://apify.com/one_dollar_store/france-company-register-sirene): French companies from the official SIRENE register.
- [Sanctions List Search](https://apify.com/one_dollar_store/sanctions-list-search): Name search across four official sanctions lists.
- [SEC Company Financials](https://apify.com/one_dollar_store/sec-company-financials-xbrl): Reported financial figures for US listed companies.
- [Norway Company Search](https://apify.com/one_dollar_store/norway-company-register-brreg): Norwegian companies from the official Brreg register.
- [SEC 13F Holdings](https://apify.com/one_dollar_store/sec-13f-institutional-holdings): What funds hold, from 13F filings.
- [SEC Form 4 Scraper](https://apify.com/one_dollar_store/sec-form-4-insider-trades): Insider buys and sells from Form 4.
- [EU VAT Validator](https://apify.com/one_dollar_store/eu-vat-number-validator): Check EU VAT numbers against VIES.

### Changelog

- October 2026: first release.

# Actor input Schema

## `searchTexts` (type: `array`):

Find legal entities by name, one search per line, for example Siemens. Add a country below to narrow a common name.

## `searchMode` (type: `string`):

Legal name looks in the registered legal name. Full text searches more of the record, such as other names, so it can return more.

## `leis` (type: `array`):

Look up exact LEI codes, 20 letters and digits each, for example HWUPKR0MPOU8FGXBT394. They are read in groups of 100.

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

Find entities by the number they have in their national business register, for example a company number. Add the country below to avoid clashes between countries.

## `country` (type: `string`):

Two letter country code such as DE, GB or US. Applies to name and registry number searches.

## `entityStatus` (type: `string`):

Active entities still exist. Inactive ones are closed, merged or no longer report. Applies to name and registry number searches.

## `registrationStatus` (type: `string`):

Status of the LEI itself. Issued means the code is current. Lapsed means it was not renewed on time. Applies to name and registry number searches.

## `category` (type: `string`):

Only entities of this kind. Applies to name and registry number searches.

## `includeParents` (type: `boolean`):

Adds the LEI and name of the direct parent and the ultimate parent when the entity reports them. Each parent is one extra request, and the service allows about 46 a minute, so turn this off for long lists.

## `children` (type: `string`):

For every entity found, also return the entities that report it as their direct parent, or as their ultimate parent. Each subsidiary is one more result.

## `maxChildrenPerEntity` (type: `integer`):

Most subsidiaries to return for one entity when subsidiaries are on.

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

The run stops after this many entities in total. Minimum 10.

## Actor input object example

```json
{
  "searchTexts": [
    "Siemens"
  ],
  "searchMode": "name",
  "country": "DE",
  "entityStatus": "any",
  "registrationStatus": "any",
  "category": "any",
  "includeParents": true,
  "children": "none",
  "maxChildrenPerEntity": 50,
  "maxItems": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTexts": [
        "Siemens"
    ],
    "country": "DE",
    "includeParents": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("one_dollar_store/gleif-lei-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 = {
    "searchTexts": ["Siemens"],
    "country": "DE",
    "includeParents": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("one_dollar_store/gleif-lei-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 '{
  "searchTexts": [
    "Siemens"
  ],
  "country": "DE",
  "includeParents": true,
  "maxItems": 20
}' |
apify call one_dollar_store/gleif-lei-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,one_dollar_store/gleif-lei-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/s0UVkPN71AbPxeSYw/builds/1LH1znYRqkRoV4nhd/openapi.json
