# LEI Scraper — GLEIF Legal Entity & Company Registry Data (`logiover/gleif-lei-company-registry-scraper`) Actor

Bulk-extract the global Legal Entity Identifier registry: 3.4 million legal entities with legal name, legal and headquarters address, jurisdiction, legal form, national registration number, LEI status, renewal dates and ownership links. KYC and counterparty data. No API key.

- **URL**: https://apify.com/logiover/gleif-lei-company-registry-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Lead generation
- **Stats:** 582 total users, 33 monthly users, 99.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LEI Scraper — GLEIF Legal Entity & Company Registry Data

The closest thing to a single global company register: 3.4 million legal entities with legal name, both addresses, jurisdiction, legal form, national registration number, LEI status and ownership links.

### What does the LEI Scraper do?

This Actor extracts the **Legal Entity Identifier (LEI)** registry published by GLEIF, the Global Legal Entity Identifier Foundation. The LEI is the ISO 17442 code that every entity trading in financial markets is required to hold, which makes this registry unusually complete: 3.4 million entities across every jurisdiction, each validated against its own national company register and re-checked annually.

What makes the dataset joinable is the `registeredAs` field — the registration number the entity holds at its local companies registry. That is the key that lets you match an LEI record to a Companies House number, a German HRB number, a Turkish MERSIS number or a US state filing ID, and so merge global counterparty data into whatever you already hold.

One property of the API shapes how this Actor works. Page-based pagination stops dead at 10,000 results per query, so a country with more than that cannot simply be paged through — asking for page 51 returns an error rather than data. This Actor therefore treats a bulk run as a query tree: it counts each filter combination first, and any slice over the ceiling is split again by LEI status, then entity category, then entity status, then registration year and month, until every leaf fits. That is what lets one run collect the 358,000 US entities the ceiling would otherwise hide.

### Who is it for?

- **KYC, AML and compliance teams** building or refreshing a counterparty master file.
- **Fintechs and banks** that must map trading counterparties to LEIs under EMIR, MiFID II or Dodd-Frank.
- **Data and RegTech vendors** seeding an entity-resolution graph with validated, cross-referenced identities.
- **Sales and market intelligence teams** who need a clean, global list of registered companies by country and legal form.
- **Researchers and journalists** tracing corporate ownership structures across borders.

### Use cases

- Pull every active legal entity in a country and join it to your CRM on the national registration number.
- Track lapsed LEIs — an entity that stopped renewing is a counterparty-risk signal worth alerting on.
- Map a corporate group: give a parent LEI and collect every subsidiary it owns, or every entity that owns it.
- Build an entity-resolution reference set with legal name, trade names, both addresses and the S\&P company ID.
- Monitor newly issued LEIs each month as an early signal of new market entrants.
- Feed an AI agent a live company reference set so it can answer counterparty and ownership questions.

### Why use this LEI Scraper?

- **The 10,000-result ceiling handled automatically** — the Actor slices a country into sub-queries so bulk runs actually reach the whole population.
- **National registration number on 86% of rows**, which is what makes the data joinable to local registries.
- **Legal form resolved to a readable name**, not just an ELF code: `V44D` becomes `stichting`, `R5UT` becomes `limited şirket`.
- **Ownership in both directions** — subsidiaries of a LEI, and the entities that own it.
- **Both addresses kept separate**, with a flag for the 14% of entities whose headquarters differ from their legal address.
- **Keyless and open** — GLEIF publishes this data for public reuse; no API key, no login, no rate-limit token.

### What data can you extract?

One row per legal entity. Anything the source left blank comes back as `null`.

| Field | Type | Description |
|---|---|---|
| `lei` | string | 20-character ISO 17442 Legal Entity Identifier |
| `legalName` | string | Registered legal name |
| `otherNames` | string | Trade names and previous names, pipe-separated |
| `entityCategory` | string | GENERAL, FUND, BRANCH, SOLE\_PROPRIETOR and so on |
| `entityStatus` | string | ACTIVE or INACTIVE at the national registry |
| `legalFormCode` | string | ELF legal-form code, e.g. V44D |
| `legalFormName` | string | Legal form resolved to a readable name |
| `jurisdiction` | string | Jurisdiction the entity is registered in |
| `registeredAs` | string | Registration number at the entity's own national registry — the join key to local company data |
| `registeredAtId` | string | GLEIF code of the registration authority, e.g. RA000463 |
| `legalAddress` | string | Legal address street line |
| `legalCity` | string | Legal address city |
| `legalRegion` | string | Legal address region or state |
| `legalCountry` | string | Legal address country (ISO alpha-2) |
| `legalPostalCode` | string | Legal address postcode |
| `hqAddress` | string | Headquarters street line |
| `hqCity` | string | Headquarters city |
| `hqRegion` | string | Headquarters region |
| `hqCountry` | string | Headquarters country |
| `hqPostalCode` | string | Headquarters postcode |
| `hqDiffersFromLegal` | boolean | True where the headquarters is not the legal address |
| `registrationStatus` | string | LEI status: ISSUED, LAPSED, RETIRED, ANNULLED, DUPLICATE |
| `initialRegistrationDate` | string | When the LEI was first issued |
| `lastUpdateDate` | string | When the record was last updated |
| `nextRenewalDate` | string | When the LEI must next be renewed |
| `isLapsed` | boolean | True where the holder stopped renewing the LEI |
| `managingLou` | string | LEI of the Local Operating Unit that maintains the record |
| `validationSources` | string | How thoroughly the record was corroborated, e.g. FULLY\_CORROBORATED |
| `validationAuthorityId` | string | Authority the record was validated against |
| `creationDate` | string | When the entity itself was created |
| `successorLei` | string | LEI of the successor entity after a merger |
| `spglobal` | string | S\&P Global company identifiers, where mapped |
| `conformityFlag` | string | Whether the record conforms to GLEIF data-quality rules |
| `relatedLei` | string | In subsidiary and parent modes, the anchor LEI the row relates to |
| `url` | string | Link to the record on GLEIF's own search site |
| `scrapedAt` | string | When this row was collected |

#### Sample output

```json
{
  "lei": "5493001IN9FTPIHPPO54",
  "legalName": "WILKINSON SWORD GMBH",
  "otherNames": "Halde Zweiunddreißigste Verwaltungsgesellschaft mbH",
  "entityCategory": "GENERAL",
  "entityStatus": "ACTIVE",
  "legalFormCode": "2HBR",
  "legalFormName": "Gesellschaft mit beschränkter Haftung",
  "jurisdiction": "DE",
  "registeredAs": "HRB 16753",
  "registeredAtId": "RA000369",
  "legalAddress": "SCHUTZENSTR. 110",
  "legalCity": "SOLINGEN",
  "legalRegion": "DE-NW",
  "legalCountry": "DE",
  "legalPostalCode": "42659",
  "hqAddress": "SCHUTZENSTR. 110",
  "hqCity": "SOLINGEN",
  "hqRegion": "DE-NW",
  "hqCountry": "DE",
  "hqPostalCode": "42659",
  "hqDiffersFromLegal": false,
  "registrationStatus": "ISSUED",
  "initialRegistrationDate": "2012-12-18T16:18:00Z",
  "lastUpdateDate": "2026-03-03T08:57:16Z",
  "nextRenewalDate": "2027-03-31T16:35:29Z",
  "isLapsed": false,
  "managingLou": "5493001KJTIIGC8Y1R12",
  "validationSources": "FULLY_CORROBORATED",
  "validationAuthorityId": "RA000369",
  "creationDate": "2003-09-29T00:00:00Z",
  "successorLei": null,
  "spglobal": "5552822",
  "conformityFlag": "NON_CONFORMING",
  "relatedLei": null,
  "url": "https://search.gleif.org/#/record/5493001IN9FTPIHPPO54",
  "scrapedAt": "2026-08-16T09:39:45.488Z"
}
```

### How to use the LEI Scraper

#### Option A — a country in bulk

Keep registry mode, enter one or more ISO country codes (`DE`, `US`, `GB`, `IN`, `IT`, `NL`), optionally restrict to active entities with an issued LEI, and set a result limit. Slices over the API ceiling are split automatically, so a large country is collected in full rather than truncated at 10,000.

#### Option B — the whole registry

Enter `ALL` as the country to walk all 3.4 million records. Set the result limit to what you actually need; the run collects in slices and can be resumed by narrowing the filters.

#### Option C — enrich a list you already hold

Switch to lookup mode and paste your LEI codes. The Actor returns the full record for each, 200 per request — the fastest way to refresh a counterparty file.

#### Option D — map a corporate group

Subsidiary mode takes a parent LEI and returns every entity it owns; parent mode does the reverse. Each row records which anchor LEI it belongs to, so several groups can be mapped in one run.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `mode` | string | Registry pulls entities in bulk by country. Search finds them by name. Lookup takes LEI codes. Subsidiaries returns what a LEI owns; Parents returns what owns it. Default: `"registry"`. |
| `countries` | string | Registry mode. ISO 3166-1 alpha-2 codes of the legal address, comma-separated, e.g. DE, US, GB, IN, IT, NL, FR. Enter ALL to walk the whole 3.4-million-record registry. Slices over the API's 10,000-result ceiling are split automatically. Default: `"DE"`. |
| `entityStatus` | string | Optional. ACTIVE excludes entities that have been dissolved or merged away. |
| `registrationStatus` | string | Optional. ISSUED is a live, renewed LEI; LAPSED means the holder stopped renewing it, which is itself a risk signal. |
| `entityCategory` | string | Optional. GENERAL is an ordinary company, FUND an investment fund, BRANCH a registered branch of a foreign entity. |
| `searchQuery` | string | Search mode. Full-text search across entity names, e.g. deutsche bank or siemens. |
| `leiCodes` | string | Lookup mode. One or more 20-character LEI codes, comma- or newline-separated. Use this to enrich a list you already hold. |
| `parentLeiCodes` | string | Subsidiary and parent modes. One or more LEI codes, comma- or newline-separated. Each returned row records which anchor LEI it belongs to. |
| `maxResults` | integer | Stop after this many records. Each request returns 200. Default: `5000`. |
| `proxyConfiguration` | object | Optional. The GLEIF API is public and open, so a proxy is not required; it is available if you want the requests routed. |

### Tips for best results

- Filtering to `ISSUED` plus `ACTIVE` gives the live population; leaving both open also brings back lapsed and dissolved entities, which is what you want for historical work.
- `registeredAs` is the field to join on. It is filled for about 86% of entities — the gaps are mostly funds and branches that have no separate national registration.
- `isLapsed` is a cheap risk flag: an entity that stopped paying to renew its LEI has usually stopped trading, or stopped caring.
- Large countries are split by registration year automatically. If a run stops early, narrow it by category or status rather than raising the result limit.
- `hqDiffersFromLegal` marks the entities whose operations sit somewhere other than their registered seat — often the interesting ones.

### Integrations

Connect this Actor to Make, Zapier, n8n, Slack, Google Sheets, GitHub, Airtable or any HTTP endpoint through Apify integrations. Every finished run can push its dataset straight into your warehouse, or fire a webhook so a downstream job starts the moment the data lands.

### API usage

Run the Actor from your own code with the Apify API. Datasets can be exported as JSON, CSV, Excel, XML, RSS or HTML, and every run is available through the [Apify API reference](https://docs.apify.com/api/v2).

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~gleif-lei-company-registry-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input": {"mode": "registry", "countries": "DE", "entityStatus": "ACTIVE", "registrationStatus": "ISSUED", "maxResults": 5000, "proxyConfiguration": {"useApifyProxy": false}}}'
```

Python, JavaScript, PHP and CLI clients are documented under [Apify API clients](https://docs.apify.com/api/client).

### Use with AI agents (MCP)

This Actor is callable from any MCP-compatible client — Claude, Cursor, VS Code or your own agent — through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). An agent can call it to answer live questions about company identity, legal form, registration numbers and corporate ownership worldwide instead of guessing from stale training data.

### FAQ

#### Do I need a GLEIF account or API key?

No. GLEIF publishes the LEI registry as open data for public reuse, and the Actor reads it with no key and no login.

#### What is an LEI?

A 20-character code defined by ISO 17442 that identifies a legal entity taking part in financial transactions. Regulators in the EU, US and UK require it for derivatives and securities reporting, which is why coverage is broad and kept current.

#### How many records can one run return?

3.4 million exist. A single API query stops at 10,000, but this Actor slices around that, so the practical limit is the result cap you set.

#### Why does the log show the run splitting into slices?

Because the API refuses to paginate past 10,000 results per query. Counting each filter combination and splitting the big ones is what makes a complete country pull possible instead of a truncated one.

#### What is `registeredAs` and why does it matter?

It is the entity's registration number at its own national companies registry — an HRB number in Germany, a company number at Companies House, a MERSIS number in Turkey. It is the key that lets you join this global dataset to local records.

#### Can I get ownership structures?

Yes. Subsidiary mode returns every entity a given LEI owns; parent mode returns the entities that own it. Note that GLEIF only holds relationships the entities themselves reported, so a group with no reported parent will come back empty.

#### Why is `successorLei` usually empty?

It is only filled where an entity was merged into another one. Run with entity status `INACTIVE` to concentrate on dissolved and merged entities, where it fills for roughly a third of rows.

#### How current is the data?

GLEIF updates the registry continuously and every LEI must be re-validated annually. `lastUpdateDate` and `nextRenewalDate` on each row tell you exactly how fresh that specific record is.

#### Can I export to CSV or Excel?

Yes. Every run's dataset exports as JSON, CSV, Excel, XML, RSS or HTML from the Storage tab, the API, or automatically through an integration.

#### How fresh is the data?

Every run reads the site live at that moment, so the data is as fresh as the site itself. Schedule the Actor hourly, daily or weekly to build a time series.

#### How often is the Actor updated?

It is monitored and fixed when the site changes its markup or its endpoints. Report anything that looks wrong through the Issues tab and it gets picked up.

### Is it legal to scrape GLEIF?

This Actor collects only publicly available information — the same pages any visitor can open without logging in. It does not bypass a login, and it does not touch private or personal accounts. Public data collection is legal in most jurisdictions, but how you *use* the data is your responsibility: if any record contains personal data, GDPR and comparable laws still apply, and you need a lawful basis for processing it. When in doubt, take legal advice. See Apify's [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/) guide.

### Related scrapers

- [UK Companies House Bulk Scraper](https://apify.com/logiover/uk-companies-house-bulk-scraper) — full UK company register.
- [SEC EDGAR Form D Scraper](https://apify.com/logiover/sec-edgar-form-d-scraper) — US private placement filings.
- [OFAC Sanctions Scraper](https://apify.com/logiover/ofac-sanctions-scraper) — US sanctions and watchlists.
- [ICIJ Offshore Leaks Scraper](https://apify.com/logiover/icij-offshore-leaks-scraper) — offshore entity records.
- [France Company Registry Scraper](https://apify.com/logiover/france-company-registry-scraper) — French SIREN/SIRET data.

# Actor input Schema

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

Registry pulls entities in bulk by country. Search finds them by name. Lookup takes LEI codes. Subsidiaries returns what a LEI owns; Parents returns what owns it.

## `countries` (type: `string`):

Registry mode. ISO 3166-1 alpha-2 codes of the legal address, comma-separated, e.g. DE, US, GB, IN, IT, NL, FR. Enter ALL to walk the whole 3.4-million-record registry. Slices over the API's 10,000-result ceiling are split automatically.

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

Optional. ACTIVE excludes entities that have been dissolved or merged away.

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

Optional. ISSUED is a live, renewed LEI; LAPSED means the holder stopped renewing it, which is itself a risk signal.

## `entityCategory` (type: `string`):

Optional. GENERAL is an ordinary company, FUND an investment fund, BRANCH a registered branch of a foreign entity.

## `searchQuery` (type: `string`):

Search mode. Full-text search across entity names, e.g. deutsche bank or siemens.

## `leiCodes` (type: `string`):

Lookup mode. One or more 20-character LEI codes, comma- or newline-separated. Use this to enrich a list you already hold.

## `parentLeiCodes` (type: `string`):

Subsidiary and parent modes. One or more LEI codes, comma- or newline-separated. Each returned row records which anchor LEI it belongs to.

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

Stop after this many records. Each request returns 200.

## `proxyConfiguration` (type: `object`):

Optional. The GLEIF API is public and open, so a proxy is not required; it is available if you want the requests routed.

## Actor input object example

```json
{
  "mode": "registry",
  "countries": "DE",
  "entityStatus": "",
  "registrationStatus": "",
  "entityCategory": "",
  "searchQuery": "deutsche bank",
  "leiCodes": "5493001KJTIIGC8Y1R12, 254900OPPU84GM83MG36",
  "parentLeiCodes": "5493001KJTIIGC8Y1R12",
  "maxResults": 5000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or Excel.

# 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": "registry",
    "countries": "DE",
    "entityStatus": "",
    "registrationStatus": "",
    "entityCategory": "",
    "maxResults": 5000,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/gleif-lei-company-registry-scraper").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": "registry",
    "countries": "DE",
    "entityStatus": "",
    "registrationStatus": "",
    "entityCategory": "",
    "maxResults": 5000,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/gleif-lei-company-registry-scraper").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": "registry",
  "countries": "DE",
  "entityStatus": "",
  "registrationStatus": "",
  "entityCategory": "",
  "maxResults": 5000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call logiover/gleif-lei-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/gleif-lei-company-registry-scraper"
        }
    }
}

```

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/TKhVyjHu2dHCYTaMg/builds/h5XwgTkLcBRzkn1MA/openapi.json
