GLEIF LEI Lookup & Corporate Ownership Graph API (KYB) avatar

GLEIF LEI Lookup & Corporate Ownership Graph API (KYB)

Pricing

from $6.60 / 1,000 results

Go to Apify Store
GLEIF LEI Lookup & Corporate Ownership Graph API (KYB)

GLEIF LEI Lookup & Corporate Ownership Graph API (KYB)

LEI lookup and corporate ownership API: resolve a company name to its GLEIF LEI and traverse parent/child relationships into a normalized ownership graph. Map corporate hierarchies and beneficial ownership for KYB/AML. Keyless, open-license.

Pricing

from $6.60 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

2 days ago

Last modified

Share

GLEIF LEI Lookup & Corporate Ownership Graph API — KYB / AML / Beneficial Ownership

An LEI lookup and corporate ownership API. Resolve a company name to its GLEIF Legal Entity Identifier, then traverse GLEIF's Level-2 parent and child relationships into a normalized corporate ownership graph — with the edge metadata that makes an ownership claim auditable, and an explicit per-source status on every row so you always know the difference between "GLEIF says there is no parent" and "we could not ask".

Keyless. Open licence (GLEIF data is free for commercial use). Agent-ready.

Who it's for

  • KYB / KYC onboarding — resolve a counterparty to a canonical LEI, pull its registry ID and company registration number, and confirm the LEI is current.
  • AML / sanctions & beneficial-ownership screening — walk the ownership chain to the ultimate parent, screen previous legal names and transliterated aliases, and read GLEIF's published reason when no parent is reported.
  • Credit and counterparty risk — map a group structure, count subsidiaries, and see whether the ownership filing itself is PUBLISHED or LAPSED.
  • RevOps / data enrichment — attach LEI, BIC, ISIN, OpenCorporates and S&P Global identifiers to an account record.
  • AI agents — a clean, chainable "resolve company to LEI and ownership" tool over MCP.

What it does

Two modes.

search returns ranked LEI candidates for a company name. GLEIF's own result order is not relevance-ranked, so every candidate is graded (exact, exact_normalized, exact_core, prefix, contains, ...) and ranked, and the row tells you whether the top hit was ambiguous.

graph takes an LEI (or resolves one from a name) and returns the ownership graph around it: the entity itself, its direct parent, its ultimate parent, its direct subsidiaries and — optionally — its indirect subsidiaries. Each parent row carries the GLEIF relationship record: edge type, ownership period, accounting period, filing status and corroboration level. Every row also carries the full ownership chain to the top of the group and the data vintage.

The contract this Actor keeps

  • null means "not checked". false means "checked, and the answer is no". If the direct-parent probe fails, has_direct_parent is null, parent_disclosure_status is unknown, and partial_result is true. It is never rendered as "this entity has no parent".
  • Counts are never invented. direct_children_count and relationship_count are null when a probe failed — a 0 there would be a claim the run did not earn.
  • A partial graph is never presented as complete. direct_children_truncated tells you when maxChildren cut the subsidiary list short, alongside the true direct_children_total_reported from GLEIF.
  • Live drift assertions run before anything is billed. Six probes verify the GLEIF envelope shape, golden-copy freshness, a known-good LEI, a parent-edge round trip, a negative control (a nonsense name must return zero, not the registry) and the reporting-exception endpoint. If any fails, the run fails and nothing is emitted or billed.
  • An unknown LEI fails loudly instead of returning an empty graph.

Example input

{
"mode": "graph",
"name": "Apple Inc",
"includeChildren": true,
"maxChildren": 100,
"resolveOwnershipChain": true,
"includeUltimateChildren": false,
"includeIsins": false,
"strictNameMatch": false
}

Seed by exact LEI instead:

{ "mode": "graph", "lei": "5493004SYPRAVRVNK561", "includeChildren": true }

Rank LEI candidates for a name:

{ "mode": "search", "name": "Danone", "maxCandidates": 10 }

Input fields

FieldTypeDefaultWhat it does
modestringgraphsearch = ranked LEI candidates for a name. graph = the ownership graph around an entity.
namestringApple IncCompany name. GLEIF matches the registered legal nameSiemens Aktiengesellschaft resolves, Siemens AG does not.
leistringExact 20-character LEI. Overrides name in graph mode.
includeChildrenbooleantrueInclude direct subsidiaries.
maxChildreninteger100Cap on direct subsidiaries. Exceeding it sets direct_children_truncated.
maxCandidatesinteger10Cap on search-mode candidates.
includeUltimateChildrenbooleanfalseAlso return indirect subsidiaries. Adds rows, so it adds cost.
maxUltimateChildreninteger100Cap on indirect subsidiaries.
resolveOwnershipChainbooleantrueWalk parent edges to the top of the group. Adds no rows.
includeIsinsbooleanfalseFetch ISINs mapped to the seed LEI. Adds no rows.
maxIsinsinteger50Cap on listed ISINs.
strictNameMatchbooleanfalseFail the run instead of guessing when a name has no exact GLEIF legal-name match. Recommended for automated KYB pipelines.

Output fields

One row per graph node (or per search candidate). Every row carries the same column set, so null always means "not applicable or not checked", never "missing column".

FieldTypeDescription
leistring20-character Legal Entity Identifier.
legal_namestringOfficial legal name of the entity as registered with GLEIF.
other_namesarrayAlternative, previous and trade names reported to GLEIF.
jurisdictionstringLegal jurisdiction (ISO 3166 country or country-subdivision code).
legal_formstringISO 20275 ELF code for the entity's legal form (for example H1UM).
entity_statusstringEntity operating status: ACTIVE or INACTIVE.
entity_categorystringGLEIF entity category, e.g. GENERAL, BRANCH, FUND, SOLE_PROPRIETOR.
registration_statusstringLEI registration status: ISSUED, LAPSED, RETIRED, ANNULLED, MERGED, PENDING_TRANSFER, PENDING_ARCHIVAL.
countrystringLegal address country.
citystringLegal address city. For Apple Inc this is Glendale, its registered agent - see hq_city for the operating headquarters.
postal_codestringLegal address postal code.
relation_to_seedstringHow this row relates to the searched entity: self, direct_parent, ultimate_parent, direct_child, ultimate_child, or match (search mode).
seed_leistringThe LEI the graph was built around. Null in search mode.
gleif_urlstringLink to this entity's record on search.gleif.org.
legal_name_languagestringISO 639 language of the legal name.
previous_legal_namesarrayNames GLEIF flags as PREVIOUS_LEGAL_NAME. Directly useful for AML name screening against historic aliases.
other_name_typesarrayDistinct GLEIF name types present on this record (PREVIOUS_LEGAL_NAME, TRADING_OR_OPERATING_NAME, ...).
transliterated_other_namesarrayLatin-script transliterations of non-Latin legal names.
business_registry_idstringGLEIF Registration Authority code of the registry the entity is registered in (for example RA000598 = California Secretary of State).
business_registry_otherstringRegistry name when it is not in the GLEIF Registration Authorities List.
company_registration_numberstringThe entity's number in its home business registry (GLEIF registeredAs). The join key to national company registers.
legal_form_otherstringLegal form when no ELF code applies.
entity_sub_categorystringGLEIF entity sub-category, e.g. CENTRAL_GOVERNMENT, MUNICIPALITY.
entity_creation_datestringDate the legal entity was created, per its registry.
successor_leistringLEI of the entity that succeeded this one (merger/absorption).
successor_namestringName of the successor entity.
successor_leisarrayAll successor LEIs when an entity split into several.
successor_entity_namesarrayNames of successor entities. GLEIF often publishes a successor by NAME with no LEI, so this is not always derivable from successor_leis.
conformity_flagstringGLEIF data-quality conformity flag: CONFORMING, NON_CONFORMING, NOT_APPLICABLE.
corporate_event_group_countintegerNumber of GLEIF corporate-event groups (mergers, spin-offs) recorded against this entity.
legal_address_linesarrayStreet lines of the legal (registered) address.
legal_address_regionstringISO subdivision of the legal address.
hq_address_linesarrayStreet lines of the headquarters address.
hq_citystringHeadquarters city. Fetched by v1.0 and discarded; now emitted.
hq_regionstringISO subdivision of the headquarters address.
hq_countrystringHeadquarters country. Differs from the legal country for entities registered through an agent or in a holding jurisdiction.
hq_postal_codestringHeadquarters postal code.
legal_and_hq_address_differbooleanTrue when the legal and headquarters addresses are not the same place. Null when the record carries only one of them.
other_addresses_countintegerCount of additional addresses on the record.
initial_registration_datestringWhen the LEI was first issued.
last_update_datestringWhen the LEI record was last updated.
next_renewal_datestringWhen the LEI must next be renewed.
days_to_next_renewalintegerDays until the next renewal date; negative means overdue.
registration_renewal_overduebooleanTrue when the next renewal date is in the past. Null when GLEIF publishes no renewal date.
lei_is_currentbooleanTrue only when registration_status is ISSUED and entity_status is ACTIVE. Null when either is missing - never guessed.
lei_compliance_flagstringcurrent (ISSUED) / attention (LAPSED, PENDING_TRANSFER, PENDING_ARCHIVAL) / not_current (RETIRED, ANNULLED, MERGED, DUPLICATE).
managing_loustringLEI of the Local Operating Unit that maintains this record.
corroboration_levelstringHow well GLEIF corroborated the record: FULLY_CORROBORATED, PARTIALLY_CORROBORATED, ENTITY_SUPPLIED_ONLY.
validated_at_registry_idstringRegistration Authority code GLEIF validated the record against.
validated_asstringRegistry identifier GLEIF validated the record against.
other_validation_authority_countintegerCount of additional validation authorities on the record.
bic_codesarraySWIFT/BIC codes mapped to this LEI.
other_identifiersarrayCross-references as SCHEME:VALUE (BIC, MIC, OCID/OpenCorporates, QCC, GEM, SPGLOBAL).
relationship_typestringGLEIF Level-2 edge type on parent rows: IS_DIRECTLY_CONSOLIDATED_BY or IS_ULTIMATELY_CONSOLIDATED_BY. Null on self and child rows.
relationship_statusstringACTIVE or INACTIVE ownership relationship.
relationship_valid_fromstringvalidFrom on the GLEIF relationship record.
relationship_period_startstringStart of the RELATIONSHIP_PERIOD - when the ownership relationship began.
relationship_accounting_period_startstringStart of the ACCOUNTING_PERIOD the consolidation was reported for.
relationship_accounting_period_endstringEnd of the ACCOUNTING_PERIOD the consolidation was reported for.
relationship_registration_statusstringPUBLISHED, LAPSED, ANNULLED - whether the ownership filing itself is current.
relationship_last_update_datestringWhen the ownership filing was last updated.
relationship_corroboration_levelstringHow the ownership claim was corroborated, e.g. ENTITY_SUPPLIED_ONLY, FULLY_CORROBORATED.
relationship_corroboration_documentsstringDocument class used to corroborate the ownership claim.
edge_from_leistringChild side of the ownership edge (GLEIF startNode).
edge_to_leistringParent side of the ownership edge (GLEIF endNode).
ownership_depthinteger0 = the seed, 1 = direct parent, n = ultimate parent n hops up, -1 = direct child, -2 = indirect (ultimate) child.
gleif_golden_copy_datestringPublish date of the GLEIF golden copy this answer came from - the data vintage.
retrieved_atstringUTC timestamp of this run.
direct_parent_leistringLEI of the seed's direct accounting-consolidation parent. Null when there is none OR when the probe failed - read has_direct_parent and source_direct_parent_status to tell those apart.
direct_parent_namestringLegal name of the direct parent.
ultimate_parent_leistringLEI of the seed's ultimate accounting-consolidation parent - the top of the ownership tree.
ultimate_parent_namestringLegal name of the ultimate parent.
has_direct_parentbooleanTrue = GLEIF returned a direct parent. False = GLEIF confirmed there is none. Null = the probe did not answer. Never guessed.
has_ultimate_parentbooleanTrue / false / null on the same verified-negative contract as has_direct_parent.
direct_parent_is_ultimate_parentbooleanTrue when the seed sits one level below the top of its group.
seed_is_ultimate_parentbooleanTrue when the seed itself has no parent, i.e. it is the top of its own ownership tree.
direct_parent_exception_reasonstringWhy GLEIF holds no direct parent: NATURAL_PERSONS, NON_CONSOLIDATING, NO_LEI, NO_KNOWN_PERSON, LEGAL_OBSTACLES, DISCLOSURE_DETRIMENTAL, BINDING_LEGAL_COMMITMENTS, CONSENT_NOT_OBTAINED. A published reason is a materially different finding from missing data.
direct_parent_exception_categorystringGLEIF exception category, normally DIRECT_ACCOUNTING_CONSOLIDATION_PARENT.
ultimate_parent_exception_reasonstringSame reason vocabulary at the ultimate-parent level.
ultimate_parent_exception_categorystringNormally ULTIMATE_ACCOUNTING_CONSOLIDATION_PARENT.
parent_disclosure_statusstringdisclosed = a parent LEI was returned. none_reported_REASON = GLEIF confirmed there is no parent and published why. unknown = the probe failed, so ownership above this entity is NOT established.
ownership_chain_leisarrayOrdered LEIs from the seed up to its ultimate parent, nearest first.
ownership_chain_depthintegerNumber of hops from the seed to the top of its ownership tree. Null when the walk could not complete.
ownership_chain_truncatedbooleanTrue when the upward walk hit its 10-hop bound before reaching the top.
direct_children_countintegerDirect subsidiaries actually returned on this run. Null when the children probe failed - never 0.
direct_children_total_reportedintegerTotal direct subsidiaries GLEIF reports, regardless of maxChildren.
direct_children_truncatedbooleanTrue when maxChildren cut the subsidiary list short, so the graph is incomplete by design.
ultimate_children_countintegerUltimate (indirect) subsidiaries returned. Null unless includeUltimateChildren was on.
ultimate_children_total_reportedintegerTotal ultimate subsidiaries GLEIF reports.
isin_countintegerNumber of ISINs mapped to the seed LEI. Null unless includeIsins was on.
isins_samplearrayISINs mapped to the seed LEI, up to maxIsins. Empty unless includeIsins was on.
relationship_countintegerOwnership edges verified on this run. Null when any edge probe failed - a 0 here would be a claim the run did not earn.
sources_failedarrayGLEIF endpoints that did not answer on this run. Empty on a clean run.
partial_resultbooleanTrue when at least one GLEIF endpoint did not answer, so some fields are null-because-unchecked rather than null-because-absent.
source_errorsarrayHuman-readable errors for any endpoint that failed.
name_querystringThe company name searched for. Null when the run was seeded by LEI.
name_match_typestringMatch grade for a search-mode row: exact, exact_normalized, exact_core, prefix, contains, all_tokens, token_overlap, other.
name_match_rankintegerRank of this candidate after relevance grading (1 = best). GLEIF's own result order is not relevance-ranked.
name_candidates_totalintegerHow many entities GLEIF matched for the name, before any cap.
name_match_ambiguousbooleanTrue when no candidate matched the queried legal name exactly, so the top pick is a best guess.
seed_resolved_from_namebooleanTrue when the graph seed came from a name search rather than an explicit LEI.
seed_match_typestringMatch grade of the candidate chosen as the graph seed.
name_match_tied_countintegerHow many candidates share the best match score. Greater than 1 means several GLEIF records match the queried name equally well, so the top pick is arbitrary -- two distinct records genuinely carry the legal name "Deutsche Bank Aktiengesellschaft".
source_entity_statusstringok / unavailable / missing for the GLEIF lei-record lookup.
source_direct_parent_statusstringok = a parent was returned. absent = GLEIF confirmed none. unavailable = the request failed, so no conclusion about ownership may be drawn. not_requested = the probe was switched off.
source_ultimate_parent_statusstringSame ok / absent / unavailable / not_requested contract.
source_direct_parent_relationship_statusstringOutcome of the direct-parent-relationship (edge metadata) request.
source_ultimate_parent_relationship_statusstringOutcome of the ultimate-parent-relationship request.
source_direct_parent_exception_statusstringOutcome of the direct-parent-reporting-exception request.
source_ultimate_parent_exception_statusstringOutcome of the ultimate-parent-reporting-exception request.
source_direct_children_statusstringok / partial / unavailable / not_requested for the paginated direct-children fetch.
source_ultimate_children_statusstringok / partial / unavailable / not_requested for the ultimate-children fetch.
source_ownership_chain_statusstringok / partial / unavailable / not_requested for the upward parent walk.
source_isins_statusstringok / unavailable / not_requested for the ISIN mapping fetch.

Columns that are null on the default example, and how to populate them

The prefilled example (Apple Inc) is the top of its own ownership tree, so its parent-edge columns are legitimately empty. Each of these has a verified live input that fills it:

ColumnsPopulate with
relationship_*, edge_from_lei, edge_to_lei, direct_parent_lei, direct_parent_name, ultimate_parent_lei, ultimate_parent_name, direct_parent_is_ultimate_parent, ownership_chain_leis{"mode":"graph","lei":"2549005JJKRFXSM5CC84"} — a grandchild whose direct parent (Apple Operations International) differs from its ultimate parent (Apple Inc)
ultimate_children_count, ultimate_children_total_reported{"mode":"graph","lei":"HWUPKR0MPOU8FGXBT394","includeUltimateChildren":true}
isin_count, isins_sample{"mode":"graph","lei":"HWUPKR0MPOU8FGXBT394","includeIsins":true} (951 ISINs)
name_match_type, name_match_rank, name_match_tied_count{"mode":"search","name":"Deutsche Bank"} -- two distinct LEIs share the legal name Deutsche Bank Aktiengesellschaft, so the top pick is flagged ambiguous
transliterated_other_names{"mode":"graph","lei":"636700VVHS50XM79JI98"}
business_registry_other{"mode":"graph","lei":"894500L731TNWUALQL85"}
legal_form_other{"mode":"graph","lei":"984500DCF3Q8K64CAB80"}
entity_sub_category{"mode":"graph","lei":"815600AE25B2FEEFCE23"} (LOCAL_GOVERNMENT)
successor_lei, successor_name, successor_leis{"mode":"graph","lei":"747800X0S05A0KPBJ055"}
successor_entity_names{"mode":"graph","lei":"8156006C115C3A98D766"} — GLEIF names this successor with no LEI
sources_failed, source_errorsOnly populated when a GLEIF endpoint fails. Empty here is good news.

Use as an MCP tool

Available to AI agents through mcp.apify.com as an LEI-lookup / ownership-graph tool. Pass a company name or an LEI and get back the resolved entity, its ownership chain and its subsidiaries. Agents should read parent_disclosure_status and partial_result before asserting anything about ownership: unknown means the question was not answered, not that the answer is "none".

FAQ

What is an LEI? The Legal Entity Identifier — a global, permanent 20-character identifier for a legally distinct entity, issued under the GLEIF system and required for reporting in most derivatives and securities regimes.

Is this a KYB API? Yes. It resolves and maps registered legal entities and returns the home business registry (business_registry_id) plus the entity's number in it (company_registration_number), which is the join key to national company registers.

Where does the ownership data come from? GLEIF's Level-2 relationship records — the direct and ultimate accounting consolidation parents an entity reports. That is a defined, auditable relationship, not an inferred one.

What if an entity reports no parent? GLEIF publishes a machine-readable reason. parent_disclosure_status will read, for example, none_reported_NATURAL_PERSONS (the owners are natural persons — this is what Apple Inc reports), none_reported_NON_CONSOLIDATING, or none_reported_NO_LEI. That is a materially different finding from missing data, and it is why a bare null parent is never good enough.

Does GLEIF ownership equal beneficial ownership? No, and the distinction matters. GLEIF Level-2 covers accounting-consolidation parents. It is an excellent corporate-hierarchy backbone and a strong input to a beneficial-owner analysis, but it is not a UBO register.

Why did my company name not resolve? GLEIF filters on the registered legal name. Siemens AG returns 14 entities, none of which is Siemens AG — GLEIF registers it as Siemens Aktiengesellschaft. Use mode: "search" to see the graded candidates, or set strictNameMatch: true to fail rather than guess.

Is it keyless? Yes. api.gleif.org needs no key and GLEIF data is published under a fully open licence permitting commercial use.

Why did my run fail instead of returning zero rows? Because a zero that was never verified is worse than an error. An unknown LEI, an unreachable GLEIF, or a failed drift assertion all fail the run — and a failed run emits nothing and bills nothing.

Source

GLEIF LEI API v1 (api.gleif.org/api/v1) — lei-records, direct-parent, ultimate-parent, direct-parent-relationship, ultimate-parent-relationship, direct-parent-reporting-exception, ultimate-parent-reporting-exception, direct-children, ultimate-children and isins. Official, keyless, open-licence. The GLEIF golden-copy publish date is stamped on every row as gleif_golden_copy_date.

Pricing (Pay Per Result)

Billed per record returned — one event per graph node or search candidate. A run that fails, or one where GLEIF answered and matched nothing, emits no records and costs nothing. includeUltimateChildren is the only switch that adds rows; resolveOwnershipChain and includeIsins add fields, not cost.

  • kyb-company-verifier — business-registry verification for a named entity.
  • sos-registry-monitor — US Secretary-of-State registration and status changes.
  • consolidated-screening-list-delta — OFAC / BIS / State sanctions screening deltas; pair it with the ultimate parent this Actor resolves.
  • ria-registration-delta-monitor — SEC investment-adviser roster and registration events, keyed by CRD.