Skip to main content
Glama

Get Beneficial Owners

secedgar_get_beneficial_owners
Read-onlyIdempotent

List the 5%-and-over beneficial owners of a public company, parsed from the structured SCHEDULE 13D and SCHEDULE 13G filings made about it. The input is the ISSUER — the company being held — which is the opposite direction from secedgar_get_institutional_holdings, where the input is the manager. 13D is the activist form and carries the filer's stated purpose of the transaction; 13G is the passive form and has no purpose field at all, which is the substantive difference between a stake that intends to influence control and one that does not. Every filing is returned with each reporting person listed separately, because voting power, dispositive power, and percent of class are reported per person even on a joint filing where several funds and their controlling principal report overlapping shares — summing those percentages double-counts the same position. Coverage starts at 2024-12-18, when SEC replaced the legacy SC 13D / SC 13G text filings with this XML format; earlier stakes are readable but not parseable, and the response reports how many of them the issuer has. The full parsed set is materialized as df_ when a canvas is available, one row per reporting person, so it joins against the insider and 13F dataframes on issuer CIK — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of filings to fetch and parse, newest first. Each filing is a separate document fetch, so this is the cost of the call as well as its depth. Default 10; a widely-held company can have dozens of blockholder filings a year.
issuerYesThe company whose blockholders you want — a ticker ("AAPL"), a 10-digit CIK ("0000320193"), or a company name. This is the subject company of the schedule, not the investor filing it; passing an investment manager here returns the schedules filed about that manager, which is almost always empty.
form_kindNoWhich schedule to return. "13D" is the activist form, filed by a holder that may seek to influence control and carrying a stated purpose of transaction. "13G" is the passive form, available to institutions and holders under 20% that certify no control intent. "all" (default) returns both, newest first.all
include_amendmentsNoWhether to include amendments (SCHEDULE 13D/A, SCHEDULE 13G/A). Amendments carry the current position and are how an ongoing stake is tracked, so they are included by default. Set false to see only filings that opened a new position.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoThe limit cap applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of filings returned.
issuerNoThe issuer input, echoed.
noticeNoGuidance when no filings matched, naming the coverage boundary and the fallback.
datasetNoDataframe with one row per reporting person across parsed filings; joins insider and 13F dataframes on issuer_cik. Absent when canvas is unavailable or nothing parsed.
filingsNoBlockholder filings, newest first, capped at limit.
form_kindNoThe schedule filter applied — the requested value, or the default "all".
truncatedNoTrue when filings were capped by limit.
issuer_cikNoCIK of the resolved issuer, zero-padded to 10 digits.
issuer_nameNoEDGAR-conformed name of the resolved issuer.
filings_parsedNoFilings fetched and parsed: total_structured_filings capped by limit.
structured_coverage_fromNoFirst date SEC required this XML format (YYYY-MM-DD); earlier blockholder filings cannot be parsed here.
total_structured_filingsNoStructured 13D/13G filings matching form_kind in the recent submissions window, before limit.
legacy_filings_before_coverageNoLegacy SC 13D / SC 13G filings (pre-2024-12-18) in the recent submissions window, which this tool cannot parse; find them with secedgar_search_filings. A floor: the window holds the last year or 1,000 filings.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed20 schema fields changed
    • changedOutput schema / properties / dataset / description
      Previous value: -"Canvas dataframe holding one row per reporting person across every parsed filing, each row carrying the issuer, form, accession, and dates alongside the person's powers. Joins against the insider and 13F dataframes on issuer_cik. Absent when canvas is unavailable or nothing parsed."New value: +"Dataframe with one row per reporting person across parsed filings; joins insider and 13F dataframes on issuer_cik. Absent when canvas is unavailable or nothing parsed."
    • changedOutput schema / properties / dataset / properties / name / description
      Previous value: -"Dataframe handle (df_XXXXX_XXXXX) — inspect its columns with secedgar_dataframe_describe, then query it with secedgar_dataframe_query."New value: +"Dataframe handle (df_XXXXX_XXXXX) for secedgar_dataframe_describe, then secedgar_dataframe_query."
    • changedOutput schema / properties / dataset / properties / truncated / description
      Previous value: -"True when the issuer has more structured filings than limit fetched — the dataframe holds the parsed filings only, not the whole history."New value: +"True when more structured filings exist than limit fetched."
    • changedOutput schema / properties / filings / items / properties / event_date / description
      Previous value: -"Date of the event that required the filing (YYYY-MM-DD) — when the position actually crossed or changed, which precedes filing_date. Absent when the cover page omits it."New value: +"Date of the event that required the filing (YYYY-MM-DD). Absent when the cover page omits it."
    • changedOutput schema / properties / filings / items / properties / purpose_of_transaction / description
      Previous value: -"Item 4 purpose-of-transaction prose — what the holder says it intends. Present on 13D filings only; 13G has no such field, which is what makes it the passive form. Absent on an amendment that restates no purpose."New value: +"Item 4 purpose of transaction, 13D only. Absent on 13G and on an amendment that restates none."
    • changedOutput schema / properties / filings / items / properties / purpose_truncated / description
      Previous value: -"True when purpose_of_transaction was clipped to fit — read the full item with secedgar_get_filing on this accession number."New value: +"True when purpose_of_transaction was clipped; read the full item with secedgar_get_filing."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / description
      Previous value: -"Every reporting person on this filing. A joint filing lists a fund, its adviser, and its controlling principal separately, each reporting the same underlying shares."New value: +"Every reporting person; a joint filing lists a fund, its adviser, and its principal separately, each reporting the same shares."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / aggregate_amount_owned / description
      Previous value: -"Shares beneficially owned by this person. Absent when the person reports no amount, which happens on an exit amendment reporting a zero position."New value: +"Shares beneficially owned by this person. Absent when none is reported, as on an exit amendment."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / cik / description
      Previous value: -"Reporting person CIK, when the schedule carries one. SCHEDULE 13G never does — its cover page has no CIK field — so this is populated on 13D filings only."New value: +"Reporting person CIK. 13D only; the 13G cover page has no CIK field."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / citizenship / description
      Previous value: -"SEC citizenship or place-of-organization code — a US state (\"DE\"), or an SEC country code (\"X1\" United States, \"E9\" Cayman Islands)."New value: +"SEC citizenship or place-of-organization code: a US state (\"DE\") or SEC country code (\"E9\" Cayman Islands)."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / excludes_certain_shares / description
      Previous value: -"True when the reported aggregate deliberately excludes shares this person disclaims beneficial ownership of. Absent when the filing does not answer."New value: +"True when the aggregate excludes shares this person disclaims. Absent when the filing does not say."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / notes / description
      Previous value: -"The filer's own cover-page footnote, usually the share count the percentage was computed against. Clipped when long — the full text is in the filing."New value: +"The filer's cover-page footnote, often the share count behind the percentage. Clipped when long."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / percent_of_class / description
      Previous value: -"Percent of the class this person beneficially owns (0-100), as this person reports it. Per person, not per filing: joint filers report overlapping shares, so these do not sum to a group total."New value: +"Percent of the class this person beneficially owns (0-100). Joint filers report overlapping shares, so these do not sum."
    • changedOutput schema / properties / filings / items / properties / reporting_persons / items / properties / person_types / description
      Previous value: -"SEC type-of-reporting-person codes — IN individual, CO corporation, PN partnership, IA investment adviser, HC holding company, OO other. One person can carry several."New value: +"SEC reporting-person codes: IN individual, CO corporation, PN partnership, IA investment adviser, HC holding company, OO other."
    • changedOutput schema / properties / filings / items / properties / security_class / description
      Previous value: -"Title of the class of securities the schedule covers. A multi-class issuer has a separate schedule per class, so percentages are of this class only."New value: +"Class of securities the schedule covers; percentages are of this class only."
    • changedOutput schema / properties / filings_parsed / description
      Previous value: -"Filings actually fetched and parsed — total_structured_filings capped by limit."New value: +"Filings fetched and parsed: total_structured_filings capped by limit."
    • changedOutput schema / properties / legacy_filings_before_coverage / description
      Previous value: -"Legacy SC 13D / SC 13G filings in the issuer's recent submissions window — pre-2024-12-18 stakes this tool cannot parse. Reach them with secedgar_search_filings and read them with secedgar_get_filing. A floor, not a lifetime count: the submissions window holds the last year or 1,000 filings of every type, whichever is more."New value: +"Legacy SC 13D / SC 13G filings (pre-2024-12-18) in the recent submissions window, which this tool cannot parse; find them with secedgar_search_filings. A floor: the window holds the last year or 1,000 filings."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when no filings matched — names the coverage boundary and the fallback."New value: +"Guidance when no filings matched, naming the coverage boundary and the fallback."
    • changedOutput schema / properties / structured_coverage_from / description
      Previous value: -"First filing date on which SEC required this XML format (YYYY-MM-DD). Blockholder filings before it exist but are not parseable into this schema."New value: +"First date SEC required this XML format (YYYY-MM-DD); earlier blockholder filings cannot be parsed here."
    • changedOutput schema / properties / total_structured_filings / description
      Previous value: -"Structured SCHEDULE 13D/13G filings matching the form filter in the issuer's recent submissions window, before the limit. The population the returned filings are the newest slice of."New value: +"Structured 13D/13G filings matching form_kind in the recent submissions window, before limit."
  2. Changed1 schema field changed
    • changedOutput schema / properties / legacy_filings_before_coverage / description
      Previous value: -"Legacy SC 13D / SC 13G filings in the issuer's recent submissions window — pre-2024-12-18 stakes this tool cannot parse. Reach them with secedgar_search_filings and read them with secedgar_get_filing. A floor, not a lifetime count: the submissions window holds roughly the last thousand filings of every type."New value: +"Legacy SC 13D / SC 13G filings in the issuer's recent submissions window — pre-2024-12-18 stakes this tool cannot parse. Reach them with secedgar_search_filings and read them with secedgar_get_filing. A floor, not a lifetime count: the submissions window holds the last year or 1,000 filings of every type, whichever is more."
  3. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: The issuer input does not resolve to a known EDGAR company `ambiguous_issuer`: The issuer name matches several EDGAR companies `no_filings_found`: The issuer has no structured SCHEDULE 13D/13G filings matching the requested form kind Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: The issuer input does not resolve to a known EDGAR company. `ambiguous_issuer`: The issuer name matches several EDGAR companies. `no_filings_found`: The issuer has no structured SCHEDULE 13D/13G filings matching the requested form kind. `rate_limited`: SEC is rate-limiting this server's IP — SEC answered 429, or the call was refused without being sent while the cool-down after one runs. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "issuer_not_found",
      -  "ambiguous_issuer",
      -  "no_filings_found"
      -]New value: +[
      +  "issuer_not_found",
      +  "ambiguous_issuer",
      +  "no_filings_found",
      +  "rate_limited"
      +]
  4. Changed1 schema field changed
    • changedOutput schema / properties / dataset / properties / name / description
      Previous value: -"Dataframe handle (df_XXXXX_XXXXX) — pass to secedgar_dataframe_query."New value: +"Dataframe handle (df_XXXXX_XXXXX) — inspect its columns with secedgar_dataframe_describe, then query it with secedgar_dataframe_query."
  5. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "issuer",
      +      "issuer_cik",
      +      "issuer_name",
      +      "form_kind",
      +      "total_structured_filings",
      +      "filings_parsed",
      +      "structured_coverage_from",
      +      "legacy_filings_before_coverage",
      +      "filings"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `issuer_not_found`: The issuer input does not resolve to a known EDGAR company `ambiguous_issuer`: The issuer name matches several EDGAR companies `no_filings_found`: The issuer has no structured SCHEDULE 13D/13G filings matching the requested form kind Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "issuer_not_found",
      +            "ambiguous_issuer",
      +            "no_filings_found"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "issuer",
      -  "issuer_cik",
      -  "issuer_name",
      -  "form_kind",
      -  "total_structured_filings",
      -  "filings_parsed",
      -  "structured_coverage_from",
      -  "legacy_filings_before_coverage",
      -  "filings"
      -]
  6. Added

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, openWorld), and the description adds substantial behavior beyond them: coverage begins 2024-12-18 with legacy text filings readable but not parseable, the response reports how many such filings exist, and results are materialized as df_<id> for joining on issuer CIK. This is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the key directional distinction, then layers in the 13D/13G semantics, coverage caveat, and dataframe handoff. It is long, but nearly every sentence carries distinct information; the dense packing is justified by the tool's analytical subtleties.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description correctly avoids explaining return values and instead covers what an agent needs to call and then use the result: directional input semantics, coverage limits with a count for unparseable filings, per-reporting-person granularity, and the follow-on tools (dataframe_describe, dataframe_query) for analysis.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds real value: it warns that passing an investment manager to the issuer param returns schedules filed about that manager (usually empty), and it clarifies the analytical consequence of per-person reporting — summing percentages double-counts a joint filing. It goes beyond restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'List the 5%-and-over beneficial owners of a public company' — and immediately scopes the source (SCHEDULE 13D/13G). It explicitly distinguishes itself from the near-miss sibling secedgar_get_institutional_holdings by explaining that the input is the issuer, not the manager, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names an alternative (get_institutional_holdings) and the condition that separates them (issuer vs manager direction), plus explains the 13D/13G selection criteria and when amendments matter. The gap is that the potentially overlapping sibling secedgar_find_holders is never mentioned, leaving one routing decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.