LEI Lookup & Watch: Legal Entity Identifier Status & Renewals
Pricing
from $1.00 / 1,000 lei record returneds
LEI Lookup & Watch: Legal Entity Identifier Status & Renewals
Look up or watch Legal Entity Identifier (LEI) records from the free public GLEIF API: status, renewal date, name, address and parents. Watch mode returns only new, changed or soon-to-renew LEIs. Never charged for failed or unchanged rows. Not affiliated with or endorsed by GLEIF.
Pricing
from $1.00 / 1,000 lei record returneds
Rating
0.0
(0)
Developer
COMPASS DEV
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Returns Legal Entity Identifier (LEI) records from the free public GLEIF API (status, next renewal date, legal name, addresses without street lines, BIC and optional parent companies) and, in watch mode, only the LEIs that are new to your list, changed, or due for renewal soon. Never charged for failed or unchanged rows.
Give it LEI codes (or company names) and get one clean, flat row per company: is the LEI still ISSUED or has it LAPSED,
when must it be renewed, what is the registered legal name and address, which register and number, who is the parent.
Run it on a schedule in watch mode and it tells you only what changed since the last run: a lapsed LEI, a renewal date
that is 30 days away, a new name or address, a merger (successor LEI). Built for KYC / KYB, counterparty and vendor
monitoring, MiFIR / EMIR reporting teams, and AI agents that need a reliable company identifier.
Data: LEI data from GLEIF (the Global Legal Entity Identifier Foundation) under CC0. Not affiliated with or endorsed by GLEIF.
Quick start
- Look up two LEIs (export: every record, every run):
{ "companies": ["7LTWFZYICNSX8D621K86", "529900EXG2PM316ISO63"] }
- Watch the same LEIs for changes and renewals (the first run is the baseline; later runs return only changes):
{ "companies": ["7LTWFZYICNSX8D621K86", "529900EXG2PM316ISO63"], "stateName": "my-counterparties" }
- Find a company by name (best match; use the LEI for watching):
{ "companies": ["Deutsche Bank"], "country": "DE" }
What it does
- LEI codes: looked up in batches of 100 per request; one row per LEI. An unknown LEI gives a free
no_datarow, an LEI with wrong check digits a freefailedrow (no request). - Company names: searched on the legal name (GLEIF's search needs every word of the legal name; a trailing legal form
such as "AG", "Inc" or "Ltd" is left out of the search). Candidates are ranked: the same name (legal forms spelled out:
"AG" = "Aktiengesellschaft") first, then active and issued records, then main entities before branches and funds.
matchesPerNamesets how many are returned (default 1).matchTypeandnameCandidatessay how sure the match is. - Watch mode: remembers each LEI's legal name, entity and registration status, next renewal date, legal and
headquarters address, legal form, jurisdiction, successor, expiration and parents under your watch list name, and
returns only:
baseline: the first time an LEI is on the list;changed: a tracked field changed (changedFieldsand the previous name, statuses and renewal date are in the row);renewal_due: nothing changed, but the next renewal date is now withinrenewalWarningDays(sent once per renewal);- unchanged LEIs are free and left out (
includeUnchanged: truereturns them as free rows). - A watch run with nothing new or changed returns exactly one free
no_datarow that says so, so a scheduled run never looks empty or broken.
- Parents (
includeParents: true): direct and ultimate accounting parent (LEI and legal name), from GLEIF's relationship records. - No personal data (when in doubt, a record is left out whole): only records whose legal form (ISO 20275 ELF code) is
on a reviewed list of forms that can't be a person are returned, so sole traders, "other" (8888) and "not listed"
(9999) forms never are; also left out: GLEIF's sole-proprietor category, a person's name (or a sole-trader form or an
owner) in any name field (legal, other, successor, parent or related-entity names), a parent or successor that is a
person, and an address line that is a person's name or names an owner. An LEI left out gives a free
no_datarow withdropReason: "person"that says why, without the name. - Addresses carry no street line:
legalAddressandheadquartersAddresshold only the postal code, city, region and country (a free-text address line can name a person). - You are never charged for failed results: failed, no_data and unchanged rows are free.
Input
| Field | Type | Default | Description |
|---|---|---|---|
companies | list of strings | — (prefilled with 2 LEIs) | LEI codes and/or company legal names, one per line |
mode | watch or export | — | Empty: watch when stateName is given, otherwise export. An explicit mode wins |
stateName | string | — (prefilled example-watchlist) | Watch list name. Watch mode without a name uses the list default |
renewalWarningDays | integer 0–365 | 30 | Watch: return a record once as renewal_due when its renewal date is this close |
includeParents | boolean | false | Add direct and ultimate parent (2 more requests per record) |
matchesPerName | integer 1–10 | 1 | Company names: how many best matches to return |
country | string | — | Two-letter country code of the legal address, to narrow name searches |
includeUnchanged | boolean | false | Watch: also return unchanged records (free) |
maxItems | integer 1–10,000 | 100 | Most charged rows per run; in watch mode the rest comes next run |
Field names from other tools: leis, names (→ companies). They work in the input but are not listed in the input
schema (charter 5.4); companies wins when both are given.
Output
One row per LEI record (flat; exports cleanly to CSV, JSON and Excel):
{"status": "ok","attempts": 1,"error": null,"input": "7LTWFZYICNSX8D621K86","mode": "watch","watchList": "my-counterparties","lei": "7LTWFZYICNSX8D621K86","legalName": "DEUTSCHE BANK AKTIENGESELLSCHAFT","entityStatus": "ACTIVE","registrationStatus": "ISSUED","category": "GENERAL","legalFormId": "6QQB","jurisdiction": "DE","legalAddress": "60325, Frankfurt am Main, DE-HE, DE","legalCountry": "DE","registeredAs": "HRB 30000","nextRenewalDate": "2027-06-05","daysToRenewal": 248,"renewalDueSoon": false,"bic": "DEUTDEFFXXX","directParentLei": null,"matchType": "lei","changeType": "changed","changedFields": "registrationStatus","previousRegistrationStatus": "LAPSED","url": "https://search.gleif.org/#/record/7LTWFZYICNSX8D621K86","source": "GLEIF LEI data (Global Legal Entity Identifier Foundation), via the public GLEIF API","license": "CC0 1.0 (GLEIF LEI Data Terms of Use); not affiliated with or endorsed by GLEIF","dataUpdatedAt": "2026-09-30","scrapedAt": "2026-09-30T10:00:00.000Z"}
Every row also has the headquarters address, register code, creation and registration dates, last update, expiration, successor, managing LOU, corroboration level, conformity flag and parent names (see the dataset schema).
| Status | Meaning | Charged? |
|---|---|---|
ok | LEI record returned | Export: yes. Watch: baseline, changed and renewal_due yes; unchanged no |
no_data | Unknown LEI, no name match, a record left out because it is or names a person, or no changes since the last run | No |
failed | Invalid input, or no answer after retries (error says why) | No |
The key-value store holds RUN_REPORT (counts, charged and free rows, stop reason) and, when something fails, the raw
response (SNAPSHOT_*).
Use it from AI agents
- One clear main input:
{"companies": ["<LEI or company name>"]}. The same call returns data every time (export). - Add
"stateName": "<list>"to get only changes and renewal alerts on later calls; a call with nothing new returns oneno_datarow that says "No new or changed LEI records since the last run". - Every row has
status,error,url(the record on GLEIF's public LEI search) andscrapedAt. - Via the Apify MCP server or API:
mouadapi/lei-watch. Pay per returned record; x402 agentic payments supported.
Copy-paste call (your Apify token in APIFY_TOKEN):
curl -s -X POST "https://api.apify.com/v2/acts/mouadapi~lei-watch/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"companies": ["7LTWFZYICNSX8D621K86"]}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('mouadapi/lei-watch').call({ companies: ['7LTWFZYICNSX8D621K86'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Pricing
Pay per event, one lei-record event per returned record (export: every record; watch: baseline, changed and
renewal_due rows). no_data, failed and unchanged rows are free.
| Plan | Price per 1,000 records |
|---|---|
| Free | $1.50 |
| Bronze | $1.30 |
| Silver | $1.15 |
| Gold (and higher) | $1.00 |
Apify also charges its small per-run start event. There are no usage fees on top.
Limits
- One request at a time, at most one a second (GLEIF publishes no per-minute limit; we stay well under the usual 60 a minute). 100 LEIs take about 1 request; with parents, 2 more requests per LEI (about 3 minutes for 100).
- If GLEIF answers HTTP 429 (rate limit), the run pauses 60, 120 and 240 seconds on the same connection, then stops with
free
failedrows. No other IP or proxy is ever tried.
Known issues
- Name search is best effort: GLEIF's legal-name search needs every word ("Deutsche Bank AG" does not find
"DEUTSCHE BANK AKTIENGESELLSCHAFT", so the legal form is left out of the search). Check
matchType; watch by LEI code. - Parents are the accounting-consolidation parents GLEIF has; many entities report none (then the fields are empty).
- GLEIF refreshes its data several times a day (
dataUpdatedAtis the data set's publish date).
Data and licence
- Source: the public GLEIF API (api.gleif.org), documented at gleif.org. GLEIF's LEI Data Terms of Use: the data "are provided under the CC0 licence" and the Access Service "is provided for free".
- This Actor is not provided, supported, authorized or endorsed by GLEIF or any LEI issuer (LOU), and is not a GLEIF service. It returns the LEI data as published.
FAQ
How do I get alerted before an LEI lapses? Schedule a daily or weekly watch run with your LEIs and
renewalWarningDays (default 30). Each LEI comes back once as renewal_due when its renewal date gets close, and again as
changed if it lapses or is renewed.
Why did a company name give the wrong entity? GLEIF's name search is word based. Check matchType (
name (same name)matchesPerName, narrow with country, or use the LEI.
Are people's names returned? No. Only legal forms that can't be a person pass, and records with a person's name in any name field, a parent or successor that is a person, or an address line that names a person or an owner are left out whole. No free-text address line is ever returned. The check is automatic and leans towards leaving data out: a company named like a person (a bare two-word name such as "Fresh Express", with no legal-form or organisation word) is left out too.