# LEI Lookup & Company Enrichment (Official GLEIF API) (`gufobyte/gleif-lei-lookup`) Actor

Look up Legal Entity Identifiers (LEI) or match company names to LEIs with the official GLEIF API. Legal name, addresses, status, registration and renewal dates, direct and ultimate parent, ISINs. Open data, no scraping.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Enrichment (Official GLEIF API)

Turn a list of **LEI codes or company names** into clean, structured company data from the **Global Legal Entity Identifier Foundation (GLEIF)**: legal name, legal and headquarters address, entity and LEI status, registration and **renewal dates**, company register ID, legal form, **direct and ultimate parent**, BIC and **ISIN** codes.

Ideal for **KYC/KYB**, counterparty onboarding, **MiFID II / EMIR reporting** checks, supplier master-data clean-up, and CRM enrichment.

### What does LEI Lookup do?

- 🔎 **Bulk LEI lookup**: 100 LEIs per API call, fast and cheap
- 🧠 **Company name → LEI matching** with GLEIF fuzzy search, re-ranked by our own similarity score (legal suffixes such as S.p.A., GmbH, N.V. are ignored)
- 🌍 **Country filter** for name matches (e.g. only `IT`, `DE`)
- 🏢 **Ownership**: direct and ultimate accounting-consolidation parent, or the official reason GLEIF reports none (e.g. `NO_KNOWN_PERSON`)
- 💹 **ISINs and BICs** mapped to the entity
- ✅ **Offline ISO 17442 checksum validation**: mistyped LEIs are flagged instantly and **never charged**
- ⏰ Spot **lapsed LEIs** (`registrationStatus = LAPSED`, `nextRenewalDate` in the past) before they break your regulatory reports
- 📤 Export to CSV, Excel, JSON, or via API, Make, Zapier, n8n, Google Sheets

### Why use it?

- **KYB / onboarding**: verify a counterparty's legal name, address and registry number in seconds
- **Regulatory reporting**: make sure every counterparty LEI in your trade reports is valid and not lapsed
- **Group structures**: map subsidiaries to their ultimate parent for credit exposure or sanctions screening
- **Data enrichment**: add registry IDs and legal forms to supplier or customer lists

### How much does it cost?

Pay-per-event: **$2.00 per 1,000 LEI records returned** ($0.002 each). Invalid LEIs and names with no match are listed in the output **for free**. Parents and ISINs are included in the same price (they only make the run slower). Use *Maximum cost per run* to cap your spend.

### How to use it

1. Click **Try for free**.
2. Paste **LEI codes** and/or **Company names**.
3. Optionally enable **Include direct and ultimate parent** and **Include ISINs**.
4. Start the run and export the results.

### Input example

```json
{
  "leis": ["5493001KJTIIGC8Y1R12", "549300RIVY5EX8RCON76"],
  "companyNames": ["Ferrari N.V."],
  "maxMatchesPerName": 1,
  "minNameSimilarity": 60,
  "countryFilter": [],
  "includeParents": true,
  "includeIsins": false,
  "maxRequestsPerMinute": 55
}
```

### Output example

```json
{
  "query": "5493001KJTIIGC8Y1R12",
  "matchType": "lei",
  "matchScore": 1.0,
  "found": true,
  "lei": "5493001KJTIIGC8Y1R12",
  "legalName": "Bloomberg Finance L.P.",
  "entityStatus": "ACTIVE",
  "entityCategory": "GENERAL",
  "legalFormCode": "T91T",
  "jurisdiction": "US-DE",
  "country": "US",
  "legalAddress": {"addressLines": ["C/O Corporation Service Company", "251 Little Falls Drive"], "city": "Wilmington", "region": "US-DE", "postalCode": "19808", "country": "US"},
  "registrationAuthorityId": "RA000602",
  "registeredAs": "4348344",
  "registrationStatus": "ISSUED",
  "nextRenewalDate": "2027-01-25T16:50:02Z",
  "directParent": {"lei": "549300B56MD0ZC402L06", "legalName": "Bloomberg L.P.", "country": "US", "exception": null},
  "ultimateParent": {"lei": "549300RMUDWPHCUQNE66", "legalName": "Bloomberg Inc.", "country": "US", "exception": null},
  "gleifUrl": "https://search.gleif.org/#/record/5493001KJTIIGC8Y1R12",
  "retrievedAt": "2026-10-08T03:57:29+00:00"
}
```

Rows with `found: false` carry an `error`: `INVALID_LEI_CHECKSUM`, `LEI_NOT_FOUND`, `NO_MATCH` or `NO_MATCH_IN_COUNTRY`. Views: **Overview** and **Ownership**. A `SUMMARY` record with counts is saved in the key-value store.

### Speed

GLEIF allows about 60 API requests per minute per client, and the Actor respects that limit. LEI lists are fetched 100 at a time (thousands of LEIs per minute). Name matching needs 2 requests per name, and parents add 2-4 requests per record.

### Data source and legal

All data comes from the **official GLEIF REST API** (`api.gleif.org`). GLEIF data is published as **open data under CC0** and may be reused freely. No scraping, no login. GLEIF is not affiliated with this Actor. Records of sole proprietors can contain personal data: process them only for a legitimate purpose.

### FAQ

- **Does it support LEI → ISIN?** Yes, enable *Include ISINs*.
- **Can I search by registry number (e.g. Italian REA or German HRB)?** Not yet. Open an issue if you need it.
- **Found a bug?** Use the **Issues** tab; we answer within 24 hours.

*Made by Gufobyte - small, honest data tools.*

# Changelog

This Actor's version history is a separate document: https://apify.com/gufobyte/gleif-lei-lookup/changelog.md

# Actor input Schema

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

20-character Legal Entity Identifiers. Checksums are validated offline (ISO 17442) before calling GLEIF; invalid codes are reported for free.

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

Legal names to match to LEIs (fuzzy matching, re-ranked by a similarity score).

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

How many candidate entities to return for each company name (best score first).

## `minNameSimilarity` (type: `integer`):

Candidates whose normalised legal name is less similar than this (in %) are discarded. 60 is a good balance; use 85+ for strict matching.

## `countryFilter` (type: `array`):

Only return name matches whose legal address is in these countries, e.g. IT, DE, NL.

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

Adds the direct and ultimate accounting-consolidation parent (or the reason GLEIF reports none). Costs 2-4 extra API calls per record, so runs are slower.

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

Adds the securities (ISIN codes) mapped to the LEI by GLEIF and ANNA.

## `maxRequestsPerMinute` (type: `integer`):

GLEIF allows 60 requests per minute per client. Keep below that to avoid throttling.

## Actor input object example

```json
{
  "leis": [
    "5493001KJTIIGC8Y1R12",
    "549300RIVY5EX8RCON76"
  ],
  "companyNames": [
    "Ferrari N.V."
  ],
  "maxMatchesPerName": 1,
  "minNameSimilarity": 60,
  "countryFilter": [],
  "includeParents": false,
  "includeIsins": false,
  "maxRequestsPerMinute": 55
}
```

# 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 = {
    "leis": [
        "5493001KJTIIGC8Y1R12",
        "549300RIVY5EX8RCON76"
    ],
    "companyNames": [
        "Ferrari N.V."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gufobyte/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 = {
    "leis": [
        "5493001KJTIIGC8Y1R12",
        "549300RIVY5EX8RCON76",
    ],
    "companyNames": ["Ferrari N.V."],
}

# Run the Actor and wait for it to finish
run = client.actor("gufobyte/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 '{
  "leis": [
    "5493001KJTIIGC8Y1R12",
    "549300RIVY5EX8RCON76"
  ],
  "companyNames": [
    "Ferrari N.V."
  ]
}' |
apify call gufobyte/gleif-lei-lookup --silent --output-dataset

```

## MCP server setup

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