Skip to main content
Glama

Resolve Entity

resolve_entity
Read-onlyIdempotent

"What's the ticker for…" / "find the CIK for…" / "what's the LEI for…" / "what's the RxCUI for…" / "look up the ID for…" / "what is X's official identifier" / "who owns X" / "is X a subsidiary of Y" — resolve a user-spoken NAME to the canonical/official identifiers other tools require as input. Use FIRST whenever you have a name but need an ID. SUPPORTED TYPES: "company" (cross-source identity spine: 10-digit CIK + ticker + company_name from SEC EDGAR, legal-entity LEI from GLEIF with parent/ultimate-parent/children ownership when the LEI resolves, and security FIGI from OpenFIGI — by exact ticker map when a ticker is implied, and otherwise by name search, so NON-EQUITY instruments that never have a ticker (municipal and corporate bonds, notes, authority debt) DO resolve here; when a name matches more than one instrument it asserts nothing and returns figi_candidates to pick from, which is the correct answer to an issuer name that does not identify a single bond; every identifier is labelled with the source that established it, and an identifier that could NOT be resolved is stated explicitly under unresolved rather than omitted — accepts ticker, CIK, ISIN, or company name as input; an ISIN like "CH0038863350" resolves to the LEGAL ENTITY that issued the security via the GLEIF ISIN-to-LEI mapping, covering non-US issuers EDGAR cannot reach), "drug" (returns RxCUI + ingredient + brand from RxNorm + pipeworx://rxnorm/concept/{rxcui} citation; accepts brand or generic name). LEI/FIGI enrichment degrades gracefully — if GLEIF or OpenFIGI is unavailable, the EDGAR identifiers still return. Each call cascades through several lookup endpoints internally — using resolve_entity replaces 2-3 manual lookups.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
typeYesEntity type: "company" or "drug".
valueYesFor company: ticker (AAPL), CIK (0000320193), or name. For drug: brand or generic name (e.g., "ozempic", "metformin"). Pass the ENTITY NAME ONLY — for a bond that is the ISSUER exactly as printed ("NEW YORK ST DORM AUTH"), never the question's full noun phrase ("NEW YORK ST DORM AUTH revenue bonds"): the FIGI lookup matches instrument names, so trailing security-class words match nothing.
countryNoOPTIONAL ISO 3166-1 alpha-2 of the country whose business register you mean ("NO", "FI", "JP", "GB", "FR", "EE", "BR"). Narrows the national-register fan-out and is often the difference between the right company and a US namesake — "Apple" with country "NO" is a Norwegian company, not Apple Inc. Omitting it searches every register we can name, which is the right default when you do not know. company only; ignored for drug.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idsYesEvery identifier established: cik, ticker, company_name, lei, figi, isin, cusip, register_id, register_country. A key absent here appears in `unresolved` with a reason — never silently dropped.
typeYes
brandNo
notesNo
queryYes
relatedNoEntities that collapsed INTO the match, each carrying `collapsed_by`.
sourcesYesPer-identifier provenance. Every key in `ids` has a matching key here.
resolvedYesAt least one identifier was established. Read `match_status` and `unresolved` for WHICH — a company can be resolved in a national register with no CIK at all.
searchedNoEVERY register asked, with its own as-of date and row count. A register that could not be reached carries `error` — 0 rows with an error is "we could not ask", 0 rows without one is "nothing is there", and they are different answers.
registersNoThe matched entity as every register that carries it — the match (flagged `matched: true`) plus anything that collapsed into it. A Companies House number AND the LEI that crosswalks to it are the SAME answer, not rivals.
resourcesNo
candidatesNoRivals, best first. Populated on "ambiguous" and on "matched" alike.
ingredientNo
unresolvedYesPer-identifier reason an id could NOT be established — the honest twin of `ids`.
cik_withheldNoA CIK that came back from a FUZZY SEC name match and is NOT asserted, because the spine matched a stronger non-US candidate. The number is here so a caller who wanted the US filer can still use it; what changed is that we no longer claim it IS the answer. See `unresolved.cik` for the reason.
match_statusNoThe headline to branch on. "ambiguous" is an ANSWER, not a failure: two companies matched the name equally well and both are in `candidates`. "no_match" means every register in `searched` was asked and none carried it. "incomplete" means one of them could NOT be asked (it carries an `error` in `searched[]`), so the candidate set is short by an unknown amount and no id is asserted — distinct from "ambiguous" because a RETRY is what resolves it, not a narrower query; `fanout_incomplete` names the unreachable registers and carries, under `withheld_match`, the candidate that would have been returned on a complete fan-out.
figi_withheldNoA FIGI that matched this name in OpenFIGI (`figi_match: "name_search"`) and is NOT asserted, because `match_status` is "incomplete": a name search cannot tell a company apart from a security carrying its name, and the registers that would have settled it are the ones we could not ask. A `ticker_map` FIGI is never withheld this way — it is corroborated by the resolved ticker it came from. Carried so a caller who accepts the caveat can use it; see `unresolved.figi`, and retry, since a transiently rate-limited register completes on the next call.
match_scoringNoThe margin rule's own inputs, so a caller can see WHY it fell where it did.
sec_alternativesNoEDGAR's own discarded near-misses on a name match, surfaced instead of dropped.
fanout_incompleteNoPresent IFF at least one register in `searched[]` carried an `error` — set even when `match_status` stayed "ambiguous". `withheld_match` is the candidate this call declined to ASSERT because a register was missing, carried rather than discarded so a caller who accepts the caveat can still use it.
match_explanationNoPlain words. Always present when the spine ran, and required on "ambiguous" and "no_match".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / country
      Added value: +{
      +  "description": "OPTIONAL ISO 3166-1 alpha-2 of the country whose business register you mean (\"NO\", \"FI\", \"JP\", \"GB\", \"FR\", \"EE\", \"BR\"). Narrows the national-register fan-out and is often the difference between the right company and a US namesake — \"Apple\" with country \"NO\" is a Norwegian company, not Apple Inc. Omitting it searches every register we can name, which is the right default when you do not know. company only; ignored for drug.",
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "brand": {
      +      "type": "string"
      +    },
      +    "candidates": {
      +      "description": "Rivals, best first. Populated on \"ambiguous\" and on \"matched\" alike.",
      +      "items": {
      +        "properties": {
      +          "country": {
      +            "description": "ISO-2 of the REGISTER, not of the company's operations.",
      +            "type": "string"
      +          },
      +          "data_as_of": {
      +            "description": "That register's own snapshot date, per row, so a stale country is visible.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "detail_tool": {
      +            "description": "The live pack tool that returns the full record, e.g. \"brreg-no:get_entity\".",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "legal_form": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "legal_name": {
      +            "type": "string"
      +          },
      +          "lei": {
      +            "description": "From the GLEIF crosswalk when present. Never guessed from a name.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "match_type": {
      +            "enum": [
      +              "id",
      +              "exact",
      +              "exact_form",
      +              "prefix",
      +              "tokens"
      +            ],
      +            "type": "string"
      +          },
      +          "matched_kind": {
      +            "enum": [
      +              "legal",
      +              "trading",
      +              "former",
      +              "english",
      +              "kana"
      +            ],
      +            "type": "string"
      +          },
      +          "matched_name": {
      +            "description": "The name row that matched, exactly as the publisher spells it.",
      +            "type": "string"
      +          },
      +          "register": {
      +            "description": "Publisher + dataset, e.g. \"Brønnøysund Register Centre, Enhetsregisteret\". Never a URL or filename.",
      +            "type": "string"
      +          },
      +          "register_id": {
      +            "description": "The native id in the register's own canonical formatting.",
      +            "type": "string"
      +          },
      +          "register_key": {
      +            "description": "Stable machine slug for the register.",
      +            "type": "string"
      +          },
      +          "registration_status": {
      +            "description": "GLEIF rows only: the LEI RECORD's lifecycle (ISSUED/LAPSED/RETIRED/...). A DIFFERENT fact from `status` — a lapsed LEI is unmaintained reference data about a company that may well still trade.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "score": {
      +            "description": "0-1, assigned centrally. An adapter never grades itself.",
      +            "type": "number"
      +          },
      +          "status": {
      +            "description": "The COMPANY's status.",
      +            "enum": [
      +              "active",
      +              "inactive",
      +              "dissolved",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          },
      +          "status_raw": {
      +            "description": "The register's own status word, verbatim and unglossed.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "country",
      +          "register",
      +          "register_key",
      +          "register_id",
      +          "legal_name",
      +          "score",
      +          "status"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "cik_withheld": {
      +      "description": "A CIK that came back from a FUZZY SEC name match and is NOT asserted, because the spine matched a stronger non-US candidate. The number is here so a caller who wanted the US filer can still use it; what changed is that we no longer claim it IS the answer. See `unresolved.cik` for the reason.",
      +      "type": "string"
      +    },
      +    "fanout_incomplete": {
      +      "description": "Present IFF at least one register in `searched[]` carried an `error` — set even when `match_status` stayed \"ambiguous\". `withheld_match` is the candidate this call declined to ASSERT because a register was missing, carried rather than discarded so a caller who accepts the caveat can still use it.",
      +      "properties": {
      +        "unavailable": {
      +          "items": {
      +            "properties": {
      +              "country": {
      +                "type": "string"
      +              },
      +              "error": {
      +                "type": "string"
      +              },
      +              "register": {
      +                "type": "string"
      +              },
      +              "register_key": {
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "withheld_match": {
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "figi_withheld": {
      +      "description": "A FIGI that matched this name in OpenFIGI (`figi_match: \"name_search\"`) and is NOT asserted, because `match_status` is \"incomplete\": a name search cannot tell a company apart from a security carrying its name, and the registers that would have settled it are the ones we could not ask. A `ticker_map` FIGI is never withheld this way — it is corroborated by the resolved ticker it came from. Carried so a caller who accepts the caveat can use it; see `unresolved.figi`, and retry, since a transiently rate-limited register completes on the next call.",
      +      "type": "string"
      +    },
      +    "ids": {
      +      "description": "Every identifier established: cik, ticker, company_name, lei, figi, isin, cusip, register_id, register_country. A key absent here appears in `unresolved` with a reason — never silently dropped.",
      +      "type": "object"
      +    },
      +    "ingredient": {
      +      "type": "string"
      +    },
      +    "match_explanation": {
      +      "description": "Plain words. Always present when the spine ran, and required on \"ambiguous\" and \"no_match\".",
      +      "type": "string"
      +    },
      +    "match_scoring": {
      +      "description": "The margin rule's own inputs, so a caller can see WHY it fell where it did.",
      +      "properties": {
      +        "margin": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "runner_up": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "thresholds": {
      +          "properties": {
      +            "floor": {
      +              "type": "number"
      +            },
      +            "margin": {
      +              "type": "number"
      +            },
      +            "match": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "top": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "match_status": {
      +      "description": "The headline to branch on. \"ambiguous\" is an ANSWER, not a failure: two companies matched the name equally well and both are in `candidates`. \"no_match\" means every register in `searched` was asked and none carried it. \"incomplete\" means one of them could NOT be asked (it carries an `error` in `searched[]`), so the candidate set is short by an unknown amount and no id is asserted — distinct from \"ambiguous\" because a RETRY is what resolves it, not a narrower query; `fanout_incomplete` names the unreachable registers and carries, under `withheld_match`, the candidate that would have been returned on a complete fan-out.",
      +      "enum": [
      +        "matched",
      +        "ambiguous",
      +        "no_match",
      +        "incomplete"
      +      ],
      +      "type": "string"
      +    },
      +    "notes": {
      +      "type": "string"
      +    },
      +    "query": {
      +      "type": "string"
      +    },
      +    "registers": {
      +      "description": "The matched entity as every register that carries it — the match (flagged `matched: true`) plus anything that collapsed into it. A Companies House number AND the LEI that crosswalks to it are the SAME answer, not rivals.",
      +      "items": {
      +        "properties": {
      +          "country": {
      +            "description": "ISO-2 of the REGISTER, not of the company's operations.",
      +            "type": "string"
      +          },
      +          "data_as_of": {
      +            "description": "That register's own snapshot date, per row, so a stale country is visible.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "detail_tool": {
      +            "description": "The live pack tool that returns the full record, e.g. \"brreg-no:get_entity\".",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "legal_form": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "legal_name": {
      +            "type": "string"
      +          },
      +          "lei": {
      +            "description": "From the GLEIF crosswalk when present. Never guessed from a name.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "match_type": {
      +            "enum": [
      +              "id",
      +              "exact",
      +              "exact_form",
      +              "prefix",
      +              "tokens"
      +            ],
      +            "type": "string"
      +          },
      +          "matched_kind": {
      +            "enum": [
      +              "legal",
      +              "trading",
      +              "former",
      +              "english",
      +              "kana"
      +            ],
      +            "type": "string"
      +          },
      +          "matched_name": {
      +            "description": "The name row that matched, exactly as the publisher spells it.",
      +            "type": "string"
      +          },
      +          "register": {
      +            "description": "Publisher + dataset, e.g. \"Brønnøysund Register Centre, Enhetsregisteret\". Never a URL or filename.",
      +            "type": "string"
      +          },
      +          "register_id": {
      +            "description": "The native id in the register's own canonical formatting.",
      +            "type": "string"
      +          },
      +          "register_key": {
      +            "description": "Stable machine slug for the register.",
      +            "type": "string"
      +          },
      +          "registration_status": {
      +            "description": "GLEIF rows only: the LEI RECORD's lifecycle (ISSUED/LAPSED/RETIRED/...). A DIFFERENT fact from `status` — a lapsed LEI is unmaintained reference data about a company that may well still trade.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "score": {
      +            "description": "0-1, assigned centrally. An adapter never grades itself.",
      +            "type": "number"
      +          },
      +          "status": {
      +            "description": "The COMPANY's status.",
      +            "enum": [
      +              "active",
      +              "inactive",
      +              "dissolved",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          },
      +          "status_raw": {
      +            "description": "The register's own status word, verbatim and unglossed.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "country",
      +          "register",
      +          "register_key",
      +          "register_id",
      +          "legal_name",
      +          "score",
      +          "status"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "related": {
      +      "description": "Entities that collapsed INTO the match, each carrying `collapsed_by`.",
      +      "items": {
      +        "properties": {
      +          "country": {
      +            "description": "ISO-2 of the REGISTER, not of the company's operations.",
      +            "type": "string"
      +          },
      +          "data_as_of": {
      +            "description": "That register's own snapshot date, per row, so a stale country is visible.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "detail_tool": {
      +            "description": "The live pack tool that returns the full record, e.g. \"brreg-no:get_entity\".",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "legal_form": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "legal_name": {
      +            "type": "string"
      +          },
      +          "lei": {
      +            "description": "From the GLEIF crosswalk when present. Never guessed from a name.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "match_type": {
      +            "enum": [
      +              "id",
      +              "exact",
      +              "exact_form",
      +              "prefix",
      +              "tokens"
      +            ],
      +            "type": "string"
      +          },
      +          "matched_kind": {
      +            "enum": [
      +              "legal",
      +              "trading",
      +              "former",
      +              "english",
      +              "kana"
      +            ],
      +            "type": "string"
      +          },
      +          "matched_name": {
      +            "description": "The name row that matched, exactly as the publisher spells it.",
      +            "type": "string"
      +          },
      +          "register": {
      +            "description": "Publisher + dataset, e.g. \"Brønnøysund Register Centre, Enhetsregisteret\". Never a URL or filename.",
      +            "type": "string"
      +          },
      +          "register_id": {
      +            "description": "The native id in the register's own canonical formatting.",
      +            "type": "string"
      +          },
      +          "register_key": {
      +            "description": "Stable machine slug for the register.",
      +            "type": "string"
      +          },
      +          "registration_status": {
      +            "description": "GLEIF rows only: the LEI RECORD's lifecycle (ISSUED/LAPSED/RETIRED/...). A DIFFERENT fact from `status` — a lapsed LEI is unmaintained reference data about a company that may well still trade.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "score": {
      +            "description": "0-1, assigned centrally. An adapter never grades itself.",
      +            "type": "number"
      +          },
      +          "status": {
      +            "description": "The COMPANY's status.",
      +            "enum": [
      +              "active",
      +              "inactive",
      +              "dissolved",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          },
      +          "status_raw": {
      +            "description": "The register's own status word, verbatim and unglossed.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "country",
      +          "register",
      +          "register_key",
      +          "register_id",
      +          "legal_name",
      +          "score",
      +          "status"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "resolved": {
      +      "description": "At least one identifier was established. Read `match_status` and `unresolved` for WHICH — a company can be resolved in a national register with no CIK at all.",
      +      "type": "boolean"
      +    },
      +    "resources": {
      +      "type": "object"
      +    },
      +    "searched": {
      +      "description": "EVERY register asked, with its own as-of date and row count. A register that could not be reached carries `error` — 0 rows with an error is \"we could not ask\", 0 rows without one is \"nothing is there\", and they are different answers.",
      +      "items": {
      +        "properties": {
      +          "country": {
      +            "type": "string"
      +          },
      +          "data_as_of": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "error": {
      +            "type": "string"
      +          },
      +          "register": {
      +            "type": "string"
      +          },
      +          "register_key": {
      +            "type": "string"
      +          },
      +          "rows": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "register",
      +          "register_key",
      +          "country",
      +          "rows"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "sec_alternatives": {
      +      "description": "EDGAR's own discarded near-misses on a name match, surfaced instead of dropped.",
      +      "items": {
      +        "properties": {
      +          "cik": {
      +            "type": "string"
      +          },
      +          "company_name": {
      +            "type": "string"
      +          },
      +          "ticker": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "sources": {
      +      "description": "Per-identifier provenance. Every key in `ids` has a matching key here.",
      +      "type": "object"
      +    },
      +    "type": {
      +      "type": "string"
      +    },
      +    "unresolved": {
      +      "description": "Per-identifier reason an id could NOT be established — the honest twin of `ids`.",
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "query",
      +    "resolved",
      +    "ids",
      +    "sources",
      +    "unresolved"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "type": "company",
      +    "value": "AAPL"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / value / description
      Previous value: -"For company: ticker (AAPL), CIK (0000320193), or name. For drug: brand or generic name (e.g., \"ozempic\", \"metformin\")."New value: +"For company: ticker (AAPL), CIK (0000320193), or name. For drug: brand or generic name (e.g., \"ozempic\", \"metformin\"). Pass the ENTITY NAME ONLY — for a bond that is the ISSUER exactly as printed (\"NEW YORK ST DORM AUTH\"), never the question's full noun phrase (\"NEW YORK ST DORM AUTH revenue bonds\"): the FIGI lookup matches instrument names, so trailing security-class words match nothing."
  4. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.