# GLEIF, global register of LEI codes

A LEI (Legal Entity Identifier) is a twenty-character code every legal entity needs to trade on financial markets. The Global LEI Foundation (GLEIF) publishes the whole register openly: name, address, legal form, Chamber of Commerce number, status and who the direct and ultimate parent is. On 16 October 2026, 198,915 LEIs had a legal address in the Netherlands, out of more than 3.4 million worldwide.

- Publisher: Global Legal Entity Identifier Foundation
- Area: World · Finest detail: legal entity
- Period: actuele stand, met registratiedatum sinds 2012 · Refreshed: daily
- Access: Open · Licence: CC0 1.0
- Join keys: LEI, KvK-nummer (registeredAs), landcode
- Status: ok (2026-10-16) · 198.991 LEI's met juridisch adres in Nederland
- URL: https://www.gleif.org/en/lei-data/gleif-api

## What can you do with it?
- **From Chamber of Commerce number to LEI.** Filter on entity.registeredAs and you get the LEI for a Chamber of Commerce number. ING Groep N.V. (KvK 33231073) has LEI 549300NYKK9MWM7GGW15.
- **Who owns whom?.** The direct-parent and ultimate-parent relations show which group is behind a company, also across borders. ING Groep has 6 direct and 71 ultimate subsidiaries with a LEI.
- **Mapping letterbox companies.** Find Dutch LEIs whose ultimate parent is in another country and count per country. You see which foreign groups use the Netherlands as a base.
- **Lapsed registrations.** A LEI must be renewed every year. Almost a quarter of Dutch LEIs had the status LAPSED in October 2026: not renewed, so the data may be out of date.

## How to process it
1. **Count per country.** With page[size]=1 you fetch one record; the total is in meta.pagination.total. Use curl -g, otherwise it trips over the square brackets.
   `https://api.gleif.org/api/v1/lei-records?filter[entity.legalAddress.country]=NL&page[size]=1`
2. **Look up by KvK number.** registeredAs is the number in the trade register; registration authority RA000463 is the Netherlands Chamber of Commerce.
   `https://api.gleif.org/api/v1/lei-records?filter[entity.registeredAs]=33231073&filter[entity.legalAddress.country]=NL`
3. **Follow the group structure.** Each LEI has relationship links. direct-children gives the subsidiaries, ultimate-parent the top of the group.
   `https://api.gleif.org/api/v1/lei-records/549300NYKK9MWM7GGW15/direct-children`
4. **New since a date.** Date fields accept > for 'after'. This counts all Dutch LEIs issued since 1 January 2025 (37,662 on 16 October 2026).
   `https://api.gleif.org/api/v1/lei-records?filter[entity.legalAddress.country]=NL&filter[registration.initialRegistrationDate]=%3E2025-01-01&page[size]=1`
5. **Everything at once.** The golden copy is the whole register as CSV, JSON or XML, three times a day. On 16 October 2026: 3,463,900 records, 481 MB as a CSV zip.
   `https://goldencopy.gleif.org/api/v2/golden-copies/publishes/latest`

## Interesting combinations
- Which Dutch companies belong to a foreign group? → [kvk-handelsregister](https://www.opendataindex.nl/en/bron/kvk-handelsregister.md) via KvK-nummer (registeredAs). Join the KvK number from GLEIF to the trade register and add establishment address and SBI code.
- Who wins European tenders? → [ted-aanbestedingen](https://www.opendataindex.nl/en/bron/ted-aanbestedingen.md) via bedrijfsnaam. TED names the winner. Look up that name in GLEIF and see which group is ultimately behind it.

## Similar sources
- [kvk-handelsregister](https://www.opendataindex.nl/en/bron/kvk-handelsregister.md): The trade register has all Dutch businesses, including sole traders, but the API is paid. GLEIF only has legal entities with a LEI, but openly and with group relations.
- [OpenCorporates](https://opencorporates.com): Collects trade registers from many countries, but the API needs a token (HTTP 401 without one, 16 Oct 2026). Read the reuse terms before you publish.

## What to watch out for
- **Only those who need a LEI.** A LEI is mandatory for parties on financial markets (among other things since MiFID II in 2018). Most small businesses have none.
- **Lapsed is not dissolved.** LAPSED means the LEI was not renewed. The company may still exist; the data just are no longer checked.
- **Country is the current address.** The country filter looks at the current legal address. A company that moved abroad no longer counts for the Netherlands.
- **Parent only if known.** Group relations are only included if the parent has a LEI and the relation was reported. Otherwise an exception is given (for example 'natural persons').
- **Not every field can be filtered.** Filtering on legal form (entity.legalForm.id) returned an error on 16 October 2026. Count legal forms from the golden copy instead.

## API (JSON:API (REST))

- Base: https://api.gleif.org/api/v1
- Access: No key or account. (tested)
- Formats: json
- Size: 3464394 LEI records worldwide, of which 198,993 with a legal address in the Netherlands (16 Oct 2026) (tested)
- Filtering: JSON:API filters filter[field]=value. Several values with a comma (filter[entity.legalAddress.country]=NL,BE), exclude with ! (filter[registration.status]=!ISSUED), dates with > or >= (=>2025-01-01) and a range with .. (2025-01-01..2025-12-31), * as wildcard in names (ING*). Use curl -g, otherwise the brackets trip it up.; =, ,, !, >, >=, <, <=, .., *

### Endpoints
- `GET /lei-records`: Search and filter all LEI records; the total is in meta.pagination.total.
- `GET /lei-records/{lei}`: One record: entity (name, addresses, legal form, registration number, status) and registration (dates, status, issuer).
- `GET /lei-records/{lei}/{direct-parent|ultimate-parent|direct-children|ultimate-children}`: Group relations. Without a reported parent 404; then …/direct-parent-reporting-exception gives the reason (e.g. NATURAL_PERSONS).
- `GET /lei-records/{lei}/isins`: ISIN codes of securities linked to this LEI (ING Groep: 41).
- `GET /lei-records/{lei}/lei-issuer`: The issuing organisation (LOU) of this LEI.
- `GET /fuzzycompletions?field=entity.legalName&q={naam}`: Fuzzy search by name, with the LEI in relationships.
- `GET /autocompletions?field=fulltext&q={tekst}`: Suggestions while typing, with highlighting.
- `GET /entity-legal-forms/{code}`: Legal form from the ISO 20275 list (54M6 = private limited company, B5PM = public limited company).
- `GET /registration-authorities/{code}`: Registers (RA000463 = the KvK business register).
- `GET /lei-issuers`: All 41 issuing organisations.
- `GET /countries`: Countries (250) with code and name; also /regions and /jurisdictions.
- `GET /fields`: Description of all fields and filter operators.

### Parameters
- `filter[<veld>]`: Filter on a field from /fields with context FILTER_LEIREC, e.g. filter[entity.legalAddress.country]=NL, filter[entity.registeredAs]=33231073, filter[entity.legalForm]=54M6, filter[entity.addresses.city]=Amsterdam. (tested)
- `filter[fulltext]`: Free search in all names (rabobank: 150). (tested)
- `page[size]`: 1 to 200 per page (201 returns 400). (tested)
- `page[number]`: Page number; page[number] × page[size] must not exceed 10,000. (tested)
- `page[cursor]`: page[cursor]=* starts cursor paging for larger sets; then follow links.next. (tested)
- `sort`: Sort field, - for descending (sort=-registration.initialRegistrationDate). Only fields with sortable=true in /fields. Without sort the newest registration came first. (tested)

### Fields of a LEI record (attributes, selection) (14)
`lei` string, `entity.legalName.name` string, `entity.legalAddress` object, `entity.headquartersAddress` object, `entity.registeredAt.id` string, `entity.registeredAs` string, `entity.legalForm.id` string, `entity.category` string, `entity.status` string, `registration.status` string, `registration.initialRegistrationDate` datetime, `registration.nextRenewalDate` datetime, `registration.corroborationLevel` string, `bic` lijst

### Limits and pitfalls
- page[size] at most 200 and page numbering at most 10,000 records deep; beyond that cursor paging (page[cursor]=*). No rate limit headers seen. (tested)
- Filter on legal form with filter[entity.legalForm]=54M6 (164,791 Dutch private companies). filter[entity.legalForm.id] returns "Filter should contain only allowed values", as does entity.legalAddress.city (use entity.addresses.city). (tested)
- > and >= gave the same count for dates (37,749 Dutch LEIs from 2025). Counting per year works directly with a range: 2025-01-01..2025-12-31 gave 18,246. (tested)
- entity-legal-forms ignored filter[country]=NL (all 3,599 legal forms came back). Fetch a code directly or filter on countryCode yourself. (tested)
- The API follows the golden copy, published three times a day (00, 08, 16 UTC); meta.goldenCopy.publishDate tells which. The API ran one publication behind (08:00 while 16:00 was out). The full register: goldencopy.gleif.org/api/v2/golden-copies/publishes/latest (CSV zip 481 MB, 3,464,825 records). (tested)
- LAPSED means the LEI wasn't renewed, not that the company is gone. For the company, look at entity.status. (experience)
- api.gleif.org's robots.txt allows everything; goldencopy.gleif.org/robots.txt returned 403 (the API there works). (tested)

### Example
```
https://api.gleif.org/api/v1/lei-records?filter[entity.legalAddress.country]=NL&filter[entity.registeredAs]=33231073&page[size]=1
```

## How to fetch it

### curl
```bash
curl -g "https://api.gleif.org/api/v1/lei-records?filter[entity.registeredAs]=33231073&filter[entity.legalAddress.country]=NL"
```

### python
```python
import requests

basis = "https://api.gleif.org/api/v1/lei-records"
r = requests.get(basis, params={"filter[entity.legalAddress.country]": "NL",
                                "filter[entity.legalName]": "ING Groep N.V."})
lei = r.json()["data"][0]["id"]
dochters = requests.get(f"{basis}/{lei}/direct-children", params={"page[size]": 100}).json()
for d in dochters["data"]:
    e = d["attributes"]["entity"]
    print(d["id"], e["legalName"]["name"], e["legalAddress"]["country"])
```

## What you can build with it
- [Procurement radar: who wins public contracts?](https://www.opendataindex.nl/en/bouwen/aanbestedingsradar.md): See per quarter which companies win Dutch public contracts, in which sector and for what amount, with their company number, LEI and parent company.


## Examples with real figures (2)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **New LEIs of Dutch legal entities: 18,289 LEIs in 2025, 60% more than in 2014** (2025). Table lei-records. [Example](https://www.opendataindex.nl/en/voorbeeld/gleif-nieuwe-lei-nl)
  - `https://api.gleif.org/api/v1/lei-records?filter%5Bentity.legalAddress.country%5D=NL&filter%5Bregistration.initialRegistrationDate%5D=%3E2025-01-01&page%5Bsize%5D=1`
  - `https://api.gleif.org/api/v1/lei-records?filter%5Bentity.legalAddress.country%5D=NL&filter%5Bregistration.initialRegistrationDate%5D=%3E2026-01-01&page%5Bsize%5D=1`
- **Dutch LEIs by status: valid (ISSUED) is the largest part, 65% in oktober 2026** (oktober 2026). Table lei-records. [Example](https://www.opendataindex.nl/en/voorbeeld/gleif-status-nl)
  - `https://api.gleif.org/api/v1/lei-records?filter%5Bentity.legalAddress.country%5D=NL&page%5Bsize%5D=1`
  - `https://api.gleif.org/api/v1/lei-records?filter%5Bentity.legalAddress.country%5D=NL&filter%5Bregistration.status%5D=LAPSED&page%5Bsize%5D=1`
