# GLEIF LEI Scraper — LEI Lookup, Lapsed Status & Parents (`publicdata/gleif-lei-scraper`) Actor

LEI lookup and bulk export from the official GLEIF Global LEI Index: search any LEI code or legal entity identifier for legal name, status, jurisdiction, addresses, national register ID, BIC/MIC codes, renewal dates and direct and ultimate parent companies. Screen for lapsed LEIs.

- **URL**: https://apify.com/publicdata/gleif-lei-scraper.md
- **Developed by:** [Riccardo](https://apify.com/publicdata) (community)
- **Categories:** Business, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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

## GLEIF LEI Scraper — Legal Entity Identifiers & Ownership

**Find out which of your counterparties is carrying a lapsed LEI, who ultimately owns them, and which national register number their legal entity identifier maps back to — in one run, without opening a single portal page.**

This Actor exports records from the official **GLEIF Global LEI Index**, the worldwide register of legal entities in financial markets: **2.7 million+ entities across 200+ jurisdictions**. It reads `api.gleif.org`, the foundation's own API — no key, no browser, public domain (CC0). Do a one-off **LEI lookup** by name, enrich **LEI codes** you already hold, or sweep a country for renewal failures.

### What you get

**Renewal and status — the lapsed-LEI signal**

- **`registrationStatus`** — ISSUED, LAPSED, RETIRED, ANNULLED, MERGED or DUPLICATE. LAPSED means the entity did not renew, a standard due-diligence red flag.
- **`nextRenewalDate`** — the date the LEI must next be renewed, so you can act before it lapses rather than after.
- `initialRegistrationDate`, `lastUpdateDate`, `managingLou`, and `corroborationLevel` (FULLY\_CORROBORATED, PARTIALLY\_CORROBORATED or ENTITY\_SUPPLIED\_ONLY) to document how strongly a record was validated.
- `status` (ACTIVE / INACTIVE), `expirationDate`, and `successorLei` for entities that merged into another.

**Ownership hierarchy — company ownership data**

- **`directParentLei`** and **`directParentName`** — the immediate parent.
- **`ultimateParentLei`** and **`ultimateParentName`** — the top of the group.

Walk those four fields across a list and you reconstruct group structure without a paid ownership database.

**Identity and cross-register keys**

- `lei` (the 20-character code), `legalName`, `otherNames` (trading and alternative names).
- **`registeredAs`** — the identifier in the national business register: a SIREN, an HRB number, a company number. This is what lets you join GLEIF to a local register.
- `registryCode` (which national register validated the entity), `category` (GENERAL, FUND, BRANCH, SOLE\_PROPRIETOR, INTERNATIONAL\_ORGANIZATION), `jurisdiction`, `legalFormCode` (ISO 20275), `creationDate`.

**Addresses and market identifiers**

- `legalAddress` and `headquartersAddress` (lines, city, region, country, postal code), plus flattened `country`, `city`, `postalCode`.
- **`bic`** (linked SWIFT/BIC codes), `mic` (market identifier codes), `isins` (securities issued, fetched on request), `sourceUrl` and `source`.

### Who uses this

- A **compliance officer** running KYC counterparty screening sweeps a country for `registrationStatus: LAPSED` and gets the list of clients whose LEI quietly expired.
- A **KYB analyst** onboarding a new supplier pulls the direct and ultimate parent to see which group actually stands behind the invoicing entity.
- A **sales or credit team** enriches a spreadsheet of LEI codes into legal names, addresses and parent company data before pricing a facility.
- A **data engineer** uses `registeredAs` to join GLEIF records to a national company register, and `bic`, `mic` or `isins` to join them to market data.
- A **researcher or AI agent** queries the Actor through the Apify MCP server to answer "who owns this entity" without writing any scraper.

### Example output

Shortened — one record, as returned:

```json
{
  "lei": "969500H8I9NI5PPOKZ50",
  "legalName": "NESTLE DYNAMIQUE",
  "status": "ACTIVE",
  "category": "FUND",
  "jurisdiction": "FR",
  "legalFormCode": "MQU9",
  "registeredAs": "74530",
  "registryCode": "RA000190",
  "creationDate": "2022-10-06",
  "country": "FR",
  "city": "PARIS",
  "postalCode": "75009",
  "registrationStatus": "ISSUED",
  "corroborationLevel": "FULLY_CORROBORATED",
  "directParentLei": null,
  "directParentName": null,
  "ultimateParentLei": null,
  "ultimateParentName": null,
  "sourceUrl": "https://search.gleif.org/#/record/969500H8I9NI5PPOKZ50",
  "source": "GLEIF Global LEI Index (CC0)"
}
```

Here the parent fields are `null` because this entity did not report a parent — see the honest limits below. On a record that failed renewal, `registrationStatus` reads `LAPSED` and `nextRenewalDate` sits in the past; that pair is the whole screening signal.

### Input

| Field | What it does |
|---|---|
| `query` | Entity name to search, fuzzy. Leave empty to browse with the filters below. |
| `leiList` | Exact 20-character LEI codes to fetch. Overrides the search — use this to enrich a list you already have. |
| `countries` | ISO-2 country codes of the legal address: `CH`, `DE`, `FR`, `US`. Empty means worldwide. |
| `entityStatus` | Whether the legal entity is still active. Default `all`. |
| `registrationStatus` | `ISSUED` (current) or `LAPSED` (not renewed), plus RETIRED, MERGED, ANNULLED. Default `all`. |
| `category` | Restrict to GENERAL, FUND, BRANCH, SOLE\_PROPRIETOR or INTERNATIONAL\_ORGANIZATION. Default `all`. |
| `includeParents` | Fetch direct and ultimate parent. Default `true`. Adds up to two requests per entity. |
| `includeIsins` | Fetch securities issued by each entity. Default `false`. Adds one request per entity. |
| `maxItems` | Safety cap on results. Default `200`, `0` = unlimited. |

Compliance sweep — every German entity whose LEI was not renewed:

```json
{ "countries": ["DE"], "registrationStatus": "LAPSED" }
```

Enrich a counterparty list you already hold, with the ownership tree:

```json
{ "leiList": ["969500H8I9NI5PPOKZ50"], "includeParents": true }
```

Every Swiss fund with a current LEI, no cap:

```json
{ "countries": ["CH"], "category": "FUND", "registrationStatus": "ISSUED", "maxItems": 0 }
```

### Run it on a schedule

GLEIF republishes the index daily, so a daily schedule is the right cadence — this is a daily register, not a real-time feed. Set the Actor to run each morning with `registrationStatus: "LAPSED"` for your countries, and it becomes a standing watch for renewal failures.

From the Apify console, connect the run to **Google Sheets, Slack, e-mail, a webhook, Make or Zapier** through the built-in integrations, and new rows land where your team already works. **Deduplicate on `lei`** — it is stable, unique and never reused — so you are alerted only about entities that newly appear in the lapsed set.

### Use it from code or from an AI agent

Start runs and read the dataset over the Apify API or the Apify CLI, in any language, with the same input JSON shown above. The Actor is also exposed as an **MCP tool through the Apify MCP server**, so an AI agent can call it directly to resolve an LEI code or fetch parent company data mid-conversation.

### Pricing

Pay-per-event: a small fee **per entity exported**, so a five-record lookup costs what five records cost. Platform usage on top of that is negligible — the Actor makes plain API calls and never launches a browser.

### Where the data comes from

Every record comes from the **GLEIF Global LEI Index**, published by the Global Legal Entity Identifier Foundation and released into the **public domain under CC0** — free to use, including commercially. Each row carries the `source` field so provenance travels with the data.

Honest limits, so you know what this is not:

- **Level 2 parent relationships are self-reported by the entities themselves.** Where an entity has not reported a parent, the field is simply absent — that is a reporting gap, not evidence that no parent exists.
- **GLEIF records parent *legal entities*, not natural persons. This is not beneficial-ownership (UBO) data** and will not tell you which individuals control a company. If you need UBO, you need a national beneficial-ownership register.
- Coverage is limited to entities that have obtained an LEI; companies with no financial-market activity often have none. The index refreshes daily and is not a real-time feed.

This Actor is independent and not affiliated with GLEIF.

### Related Actors

Same engine, same official-source approach:

- [**AusTender (Australia)**](https://apify.com/publicdata/austender-australian-government-contracts) — federal contracts, winners and expiry dates
- [**UK Public Tenders**](https://apify.com/publicdata/uk-contracts-finder-find-a-tender) — Contracts Finder and Find a Tender in one run
- [**Swiss Public Tenders (simap.ch)** — tenders and awards with prices, bid counts and weighted criteria](https://apify.com/publicdata/simap-swiss-public-tenders)
- [**Swiss Commercial Register (SHAB)** — new companies, changes, deletions and bankruptcies](https://apify.com/publicdata/shab-swiss-company-gazette)
- [**EU Tenders (TED)** — European procurement notices and contract awards](https://apify.com/publicdata/ted-eu-public-tenders)
- [**France Company Register** — SIREN/SIRET, executives, official labels](https://apify.com/publicdata/france-company-register-scraper)
- [**Brazil CNPJ** — Receita Federal company data and partners](https://apify.com/publicdata/brazil-cnpj-lookup)

# Actor input Schema

## `query` (type: `string`):

Entity name to search for (fuzzy). Leave empty to browse using the filters below.

## `leiList` (type: `array`):

Exact 20-character LEI codes to fetch. Overrides the search.

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

ISO-2 country codes of the legal address, e.g. CH, DE, FR, US. Empty = worldwide.

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

Filter by whether the legal entity is still active.

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

ISSUED means the LEI is current; LAPSED means it was not renewed (a due-diligence red flag).

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

Restrict to a category of entity.

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

Fetch direct and ultimate parent companies. Adds up to two requests per entity.

## `includeIsins` (type: `boolean`):

Fetch securities (ISINs) issued by each entity. Adds one request per entity.

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

Safety cap (0 = unlimited).

## Actor input object example

```json
{
  "query": "Nestle",
  "entityStatus": "all",
  "registrationStatus": "all",
  "category": "all",
  "includeParents": true,
  "includeIsins": false,
  "maxItems": 200
}
```

# Actor output Schema

## `dataset` (type: `string`):

Legal Entity Identifier records from the GLEIF Global LEI Index. Every exported row is one dataset item.

# 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 = {
    "query": "Nestle"
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicdata/gleif-lei-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 = { "query": "Nestle" }

# Run the Actor and wait for it to finish
run = client.actor("publicdata/gleif-lei-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 '{
  "query": "Nestle"
}' |
apify call publicdata/gleif-lei-scraper --silent --output-dataset

```

## MCP server setup

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