Skip to main content
Glama

Get Material Events

secedgar_get_material_events
Read-onlyIdempotent

Retrieve a company's 8-K filings with their item codes decoded, optionally filtered to specific items. 8-K item codes are how material events are actually scoped — 1.01 material agreements, 2.02 results of operations, 4.02 non-reliance on previously issued financials, 5.02 officer and director departures — and filtering by them is narrower than any form-level filter in secedgar_search_filings or secedgar_company_search, neither of which can see items. Each row carries the accession number and primary document for secedgar_get_filing; press releases usually ride as EX-99 exhibits rather than in the primary document. Two numbering regimes exist: filings from 2004-08-23 onward use the x.xx codes, earlier ones use single integers (12 was the old results-of-operations item, 9 the old Regulation FD item), and both are accepted as filters and decoded in the response. A date window reaches filings older than the recent submissions window by reading every archive page it overlaps, up to 10; without one, the scan reads back only as far as it needs to fill limit with filings passing the items filter, within the same 10 pages. Every scanned filing that passes the filter is materialized as df_ for item-distribution analysis over time (pass a date window to cover a longer span) — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
itemsNoItem codes to filter to; a filing matches when it reports any of them. Omit to return every 8-K. Current-regime codes are dotted ("2.02"), pre-2004-08-23 codes are bare integers ("12"), and the two vocabularies do not overlap — filtering on "2.02" alone returns nothing from a pre-2004 window, so pair them ("2.02", "12") when the window spans the changeover. Full decode table: the secedgar://filing-types resource.
limitNoFilings returned inline, newest first. Every scanned filing that passes the filter is materialized as a dataframe when there are more than this and a canvas is available. Default 20.
companyYesCompany ticker symbol (e.g. "AAPL"), name (e.g. "Apple"), or CIK number (e.g. "320193"). Ticker is the exact lookup; name search matches current and former names.
filed_afterNoOnly include filings filed on or after this date (YYYY-MM-DD). A date filter routes the scan into the older submissions archive pages, so it reaches 8-K filings that predate the recent window (the last year or 1,000 filings of every form, whichever holds more).
filed_beforeNoOnly include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; together they bound the archive-page scan.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoThe limit cap applied.
cikNoResolved CIK, zero-padded to 10 digits.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of filings shown inline.
noticeNoWhy nothing matched (an empty date window, or an items filter that excluded everything), and, when fewer than limit matched while the page cap left pages unread, how far the scan reached and the window that goes further.
datasetNoDataframe of every scanned 8-K passing the filter; item_codes is comma-separated (unnest(string_split(item_codes, ','))). Absent when the result fits inline, canvas is unavailable, or staging failed.
filingsNoMatching filings, newest first, capped at limit.
truncatedNoTrue when the inline filings list was capped.
company_nameNoSEC-conformed company name.
items_filterNoThe item codes filtered on, echoed. Absent when no filter was applied.
total_matchedNoFilings matching every filter across the scan; can exceed limit.
total_8k_scannedNo8-K filings in the date window before the items filter; compare total_matched.
item_distributionNoScanned 8-K filings per item code, before the items filter. Empty when none were scanned.
history_scanned_throughNoOldest filing date the scan reached (YYYY-MM-DD); nothing older was examined. The scan reads the recent window (last year or 1,000 filings), then up to 10 archive pages: those a date filter overlaps, or, undated, until limit filings pass the items filter. Absent when nothing was scanned.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changed
    • changedOutput schema / properties / cik / description
      Previous value: -"Central Index Key of the resolved company, zero-padded to 10 digits."New value: +"Resolved CIK, zero-padded to 10 digits."
    • changedOutput schema / properties / dataset / description
      Previous value: -"Canvas dataframe holding every scanned 8-K that passes the filter. Item codes ride as a comma-separated `item_codes` column, so item-frequency-over-time queries split it (`unnest(string_split(item_codes, ','))`). Absent when the result fits inline, canvas is unavailable, or materialization failed."New value: +"Dataframe of every scanned 8-K passing the filter; item_codes is comma-separated (unnest(string_split(item_codes, ','))). Absent when the result fits inline, canvas is unavailable, or staging failed."
    • 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 archive pages in range went unread — the 10-page cap ended the scan, or an undated call stopped once limit was filled, which is before any archive page when the recent window alone fills it — so older matching filings may exist beyond the dataframe. Pass filed_after / filed_before to reach them."New value: +"True when archive pages in range went unread (the 10-page cap, or an undated call that stopped once limit was filled, possibly before any archive page), so older matches may exist. Pass filed_after / filed_before to reach them."
    • changedOutput schema / properties / filings / items / properties / accession_number / description
      Previous value: -"Filing accession number, dash format. Pass to secedgar_get_filing for the document text."New value: +"Accession number, dash format, for secedgar_get_filing."
    • changedOutput schema / properties / filings / items / properties / items / description
      Previous value: -"Items this filing reports, decoded. Empty when EDGAR records no items for the filing, which happens on some older filings."New value: +"Items this filing reports, decoded. Empty when EDGAR records none (some older filings)."
    • changedOutput schema / properties / filings / items / properties / items / items / properties / label / description
      Previous value: -"Item title from Form 8-K. Absent for a code neither numbering regime defines, so the raw code is never given a guessed meaning."New value: +"Item title from Form 8-K. Absent for a code neither numbering regime defines."
    • changedOutput schema / properties / filings / items / properties / items / items / properties / regime / description
      Previous value: -"Which numbering the code belongs to: \"current\" for the dotted scheme in force since 2004-08-23, \"legacy\" for the single-integer scheme before it. Absent for an unrecognized code shape."New value: +"\"current\" (dotted, since 2004-08-23) or \"legacy\" (single integer, before). Absent for an unrecognized code."
    • changedOutput schema / properties / filings / items / properties / primary_document / description
      Previous value: -"Primary document filename — pass as `document` to secedgar_get_filing. Press releases are usually separate EX-99 exhibits, listed in that tool's document catalog. Absent on older filings, which EDGAR records without one; secedgar_get_filing still resolves them from the accession number alone."New value: +"Primary document filename for secedgar_get_filing; press releases are usually EX-99 exhibits. Absent on older filings, which resolve from the accession number alone."
    • changedOutput schema / properties / filings / items / properties / report_date / description
      Previous value: -"Date of the reported event (YYYY-MM-DD), which usually precedes the filing date. Absent when SEC records none."New value: +"Date of the reported event (YYYY-MM-DD), usually before filing_date. Absent when SEC records none."
    • changedOutput schema / properties / history_scanned_through / description
      Previous value: -"Oldest filing date reached by the scan (YYYY-MM-DD). Older filings were not examined: the recent window holds the last year or 1,000 filings of every form, whichever is more, and archive pages are read only for a date filter (every page overlapping it, up to 10) or to fill limit (stopping on the page that fills it). Absent when no filings were scanned."New value: +"Oldest filing date the scan reached (YYYY-MM-DD); nothing older was examined. The scan reads the recent window (last year or 1,000 filings), then up to 10 archive pages: those a date filter overlaps, or, undated, until limit filings pass the items filter. Absent when nothing was scanned."
    • changedOutput schema / properties / item_distribution / description
      Previous value: -"Count of the 8-K filings scanned in the date window carrying each item code, before the items filter. Empty when no 8-K filings were scanned."New value: +"Scanned 8-K filings per item code, before the items filter. Empty when none were scanned."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when nothing matched — distinguishes an empty date window from an items filter that excluded everything."New value: +"Why nothing matched (an empty date window, or an items filter that excluded everything), and, when fewer than limit matched while the page cap left pages unread, how far the scan reached and the window that goes further."
    • changedOutput schema / properties / total_8k_scanned / description
      Previous value: -"8-K filings inside the date window before the items filter — compare against total_matched to see how much the items filter removed."New value: +"8-K filings in the date window before the items filter; compare total_matched."
    • changedOutput schema / properties / total_matched / description
      Previous value: -"Filings matching every applied filter across the whole scan, which may exceed limit and the inline list."New value: +"Filings matching every filter across the scan; can exceed limit."
  2. Changed5 schema fields changed
    • changedInput schema / properties / filed_after / description
      Previous value: -"Only include filings filed on or after this date (YYYY-MM-DD). A date filter routes the scan into the older submissions archive pages, so it reaches 8-K filings that predate the ~1000-filing recent window."New value: +"Only include filings filed on or after this date (YYYY-MM-DD). A date filter routes the scan into the older submissions archive pages, so it reaches 8-K filings that predate the recent window (the last year or 1,000 filings of every form, whichever holds more)."
    • changedInput schema / properties / limit / description
      Previous value: -"Filings returned inline, newest first. The full filtered set is materialized as a dataframe when it exceeds this and a canvas is available. Default 20."New value: +"Filings returned inline, newest first. Every scanned filing that passes the filter is materialized as a dataframe when there are more than this and a canvas is available. Default 20."
    • changedOutput schema / properties / dataset / description
      Previous value: -"Canvas dataframe holding the full filtered 8-K set. Item codes ride as a comma-separated `item_codes` column, so item-frequency-over-time queries split it (`unnest(string_split(item_codes, ','))`). Absent when the result fits inline, canvas is unavailable, or materialization failed."New value: +"Canvas dataframe holding every scanned 8-K that passes the filter. Item codes ride as a comma-separated `item_codes` column, so item-frequency-over-time queries split it (`unnest(string_split(item_codes, ','))`). Absent when the result fits inline, canvas is unavailable, or materialization failed."
    • changedOutput schema / properties / dataset / properties / truncated / description
      Previous value: -"True when the archive scan hit its page cap before exhausting the history — older matching filings exist beyond the dataframe."New value: +"True when archive pages in range went unread — the 10-page cap ended the scan, or an undated call stopped once limit was filled, which is before any archive page when the recent window alone fills it — so older matching filings may exist beyond the dataframe. Pass filed_after / filed_before to reach them."
    • changedOutput schema / properties / history_scanned_through / description
      Previous value: -"Oldest filing date reached by the scan (YYYY-MM-DD). Older filings were not examined: the recent window caps at ~1000 filings, and archive pages are fetched only when a date filter or an under-filled result requires them. Absent when no filings were scanned."New value: +"Oldest filing date reached by the scan (YYYY-MM-DD). Older filings were not examined: the recent window holds the last year or 1,000 filings of every form, whichever is more, and archive pages are read only for a date filter (every page overlapping it, up to 10) or to fill limit (stopping on the page that fills it). Absent when no filings were scanned."
  3. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_match`: No company matches the query `multiple_matches`: The query is ambiguous and matches several companies Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_match`: No company matches the query. `multiple_matches`: The query is ambiguous and matches several companies. `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: -[
      -  "no_match",
      -  "multiple_matches"
      -]New value: +[
      +  "no_match",
      +  "multiple_matches",
      +  "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": [
      +      "cik",
      +      "company_name",
      +      "total_matched",
      +      "total_8k_scanned",
      +      "item_distribution",
      +      "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: `no_match`: No company matches the query `multiple_matches`: The query is ambiguous and matches several companies Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_match",
      +            "multiple_matches"
      +          ],
      +          "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: -[
      -  "cik",
      -  "company_name",
      -  "total_matched",
      -  "total_8k_scanned",
      -  "item_distribution",
      -  "filings"
      -]
  6. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover safety (readOnly, idempotent, openWorld), and the description adds non-obvious behavioral context the schema cannot carry: the 10-archive-page scan cap, that a date window reaches older filings while omitting one only scans as far as needed to fill limit, that every scanned passing filing is materialized as a dataframe, and that press releases usually ride as EX-99 exhibits rather than the primary document.

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?

Purpose and the sibling distinction are front-loaded, and the long span is dense with operational detail rather than filler. It loses a point because the numbering-regime and dataframe-materialization points are stated in both the description and the schema, creating redundancy.

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?

An output schema exists so return values need not be explained, yet the description still covers the dataframe side-effect, pagination/scan bounds, cross-regime filtering, and the exhibit caveat. Nothing an agent needs to call this correctly is missing.

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 coverage is already 100%, so the baseline is 3; the description goes further by explaining the two non-overlapping item vocabularies and advising to pair '2.02' with '12' when the window spans the 2004-08-23 changeover. It adds decode examples (1.01, 2.02, 4.02, 5.02) and the exact-lookup vs name-match distinction, though some of this duplicates the schema's own items text.

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 (Retrieve) and resource (8-K filings with item codes decoded) plus the optional filter. It explicitly differentiates itself from siblings by noting that secedgar_search_filings and secedgar_company_search 'can see' no item codes, which is exactly the distinguishing capability.

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

Usage Guidelines5/5

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

Names the alternatives and why this tool wins ('filtering by them is narrower than any form-level filter in secedgar_search_filings or secedgar_company_search'), and lays out the downstream workflow chain: secedgar_get_filing for documents, secedgar_dataframe_describe then secedgar_dataframe_query for the materialized df_<id>.

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.