{"openapi":"3.1.0","info":{"title":"lei.online","description":"Search and read the Global LEI Index and the national company register behind it. Anonymous, read-only, and free: no key, no account, no registration. Ordering an identifier is not part of this surface - see the `guardrail` note in the MCP tool descriptions for why.","license":{"name":"Proprietary"},"version":"1"},"servers":[{"url":"https://lei.online","description":"Production"}],"paths":{"/v1/companies/{number}":{"get":{"tags":["records"],"summary":"One company from a jurisdiction corpus, by its registration number.","operationId":"handle_company","parameters":[{"name":"number","in":"path","description":"As the register publishes it, or without separators","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The record, with its LEI when it holds one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"404":{"description":"No company holds that registration number","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"The record store is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/directory":{"get":{"tags":["browse"],"summary":"Every facet the register can be browsed by, with how many are in each bucket.","operationId":"handle_directory","responses":{"200":{"description":"Buckets per facet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Index"}}}},"500":{"description":"The record store is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/directory/{facet}/{value}":{"get":{"tags":["browse"],"summary":"One page of the entities in a bucket.","operationId":"handle_bucket","parameters":[{"name":"facet","in":"path","description":"country, issuer or legal-form","required":true,"schema":{"type":"string"}},{"name":"value","in":"path","description":"The bucket's stored key","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","description":"1-based.","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"A page of the bucket","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listing"}}}},"404":{"description":"No such facet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"The record store is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/entities/{lei}":{"get":{"tags":["records"],"summary":"One golden copy record, by its identifier.","operationId":"handle_entity","parameters":[{"name":"lei","in":"path","description":"A 20-character Legal Entity Identifier; case is not significant","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}},"404":{"description":"No entity holds that LEI","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"The record store is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/pulse":{"get":{"tags":["register"],"summary":"How big the register is, what has just joined it, and how fast it grows.","operationId":"handle_pulse","responses":{"200":{"description":"Live counts, issuance rate, and the newest records"},"500":{"description":"The record store is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/recent":{"get":{"tags":["browse"],"summary":"What has just entered the register.","operationId":"handle_recent","parameters":[{"name":"country","in":"query","description":"An ISO country code, to see only what that country has just registered.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"The newest issued identifiers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listing"}}}},"500":{"description":"The record store is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/search":{"get":{"tags":["search"],"summary":"Search both collections at once.","description":"The bounds, the trimming and the merge all live in `surface`, because MCP\nasks this same question and two surfaces that clamped differently would\nreturn different answers to the same query.","operationId":"handle_search","parameters":[{"name":"q","in":"query","description":"A company name, a registration number, or a 20-character LEI.","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Rows per group.","required":false,"schema":{"type":"integer","minimum":0}},{"name":"page","in":"query","description":"1-based.","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Matches, grouped by which collection they came from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Results"}}}},"502":{"description":"The search index is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Action":{"type":"string","description":"What this record is for, from the point of view of somebody looking at it.","enum":["buy","transfer","renew","manage","view","elsewhere"]},"Bucket":{"type":"object","description":"One bucket of a facet.","required":["key","total"],"properties":{"key":{"type":"string","description":"The stored value - an ISO country code, an LOU's LEI, an ELF code."},"label":{"type":["string","null"],"description":"A name for it where the store holds one.\n\nNull for a country, deliberately: a country's name is different in every\nlocale and the browser already knows all of them. Putting an English\nname in the API would make the Swedish page depend on a translation this\nservice has no business owning."},"total":{"type":"integer","format":"int64"},"withLei":{"type":["integer","null"],"format":"int64","description":"How many of them hold an identifier.\n\nCorpus buckets only, and it is the number that makes a directory page\ncommercial rather than a phone book: *2 304 companies in Härnösand, 119\nof which hold an LEI* is a fact nobody else publishes and the reason\nsomebody on that page might need one. Absent on register facets, where\nevery row holds one by definition."}}},"Company":{"type":"object","description":"A company as its own register describes it, plus its LEI if it holds one.","required":["source","registrationNumber","registrationNumberFormatted","registrationNumberNormalized","country","isCeased","sniActivities","action"],"properties":{"action":{"$ref":"#/components/schemas/Action","description":"What this page can offer, decided by `verdict::decide` and by nothing\non the page. A search row, this page and the LEI page all render the\nsame answer, which is what stops a chip promising something the page it\nlinks to does not have."},"ceasedDate":{"type":["string","null"]},"city":{"type":["string","null"]},"country":{"type":"string"},"county":{"type":["string","null"]},"elfAbbreviation":{"type":["string","null"]},"elfCode":{"type":["string","null"]},"elfName":{"type":["string","null"],"description":"The ELF code's own name - `Aktiebolag` for `XJHM`. A page shows the\nname and keeps the code beside it, because the code is what a form or a\nGLEIF submission asks for and the name is what a reader understands."},"isCeased":{"type":"boolean"},"legalAddress":{"type":["string","null"]},"legalAddressType":{"type":["string","null"]},"legalFormLabel":{"type":["string","null"]},"legalName":{"type":["string","null"]},"lei":{"type":["string","null"],"description":"Read live rather than taken from the projection - see the module note."},"leiStatus":{"type":["string","null"]},"municipality":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"purpose":{"type":["string","null"],"description":"The register's own statement of what the company does - the\nverksamhetsbeskrivning as filed, in Swedish and frequently a paragraph\nlong. It is the fullest description of a company the corpus carries, so\nit earns a place on the page and it is what the search-engine snippet is\nbuilt from."},"registrationDate":{"type":["string","null"]},"registrationNumber":{"type":"string","description":"As the register publishes it, which is what goes back to GLEIF."},"registrationNumberFormatted":{"type":"string","description":"The same number as its country writes it - `556325-5511`. Display only."},"registrationNumberNormalized":{"type":"string"},"sniActivities":{"type":"array","items":{"$ref":"#/components/schemas/SniActivity"},"description":"Every industry the company is filed under, primary first, for the SNI\nrevision named in `sni_revision`. The `sni_code`/`sni_description`/\n`sni_section` above are the primary of this list, kept as their own\nfields because the search snippet and the industry facet want the one\ncode a company is chiefly known by, not the whole set."},"sniCode":{"type":["string","null"]},"sniDescription":{"type":["string","null"]},"sniRevision":{"type":["string","null"],"description":"Which SNI revision `sni_activities` is drawn from - `\"2025\"` or `\"2007\"`.\nShared by the whole list because a company's codes are all one revision."},"sniSection":{"type":["string","null"]},"source":{"type":"string"}}},"Entity":{"type":"object","description":"An entity as the golden copy holds it, plus the corpus row behind it when\nthere is one.","required":["lei","successorLeis","action","served","family"],"properties":{"action":{"$ref":"#/components/schemas/Action","description":"What this page can offer. The same `verdict::decide` the search row\nused to paint its chip - so following that chip now lands on a page\ncarrying the offer it promised."},"city":{"type":["string","null"]},"companyRegistrationNumber":{"type":["string","null"],"description":"Present when this entity has a company in a jurisdiction corpus behind\nit, which is what lets the page offer a transfer rather than a lookup."},"conformityFlag":{"type":["string","null"],"description":"GLEIF's own verdict on whether the record meets the standard."},"country":{"type":["string","null"]},"createdAt":{"type":["string","null"],"description":"When the *entity* came into existence, which is not when its identifier\ndid. The two are frequently decades apart, and a page showing only the\nsecond makes a 1988 company look four years old."},"entityCategory":{"type":["string","null"]},"entityStatus":{"type":["string","null"]},"entitySubCategory":{"type":["string","null"],"description":"The narrower classification, where the category has one."},"expirationReason":{"type":["string","null"]},"expiredAt":{"type":["string","null"],"description":"When it stopped, and why."},"family":{"$ref":"#/components/schemas/Family","description":"Level 2 - the corporate structure around this entity, and the issuer's\nstated reason where there is none. See `family`."},"headquartersAddress":{"type":["string","null"],"description":"Where the business is run, as against where post is delivered. A `Box`\nnumber and a street with a building on it are two different facts, so\nthis is its own block rather than a fallback for the one above."},"headquartersCity":{"type":["string","null"]},"headquartersCountry":{"type":["string","null"]},"headquartersPostalCode":{"type":["string","null"]},"headquartersRegion":{"type":["string","null"]},"lastUpdatedAt":{"type":["string","null"]},"legalAddress":{"type":["string","null"]},"legalFormAbbreviation":{"type":["string","null"]},"legalFormCode":{"type":["string","null"]},"legalFormName":{"type":["string","null"]},"legalJurisdiction":{"type":["string","null"]},"legalName":{"type":["string","null"]},"lei":{"type":"string"},"managingLou":{"type":["string","null"]},"managingLouName":{"type":["string","null"],"description":"The issuer's own name. A managing LOU is itself an entity in the golden\ncopy, so this is a lookup rather than a list to maintain - and \"who\nissued this\" is a question a 20-character code does not answer."},"managingLouWebsite":{"type":["string","null"],"description":"Where to reach the issuer. Most relevant on a lapsed record, where the\nreader is looking at the organisation that let it lapse and needs to\ndeal with them - the point at which a name with no address is a dead end."},"nextRenewalAt":{"type":["string","null"],"description":"When the record has to be re-certified.\n\n**The most consequential date on the page.** It is the day the holder\nhas to act, and a record that passes it lapses - which is the whole of\nwhy somebody looks a lapsed code up in the first place."},"otherLegalForm":{"type":["string","null"],"description":"What the issuer wrote when the ELF list had no code for the form."},"postalCode":{"type":["string","null"]},"region":{"type":["string","null"]},"registeredAt":{"type":["string","null"]},"registrationAuthorityId":{"type":["string","null"]},"registrationAuthorityName":{"type":["string","null"],"description":"The register the entity was verified against, by name."},"registrationAuthorityWebsite":{"type":["string","null"],"description":"And where that register lives, when it publishes an address."},"registrationNumber":{"type":["string","null"]},"registrationNumberFormatted":{"type":["string","null"]},"registrationStatus":{"type":["string","null"]},"served":{"type":"boolean","description":"Whether this platform operates in the jurisdiction the entity is\nregistered in. Sweden today; see `verdict::serves`. Said plainly rather\nthan left for the wizard to discover, because *\"we do not issue there\nyet\"* is a different answer from *\"that code cannot be moved\"*."},"successorLeis":{"type":"array","items":{"type":"string"},"description":"The identifier that took over, where one did. Without it a merged\nentity's record is a dead end - and it is the field every other lookup\nsite drops."},"validationAuthorityEntityId":{"type":["string","null"]},"validationAuthorityId":{"type":["string","null"],"description":"Which register the issuer actually checked against, and under what\nidentifier there. Usually the registration authority above, and worth\nshowing separately precisely because it is not always."},"validationAuthorityName":{"type":["string","null"]},"validationSources":{"type":["string","null"],"description":"How well corroborated the record is. `FULLY_CORROBORATED` against\n`ENTITY_SUPPLIED_ONLY` is the difference between a record a register\nconfirmed and one the entity asserted about itself, and a reader\ndeciding whether to trust it is entitled to know which."}}},"Entry":{"type":"object","description":"One row of a directory listing.\n\n**A company and an entity are both rows here, and they are not the same\nthing.** A golden-copy facet lists identifiers and a corpus facet lists\ncompanies, most of which hold no identifier at all. Which fields are present\nsays which this is, and the frontend addresses each by the key it actually\nhas - an entity by its LEI, a company by its registration number.","required":["slug"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"]},"legalName":{"type":["string","null"]},"lei":{"type":["string","null"],"description":"Present on a golden-copy row."},"registeredAt":{"type":["string","null"]},"registrationNumber":{"type":["string","null"],"description":"Present on a corpus row - normalized, which is what the company page is\naddressed by."},"registrationNumberFormatted":{"type":["string","null"],"description":"The same number as a reader writes it - `556012-5790` rather than the\nbare digits the URL uses. Formatted here rather than in the page,\nbecause the shape of a registration number is a jurisdiction's own and\nmust not be spelled out in shared front-end code."},"registrationStatus":{"type":["string","null"]},"slug":{"type":"string","description":"The canonical slug, so a link from here lands on the record page rather\nthan on the redirect to it."}}},"Exception":{"type":"object","description":"Why a parent is not reported.","required":["category","reasons","references"],"properties":{"category":{"type":"string","description":"Which parent is being excepted: the direct one or the ultimate one."},"reasons":{"type":"array","items":{"type":"string"},"description":"`NON_CONSOLIDATING`, `NATURAL_PERSONS`, `NO_LEI` and the rest. Plural\nbecause the standard permits several and issuers do file several."},"references":{"type":"array","items":{"type":"string"},"description":"Free text the issuer may attach when a reason allows naming a parent\nthat has no LEI.\n\nCarried for completeness and **not rendered**: in practice the field\nholds `N/A`, a single word, or a paragraph of somebody's national\ncompany law, and none of those belong on a record page."}}},"Facet":{"type":"string","description":"Something somebody can browse by.\n\nA closed set rather than a string passed through to SQL, which is what makes\nthe facet safe to put in a URL: an unknown facet is a 404 decided here, not\na query built out of whatever arrived.\n\n**Two stores, one vocabulary.** The first three group the Global LEI Index;\nthe last three group a jurisdiction corpus, where the questions worth asking\nare geographic and industrial rather than about who issued what. They are\none enum because a facet is a facet to a URL and to a reader - the store it\nreads is [`Source`], and it decides the query rather than the shape of the\npage.","enum":["country","issuer","legal-form","county","municipality","industry"]},"Family":{"type":"object","description":"An entity's place in a corporate structure, as far as the Level 2 data goes.","required":["parents","children","childrenTotal","exceptions"],"properties":{"children":{"type":"array","items":{"$ref":"#/components/schemas/Relative"},"description":"Ties where this entity is the parent, capped at [`CHILDREN_SHOWN`]."},"childrenTotal":{"type":"integer","format":"int64","description":"How many children exist, which is not always how many are listed."},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"},"description":"Why a parent is missing, where the issuer has said."},"parents":{"type":"array","items":{"$ref":"#/components/schemas/Relative"},"description":"Ties where this entity is the child - its direct and ultimate parents,\nits fund manager, the head office a branch belongs to."}}},"Hit":{"type":"object","required":["kind","action","name","slug"],"properties":{"action":{"$ref":"#/components/schemas/Action"},"city":{"type":["string","null"]},"country":{"type":["string","null"]},"entityStatus":{"type":["string","null"]},"kind":{"$ref":"#/components/schemas/Kind"},"lei":{"type":["string","null"]},"leiStatus":{"type":["string","null"]},"name":{"type":"string"},"registrationNumber":{"type":["string","null"],"description":"As the register publishes it. Not what a person is shown - see below."},"registrationNumberFormatted":{"type":["string","null"],"description":"The same number as its country writes it - `556325-5511` rather than\n`5563255511`. A Swede recognises one of those at a glance and counts the\ndigits of the other."},"registrationNumberNormalized":{"type":["string","null"],"description":"The form every URL and lookup uses."},"slug":{"type":"string","description":"URL segment derived from the name. The client builds the path; this is\nthe readable half of it."}}},"Index":{"type":"object","description":"Every facet with its buckets, as one answer.\n\nOne request rather than six: a hub page wants all of them, a bucket page\nwants one of them to resolve its slug, and both are served from the same\nwarm copy.","required":["country","issuer","legalForm","county","municipality","industry"],"properties":{"country":{"type":"array","items":{"$ref":"#/components/schemas/Bucket"}},"county":{"type":"array","items":{"$ref":"#/components/schemas/Bucket"}},"industry":{"type":"array","items":{"$ref":"#/components/schemas/Bucket"}},"issuer":{"type":"array","items":{"$ref":"#/components/schemas/Bucket"}},"legalForm":{"type":"array","items":{"$ref":"#/components/schemas/Bucket"}},"municipality":{"type":"array","items":{"$ref":"#/components/schemas/Bucket"}}}},"Kind":{"type":"string","description":"What a result leads to, and therefore which page it links to.\n\nThe distinction the front page splits on: a hit that already has an LEI goes\nto the LEI record, and one that does not goes to the company page. There is\nno third kind, because a thing either holds an identifier or it does not.","enum":["company","entity"]},"Listing":{"type":"object","description":"A page of one bucket.","required":["facet","value","total","page","pages","entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}},"facet":{"$ref":"#/components/schemas/Facet"},"page":{"type":"integer","format":"int64"},"pages":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64","description":"How many entities are in the bucket, not how many are on this page."},"value":{"type":"string"}}},"Problem":{"type":"object","description":"One error shape, so a client never has to guess which one it received.\n\nDeclared as a type rather than built inline because the OpenAPI document\nrefers to it four times, and a shape described four times is four shapes\nwaiting to disagree.","required":["error"],"properties":{"error":{"type":"string","description":"What went wrong, in one sentence, meant to be shown to whoever asked."}}},"Relative":{"type":"object","description":"One related entity, named rather than left as twenty characters.\n\n**One row per entity, not one per relationship record.** A subsidiary that\nis both directly and ultimately consolidated by the same parent files two\nrecords, and listing both puts the same company on the page twice under two\nheadings that read as two different companies. Grouping them here means the\nties become a property of the relative - which is also the more useful fact:\na child that is ultimate-only sits *below* another subsidiary, and that is\nthe shape of the group rather than a duplicate row.","required":["lei","relationshipTypes","active"],"properties":{"active":{"type":"boolean","description":"Whether any of the ties is still live. An `INACTIVE` relationship is\nhistory, and rendering it unmarked beside a live one would read as a\ncurrent parent."},"country":{"type":["string","null"]},"legalName":{"type":["string","null"]},"lei":{"type":"string"},"relationshipTypes":{"type":"array","items":{"type":"string"},"description":"GLEIF's own words for the ties - `IS_DIRECTLY_CONSOLIDATED_BY` and the\nrest. Passed through as published and translated at the edge, because\nthe vocabulary belongs to the standard and not to this service."}}},"Results":{"type":"object","required":["companies","entities","companiesFound","entitiesFound","merged"],"properties":{"companies":{"type":"array","items":{"$ref":"#/components/schemas/Hit"},"description":"Companies in a jurisdiction corpus, with their LEI where they hold one."},"companiesFound":{"type":"integer","format":"int64","minimum":0},"entities":{"type":"array","items":{"$ref":"#/components/schemas/Hit"},"description":"Golden copy records with no corpus row behind them."},"entitiesFound":{"type":"integer","format":"int64","minimum":0},"merged":{"type":"integer","description":"How many golden copy hits were dropped as already shown in `companies`.","minimum":0}}},"SniActivity":{"type":"object","description":"One industry classification a company files under.\n\nA company reports several - a primary line of business and the others it is\nalso active in - and the register ranks them, primary first. The page shows\nthe whole list, so this is one entry in it. `section` is the bare SNI section\nletter; the revision it belongs to is shared by the set and carried once, on\n`Company::sni_revision`, rather than repeated on every code.","required":["rank","code"],"properties":{"code":{"type":"string"},"description":{"type":["string","null"]},"rank":{"type":"integer","format":"int32"},"section":{"type":["string","null"]}}}}},"tags":[{"name":"search","description":"Finding an entity when you do not have its identifier"},{"name":"records","description":"Reading one entity when you do"},{"name":"register","description":"The shape and motion of the register itself"},{"name":"browse","description":"Walking the register by group, when there is no one entity in mind yet"}]}