GLEIF LEI Scraper — LEI Lookup, Lapsed Status & Parents avatar

GLEIF LEI Scraper — LEI Lookup, Lapsed Status & Parents

Pricing

from $4.25 / 1,000 entities

Go to Apify Store
GLEIF LEI Scraper — LEI Lookup, Lapsed Status & Parents

GLEIF LEI Scraper — LEI Lookup, Lapsed Status & Parents

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.

Pricing

from $4.25 / 1,000 entities

Rating

0.0

(0)

Developer

PublicData

PublicData

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

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: 3,408,417 entities across 235 jurisdictions (counted from the live API on 2026-08-21). 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, DUPLICATE, PENDING_TRANSFER or PENDING_ARCHIVAL. LAPSED means the entity did not renew, a standard due-diligence red flag. (GLEIF also defines MERGED, but no record in the index currently carries it.)
  • 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, RESIDENT_GOVERNMENT_ENTITY, 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 — first 200 per entity, with isinsTotal and isinsTruncated alongside so you can see when that cut), 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 — checking isinsTruncated first, because the ISIN list stops at 200 per entity.
  • 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:

{
"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 — GLEIF answers its direct-parent and ultimate-parent endpoints with 404 Resource not found, and see the honest limits below. When includeParents is on, all four parent columns are on every row, null or not, so the export has the same shape whatever the run happens to match. On a record that failed renewal, registrationStatus reads LAPSED and nextRenewalDate sits in the past; that pair is the whole screening signal.

Input

FieldWhat it does
queryEntity name to search, fuzzy. Leave empty to browse with the filters below.
leiListExact 20-character LEI codes to fetch. Replaces the name search — use this to enrich a list you already have. The filters below still apply: they are sent to GLEIF alongside the codes, so a code that does not match them is not exported and not billed.
countriesISO-3166-1 alpha-2 codes of the legal address: CH, DE, FR, US. Not names (Switzerland) and not alpha-3 (CHE) — GLEIF answers those with zero matches rather than an error, so the Actor rejects an unknown code and stops instead of returning a quietly incomplete set. Empty means worldwide.
entityStatusWhether the legal entity is still active: ACTIVE, INACTIVE, NULL (no status recorded). Default all, which really is all 3.41 M records.
registrationStatusISSUED (current) or LAPSED (not renewed), plus RETIRED, ANNULLED, DUPLICATE, PENDING_TRANSFER, PENDING_ARCHIVAL. Default all.
categoryRestrict to GENERAL, FUND, BRANCH, SOLE_PROPRIETOR, RESIDENT_GOVERNMENT_ENTITY or INTERNATIONAL_ORGANIZATION. Default all.
updatedFrom, updatedToWindow on lastUpdateDate (YYYY-MM-DD). The slice that actually changed — this is what makes a scheduled run complete rather than partial. Either end may be left empty for an open-ended window.
renewalFrom, renewalToWindow on nextRenewalDate (YYYY-MM-DD). Combine with registrationStatus: ISSUED to catch LEIs about to expire. Either end may be left empty: renewalFrom alone means "every renewal still ahead" — CH + ISSUED + renewalFrom: 2026-09-01 matched 17,704 records on 2026-08-21, past the 10,000 cap, so pair it with renewalTo when you need the whole set.
sortByGLEIF's own ordering: most recently updated, soonest renewal, legal name, LEI. Default is GLEIF relevance. Matters when more records match than one run can return — the sort decides which ones you get.
includeParentsFetch direct and ultimate parent. Default true. Adds up to two requests per entity. All four parent columns are then written on every row, null where no parent was reported.
includeIsinsFetch securities issued by each entity. Default false. Adds one request per entity, and returns at most the first 200 ISINs per entityisinsTotal and isinsTruncated on each row tell you when that was a cut.
maxItemsSafety cap on results. Default 200. 0 means "as many as GLEIF will serve", which is at most 10,000 per run — see the cap below.

Bad input stops the run instead of quietly changing the answer. GLEIF is a permissive validator, so this Actor is the strict one. An unknown country code (CHE, Switzerland) comes back from GLEIF as 200 OK with zero matches, and a malformed date is often rounded to a real one rather than rejected — on 2026-08-21, updatedFrom: 2026-02-30 returned 1,131,464 matches, byte-identical to 2026-03-02, and updatedFrom: yesterday returned 2,385, identical to 2026-08-20. Either would have finished as a green, billed run over the wrong slice. All four date fields must therefore be a real YYYY-MM-DD calendar date, and From must not be later than To; anything else fails before the first request, with nothing exported and nothing charged.

The 10,000-row cap, up front. GLEIF's API refuses page-based pagination beyond 10,000 results (page[number] × page[size] > 10000 → HTTP 400) and offers no cursor, so no single run can return more than 10,000 rows. When more match, the Actor logs how many it got out of how many exist and says so in the run status — it does not pretend the export was complete. To cover a bigger set, split it: by country, by category, or by a date window.

Compliance sweep — the German LEIs that lapsed in the last week (54,125 German LEIs are lapsed in total, far past the 10,000 cap; the date window is what makes the run complete):

{ "countries": ["DE"], "registrationStatus": "LAPSED", "updatedFrom": "2026-08-14", "maxItems": 0 }

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

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

Every Swiss fund with a current LEI, no cap — 2,319 rows, comfortably inside the ceiling:

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

Swiss LEIs due for renewal in the next 30 days, soonest first:

{ "countries": ["CH"], "registrationStatus": "ISSUED", "renewalFrom": "2026-08-21", "renewalTo": "2026-09-20", "sortBy": "registration.nextRenewalDate", "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", your countries, and updatedFrom set to yesterday, and it becomes a standing watch for renewal failures:

{ "countries": ["DE"], "registrationStatus": "LAPSED", "updatedFrom": "2026-08-20", "maxItems": 0 }

The updatedFrom window is not optional decoration. Without it the query matches every German LEI that has ever lapsed — 54,125 of them — and a run can return at most 10,000, so you would be alerted on an arbitrary slice of the backlog instead of on what changed. With a one-day window the same query returns the tens of records that actually moved that day, and the run covers all of them.

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 four parent columns are present and null — that is a reporting gap, not evidence that no parent exists.
  • A parent lookup that fails is never exported as an empty ownership tree. GLEIF rate-limits bursts with HTTP 429; the Actor honours the server's Retry-After and backs off up to six jittered times before giving up. On 2026-08-21 the compliance example above (DE + LAPSED + updatedFrom, 200 rows, parents on) hit 8 rate limits and recovered from all 8 on the first retry, after waits of 32–76 s; nothing was lost. If a lookup does still fail, the Actor drops that row instead of exporting and billing it with null parents that would look like a genuine absence — the run status says how many rows were dropped, and you can re-run those LEIs through leiList.
  • isins returns the first 200 securities per entity, not all of them. That is one request per row rather than one per 200 securities — UBS AG has 300,615 ISINs and Deutsche Bank AG 21,824 (measured 2026-08-21), which would be 1,504 and 110 extra requests for a single row. Each row carries isinsTotal (GLEIF's own count) and isinsTruncated, so a partial list is never silent.
  • 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.
  • One run returns at most 10,000 records. That is GLEIF's own pagination ceiling, not a choice this Actor makes, and there is no cursor to work around it. Broad sweeps must be split by country, category or date window; the run status tells you when a result set was cut short and by how much.

This Actor is independent and not affiliated with GLEIF.

Frequently asked questions

Is LEI data free to use?

Yes. GLEIF publishes the Global LEI Index under CC0 — public domain, no restrictions on commercial use.

What does a lapsed LEI mean for a counterparty check?

It means the entity did not renew its registration. The data on file is no longer being confirmed as current, which is why the GLEIF LEI Scraper lets you filter on registration status directly.

What happens if GLEIF rate-limits a lookup?

The run fails loudly instead of returning an entity with no parent. An absent parent must mean the entity reported none, never that the lookup quietly failed — on a KYC product that distinction matters.

Why is the ISIN list capped?

GLEIF pages that endpoint and some entities hold hundreds of thousands of securities: UBS AG alone has over 300,000. Each row therefore carries the true total alongside the exported list, so you always know whether it was cut.

Same engine, same official-source approach: