# LEI Lookup & Company Search (GLEIF) (`henri_dewitte/gleif-lei-lookup`) Actor

Look up companies in the official GLEIF LEI database by LEI, ISIN, BIC, company/VAT number or name, or search all LEIs by country, status and renewal date. Parent companies included. $2 per 1,000 records.

- **URL**: https://apify.com/henri_dewitte/gleif-lei-lookup.md
- **Developed by:** [Henri De Witte](https://apify.com/henri_dewitte) (community)
- **Categories:** Lead generation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 lei records

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

## LEI Lookup & Company Search (GLEIF)

Look up companies in the **official GLEIF LEI database**: the global register of Legal Entity Identifiers used by banks, brokers, funds and regulators. Enter a list of **LEIs, ISINs, BICs, company/VAT numbers or company names**, or **search all 3.4 million LEIs** by country, status and renewal date. Parent companies included.

- ✅ Official GLEIF API (free, CC0 open data), updated daily
- ✅ Mixed lists: LEI, ISIN, BIC/SWIFT, company number (e.g. Belgian `BE0202239951`, German `HRB 719915`) or name, detected automatically
- ✅ Bulk: 200 LEIs per request, thousands per run
- ✅ Direct and ultimate parent company (LEI, name, country), or the reason why none is reported
- ✅ Renewal status: `CURRENT`, `DUE_SOON` (60 days), `OVERDUE`, with days until renewal
- ✅ Search filters: country, name wildcard, LEI status, company status, category, renewal date, registration date
- ✅ "Only new since last run" mode: get every new LEI in your country on a schedule
- ✅ Validates LEI and ISIN check digits and tells you about typos

### What can you use it for?

- **KYC and onboarding:** check that a client's LEI is valid and not lapsed, and get its official name, address and parent company.
- **Regulatory reporting (MiFID II, EMIR, SFTR):** validate the LEIs in your trade reports in bulk before you submit them.
- **Data enrichment:** turn ISINs, BICs or company numbers into LEIs and clean company data.
- **Lead generation for LEI and compliance services:** list companies whose LEI expires in the next 30 days, or that registered a new LEI this week.
- **Group structures:** see which companies belong to the same ultimate parent.

### How to use it

**Look up a list**

1. Keep the mode on **Look up a list**.
2. Paste your LEIs, ISINs, BICs, company numbers or names, one per line.
3. Click **Start**. Each row tells you how it was matched (`matchedBy`).

**Search with filters**

1. Choose **Search with filters**.
2. Set at least one filter, e.g. country `BE` and "Renewal due within 30 days".
3. Click **Start**, or schedule it with "Only new since the last run".

### Input examples

Mixed lookup list:

```json
{
    "mode": "lookup",
    "queries": ["529900D6BF99LW9R2E68", "US0378331005", "GEBABEBBXXX", "BE0403227515", "Colruyt"]
}
```

All valid Belgian LEIs that must be renewed in the next 30 days:

```json
{
    "mode": "search",
    "countries": ["BE"],
    "registrationStatuses": ["ISSUED"],
    "renewalWithinDays": 30,
    "maxResults": 5000
}
```

| Field                             | Default  | Meaning                                                                                                      |
| --------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------ |
| `mode`                            | `lookup` | `lookup` (a list) or `search` (filters).                                                                     |
| `queries`                         | –        | LEIs, ISINs, BICs, company numbers or names. Prefixes `lei:`, `isin:`, `bic:`, `reg:`, `name:` force a type. |
| `countries`                       | `[]`     | 2-letter country codes of the legal address.                                                                 |
| `maxMatchesPerName`               | `1`      | Matches per company name (best first).                                                                       |
| `nameFilter`                      | empty    | Search: legal name, `*` = wildcard (`*bank*`).                                                               |
| `registrationStatuses`            | `[]`     | Search: `ISSUED`, `LAPSED`, `RETIRED` ...                                                                    |
| `entityStatus`                    | `ANY`    | Search: `ACTIVE` or `INACTIVE` companies.                                                                    |
| `categories`                      | `[]`     | Search: `GENERAL`, `FUND`, `BRANCH` ...                                                                      |
| `renewalWithinDays`               | empty    | Search: renewal between today and X days from now.                                                           |
| `renewalFrom` / `renewalTo`       | empty    | Search: renewal date range (YYYY-MM-DD).                                                                     |
| `registeredWithinDays`            | empty    | Search: LEI first issued in the last X days.                                                                 |
| `registeredFrom` / `registeredTo` | empty    | Search: first registration date range.                                                                       |
| `includeParents`                  | `true`   | Add direct and ultimate parent company.                                                                      |
| `includeSoleProprietors`          | `false`  | Sole proprietors are natural persons and are skipped by default (GDPR).                                      |
| `maxResults`                      | `1000`   | Maximum records (and maximum cost) per run.                                                                  |
| `onlyNewSinceLastRun`             | `false`  | Only LEIs that an earlier run with the same settings did not return.                                         |

### Output example

```json
{
    "lei": "5493001KJTIIGC8Y1R12",
    "legalName": "Bloomberg Finance L.P.",
    "otherNames": [],
    "entityStatus": "ACTIVE",
    "registrationStatus": "ISSUED",
    "renewalStatus": "CURRENT",
    "daysUntilRenewal": 109,
    "nextRenewalDate": "2027-01-25T16:50:02.000Z",
    "initialRegistrationDate": "2012-12-06T20:55:22.000Z",
    "lastUpdateDate": "2026-01-05T14:20:40.000Z",
    "entityCreationDate": "2007-06-05T00:00:00.000Z",
    "category": "GENERAL",
    "subCategory": null,
    "legalFormCode": "T91T",
    "legalFormOther": null,
    "jurisdiction": "US-DE",
    "registeredAs": "4348344",
    "registrationAuthorityId": "RA000602",
    "legalAddress": "C/O Corporation Service Company, 251 Little Falls Drive",
    "legalCity": "Wilmington",
    "legalPostalCode": "19808",
    "legalRegion": "US-DE",
    "legalCountry": "US",
    "hqAddress": "731 Lexington Avenue",
    "hqCity": "New York",
    "hqPostalCode": "10022",
    "hqRegion": "US-NY",
    "hqCountry": "US",
    "bics": [],
    "directParentLei": "549300B56MD0ZC402L06",
    "directParentName": "Bloomberg L.P.",
    "directParentCountry": "US",
    "ultimateParentLei": "549300RMUDWPHCUQNE66",
    "ultimateParentName": "Bloomberg Inc.",
    "ultimateParentCountry": "US",
    "parentExceptionReason": null,
    "successorLei": null,
    "successorName": null,
    "expirationDate": null,
    "expirationReason": null,
    "managingLou": "5493001KJTIIGC8Y1R12",
    "corroborationLevel": "FULLY_CORROBORATED",
    "conformityFlag": "CONFORMING",
    "gleifUrl": "https://search.gleif.org/#/record/5493001KJTIIGC8Y1R12",
    "query": "5493001KJTIIGC8Y1R12",
    "matchedBy": "lei",
    "scrapedAt": "2026-10-08T11:30:00.000Z"
}
```

### Pricing

**Pay per result: $2 per 1,000 LEI records** ($0.002 per record), parent companies included. You only pay for records in your dataset: search terms that find nothing and duplicates are never charged. Set a **maximum cost per run** and the Actor stops cleanly when it is reached.

**Free Apify plan:** a run returns at most **100 records**. Upgrade to a paid Apify plan to get all results.

### FAQ

**Where does the data come from?** From the official GLEIF API. GLEIF publishes LEI data as open data (CC0), free to use for any purpose.

**Why do I get a different company when I search by name?** Names are not unique. The Actor ranks exact matches first and prefers valid LEIs. Add a country, raise "Matches per name", or use the company number or LEI for an exact match.

**My VAT number is matched as ISIN first?** Belgian VAT numbers (BE + 10 digits) look exactly like Belgian ISINs. The Actor tries ISIN first and then the company number automatically. Use the `reg:` prefix to skip the ISIN check.

**Personal data?** LEI data describes legal entities. Sole proprietors (natural persons) are skipped by default. Some company names contain a person's name; you are responsible for how you use the data (GDPR).

**How fast is it?** GLEIF allows 60 requests per minute. LEI lists go 200 per request (very fast); other search terms take about 1 second each. Search mode returns about 100 records per second.

### Limitations

- Only entities with an LEI are included (mainly companies active on financial markets, funds and banks), not every company.
- Searching by city or postal code is not supported by the GLEIF API.
- Company numbers must match how the business register writes them; the Actor tries common spellings for Belgium.

### Support

Found a problem or need a feature? Open an issue on the **Issues** tab.

# Actor input Schema

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

"Look up a list" = enter LEIs, ISINs, BICs, company numbers or names. "Search with filters" = all LEIs that match a country, status, renewal date ...

## `queries` (type: `array`):

One per line. The type is detected automatically: LEI (529900D6BF99LW9R2E68), ISIN (US0378331005), BIC (GEBABEBBXXX), company or VAT number (BE0202239951, HRB 719915) or company name (Proximus). Force a type with a prefix: lei:, isin:, bic:, reg: or name:. Up to 200 LEIs are checked per request.

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

2-letter country codes of the legal address, e.g. BE, NL, DE. In "Look up a list" mode this limits name and number searches.

## `maxMatchesPerName` (type: `integer`):

When searching by company name: how many matches to return (best first).

## `nameFilter` (type: `string`):

Legal name filter. Use \* as a wildcard, e.g. *bank* or *bakkerij*.

## `registrationStatuses` (type: `array`):

ISSUED = valid, LAPSED = not renewed, RETIRED, MERGED, ANNULLED ... Leave empty for all.

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

Does the legal entity still exist?

## `categories` (type: `array`):

GENERAL (companies), FUND, BRANCH ... Leave empty for all.

## `renewalWithinDays` (type: `integer`):

Only LEIs whose next renewal date is between today and X days from now. Great on a schedule. Overrides the renewal dates below.

## `renewalFrom` (type: `string`):

Next renewal date on or after (YYYY-MM-DD).

## `renewalTo` (type: `string`):

Next renewal date on or before (YYYY-MM-DD).

## `registeredWithinDays` (type: `integer`):

Only LEIs issued in the last X days (new companies on the financial markets). Overrides the registration dates below.

## `registeredFrom` (type: `string`):

LEI first issued on or after (YYYY-MM-DD).

## `registeredTo` (type: `string`):

LEI first issued on or before (YYYY-MM-DD).

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

Add the LEI, name and country of the direct and ultimate parent company.

## `includeSoleProprietors` (type: `boolean`):

Sole proprietors are natural persons. They are skipped by default (GDPR). Only turn this on if you have a legal reason to process their data.

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

Maximum number of records this run saves (and you pay for).

## `onlyNewSinceLastRun` (type: `boolean`):

Remember which LEIs you already got and only return new ones. Schedule it to get e.g. every new LEI in your country.

## Actor input object example

```json
{
  "mode": "lookup",
  "queries": [
    "529900D6BF99LW9R2E68",
    "US0378331005",
    "BE0403227515",
    "Proximus"
  ],
  "countries": [],
  "maxMatchesPerName": 1,
  "registrationStatuses": [],
  "entityStatus": "ANY",
  "categories": [],
  "includeParents": true,
  "includeSoleProprietors": false,
  "maxResults": 1000,
  "onlyNewSinceLastRun": false
}
```

# 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 = {
    "queries": [
        "529900D6BF99LW9R2E68",
        "US0378331005",
        "BE0403227515",
        "Proximus"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("henri_dewitte/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 = { "queries": [
        "529900D6BF99LW9R2E68",
        "US0378331005",
        "BE0403227515",
        "Proximus",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("henri_dewitte/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 '{
  "queries": [
    "529900D6BF99LW9R2E68",
    "US0378331005",
    "BE0403227515",
    "Proximus"
  ]
}' |
apify call henri_dewitte/gleif-lei-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,henri_dewitte/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/G7YiX2PF2CtlADsf6/builds/2NDDhwVh5NuSCDL2G/openapi.json
