secedgar-mcp-server
Server Details
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
- Status
- Healthy
- Uptime
- 100.0% over 73 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/secedgar-mcp-server
- GitHub Stars
- 11
- Server Listing
- @cyanheads/secedgar-mcp-server
TDQS
Scored across 16 tools
The tools partition SEC EDGAR workflows by resource and direction: company resolution, filing search/content, financial retrieval shapes, and ownership directions are explicitly separated. Financial tools distinguish one-company/one-concept history, latest snapshot, multi-company comparison, and one-concept/all-company frames, while ownership tools distinguish manager portfolio, issuer holders, beneficial owners, and fund holdings.
Almost all tools use the secedgar_ prefix followed by a clear verb_noun pattern such as get_financials, search_filings, and compare_companies. The two exceptions, secedgar_company_search and secedgar_dataframe_describe, reverse to noun_verb but remain readable and predictable.
Sixteen tools are justified by the broad SEC data domain, covering entity search, filing retrieval, financial data, ownership datasets, events, and dataframe analysis helpers. Each tool maps to a distinct workflow, and no obvious redundant or filler tools are present.
The surface covers entity resolution, filing search and content access, multiple XBRL financial views, insider and institutional ownership, beneficial ownership, fund holdings, material events, and dataframe analysis. General filing search and get_filing provide access to remaining SEC form types, so there are no major dead ends for the stated domain.
Available Tools
16 toolssecedgar_company_searchSecedgar Company SearchARead-onlyIdempotentInspect
Find companies and retrieve entity info with optional recent filings. Entry point for most EDGAR workflows — resolves tickers, names, or CIKs to entity details, with accession numbers in the result feeding secedgar_get_filing for document content. When a date or form filter carries the scan past the recent submissions window, the full filtered filing history is also staged as df_ — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.
| Name | Required | Description | Default |
|---|---|---|---|
| forms | No | Filter filings to specific form types (e.g., ["10-K", "10-Q", "8-K"]), matched exactly (case-insensitive) — list an amendment such as "10-K/A" to include it. Without this, returns all form types. | |
| query | Yes | Company ticker symbol (e.g., "AAPL", "VOO"), name (e.g., "Apple"), or CIK number (e.g., "320193"). Ticker is the fastest lookup and works for equities, ETFs, and mutual funds; a multi-class share ticker resolves in either form ("BRK-B" or "BRK.B"). Name search matches current and former names, preferring a name the query matches exactly over one it only starts or appears in. The corporate suffix (Inc, Corp, Co, Ltd, PLC, LLC, LP, N.V., S.A., AG, SE) can be left off ("Apple" finds "Apple Inc."; "Rio Tinto" lists both the Ltd and the PLC) or spelled out ("Beacon Financial Corporation" finds "Beacon Financial Corp"), but a suffix you include must match — Corp, Inc, Co, and Ltd stay distinct from each other, since separate registrants differ only by which one they use. | |
| filed_after | No | 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 filings that predate the recent window — the last year or 1,000 filings, whichever holds more (e.g. a company's 2005 10-K). | |
| filed_before | No | Only include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; together they bound the archive-page scan. | |
| filing_limit | No | Maximum number of filings to return in the inline list; when more match, the notice names where the rest are. Capped at 50: a larger value, up to 1000, returns what 50 returns. | |
| include_filings | No | Include recent filings in the response. Set to false for entity-info-only lookups. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The inline limit applied: `filing_limit`, at most 50. |
| cik | No | Central Index Key, zero-padded to 10 digits. |
| sic | No | SIC industry code. |
| name | No | SEC-conformed company name. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of filings returned inline. |
| notice | No | Guidance when no filings matched the forms filter, or when the inline list withheld some — naming the dataframe, a larger filing_limit, or a secedgar_search_filings call to page through the rest. |
| dataset | No | Dataframe of the full filtered history (recent window plus archive pages), staged only when the scan went past the recent window and the history exceeds the inline list (filing_limit, at most 50). |
| filings | No | Recent filings, filtered by forms if specified. |
| tickers | No | Associated ticker symbols. |
| class_id | No | SEC fund class ID (e.g. "C000092055"), present alongside series_id. |
| exchanges | No | Exchanges where listed. |
| series_id | No | SEC fund series ID (e.g. "S000002839"), when the query resolved via a fund ticker (ETF or mutual fund). |
| truncated | No | True when more filings matched than the inline list holds. |
| total_filings | No | Filings matching the filter across everything scanned; can exceed the inline list. |
| fiscal_year_end | No | Fiscal year end (MM-DD, e.g. "09-26"). Absent when SEC records none (e.g., private or pre-IPO entities). |
| sic_description | No | Human-readable SIC description. |
| state_of_incorporation | No | State of incorporation (US two-letter code, e.g. "DE"). Absent for many foreign filers and individuals. |
| history_scanned_through | No | Oldest filing date the scan reached (YYYY-MM-DD); nothing older was examined. Archive pages past the recent window (last year or 1,000 filings) are read only for a date filter or an under-filled form filter. Absent when nothing was scanned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world traits, so the description correctly spends its space elsewhere: the non-obvious behavior that a filtered scan stages the full filing history as a df_<id> artifact and where accession numbers flow next. This is genuine behavioral context an agent cannot infer from annotations or schema; only the 'recent window' boundary definition is delegated to the parameter docs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose before the workflow handoffs. Every clause earns its place: purpose, downstream consumption of accession numbers, and the conditional dataframe staging path.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six well-documented parameters, annotations covering safety, and an output schema handling return shape, the description supplies exactly what is missing: the entry-point positioning and the df_<id> side effect. It stops short of noting result limits or that entity-only lookups should set include_filings=false, which the schema covers but the narrative could reinforce.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions are already unusually detailed (query resolution rules, suffix matching, the 50-cap on filing_limit). The description adds little parameter-level meaning beyond naming that accession numbers appear in results and that date/form filters trigger archive scanning, both of which are echoed in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find companies and retrieve entity info with optional recent filings') and adds scope ('resolves tickers, names, or CIKs to entity details'). It also positions itself relative to siblings, naming secedgar_get_filing as the downstream consumer of accession numbers, so an agent can distinguish this lookup from search_filings or get_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as the 'Entry point for most EDGAR workflows' and explains the conditional handoff to secedgar_dataframe_describe/query when a date or form filter pushes the scan past the recent window. It does not name when to prefer secedgar_search_filings or secedgar_compare_companies instead, so the alternative routing is incomplete rather than absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_compare_companiesSecedgar Compare CompaniesARead-onlyIdempotentInspect
Compare 2-10 named companies across 1-8 XBRL concepts, aligned on fiscal years (annual) or calendar quarters (quarterly). This is the middle shape between secedgar_get_financials (one company, one concept, full history) and secedgar_fetch_frames (one concept, one period, every reporting company) — reach for it when the question names the companies. One companyfacts read per company, resolved through the same frame dedup and tag priority as secedgar_get_financials so the numbers agree. Balance-sheet and entity-info concepts are filed as point-in-time values: an annual matrix takes each company’s fiscal-year-end snapshot and places it in the period of the fiscal year it closes, beside that year’s income-statement lines (interim and cover-date snapshots stay out), and a quarterly matrix aligns each snapshot on the calendar quarter it falls in. The inline matrix covers the most recent periods up to periods, trimmed further when companies x concepts x periods is too large to return in one response; the full aligned series is materialized as df_ for growth rates and spreads — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query. A company that fails to resolve is reported in failed_companies and the comparison proceeds with the rest, and a company that does not report a concept is reported in gaps with the tags that were tried — never interpolated or zero-filled. A company that reports a concept only for periods older than the inline window is named in caveats with its newest period. A concept that is neither a friendly name nor an XBRL tag is reported once in unknown_concepts with the closest supported names, and fails the call only when every concept is one. Off-calendar filers and unit mismatches are surfaced in caveats rather than silently mixed.
| Name | Required | Description | Default |
|---|---|---|---|
| periods | No | Upper bound on how many recent periods the inline matrix covers, newest first — not a guarantee. The matrix is companies x concepts x periods cells, and the inline window drops further older periods when that product is too large to return in one response. The full aligned series is always registered to the dataframe, so dropped periods stay queryable via secedgar_dataframe_query. Capped at 12: a larger value, up to 1000, returns what 12 returns. | |
| concepts | Yes | Concepts to compare — friendly names like "revenue" or "net_income" (discover them with secedgar_search_concepts) or raw XBRL tags. | |
| taxonomy | No | XBRL taxonomy to resolve concepts under. Use ifrs-full only when every company in the list reports under IFRS; mixing IFRS and US GAAP filers in one call resolves them all under the same taxonomy. | us-gaap |
| companies | Yes | Companies to compare, as ticker symbols (preferred) or CIK numbers. A company that does not resolve is reported in failed_companies and the rest of the comparison still runs. | |
| period_type | No | Align on fiscal years, each under the calendar-year key SEC frames it as (annual), or on calendar quarters (quarterly). Quarterly comparisons of off-calendar filers are missing at least one calendar quarter per year — see caveats. | annual |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The periods cap applied. |
| gaps | No | Company-concept pairs with no value in any period (never zero-filled). A pair with values only before the inline window appears in caveats instead. |
| cells | No | Inline matrix values, covering the periods listed in periods[]. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of periods shown inline. |
| notice | No | Guidance when the inline matrix dropped periods, or the full series is staged as a dataframe. |
| caveats | No | Comparability warnings (company ones prefixed with the name), else empty: missing quarters; a concept 2+ years behind the company's other lines; an instant with no fiscal-year-end value (annual); differing period ends or units; values only before the inline window; merged inputs. |
| dataset | No | Dataframe of the full aligned series, every period, with cells[] columns. Absent when canvas is unavailable. |
| periods | No | Period keys in the inline matrix, newest first; shorter than requested when the cell count shrank it (see notice). |
| concepts | No | Concepts covered, in input order; inputs naming the same concept appear once, under the first spelling. |
| taxonomy | No | Taxonomy the concepts were resolved under, echoed from input. |
| companies | No | Companies included in the comparison. |
| truncated | No | True when the aligned series has more periods than the inline matrix shows. |
| period_type | No | Period alignment used, echoed from input. |
| failed_companies | No | Companies excluded from the matrix; the rest still compare. |
| unknown_concepts | No | Concepts that are neither a supported name nor an XBRL tag, reported once instead of as per-company gaps; secedgar_search_concepts lists supported names. Empty when all resolved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already mark it readOnly and idempotent, the description adds substantial behavioral detail beyond them: one companyfacts read per company, shared dedup/tag-priority resolution, point-in-time handling for balance-sheet concepts, inline trimming, materialization of df_<id>, and explicit failure/gap/unknown/caveat reporting. It also states that missing data is never interpolated or zero-filled, which is important for trust.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose and sibling positioning, then proceeds through alignment details and failure modes. Some sentences repeat schema-level constraints, such as the inline periods limit, but most content earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-company comparison tool with an output schema and annotations, the description covers the workflow, alignment rules, dataframe fallback, failure modes, gaps, unknown concepts, and caveats. An agent has enough context to call it correctly and interpret the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters in detail. The description still adds meaning about the comparison-level semantics of periods, companies, concepts, taxonomy, and period_type, especially alignment behavior and failure handling that goes beyond field-level schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: comparing 2-10 named companies across 1-8 XBRL concepts aligned on fiscal years or calendar quarters. It explicitly positions the tool between secedgar_get_financials and secedgar_fetch_frames, so an agent can distinguish its purpose without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: 'reach for it when the question names the companies' and names the two sibling alternatives by shape. It also explains when to use ifrs-full and how off-calendar quarterly comparisons behave.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_dataframe_describeSecedgar Dataframe DescribeARead-onlyIdempotentInspect
List the dataframes (df_XXXXX_XXXXX) registered by the data-returning secedgar_* tools — any tool whose response carries a dataset handle stages its full result set here. Each entry surfaces source tool, query parameters, creation/expiry timestamps, row count, column schema, and whether the dataframe is truncated relative to the upstream source. Read the column schema here before writing SQL for secedgar_dataframe_query.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional table name (df_XXXXX_XXXXX) to describe a single dataframe. Omit to list all dataframes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| dataframes | No | Active dataframes for this tenant, newest first. Empty when none are registered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world behavior, and the description adds meaningful context: results are staged from data-returning tools, each entry includes source tool, query parameters, timestamps, row count, schema, and truncation status. It does not cover auth or rate limits, but it goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, then the entry structure, then the sibling routing. Every sentence carries useful information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single optional parameter, full schema coverage, existing annotations, and an output schema, the description provides enough context to call the tool correctly. It explains what is listed and why an agent should consult it before querying.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter is fully documented in the schema. The description mentions the dataframe naming pattern and listing behavior, but does not add substantial meaning beyond the schema's explanation of omitting `name` to list all dataframes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'List the dataframes (df_XXXXX_XXXXX) registered by the data-returning secedgar_* tools.' It also clarifies the registration mechanism via `dataset` handles, so an agent can distinguish this discovery tool from the SQL querying sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to this tool before writing SQL for `secedgar_dataframe_query`, which is useful sibling guidance. It does not state when not to use it or mention other alternatives, but the core usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_dataframe_querySecedgar Dataframe QueryARead-onlyIdempotentInspect
Run a single-statement SELECT against the canvas dataframes registered by the data-returning secedgar_* tools — any tool whose response carries a dataset handle. Inspect a dataframe with secedgar_dataframe_describe first; its column schema is what the SQL has to match. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected. System catalogs (information_schema, pg_catalog, sqlite_master, duckdb_*) are denied — list dataframes via secedgar_dataframe_describe. Optional register_as chains the result as a new dataframe with a fresh TTL.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | Single-statement SELECT against df_<id> tables on the shared canvas. Standard DuckDB SQL — joins, aggregates, window functions, CTEs all supported. Reference dataframes by the names returned in fetch/search responses or listed by secedgar_dataframe_describe. BIGINT columns (e.g., XBRL `value`, COUNT/SUM results) serialize as JSON strings to preserve precision past 2^53 — CAST(col AS DOUBLE) in projections for inline arithmetic. | |
| preview | No | Rows to include in the immediate response. Defaults to the row limit. Set lower (e.g., 50) when chaining via register_as and only a sample is needed inline. Capped at 10000: a larger value, up to 100000, returns what 10000 returns. | |
| row_limit | No | Hard cap on rows materialized in the response. Default 1000. A query matching more rows than this stops at the cap and `row_count_capped` comes back true; the full result lives on-canvas under register_as when provided, so do not raise this to keep large results. One case is not detectable: a SQL LIMIT exactly equal to this cap reads identically to a result that genuinely holds that many rows, and is reported as exact. Capped at 10000: a larger value, up to 100000, returns what 10000 returns. | |
| register_as | No | When set, persist the result as a new dataframe under this name (must match df_XXXXX_XXXXX shape, or pass a fresh df_<id> generated by the agent). Fresh TTL window — not inherited from the parents in the SELECT. Use to chain analyses without re-running the source SQL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The row cap that actually bound — `preview` when it is lower than `row_limit`, otherwise `row_limit`. |
| rows | No | Materialized rows, bounded by `preview` / `row_limit`. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of rows returned inline. |
| notice | No | Guidance when the query returned no rows, or when the row cap withheld some. |
| columns | No | Column names in projection order. |
| row_count | No | Rows the query produced, up to `row_limit`; exceeds `rows.length` when `preview` returned fewer. When `row_count_capped` is true this is the cap, not the full size. |
| truncated | No | True when the result set held more rows than the row cap allowed through. |
| expires_at | No | ISO 8601 expiry timestamp for the newly registered dataframe, when applicable. |
| registered_as | No | Set when `register_as` was supplied and the new dataframe was materialized. |
| row_count_capped | No | True when more rows matched than `row_limit`, so `row_count` is the cap; false means `row_count` is exact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses concrete SQL restrictions: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected, and system catalogs are denied. It also explains that register_as creates a new dataframe with a fresh TTL, which is important side-effect context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying actionable information: purpose, prerequisite, rejected operations, catalog restriction, and chaining option. The critical constraint and prerequisite are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, rich annotations, and full input schema coverage; the description still adds the necessary guardrails around SQL restrictions, schema inspection, and result registration. Nothing material for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the detailed parameter behavior is already supplied by the input schema. The description reinforces register_as chaining and the fresh TTL, but does not add substantial semantics for preview or row_limit beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: running a single-statement SELECT against canvas dataframes registered by secedgar_* tools with a `dataset` handle. It also distinguishes the tool from secedgar_dataframe_describe by assigning describe the schema-inspection role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to inspect a dataframe with secedgar_dataframe_describe first so the SQL matches the column schema. It also states what is rejected, that system catalogs must be avoided, and when to use register_as for chaining results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_fetch_framesSecedgar Fetch FramesARead-onlyIdempotentInspect
Fetch SEC XBRL frames for one concept × one period across all reporting companies. Inline response returns a page of the ranked companies — start at the top or pass offset/next_offset to walk further down the ranking; the full frames response (all reporters) is materialized as df_ when a canvas is available — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query. Accepts friendly names like "revenue" or "assets" (discover via secedgar_search_concepts) or raw XBRL tags. One call hits one XBRL tag — when a friendly name maps to multiple same-meaning tags, the response's unqueried_tags lists the others; call again per tag and UNION/COALESCE in SQL with an analysis-specific priority (e.g. SalesRevenueGoodsNet is goods-only). The response's related_tags separately flags alternate-DEFINITION tags a meaningful share of filers use as their primary line (e.g. cash incl. restricted cash, equity incl. noncontrolling interest) — a whole-universe screen on the base tag silently omits those filers; query them separately, but do not blindly union (the semantics differ). Response includes value_distribution and period_end_range to flag XBRL scale-factor anomalies and fiscal-year mixing. SEC publishes frames for us-gaap and dei tags only, and taxonomy picks which of the two a raw tag is read from (dei for cover-page tags such as EntityCommonStockSharesOutstanding); a friendly name keeps its own mapped taxonomy. There are no ifrs-full frames, so IFRS (20-F) filers are absent from every frame; read them per company with secedgar_get_financials or secedgar_compare_companies under taxonomy ifrs-full.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort direction. "desc" for highest values first (typical for revenue, assets). "asc" for lowest values. | desc |
| unit | No | Unit of measure. Use "USD-per-shares" (or equivalently "USD/shares") for EPS, "shares" for share counts, "pure" for ratios. Ignored when concept resolves to a friendly name with a known unit. | USD |
| limit | No | Number of companies to return. Capped at 100: a larger value, up to 1000, returns what 100 returns. | |
| offset | No | Rank to start the page at, 0-based, over the sorted frame. Pass the next_offset from the previous response to read the next page — the ranked list is fetched whole and sliced, so paging is stable and gap-free. An offset at or past total_companies returns an empty page. | |
| period | Yes | Calendar period. Use duration periods (no I suffix) for income/cash-flow items: "CY2023" (full year), "CY2024Q2" (single quarter). Use instant periods (I suffix) for balance-sheet items: "CY2023Q4I" (snapshot at Q4 close). | |
| concept | Yes | Financial concept — same friendly names as secedgar_get_financials (e.g., "revenue", "assets", "eps_basic") or raw XBRL tag. | |
| taxonomy | No | Frames namespace a raw XBRL tag is read from: us-gaap for financial-statement tags, dei for cover-page entity tags such as EntityCommonStockSharesOutstanding. SEC publishes frames for no other taxonomy. A friendly name keeps its own mapped taxonomy (shares_outstanding reads dei) unless dei is passed, which reads its tags from dei instead — the same rule as secedgar_get_financials. | us-gaap |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| data | No | Ranked companies for this metric. |
| unit | No | Unit of measure, in dashed form (e.g., "USD-per-shares"). |
| error | No | Present when the call failed. Absent on success. |
| label | No | Human-readable concept label. |
| shown | No | Number of companies shown inline. |
| notice | No | Guidance when the requested offset lands past the end of the ranked list. |
| offset | No | Rank the returned page starts at, 0-based. |
| period | No | Calendar period the data was fetched for, echoed from input. |
| caveats | No | Completeness warnings, else empty: quarterly frames (CY####Q#) omit fiscal-Q4 filers; annual NetIncomeLoss rows may be proxy pay-versus-performance figures; an annual frame still open or in its 10-K window may hold 10-Q trailing-twelve-month figures; top rows may be split or scale artifacts. |
| concept | No | XBRL tag the data was actually fetched against (after resolving any friendly name). |
| dataset | No | Dataframe of the full frame, every reporter. Absent when canvas is unavailable or staging failed. |
| taxonomy | No | Frames namespace the tag was read from (us-gaap or dei); a friendly name mapped to dei reads dei. |
| truncated | No | True when the inline data[] was capped by limit. |
| next_offset | No | Offset for the next page down the ranking. Absent on the last page. |
| related_tags | No | Alternate-definition tags many filers use as their primary line (e.g., cash including restricted cash); those filers are absent from data. Fetch each separately; never blindly UNION, since definitions differ. Empty when none is known. |
| unqueried_tags | No | Same-meaning mapped tags this call did not query (e.g., SalesRevenueNet for revenue); their filers are absent from data, so fetch each and UNION/COALESCE in SQL. Empty for raw tags and single-tag concepts. |
| total_companies | No | Total companies reporting this metric for this period. |
| period_end_range | No | Range of period_end dates; filers report on their own fiscal years, so "CY2023" can span 2023-01-31 to 2024-12-31, mixing fiscal periods. |
| value_distribution | No | Distribution across the full frame; max_to_p95_ratio is the outlier signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say read-only/open-world/idempotent; the description adds substantial behavior: the full ranked list is materialized as df_<id> for dataframe_describe/query, one call hits exactly one tag, `unqueried_tags` and `related_tags` expose coverage gaps, and value_distribution/period_end_range flag scale-factor anomalies and fiscal-year mixing. It also discloses a real limitation (no ifrs-full frames, so IFRS filers are silently absent) — the kind of failure mode an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the remainder is a single dense paragraph packing paging, dataframe materialization, tag-expansion semantics, anomaly flags, and taxonomy limits into one block with no structure. Most content earns its place, but the absence of breaks/repetition (taxonomy rules restated) hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and read-only annotations already covering safety, the description still supplies the operational context an agent needs: paging stability, dataframe handoff to siblings, concept-expansion workflow, and taxonomy/IFRS boundaries. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds genuine meaning beyond it — friendly names vs raw tags, taxonomy remapping for raw tags vs friendly names keeping their mapped namespace, and the fact that unit is ignored for known friendly names. The offset/next_offset explanation largely restates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb, resource, and scope: 'Fetch SEC XBRL frames for one concept × one period across all reporting companies.' The cross-sectional framing ('across all reporting companies') cleanly separates it from per-company siblings like secedgar_get_financials and secedgar_compare_companies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it (cross-company ranking by concept/period), how to page ('start at the top or pass offset/next_offset'), how to discover concepts (secedgar_search_concepts), and explicitly routes IFRS/20-F filers to secedgar_get_financials or secedgar_compare_companies under ifrs-full. It also gives when-not guidance for related_tags ('query them separately, but do not blindly union').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_find_holdersFind HoldersARead-onlyIdempotentInspect
Find which institutional managers reported holding an issuer, by searching 13F-HR information tables for one reporting quarter. This is the reverse direction of secedgar_get_institutional_holdings: that tool takes a manager and returns its portfolio, this one takes an issuer and returns its managers — pass a returned filer_cik plus the same quarter to read the actual position. Searching by cusip is the precise path, matching the identifier the information table itself carries; without it the issuer name is matched as a phrase against the filing text, which both over-matches (unrelated issuers sharing a word) and under-matches (managers writing the name differently), so prefer cusip whenever one is known. A CUSIP cannot be derived from a ticker here — read one off any 13F information table returned by secedgar_get_institutional_holdings. The returned list is unranked: the search index scores by text relevance, which carries no signal about position size, and no ordering by shares or market value is available without opening each filing. Managers holding under $100M in 13(f) securities are exempt from filing at all. When more managers match than fit inline, the full fetched set is staged as df_ — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.
| Name | Required | Description | Default |
|---|---|---|---|
| cusip | No | The issuer's 9-character CUSIP (e.g. "037833100" for Apple common stock; foreign issuers use a CINS starting with a letter, e.g. "H1467J104"). The precise match key — information tables identify every position by CUSIP, so this avoids the name-phrase misses. Each share class has its own CUSIP, so a multi-class issuer needs one call per class. Read a CUSIP off the holdings returned by secedgar_get_institutional_holdings. | |
| limit | No | Filer rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20. Capped at 100: a larger value, up to 1000, returns what 100 returns. | |
| issuer | Yes | The portfolio company whose holders you want — a ticker ("AAPL"), a 10-digit CIK ("0000320193"), or a company name. Without cusip, this resolves to the company's EDGAR-conformed name and that name is phrase-matched against 13F information tables, so it must identify one company. With cusip supplied, it is used only to label the result. | |
| quarter | No | Reporting quarter to search, "YYYY-QN" (e.g. "2026-Q1"). Omit for the newest quarter whose 45-day filing deadline has passed — the applied quarter and its filing window are echoed in the response. A quarter still inside its deadline returns only the managers that filed early, so its set is incomplete until the deadline passes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of filers shown inline. |
| issuer | No | The issuer input, echoed. |
| notice | No | Continuation, search coverage, empty results, and dataframe guidance. |
| dataset | No | Fetched managers keyed by issuer and quarter for joins. Absent if inline fits, canvas is unavailable or staging fails. |
| fetched | No | Filings retrieved, at most 500; equals total_filings when the window fit. |
| holders | No | One page of filers, capped at limit; order says nothing about position size. |
| quarter | No | Reporting quarter searched, "YYYY-QN": the requested one or the default. |
| filed_to | No | End of the filing window searched (YYYY-MM-DD). |
| ordering | No | How the holder list is ordered, and what that ordering does not mean. |
| truncated | No | True when the inline holders list was capped. |
| filed_from | No | Start of the filing window searched (YYYY-MM-DD). |
| search_key | No | The exact term searched — the CUSIP, or the quoted phrase. |
| search_mode | No | "cusip" matches the information table's identifier; "name" phrase-matches filing text, looser both ways. |
| total_filings | No | Matching documents in the filing window, including amendments; holders_in_quarter deduplicates managers and filters period. |
| total_is_exact | No | False when total_filings is a lower bound (the index capped the count). |
| holders_in_quarter | No | Distinct in-quarter managers in the fetched sample and dataframe; latest filing per CIK wins, other periods excluded. |
| resolved_issuer_cik | No | CIK of the resolved issuer, zero-padded to 10 digits. Absent when cusip was supplied. |
| resolved_issuer_name | No | EDGAR-conformed name the issuer resolved to, also the phrase searched. Absent when cusip was supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: results are unranked, relevance scores carry no position-size signal, managers under $100M are exempt from filing, and large result sets are staged as df_<id> for dataframe inspection. It also explains that quarter selection inside the filing deadline yields an incomplete manager set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded and dense with useful distinctions: purpose first, then sibling direction, then cusip preference, then completeness and staging caveats. Every sentence adds operational value, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema, and full schema description coverage, the description is complete enough for correct invocation. It covers selection guidance, parameter tradeoffs, known limitations, incomplete-quarter behavior, and how to inspect oversized results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents cusip, issuer, quarter, and limit in detail. The description reinforces the cusip-versus-name tradeoff and cross-parameter behavior, but much of that information is already present in the schema, so it adds only modest meaning beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: find institutional managers reporting holdings in an issuer by searching 13F-HR information tables for one quarter. It explicitly distinguishes this reverse lookup from secedgar_get_institutional_holdings, so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance by naming the sibling tool, explaining the reverse direction, and instructing the agent to pass a returned filer_cik plus the same quarter to read the actual position. It also states a strong preference for cusip over name matching and explains the over-matching/under-matching failure modes of name search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_beneficial_ownersGet Beneficial OwnersARead-onlyIdempotentInspect
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 dataframes on issuer CIK and the 13F and NPORT-P dataframes on CUSIP — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of successfully parsed filings naming the requested issuer to return, newest first. Other-issuer schedules and failed documents do not consume this limit; at most 50 documents are examined. Default 10. Capped at 20: a larger value, up to 1000, returns what 20 returns. | |
| issuer | Yes | The 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_kind | No | Which 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_amendments | No | Whether 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
| Name | Required | Description |
|---|---|---|
| cap | No | Result limit or document ceiling that stopped scanning. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of filings returned. |
| issuer | No | The issuer input, echoed. |
| notice | No | Exclusions, document recovery, scan bounds, and dataframe guidance. |
| dataset | No | Dataframe with one row per reporting person across parsed filings; joins insider dataframes on issuer_cik, and 13F and NPORT-P dataframes on cusip. Absent when canvas is unavailable or nothing parsed. |
| filings | No | Blockholder filings, newest first, capped at limit. |
| partial | No | True when filings_failed is nonempty, independently of truncation. |
| form_kind | No | The schedule filter applied — the requested value, or the default "all". |
| truncated | No | True when schedules remain unexamined after the result limit or 50-document ceiling. |
| issuer_cik | No | CIK of the resolved issuer, zero-padded to 10 digits. |
| issuer_name | No | EDGAR-conformed name of the resolved issuer. |
| filings_failed | No | Failures in scan order; successes retained. |
| filings_parsed | No | Matching parsed filings, capped by limit. |
| filings_examined | No | Matches + exclusions + failures; at most 50 documents. |
| filings_not_examined | No | Indexed schedules beyond the result limit or 50-document ceiling. |
| structured_coverage_from | No | First date SEC required this XML format (YYYY-MM-DD); earlier blockholder filings cannot be parsed here. |
| total_structured_filings | No | Indexed 13D/13G schedules matching form/amendment filters in the recent submissions window. |
| filings_excluded_other_issuer | No | Schedules naming another issuer; no rows returned. |
| legacy_filings_before_coverage | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld/idempotent annotations: it discloses the per-person reporting structure and the double-counting trap, the 2024-12-18 coverage boundary with pre-format stakes counted but unparsed, and the downstream dataframe materialization. That is exactly the kind of behavioral context the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the sibling contrast, and nearly every sentence carries operational information. It runs long as a single dense block, and the double-counting and canvas-paragraph material could be tightened, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter coverage, and annotations present, the description fills the remaining gaps: coverage start date, unparsed legacy filings, limit behavior caveat, and how to inspect the resulting dataframe (secedgar_dataframe_describe, then secedgar_dataframe_query). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by warning that 'issuer' is the subject company rather than the manager and that passing an investment manager returns near-empty results. The 13D/13G substantive difference and amendments-tracking rationale reinforce the enum semantics beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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, parsed from SCHEDULE 13D and 13G filings') and explicitly contrasts the input direction with secedgar_get_institutional_holdings. An agent can distinguish it from that sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('The input is the ISSUER — the company being held — which is the opposite direction from secedgar_get_institutional_holdings') and explains the alternative's condition. It also spells out the 13D vs 13G distinction and why amendments are included by default, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_filingSecedgar Get FilingARead-onlyIdempotentInspect
Fetch a specific filing's metadata and document content by accession number. Returns the primary document as readable text. Use offset/next_offset for multi-page access to large filings (10-K, S-1 can exceed 1M chars): pass the next_offset from a truncated response as offset, without section, to read the next page. Use section to jump directly to a heading (e.g. 'risk factors', 'item 7') without needing an offset.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | Company CIK, digits only (resolve via secedgar_company_search if you have a ticker or name). Optional but recommended — speeds up archive lookup. If omitted, likely filing CIKs are inferred from SEC search metadata and archive paths. | |
| offset | No | Character offset into the extracted document text. Pass next_offset from a truncated response to continue reading the next page, and leave section out: section takes precedence over offset. Default 0 reads from the beginning. | |
| section | No | Jump to a named section, matched against every detected heading and the document's own lines (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'). The first match wins, in this order: a heading equal to the value, or whose title after its Item/Part marker equals it; the first Item or Part heading containing it; a document line equal to it — a subheading the outline omits ('Liquidity and Capital Resources') — unless the line labels a table row; the first other heading containing it; a table-row label equal to it, else a document line starting with it. In a proxy statement (DEF 14A and its variants), whose ITEM headings are ballot proposals, the first heading of any kind containing the value comes before both document-line steps. Within each heading step a body heading wins over a table-of-contents row, which lands only when nothing else at that step matches. A line landing says so in the notice; table-of-contents rows and wrapped cross-references are never line landings. A leading 20-F sub-item label on a heading or line ('3D.', 'B.') is ignored, so 'risk factors' reaches '3D. RISK FACTORS'; the value itself is matched as given. A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16, and 'part i' never reaches Part II. Every step ignores case, whitespace, and quote style, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones; the steps comparing a whole heading or line (equal to, starting with) also ignore the punctuation between an Item or Part marker and its title, so 'Item 1A Risk Factors' reaches 'Item 1A. – Risk Factors'. Takes precedence over offset when both are provided, so leave it out when paging on with next_offset. On a miss, the error message includes the detected outline so you can pick the correct heading. | |
| document | No | Specific document filename within the filing (e.g., "ex-21.htm" for subsidiaries list). Default: the primary document. Available documents are listed in the response metadata under documents; entries marked binary hold no text and are rejected. | |
| include_xbrl | No | Include XBRL viewer artifacts and machine-readable taxonomy files (R*.htm fragments, *_cal/_def/_lab/_pre.xml linkbases, *_htm.xml inline instance, *.xsd schemas, MetaLinks.json, FilingSummary.xml, Show.js, report.css, *-xbrl.zip, Financial_Report.xlsx, EX-101.* technical exhibits) under documents.xbrl. Off by default — these dominate filing indexes (~100 entries on a typical 10-K) and are rarely relevant when reading filing content. | |
| content_limit | No | Maximum characters of document text to return per page. 10-K filings can exceed 500,000 characters; S-1/A can exceed 1,000,000. Default 50,000 captures ~12,000 words (typically business overview, risk factors, and MD&A). Increase to 200,000 for full financial statements, or decrease for quick summaries. Use offset or section for subsequent pages. Capped at 200000: a larger value, up to 1000000, returns what 200000 returns. | |
| accession_number | Yes | Filing accession number in either format: "0000320193-23-000106" (dashes) or "000032019323000106" (no dashes). Obtained from secedgar_company_search or secedgar_search_filings results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The `content_limit` that was applied. |
| cik | No | Filing entity CIK, zero-padded to 10 digits. |
| form | No | Form type (e.g., "10-K"), from the submissions feed or the filing's SEC header. Absent only when neither has it. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Characters of document text returned on this page. |
| notice | No | How to read the next page, which file was read when the archive does not serve the indexed primary, when section landed on a document line rather than a detected heading, and how many headings were detected when the outline lists fewer. |
| content | No | Document text content for this page window. |
| outline | No | Up to 50 detected headings, on the first page of a truncated response (offset=0, no section). Past 50, Item and Part headings come first (bare TOC copies of titled ones dropped), then the earliest others; the notice gives the detected count. Pass a heading offset as offset, or its text as section. |
| documents | No | Filing documents by category. Any name is a valid document input except entries with binary: true, which fail with binary_document; scans can outnumber readable documents. |
| truncated | No | True when the document is longer than `content_limit` allowed through. |
| filing_url | No | Direct URL to the filing on SEC.gov. |
| filing_date | No | Date the filing was submitted (YYYY-MM-DD). Absent under the same conditions as form. |
| next_offset | No | Offset of the next page, to pass as offset without section; present while content_truncated is true. |
| company_name | No | Filing entity name. Absent if the CIK did not resolve to a known entity. |
| period_ending | No | Period of report (YYYY-MM-DD), from the same source as form. Absent for forms without one (S-8, Form 4, proxy statements) or when neither source has it. |
| accession_number | No | Filing accession number, normalized to dash format. |
| primary_document | No | Filename of the primary document. When the archive does not serve the one the index names (common in 2000–2001), this is the full submission file <accession>.txt instead; the notice names both. |
| content_truncated | No | True if content was truncated at content_limit. |
| requested_document | No | Filename requested via document. Present only when it differs from primary_document. |
| content_total_length | No | Full document length in characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, so safety is covered. The description adds genuine behavior: returns primary document as readable text, truncation with next_offset signaling, and section takes precedence over offset. It doesn't mention error behavior beyond one hint in the schema, but it adds real context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then the paging recipe and the section shortcut. No waste and no repetition of schema detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and the description covers the main interaction risk (paging and section precedence). Mildly incomplete in not mentioning the optional cik or document selection, though the schema handles those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself is extremely detailed (especially section and content_limit), so the baseline is 3. The description adds only cross-parameter precedence (section over offset) and the paging recipe, which the schema also states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Fetch a specific filing's metadata and document content by accession number' — and clarifies it returns readable text. This clearly separates it from secedgar_search_filings (discovery) and secedgar_get_financials (structured data).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent how to handle large filings: use offset/next_offset for paging without section, and use section to jump to a heading without an offset. It stops short of naming sibling tools or stating prerequisites (e.g. get the accession number from search first), but the operational guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_financialsSecedgar Get FinancialsARead-onlyIdempotentInspect
Get historical XBRL financial data for a company. Accepts friendly concept names (e.g., "revenue", "net_income", "assets") or raw XBRL tags. Discover available friendly names with secedgar_search_concepts. Handles historical tag changes and deduplicates data automatically. The full series is also staged as df_ when a canvas is available — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.
| Name | Required | Description | Default |
|---|---|---|---|
| unit | No | SEC unit key to read the series in, for a concept reported in more than one (e.g. "ZAR" and a "USD" convenience translation, or "USD/EUR" among exchange-rate pairs). "USD-per-shares" is read as "USD/shares". When omitted, the series takes the unit of its newest value, then the unit with more periods; any other units are named in caveats. | |
| limit | No | Cap the inline data[] to the most-recent N periods (the series is newest-first). The full series is always registered to the dataframe, so older periods stay queryable via secedgar_dataframe_query. Omit to return every period inline. | |
| company | Yes | Ticker symbol (e.g., "AAPL") or CIK number. Ticker is preferred. | |
| concept | Yes | Financial concept — friendly name (e.g., "revenue", "net_income", "assets", "eps_diluted") or raw XBRL tag (e.g., "AccountsPayableCurrent"). Friendly names auto-resolve to the correct XBRL tags and handle historical tag changes. | |
| taxonomy | No | XBRL taxonomy. us-gaap for US companies, ifrs-full for foreign filers, dei for entity info (shares outstanding). | us-gaap |
| period_type | No | Filter to annual (FY) or quarterly (Q1-Q4) data. "all" returns both. For an instant (balance-sheet) concept, "annual" returns the values dated on the filer's fiscal-year ends. When omitted, defaults to "annual", except that an instant concept returns its full series. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| cik | No | Resolved CIK, zero-padded to 10 digits. |
| data | No | Deduplicated series, newest first, one value per calendar period. A proxy-framed period takes the filer's own report; an annual frame held by a 10-Q trailing-twelve-month figure is left out. An instant's annual values are its fiscal-year-end values (CY2025Q2I for a June year end). |
| unit | No | Unit of every value in data (e.g., "USD", "USD/shares"): the unit input when given (an unreported one fails with no_unit_data), else the newest value's unit, then the unit with more periods. A series never mixes units. |
| error | No | Present when the call failed. Absent on success. |
| label | No | Human-readable taxonomy label of the concept tag. |
| shown | No | Number of periods shown inline. |
| notice | No | Guidance when the inline series was capped, or when the full series is staged as a dataframe. |
| caveats | No | Completeness warnings, absent when none apply: other units the concept is reported in, with period counts and spans (pass unit to read one); quarters missing from every recent year (SEC reports fiscal Q4 only within the 10-K); a series ending well short of today (a retired or dropped tag). |
| company | No | Resolved entity name (SEC-conformed). |
| concept | No | XBRL tag behind the newest value; each row names its own tag. |
| dataset | No | Dataframe of the same series; fiscal keys are source_filing_fy/source_filing_fp, so order by period_end. Absent when canvas is unavailable. |
| truncated | No | True when the inline data[] was capped by limit. |
| tags_tried | No | XBRL tags attempted, when a friendly name maps to several. |
| description | No | XBRL taxonomy description of the tag. Often absent for extension tags and older concepts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses real behavior: historical tag changes are resolved automatically, data is deduplicated, alternate units surface as caveats, and the full series is staged as df_<id> only when a canvas is available. These are non-obvious traits an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no filler, and purpose plus the discovery alternative are front-loaded before the dataframe staging note. Each sentence contributes routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and rich annotations are present, and the description still supplies the workflow context, deduplication/tag-change behavior, and dataframe handoff an agent needs. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3; the description adds value by explaining that friendly concept names auto-resolve to correct XBRL tags and absorb historical tag changes, which clarifies the concept parameter's semantics rather than just restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Get historical XBRL financial data for a company" is a specific verb+resource+scope that an agent can distinguish from get_snapshot (current-state) or compare_companies without opening any schema. It also names its discovery and analysis siblings, making its place in the toolchain clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description routes the agent explicitly: discover friendly concept names with secedgar_search_concepts, and analyze the staged series with secedgar_dataframe_describe then secedgar_dataframe_query. It lacks any when-not-to-use guidance (e.g., use get_snapshot for a single current value), so it stops short of a top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_fund_holdingsGet Fund HoldingsARead-onlyIdempotentInspect
List what an ETF or mutual fund holds, parsed from the NPORT-P portfolio report it files with the SEC every quarter. The input is the fund — a ticker like VOO, a fund series ID, or the registrant trust — which is the opposite direction from the ownership tools: secedgar_get_institutional_holdings and secedgar_find_holders answer who owns a company, this answers what a fund owns. Each position carries the security name, CUSIP/ISIN/LEI where the filer reports them, share balance, market value in USD, and percent of the fund's net assets, alongside fund-level net assets and total assets. Positions are returned largest-first by percent of net assets, one page of limit rows starting at offset; the full report registers as df_ when a canvas is available — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query, which is how a fund running to thousands of positions is aggregated or joined against the 13F and insider dataframes. An NPORT-P covers exactly one fund series and a registrant trust files one report per series, so a trust with several funds needs the specific fund named — pass its ticker or series_id. Reports publish roughly two months after the period they cover, so every result is dated: the holdings are the portfolio as of report_period_date, not as of today.
| Name | Required | Description | Default |
|---|---|---|---|
| fund | Yes | The fund whose portfolio you want — a fund ticker ("VOO", "SCHD"), an SEC fund series ID ("S000002839"), or a 10-digit CIK. A ticker names one share class of one series and routes directly; a CIK names the registrant, which files a separate report per series and needs series_id when it runs more than one fund. Fund trusts are indexed by ticker and series, not by name, so a trust name only resolves for a fund that trades under its own name ("SPDR S&P 500 ETF Trust") — pass the CIK otherwise. | |
| limit | No | Number of positions to return inline, largest first by percent of net assets. Default 20. A broad index fund reports thousands of positions, so the inline list is a preview — read the whole portfolio from the dataframe, or page it with offset. Capped at 100: a larger value, up to 1000, returns what 100 returns. | |
| offset | No | Position to start the page at, 0-based, over the full ordered holdings list. Pass the returned next_offset to read the next page — the report is parsed whole and sliced, so paging is stable and gap-free. | |
| series_id | No | SEC fund series identifier ("S000002839"), naming which fund of the registrant to report. Takes precedence over any series the fund input implies. Series IDs come back on fund results from secedgar_company_search and in the series list of a series_required error. | |
| report_date | No | Target a specific reporting period by its last day (YYYY-MM-DD), e.g. "2025-12-31". Omit for the most recent report. Period ends follow the fund's own fiscal quarters, which are not always calendar quarters — Direxion funds report to February, May, August, and November. available_report_periods in the response lists the ones this call identified; a period missing from that list is still worth requesting directly, since a report the submissions window no longer dates is dated by reading it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| form | No | EDGAR form name — "NPORT-P", or "NPORT-P/A" for an amended report. |
| fund | No | The fund input, echoed. |
| as_of | No | The portfolio date these holdings are reported as of, and the publication lag behind it. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of positions shown inline. |
| notice | No | Guidance when the report carried no positions or the page fell past the end. |
| offset | No | Position the returned page starts at, 0-based. |
| dataset | No | Dataframe of every position, each row carrying the fund keys; joins 13F and 13D/G dataframes on cusip. Absent when canvas is unavailable or the report had no positions. |
| holdings | No | One page of positions, `limit` rows starting at `offset`, largest first by percent of net assets. |
| class_ids | No | SEC class IDs covered; one report covers every class of the series. |
| series_id | No | SEC series ID of the fund. Absent when the registrant files as a single fund with no series. |
| truncated | No | True when the inline holdings list was capped by limit. |
| filing_date | No | Date the report was submitted to EDGAR (YYYY-MM-DD). |
| next_offset | No | Offset for the next page. Absent on the last page. |
| series_name | No | Fund name on the report; a single-registrant closed-end fund names itself here, with no series_id. Absent when blank or "N/A". |
| net_assets_usd | No | Fund net assets in USD at the report date — the denominator of percent_of_net_assets. |
| registrant_cik | No | CIK of the registrant trust, zero-padded to 10 digits. |
| total_holdings | No | Positions in the full report, before offset and limit. |
| is_final_filing | No | True when the fund marks this its last filing for the series (liquidation or merger). Absent when unstated. |
| registrant_name | No | EDGAR-conformed name of the registrant trust. |
| accession_number | No | Accession number — pass to secedgar_get_filing for the full document. |
| total_assets_usd | No | Fund total assets in USD at the report date. |
| report_period_end | No | Fiscal year end the reporting period falls in (YYYY-MM-DD), not the portfolio date. |
| report_period_date | No | Portfolio date (YYYY-MM-DD): positions as of this date, not today. Absent only when the filer omits it. |
| publication_lag_days | No | Days from the portfolio date to the filing date. Absent when the report omits its period date. |
| total_liabilities_usd | No | Fund total liabilities in USD at the report date. |
| available_report_periods | No | Period end dates of this fund's reports, newest first: what report_date can address, about a decade back. A trust filing thousands of reports a year can miss periods here that report_date still reaches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld behavior, and the description adds substantial context beyond them: quarterly NPORT-P source, roughly two-month publication lag, results dated to report_period_date rather than today, one report per series, multi-fund trust caveats, stable paging, and dataframe registration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with purpose and routing, then return fields, paging, and caveats. Most sentences carry useful information, though a few details duplicate the detailed parameter schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of fund series, NPORT-P timing, paging, and dataframe-based exploration, the description covers what an agent needs. An output schema exists, so return-value details need not be exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so much of the parameter documentation is in structured fields. The description still adds operational meaning: ticker vs. CIK vs. series routing, series_id precedence, limit as an inline preview, offset-based stable paging, and report_date periods following fiscal rather than calendar quarters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: lists what an ETF or mutual fund holds, parsed from NPORT-P. It explicitly contrasts this with the ownership tools secedgar_get_institutional_holdings and secedgar_find_holders, so an agent can choose correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ownership tools and the direction of the relationship, making the when-to-use distinction explicit. It also directs the agent to secedgar_dataframe_describe and secedgar_dataframe_query when the full portfolio is too large for inline results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_insider_transactionsGet Insider TransactionsARead-onlyIdempotentInspect
Fetch Form 4 insider transactions (purchases, sales, grants, exercises) for a company by parsing SEC EDGAR ownership XML. Returns the reporting person, their relationship to the issuer, transaction date, type, shares traded (absolute magnitude), direction (acquire/dispose), price per share, and shares owned after the transaction. Covers nonDerivative transactions (open-market buys/sells, gifts) and derivative transactions (option exercises, RSU vests). Without a date window it reads the newest Form 4 filings; filed_after / filed_before read any period since mid-2003, reaching past the recent submissions window into the archive (e.g. insider trades in the quarter before an earnings miss). When a canvas is available, the full set of transactions parsed from the scanned filings is materialized as df_ (the inline list is a preview capped at limit) — inspect it with secedgar_dataframe_describe, then query it with secedgar_dataframe_query to aggregate net buy/sell by insider: SUM(CASE WHEN direction='dispose' THEN -shares_traded ELSE shares_traded END). Use secedgar_search_filings with forms=["4"] to search Form 4 filings across all companies.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20. Capped at 100: a larger value, up to 1000, returns what 100 returns. | |
| company | Yes | The issuer whose Form 4 filings to read — the company, not the reporting person. A ticker symbol (e.g., "AAPL"), a CIK with or without zero-padding (e.g., "320193" or "0000320193"), or a company name (current or former). A name matching several companies resolves to the top-ranked one — exact name first, then prefix, then substring — so pass a ticker or CIK when the issuer must be exact. | |
| filed_after | No | Only read Form 4 filings filed on or after this date (YYYY-MM-DD). A date window reaches filings older than the recent submissions window by paging into the archive, and with a canvas every Form 4 filed inside it is parsed, up to 100. Structured Form 4 XML begins in mid-2003, so an earlier window finds nothing. | |
| filed_before | No | Only read Form 4 filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after. Without either bound the tool reads the newest Form 4 filings. | |
| transaction_type | No | Filter by direction. "purchase" = open-market buys (code P). "sale" = open-market sells (code S). "all" includes grants, awards, exercises, gifts, and other coded transaction types as well. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of transactions shown inline. |
| notice | No | Why the result is empty (the filter, or every scanned filing naming another issuer), and the dataframe pointer when staged. |
| dataset | No | Dataframe of every parsed transaction, issuer keys on each row, for net buy/sell by insider and cross-issuer joins. Absent when canvas is unavailable or nothing parsed. |
| truncated | No | True when the inline transactions[] was capped by limit. |
| issuer_cik | No | Issuer CIK, zero-padded to 10 digits. |
| issuer_name | No | Issuer entity name (SEC-conformed). |
| transactions | No | Insider transactions, newest filing first, capped at limit; the dataframe holds the full parsed set. |
| issuer_ticker | No | Issuer ticker symbol when available. |
| filings_scanned | No | Form 4 filings scanned, including those in filings_other_issuer. |
| filings_other_issuer | No | Scanned Form 4 filings naming a different issuer, filed by this company as a reporting owner of another (e.g., a 10% holder of a fund). They are that issuer's activity, so they add no transactions here or in the dataframe. |
| history_scanned_through | No | Filing date of the oldest Form 4 parsed (YYYY-MM-DD). Present only with a date window that held a Form 4. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly/idempotent/openWorld annotations already covering the safety profile, the description adds real behavioral context: XML parsing source, mid-2003 archive boundary, newest-first scanning, and the important divergence that the inline list is only a preview capped at limit while the full set materializes as df_<id> in the canvas. That preview-vs-full-set distinction is not visible in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and efficient despite its length; nearly every sentence carries information the agent needs. The inline SQL aggregation example is slightly gratuitous but is directly actionable guidance for the follow-up query step.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter open-world tool with an output schema, the description is complete: it covers what is fetched, the date-window mechanics, the return shape at a high level, and which sibling to use for cross-company Form 4 search. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining default behavior (newest filings when no date window), the mid-2003 lower bound, and the semantics behind the canvas preview versus the limit. It stops short of 5 because much of the per-parameter detail (ticker/CIK resolution, code P/S mapping) is already spelled out in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch Form 4 insider transactions ... by parsing SEC EDGAR ownership XML') and enumerates exactly what is returned (reporting person, relationship, direction, shares, price, post-transaction holdings). It also scopes coverage to both nonDerivative and derivative transaction classes, so an agent understands precisely what is and isn't included.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context ('Without a date window it reads the newest Form 4 filings; filed_after/filed_before read any period since mid-2003') and names the concrete alternative with parameters ('Use secedgar_search_filings with forms=["4"] to search Form 4 filings across all companies'). The canvas workflow (describe then query) tells the agent what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_institutional_holdingsGet Institutional HoldingsARead-onlyIdempotentInspect
Read an institutional manager's 13F-HR information table for a quarter. company is the filer: a 10-digit CIK, ticker, or name; names outside the ticker file use EDGAR entity search, and ambiguous names return candidates. For managers holding an issuer, use secedgar_find_holders and pass its filer_cik here. Positions carry issuer, CUSIP, shares, whole-USD market value, option designation, and the accessions they came from. Same-period 13F-HR/A amendments are composed in acceptance order: a RESTATEMENT replaces the rows, a NEW HOLDINGS amendment adds its rows, and each amendment reports how it was applied. By default, sub-lines consolidate into positions sorted by value; consolidate=false preserves raw filing order, each filing's rows after the last. Page with limit, offset and returned next_offset. When canvas is available, the full composed positions are staged as df_: inspect with secedgar_dataframe_describe, then aggregate or join on cusip + reporting_period with secedgar_dataframe_query. Managers below $100M in 13(f) securities may not file. Use secedgar_search_filings with forms=["13F-HR"] for broader search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20. Capped at 500: a larger value, up to 1000, returns what 500 returns. | |
| offset | No | Row to start the page at, 0-based, over the ordered position list. Pass the next_offset from the previous response to read the next page — the filing is parsed whole and sliced, so paging is stable and gap-free. An offset at or past the position count returns an empty page. | |
| company | Yes | The institutional filer whose 13F to fetch — a 10-digit CIK (e.g. "0000102909" for VANGUARD GROUP INC, the most reliable form), a ticker, or an entity name. A name is matched against the registrants in EDGAR's ticker file first (current and former names) and, when none match, resolved through EDGAR entity search, which covers institutional managers absent from that file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like "AAPL" finds that operating company's own filings (it files no 13F), not who holds it; use secedgar_find_holders for that direction. | |
| quarter | No | Reporting quarter to target, in "YYYY-QN" format (e.g., "2025-Q4"), matched exactly against each 13F-HR's period of report. When omitted, returns the most recent 13F-HR in the submissions feed's recent window (the last year or 1,000 filings, whichever holds more). Quarters map to the filing window: Q4 2025 = filings submitted roughly Jan–Mar 2026. A quarter older than the recent window is looked up in the archive, reading forward from the quarter end up to 10 archive pages. A quarter the manager covered with a 13F-NT notice (holdings reported by other managers) fails naming that notice. | |
| consolidate | No | When true (default), info-table sub-lines for the same security (CUSIP + class + put/call) are summed into one position and results are sorted by market value descending, so `limit` returns the largest distinct holdings. Set false to return raw information-table rows in filing order (one per investment-discretion/manager sub-line), preserving investment_discretion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of holdings shown inline. |
| notice | No | Amendment composition, discovery, paging, and dataframe guidance. |
| offset | No | Row the returned page starts at, 0-based. |
| dataset | No | Composed positions, shaped by consolidate; join on cusip + reporting_period. Absent without canvas or holdings. |
| holdings | No | `limit` rows from `offset`: positions by value when consolidate=true, else raw rows in application order. |
| filer_cik | No | CIK of the 13F filer, zero-padded to 10 digits. |
| truncated | No | True when the inline holdings[] was capped by limit. |
| amendments | No | Known amendments, newest filed first. Absent if none. |
| filer_name | No | Institutional filer name (the 13F submitter). |
| filing_date | No | Original 13F-HR filing date (YYYY-MM-DD). |
| next_offset | No | Offset for the next page. Absent on the last page. |
| total_positions | No | Distinct positions before paging. Only with consolidate=true. |
| accession_number | No | Original 13F-HR accession for secedgar_get_filing. |
| reporting_period | No | Cover-page quarter end (YYYY-MM-DD). Absent if omitted. |
| composed_accessions | No | Accessions whose rows form holdings, in application order. |
| total_holdings_composed | No | Composed raw row count before consolidation or paging. |
| total_holdings_in_filing | No | Original 13F-HR raw row count. |
| amendment_search_complete | No | False if archive discovery was bounded or unavailable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, it discloses non-obvious behavior: amendment composition in acceptance order with RESTATEMENT vs NEW HOLDINGS semantics, an archive lookback of up to 10 pages for old quarters, 13F-NT failure mode, and stable slice-based paging. These are exactly the traits an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, filer-vs-issuer warning, and sibling alternatives are front-loaded, and each subsequent sentence carries distinct information about amendments, paging, or dataframe staging. It is dense and long for a tool description, with some overlap against the already-verbose schema descriptions of limit/offset/consolidate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity filing-parsing tool with an output schema, it covers the remaining gaps an agent needs: identity resolution ambiguity, amendment composition, pagination contract, and the dataframe hand-off path (df_<id> via dataframe_describe/query). Nothing needed to call it correctly or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds real meaning by stressing that company is the filer, not the portfolio company, and warning that an issuer ticker like AAPL resolves to the wrong entity. It also maps quarter to the actual filing window and explains what consolidate=false preserves (investment_discretion and filing order).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource (read a 13F-HR information table for a quarter) and immediately scopes the filer semantics. It explicitly distinguishes itself from secedgar_find_holders and secedgar_search_filings, so the agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternatives and the conditions that select them: 'For managers holding an issuer, use secedgar_find_holders and pass its filer_cik here' and 'Use secedgar_search_filings with forms=["13F-HR"] for broader search.' It also states a when-not edge case: managers below $100M in 13(f) securities may not file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_material_eventsGet Material EventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Item 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. | |
| limit | No | 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. Capped at 100: a larger value, up to 1000, returns what 100 returns. | |
| company | Yes | Company 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_after | No | 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). | |
| filed_before | No | Only 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
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| cik | No | Resolved CIK, zero-padded to 10 digits. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of filings shown inline. |
| notice | No | 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. |
| dataset | No | 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. |
| filings | No | Matching filings, newest first, capped at limit. |
| truncated | No | True when the inline filings list was capped. |
| company_name | No | SEC-conformed company name. |
| items_filter | No | The item codes filtered on, echoed. Absent when no filter was applied. |
| total_matched | No | Filings matching every filter across the scan; can exceed limit. |
| total_8k_scanned | No | 8-K filings in the date window before the items filter; compare total_matched. |
| item_distribution | No | Scanned 8-K filings per item code, before the items filter. Empty when none were scanned. |
| history_scanned_through | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, and the description adds substantial non-obvious behavior: archive-page scan capped at 10 pages, the difference between date-windowed and limit-driven scanning, the effective 100-row inline cap despite the 1000 maximum, and dataframe materialization per scanned filing. It also notes press releases usually appear as EX-99 exhibits rather than in the primary document — genuinely useful context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and narrowing rationale, then layers regime, scan-depth, and dataframe details in a logical order. It is long and some regime/code details are partly restated in the schema descriptions, but nearly every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param tool with an output schema and rich annotations, this covers everything an agent needs: selection criteria, filter pairing across regimes, the archive scan bound, the effective inline cap, the dataframe side-effect, and which tools consume the results. Nothing material is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns more by explaining the decoded meaning of representative item codes (1.01, 2.02, 4.02, 5.02), the two coexisting numbering regimes (old integer 12/9 vs x.xx), and the practical implication that a pre-2004 window requires bare-integer codes. The limit-cap behavior (max 100 inline, larger values truncate) is also surfaced in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve 8-K filings) with the distinguishing feature (item codes decoded, optional item filter) and explicitly contrasts with secedgar_search_filings and secedgar_company_search as form-level-only alternatives. An agent can select this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when item filtering beats form-level search, explains the cross-regime pairing needed when a window spans 2004-08-23, and names the downstream tools (secedgar_get_filing, secedgar_dataframe_describe, secedgar_dataframe_query) with the workflow order. Alternatives and conditions are stated rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_get_snapshotSecedgar Get SnapshotARead-onlyIdempotentInspect
Build a company financial profile in one call: the latest value of every supported XBRL concept, grouped by statement. Reads the filer's complete companyfacts payload once rather than one request per concept, so it replaces a run of secedgar_get_financials calls when the question is "what do this company's financials look like right now". Values use the same frame dedup and tag priority as secedgar_get_financials, so the two agree for any concept they both cover. Duration concepts (income statement, cash flow, per-share) report their latest full year and latest single quarter; balance-sheet and entity-info concepts report their latest point-in-time value, since that is the only form they are filed in. A concept the filer does not report is listed under gaps with the XBRL tags that were tried — never zero-filled or interpolated. Use secedgar_get_financials for a full time series of one concept, and secedgar_compare_companies to put several companies side by side.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Ticker symbol (e.g. "AAPL") or CIK number. Ticker is preferred. | |
| taxonomy | No | XBRL taxonomy to resolve concepts under. Every concept is looked up in this one taxonomy, so ifrs-full covers only the concepts with confirmed IFRS tag variants and the rest — including the dei entity-info concepts — come back under gaps. Leave at us-gaap for domestic filers, where each concept uses its own preferred taxonomy. | us-gaap |
| period_type | No | Which duration periods to report per concept: the latest full year, the latest single quarter, or both (default). Balance-sheet and entity-info concepts are point-in-time and always report their latest instant value regardless of this setting. | both |
Output Schema
| Name | Required | Description |
|---|---|---|
| cik | No | Resolved CIK, zero-padded to 10 digits. |
| gaps | No | Concepts with no value for this filer, never zero-filled or interpolated. |
| error | No | Present when the call failed. Absent on success. |
| lines | No | Resolved concepts, ordered by statement group then concept name. |
| caveats | No | Completeness warnings, else empty: quarters missing from every recent year (SEC reports fiscal Q4 only within the 10-K), and, prefixed with the concept name, lines stopping 2+ years behind the filer's newest period. |
| company | No | Resolved entity name (SEC-conformed). |
| taxonomy | No | Taxonomy the concepts were resolved under, echoed from input. |
| period_type | No | Duration periods reported, echoed from input. |
| concepts_total | No | Concepts in the supported catalog that were attempted. |
| concepts_resolved | No | Concepts that produced at least one value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly/idempotent/openWorld), but the description adds substantial semantics beyond that: single companyfacts fetch vs per-concept requests, frame dedup and tag priority shared with get_financials so outputs agree, duration concepts returning latest FY and latest quarter while balance-sheet/entity-info return point-in-time, and gaps listed with attempted tags rather than zero-filled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the alternative routing, and every sentence carries information (dedup semantics, period form rules, gap handling). It is dense and long, with a few clauses that could be tightened, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, yet the description still covers profile shape (grouped by statement), period form per concept class, and gap reporting. That is complete for an agent to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so company, taxonomy, and period_type are fully documented in the schema already. The description reinforces the period/taxonomy behavior but adds little syntax or format detail beyond what the schema states; baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Build a company financial profile in one call: the latest value of every supported XBRL concept, grouped by statement') and explicitly distinguishes itself from secedgar_get_financials and secedgar_compare_companies, so the agent can pick it without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the exact condition that selects this tool ('what do this company's financials look like right now') and both alternatives with their trade-offs: get_financials for a full time series of one concept, compare_companies for side-by-side. Explicit when-to-use and when-to-use-otherwise.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_search_conceptsSecedgar Search ConceptsARead-onlyIdempotentInspect
Search supported XBRL financial concepts by keyword, statement group, or taxonomy. Use before secedgar_get_financials, secedgar_compare_companies, or secedgar_fetch_frames to discover the right friendly name, or pass a raw XBRL tag (e.g., "NetIncomeLoss") to reverse-lookup which friendly names map to it. Empty search with no filters returns the full catalog.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Filter to a single financial statement group. income_statement covers P&L items; balance_sheet covers position items (use instant periods in secedgar_fetch_frames); cash_flow covers CF statement items; per_share covers EPS and the diluted share count it divides by; entity_info covers DEI items like shares outstanding. | |
| search | No | Case-insensitive substring matched against friendly name, label, and XBRL tags. Examples: "cash" finds cash and operating_cash_flow; "earnings" finds eps_basic and eps_diluted; "NetIncomeLoss" reverse-maps to net_income. Omit to list all concepts. | |
| taxonomy | No | Filter to a single XBRL taxonomy. us-gaap for US filers, ifrs-full for foreign filers, dei for entity info. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| total | No | Number of concepts matching the filters. |
| notice | No | Guidance when no concepts matched — echoes the search term and suggests alternatives. |
| concepts | No | Matching concepts, ordered by group then alphabetical by name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: an empty search with no filters returns the full catalog, and the tool supports reverse-mapping from raw tags. It does not mention result size or pagination for that full-catalog case, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, followed by workflow routing and the edge-case behavior. Every clause carries information; nothing is restated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary. With annotations covering safety, 100% parameter coverage, and the empty-search/catalog behavior disclosed, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself carries rich enum descriptions and per-parameter examples, so the baseline is 3. The description reinforces the search semantics (case-insensitive across friendly name, label, and XBRL tags) but adds no syntax or format details the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (supported XBRL financial concepts) with three filtering axes, and names the sibling consumers it feeds (get_financials, compare_companies, fetch_frames). An agent can distinguish this discovery tool from the data-retrieval siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to use it: 'Use before secedgar_get_financials, secedgar_compare_companies, or secedgar_fetch_frames to discover the right friendly name.' It also documents the alternate reverse-lookup mode (raw XBRL tag → friendly names), so both entry conditions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secedgar_search_filingsSecedgar Search FilingsARead-onlyIdempotentInspect
Search EDGAR filings since 1993. Full-text search covers 2001-present (the EFTS index floor); pre-2001 date ranges (to 1993) are served from the archives by form and entity/date. Pre-2001 free text needs entity scope (ticker:/cik:) — with it, the tool reads the entity's matching filings and matches the terms locally, which costs a few seconds (SEC's request rate caps the scan at roughly 5s for the 50-document maximum). A range crossing 2001-01-01 is split at the boundary and the two eras merged, each row tagged with its source. Supports exact phrases, boolean operators, wildcards, and entity targeting (ticker:AAPL or cik:320193 in query). When the match set outruns the inline list it is also staged as df_ — inspect it with secedgar_dataframe_describe, then analyze it with secedgar_dataframe_query.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Result ordering. "filing_date_desc" (default) returns most recent first. "filing_date_asc" returns oldest first. "relevance" returns SEC's native search-score order, which weights term match strength over recency. Date sorts re-order the top 100 hits returned by the search index — for broad queries with more than 100 matches and no entity targeting, date-newest filings may sit outside that window. Entity targeting (ticker:/cik:) or a narrower query keeps matches inside the window when absolute recency matters. On the no-query browse path (forms/entity only), EFTS has no relevance signal — every hit scores null — and returns filings in natural date-descending order, so all sort modes effectively yield newest-first. Pre-2001 archive results carry no relevance score either, so relevance collapses to date-descending there. | filing_date_desc |
| forms | No | Filter to specific form types (e.g., ["10-K", "10-Q", "8-K"]). Without this, searches all form types. Note: "10-K" also matches amendments filed as 10-K/A. SEC renamed the blockholder schedules on 2024-12-18 — filings before that date are "SC 13D"/"SC 13G", filings after are "SCHEDULE 13D"/"SCHEDULE 13G" — so a filter spanning that boundary must list both spellings. Ownership forms (3, 4, 5) are indexed by the reporting person (e.g., "LEVINSON ARTHUR D"), not the issuer — rows carry no transaction code, share count, or price. Use secedgar_get_insider_transactions to retrieve parsed ownership XML with person, relationship, transaction code, shares, and price. | |
| limit | No | Results per page. Capped at 100: a larger value, up to 1000, returns what 100 returns. | |
| query | No | Full-text search query. Optional — omit (or pass "") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms and browse by form type (forms) and date. When present, supports exact phrases ("material weakness"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. A multi-class share ticker resolves in either form — ticker:BRK-B and ticker:BRK.B scope to the same issuer. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax. | |
| offset | No | Pagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side up to its 10,000-result cap, and the offset counts matching documents, not filings — EDGAR indexes each document of a filing separately — so a page lists the filings among its limit documents, which can be fewer than limit, and a filing whose matching documents straddle a page edge can recur on the next page; stepping by limit never skips one. Everywhere else the offset indexes the filings this call assembled and sorted: the filings of a single 100-document window for date sorts and entity targeting, the full matched set on a pre-2001 archive path, or both together on a range that crosses 2001-01-01. Offsets at or past those rows return nothing even when more filings match (a total above the rows fetched, or total_is_exact false) — switch to sort=relevance for deep pagination on a 2001-onward search, narrow the search (forms, dates, entity targeting), or query the dataframe. On a crossing range the two sides are assembled unevenly — the archive side contributes every row it matched, the full-text side the filings of one document window — so once the window runs out the rows jump to the pre-2001 era with the remaining full-text matches absent from the middle; search the 2001-onward era on its own to page through those. | |
| filed_after | No | Only include filings filed on or after this date (YYYY-MM-DD). Use alone or with filed_before; alone, the search runs through today (UTC). | |
| filed_before | No | Only include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; alone, the search starts at 2001-01-01, or at 1993-01-01 (the archive start) for a date before 2001. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit cap applied. |
| scan | No | Pre-2001 entity-scoped free-text path only. Each candidate's whole accession .txt is read, so a match may sit in an exhibit rather than the body of the requested form. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of results shown inline. |
| total | No | Matching filings, one per accession; can exceed the rows returned. A search with terms counts the filings among the full-text documents fetched (100 per request): a lower bound unless total_is_exact. A forms- or entity-only browse from 2001 on gives EDGAR's own count; earlier ranges count rows read. |
| notice | No | Why nothing matched, what lies past a truncated list and how to reach it, or that offset passed the filings available. |
| dataset | No | Dataframe of every filing assembled (the full-text window, or the full pre-2001 match set). Absent when the rows fit inline, canvas is unavailable, or staging failed. |
| results | No | Matching filings. |
| truncated | No | True when more filings match than are shown: limit capped the list, or total is a lower bound. |
| effectiveQuery | No | The query as executed: "(entity scope: CIK …)" for a ticker:/cik: token, "(browse: forms …)" for a forms-only browse, a pre-2001 range's archive route and dates (and quarters read, if the full-index cap bound), and "(filed <after> to <before>)" for a full-text search given one bound. |
| total_is_exact | No | False when total is a lower bound: a search with terms whose 100-document window missed matches (or a relevance page past offset 0), EDGAR's 10,000 cap, or a pre-2001 archive or text scan that hit its cap. True does not mean every match is in the rows: a browse total can exceed the window. |
| total_documents | No | EDGAR's count of matching full-text documents, capped at 10,000. A search counts a filing once per matching document; a browse matches one document per filing. Absent on pure pre-2001 archive paths. |
| form_distribution | No | Filings in hand by form: every row assembled (what a dataframe holds), not only the page shown. Sums to total when every matching filing is in hand and every row has a form. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/open-world, so the description carries real weight: it discloses the ~5s local scan at SEC's rate limit, the 50-document bound, the 2001-01-01 split with 'source'-tagged rows, and the uneven merge on crossing ranges. These are non-obvious operational traits an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, but the remainder is a dense block that repeats schema-level detail about query syntax and erodes readability. The sentence about dataframe staging is well placed, yet several clauses duplicate what the 100%-covered schema already says.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described; the description instead supplies exactly what the schema cannot — era boundaries, archival fallback cost, range-splitting behavior and dataframe handoff. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions already explain sort ordering, the limit cap, query syntax and the offset window semantics in depth. The description's parameter-adjacent content (phrases, boolean, wildcards, ticker:/cik:) largely restates the schema; its genuinely additive note is that the pre-2001 local scan honors the same syntax. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence names the specific verb and resource ('Search EDGAR filings since 1993') and immediately scopes the two eras. Entity targeting, form browsing and dataframe staging are all distinguished, and the description explicitly routes the agent to secedgar_get_insider_transactions for ownership forms rather than leaving siblings ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions: pre-2001 free text requires ticker:/cik: scope or drop the terms and browse by forms; a date range alone is not a valid search; use the dataframe tools when the match set outruns the inline list. Exclusions and alternatives are named explicitly rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
secedgar_dataframe_describe1 field changed- changed
Output schema / properties / dataframes / items / properties / expires_at / descriptionPrevious value: -"ISO 8601 expiry timestamp. Sliding TTL touched on every dataframe op."New value: +"ISO 8601 expiry timestamp, fixed when the table is staged; queries do not extend it."
- Changed
secedgar_find_holders1 field changed- changed
Input schema / properties / quarter / descriptionPrevious value: -"Reporting quarter to search, \"YYYY-QN\" (e.g. \"2026-Q1\"). Omit for the newest quarter whose 45-day filing deadline has passed — the applied quarter and its filing window are echoed in the response. A quarter still inside its deadline returns nothing, because the filings do not exist yet."New value: +"Reporting quarter to search, \"YYYY-QN\" (e.g. \"2026-Q1\"). Omit for the newest quarter whose 45-day filing deadline has passed — the applied quarter and its filing window are echoed in the response. A quarter still inside its deadline returns only the managers that filed early, so its set is incomplete until the deadline passes."
- Changed
secedgar_get_beneficial_owners1 field changed- changed
Output schema / properties / dataset / descriptionPrevious 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."New value: +"Dataframe with one row per reporting person across parsed filings; joins insider dataframes on issuer_cik, and 13F and NPORT-P dataframes on cusip. Absent when canvas is unavailable or nothing parsed."
- Changed
secedgar_get_fund_holdings1 field changed- changed
Output schema / properties / dataset / descriptionPrevious value: -"Dataframe of every position, each row carrying the fund keys; joins 13F and insider dataframes on cusip. Absent when canvas is unavailable or the report had no positions."New value: +"Dataframe of every position, each row carrying the fund keys; joins 13F and 13D/G dataframes on cusip. Absent when canvas is unavailable or the report had no positions."
12 tool updates
- Changed
secedgar_company_search1 field changed- changed
Input schema / properties / filing_limit / descriptionPrevious value: -"Maximum number of filings to return in the inline list. The list holds at most 50; a larger value returns 50, and the notice names where the rest are."New value: +"Maximum number of filings to return in the inline list; when more match, the notice names where the rest are. Capped at 50: a larger value, up to 1000, returns what 50 returns."
- Changed
secedgar_compare_companies2 fields changed- changed
Input schema / properties / periods / descriptionPrevious value: -"Upper bound on how many recent periods the inline matrix covers, newest first — not a guarantee. The matrix is companies x concepts x periods cells, and the inline window drops further older periods when that product is too large to return in one response. The full aligned series is always registered to the dataframe, so dropped periods stay queryable via secedgar_dataframe_query."New value: +"Upper bound on how many recent periods the inline matrix covers, newest first — not a guarantee. The matrix is companies x concepts x periods cells, and the inline window drops further older periods when that product is too large to return in one response. The full aligned series is always registered to the dataframe, so dropped periods stay queryable via secedgar_dataframe_query. Capped at 12: a larger value, up to 1000, returns what 12 returns." - changed
Input schema / properties / periods / maximumPrevious value: -12New value: +1000
- Changed
secedgar_dataframe_query5 fields changed- changed
Input schema / properties / preview / descriptionPrevious value: -"Rows to include in the immediate response. Defaults to the row limit. Set lower (e.g., 50) when chaining via register_as and only a sample is needed inline."New value: +"Rows to include in the immediate response. Defaults to the row limit. Set lower (e.g., 50) when chaining via register_as and only a sample is needed inline. Capped at 10000: a larger value, up to 100000, returns what 10000 returns." - changed
Input schema / properties / preview / maximumPrevious value: -10000New value: +100000 - changed
Input schema / properties / row_limit / descriptionPrevious value: -"Hard cap on rows materialized in the response. Default 1000, max 10000. A query matching more rows than this stops at the cap and `row_count_capped` comes back true; the full result lives on-canvas under register_as when provided, so do not raise this to keep large results. One case is not detectable: a SQL LIMIT exactly equal to this cap reads identically to a result that genuinely holds that many rows, and is reported as exact."New value: +"Hard cap on rows materialized in the response. Default 1000. A query matching more rows than this stops at the cap and `row_count_capped` comes back true; the full result lives on-canvas under register_as when provided, so do not raise this to keep large results. One case is not detectable: a SQL LIMIT exactly equal to this cap reads identically to a result that genuinely holds that many rows, and is reported as exact. Capped at 10000: a larger value, up to 100000, returns what 10000 returns." - changed
Input schema / properties / row_limit / maximumPrevious value: -10000New value: +100000 - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment. `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*). `missing_table`: The SQL query references a df_<id> table that does not exist or has expired. `invalid_sql`: The SELECT fails to prepare — an unknown column or an invalid expression — or hits an engine error no more specific reason covers. `sql_execution_error`: The SELECT prepared but failed on the data it read — a cast or conversion that does not fit, an out-of-range value, or invalid input to a function. `register_as_clash`: The register_as target name already exists on the canvas. `non_select_statement`: The SQL is not a SELECT (DROP, INSERT, UPDATE, DDL, PRAGMA, EXPLAIN, etc.) or does not parse — only read-only SELECTs run against dataframes. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading or external-data table function (read_csv, read_parquet, glob), a function that reads an engine setting (current_setting, current_schema), or one that runs SQL or names a table from a string (query_table, or query() over anything but a single string literal). `sql_read_only`: The SQL names a file as a table (FROM 'data.csv') — the dataframe engine reads no files. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist, such as the range() or generate_series() table functions. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment. `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*). `missing_table`: The SQL query references a df_<id> table that does not exist or has expired. `invalid_sql`: The SELECT fails to prepare — an unknown column or an invalid expression — or hits an engine error no more specific reason covers. `sql_execution_error`: The SELECT prepared but failed on the data it read — a cast or conversion that does not fit, an out-of-range value, or invalid input to a function. `register_as_clash`: The register_as target name already exists on the canvas. `non_select_statement`: The SQL is not a SELECT (DROP, INSERT, UPDATE, DDL, PRAGMA, EXPLAIN, etc.) or does not parse — only read-only SELECTs run against dataframes. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading or external-data table function (read_csv, read_parquet, glob), a function that reads an engine setting (current_setting, current_schema — an unqualified current_schema is refused even where it names a column, which reads qualified as <table>.current_schema), or one that runs SQL or names a table from a string (query_table, or query() over anything but a single string literal). `sql_read_only`: The SQL names a file as a table (FROM 'data.csv') — the dataframe engine reads no files. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist, such as the range() or generate_series() table functions. Other values are possible when a failure originates below the handler."
- Changed
secedgar_fetch_frames2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number of companies to return."New value: +"Number of companies to return. Capped at 100: a larger value, up to 1000, returns what 100 returns." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000
- Changed
secedgar_find_holders2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Filer rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20."New value: +"Filer rows returned inline. The full fetched set (up to 500 rows) is materialized as a dataframe when a canvas is available. Default 20. Capped at 100: a larger value, up to 1000, returns what 100 returns." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000
- Changed
secedgar_get_beneficial_owners2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number of successfully parsed filings naming the requested issuer to return, newest first. Other-issuer schedules and failed documents do not consume this limit; at most 50 documents are examined. Default 10."New value: +"Number of successfully parsed filings naming the requested issuer to return, newest first. Other-issuer schedules and failed documents do not consume this limit; at most 50 documents are examined. Default 10. Capped at 20: a larger value, up to 1000, returns what 20 returns." - changed
Input schema / properties / limit / maximumPrevious value: -20New value: +1000
- Changed
secedgar_get_filing2 fields changed- changed
Input schema / properties / content_limit / descriptionPrevious value: -"Maximum characters of document text to return per page. 10-K filings can exceed 500,000 characters; S-1/A can exceed 1,000,000. Default 50,000 captures ~12,000 words (typically business overview, risk factors, and MD&A). Increase to 200,000 for full financial statements, or decrease for quick summaries. Use offset or section for subsequent pages."New value: +"Maximum characters of document text to return per page. 10-K filings can exceed 500,000 characters; S-1/A can exceed 1,000,000. Default 50,000 captures ~12,000 words (typically business overview, risk factors, and MD&A). Increase to 200,000 for full financial statements, or decrease for quick summaries. Use offset or section for subsequent pages. Capped at 200000: a larger value, up to 1000000, returns what 200000 returns." - changed
Input schema / properties / content_limit / maximumPrevious value: -200000New value: +1000000
- Changed
secedgar_get_fund_holdings2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number of positions to return inline, largest first by percent of net assets. Default 20. A broad index fund reports thousands of positions, so the inline list is a preview — read the whole portfolio from the dataframe, or page it with offset."New value: +"Number of positions to return inline, largest first by percent of net assets. Default 20. A broad index fund reports thousands of positions, so the inline list is a preview — read the whole portfolio from the dataframe, or page it with offset. Capped at 100: a larger value, up to 1000, returns what 100 returns." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000
- Changed
secedgar_get_insider_transactions2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20."New value: +"Maximum number of transactions to return across all Form 4 filings fetched. Filings are scanned newest-first. Default 20. Capped at 100: a larger value, up to 1000, returns what 100 returns." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000
- Changed
secedgar_get_institutional_holdings18 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20."New value: +"Maximum number of holdings rows to return. 13F filings from large institutions can contain thousands of positions. Default 20. Capped at 500: a larger value, up to 1000, returns what 500 returns." - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +1000 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "filer_name", - "filer_cik", - "filing_date", - "accession_number", - "total_holdings_in_filing", - "offset", - "holdings" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "filer_name", + "filer_cik", + "filing_date", + "accession_number", + "composed_accessions", + "total_holdings_in_filing", + "total_holdings_composed", + "offset", + "holdings" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / accession_number / descriptionPrevious value: -"Accession number of this 13F-HR — pass to secedgar_get_filing."New value: +"Original 13F-HR accession for secedgar_get_filing." - changed
Output schema / properties / amendments / descriptionPrevious value: -"Known amendments to the original report. Absent when none were found."New value: +"Known amendments, newest filed first. Absent if none." - changed
Output schema / properties / amendments / items / descriptionPrevious value: -"Same-period amendment; its holdings are not merged."New value: +"Same-period 13F-HR/A." - changed
Output schema / properties / amendments / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "description": "Readable amendment.", - "properties": { - "accession_number": { - "description": "Amendment accession for secedgar_get_filing.", - "type": "string" - }, - "amendment_type": { - "description": "Cover-page type.", - "enum": [ - "RESTATEMENT", - "NEW HOLDINGS" - ], - "type": "string" - }, - "filing_date": { - "description": "Amendment filing date (YYYY-MM-DD).", - "type": "string" - } - }, - "required": [ - "accession_number", - "filing_date", - "amendment_type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amendment with unavailable type.", - "properties": { - "accession_number": { - "description": "Amendment accession for secedgar_get_filing.", - "type": "string" - }, - "amendment_type": { - "const": "UNAVAILABLE", - "description": "Type could not be read.", - "type": "string" - }, - "filing_date": { - "description": "Amendment filing date (YYYY-MM-DD).", - "type": "string" - }, - "unavailable_reason": { - "description": "Why the type is unavailable; inspect with secedgar_get_filing.", - "enum": [ - "missing_header", - "unreadable_header", - "lookup_failed", - "lookup_stopped" - ], - "type": "string" - } - }, - "required": [ - "accession_number", - "filing_date", - "amendment_type", - "unavailable_reason" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "description": "Typed amendment.", + "properties": { + "accession_number": { + "description": "Accession for secedgar_get_filing.", + "type": "string" + }, + "amendment_type": { + "description": "Cover-page type.", + "enum": [ + "RESTATEMENT", + "NEW HOLDINGS" + ], + "type": "string" + }, + "applied_as": { + "description": "Composition role.", + "enum": [ + "restatement", + "new_holdings", + "superseded", + "not_applied" + ], + "type": "string" + }, + "filing_date": { + "description": "Filing date (YYYY-MM-DD).", + "type": "string" + } + }, + "required": [ + "accession_number", + "filing_date", + "applied_as", + "amendment_type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Untyped amendment.", + "properties": { + "accession_number": { + "description": "Accession for secedgar_get_filing.", + "type": "string" + }, + "amendment_type": { + "const": "UNAVAILABLE", + "description": "Type could not be read.", + "type": "string" + }, + "applied_as": { + "description": "Composition role.", + "enum": [ + "restatement", + "new_holdings", + "superseded", + "not_applied" + ], + "type": "string" + }, + "filing_date": { + "description": "Filing date (YYYY-MM-DD).", + "type": "string" + }, + "unavailable_reason": { + "description": "Why the type is unavailable; inspect with secedgar_get_filing.", + "enum": [ + "missing_header", + "unreadable_header", + "lookup_failed", + "lookup_stopped" + ], + "type": "string" + } + }, + "required": [ + "accession_number", + "filing_date", + "applied_as", + "amendment_type", + "unavailable_reason" + ], + "type": "object" + } +] - added
Output schema / properties / composed_accessionsAdded value: +{ + "description": "Accessions whose rows form holdings, in application order.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / dataset / descriptionPrevious value: -"Original-report positions, shaped by consolidate; join on cusip + reporting_period. Amendment positions are excluded. Absent without canvas or holdings."New value: +"Composed positions, shaped by consolidate; join on cusip + reporting_period. Absent without canvas or holdings." - changed
Output schema / properties / filer_name / descriptionPrevious value: -"Name of the institutional filer (the 13F submitter)."New value: +"Institutional filer name (the 13F submitter)." - changed
Output schema / properties / filing_date / descriptionPrevious value: -"Date the 13F was submitted (YYYY-MM-DD)."New value: +"Original 13F-HR filing date (YYYY-MM-DD)." - changed
Output schema / properties / holdings / descriptionPrevious value: -"`limit` rows from `offset`: positions by market value when consolidate=true, else raw rows in filing order."New value: +"`limit` rows from `offset`: positions by value when consolidate=true, else raw rows in application order." - changed
Output schema / properties / holdings / items / properties / market_value_usd / descriptionPrevious value: -"Whole USD at report date; pre-2023-01-03 filing values scaled from thousands. Absent if unreported."New value: +"Whole USD at report date; values filed before 2023-01-03 scaled from thousands. Absent if unreported." - added
Output schema / properties / holdings / items / properties / source_accession_numbersAdded value: +{ + "description": "Accessions the row came from, in application order.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / holdings / items / requiredPrevious value: -[ - "issuer_name" -]New value: +[ + "issuer_name", + "source_accession_numbers" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Amendment disclosure, incomplete discovery, paging, and dataframe guidance."New value: +"Amendment composition, discovery, paging, and dataframe guidance." - added
Output schema / properties / total_holdings_composedAdded value: +{ + "description": "Composed raw row count before consolidation or paging.", + "type": "number" +} - changed
Output schema / properties / total_holdings_in_filing / descriptionPrevious value: -"Original raw row count before consolidation or paging."New value: +"Original 13F-HR raw row count."
- Changed
secedgar_get_material_events2 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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."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. Capped at 100: a larger value, up to 1000, returns what 100 returns." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000
- Changed
secedgar_search_filings2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Results per page. Max 100."New value: +"Results per page. Capped at 100: a larger value, up to 1000, returns what 100 returns." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +1000
4 tool updates
- Changed
secedgar_find_holders5 fields changed- changed
Output schema / properties / dataset / descriptionPrevious value: -"Dataframe of every fetched filer row, keyed by issuer and quarter for cross-issuer joins. Absent when the result fits inline, canvas is unavailable, or staging failed."New value: +"Fetched managers keyed by issuer and quarter for joins. Absent if inline fits, canvas is unavailable or staging fails." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when total_filings exceeds fetched, so more filers exist."New value: +"True when the fetched sample may omit matching documents." - changed
Output schema / properties / holders_in_quarter / descriptionPrevious value: -"Distinct managers reporting this quarter among fetched filings: the set limit pages and the dataframe holds. Other-quarter amendments drop; a manager that amended counts once, at its latest filing."New value: +"Distinct in-quarter managers in the fetched sample and dataframe; latest filing per CIK wins, other periods excluded." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when the search returned no filers — names the likely cause."New value: +"Continuation, search coverage, empty results, and dataframe guidance." - changed
Output schema / properties / total_filings / descriptionPrevious value: -"13F-HR filings matching the search key in the window, per the index; slightly over-counts holders (amendments of older quarters, managers amending this one), which holders_in_quarter corrects."New value: +"Matching documents in the filing window, including amendments; holders_in_quarter deduplicates managers and filters period."
- Changed
secedgar_get_beneficial_owners13 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number 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."New value: +"Number of successfully parsed filings naming the requested issuer to return, newest first. Other-issuer schedules and failed documents do not consume this limit; at most 50 documents are examined. Default 10." - changed
Output schema / anyOfPrevious 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" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "issuer", + "issuer_cik", + "issuer_name", + "form_kind", + "total_structured_filings", + "filings_parsed", + "filings_examined", + "filings_excluded_other_issuer", + "filings_not_examined", + "filings_failed", + "partial", + "structured_coverage_from", + "legacy_filings_before_coverage", + "filings" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / cap / descriptionPrevious value: -"The limit cap applied."New value: +"Result limit or document ceiling that stopped scanning." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when more structured filings exist than limit fetched."New value: +"True when indexed schedules remain unexamined after the result limit or scan ceiling." - added
Output schema / properties / filings_examinedAdded value: +{ + "description": "Matches + exclusions + failures; at most 50 documents.", + "type": "number" +} - added
Output schema / properties / filings_excluded_other_issuerAdded value: +{ + "description": "Schedules naming another issuer; no rows returned.", + "type": "number" +} - added
Output schema / properties / filings_failedAdded value: +{ + "description": "Failures in scan order; successes retained.", + "items": { + "additionalProperties": false, + "description": "One failed document.", + "properties": { + "accession_number": { + "description": "Accession to inspect with secedgar_get_filing.", + "type": "string" + }, + "reason": { + "description": "Document returned 404, or could not be parsed with a usable issuer CIK.", + "enum": [ + "document_not_found", + "unparseable" + ], + "type": "string" + } + }, + "required": [ + "accession_number", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / filings_not_examinedAdded value: +{ + "description": "Indexed schedules beyond the result limit or 50-document ceiling.", + "type": "number" +} - changed
Output schema / properties / filings_parsed / descriptionPrevious value: -"Filings fetched and parsed: total_structured_filings capped by limit."New value: +"Matching parsed filings, capped by limit." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no filings matched, naming the coverage boundary and the fallback."New value: +"Exclusions, document recovery, scan bounds, and dataframe guidance." - added
Output schema / properties / partialAdded value: +{ + "description": "True when filings_failed is nonempty, independently of truncation.", + "type": "boolean" +} - changed
Output schema / properties / total_structured_filings / descriptionPrevious value: -"Structured 13D/13G filings matching form_kind in the recent submissions window, before limit."New value: +"Indexed 13D/13G schedules matching form/amendment filters in the recent submissions window." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when filings were capped by limit."New value: +"True when schedules remain unexamined after the result limit or 50-document ceiling."
- Changed
secedgar_get_fund_holdings1 field changed- changed
Output schema / properties / holdings / items / properties / currency / descriptionPrevious value: -"ISO 4217 currency the position is denominated in."New value: +"ISO 4217 denomination; value_usd stays USD."
- Changed
secedgar_get_institutional_holdings13 fields changed- added
Output schema / properties / amendment_search_completeAdded value: +{ + "description": "False if archive discovery was bounded or unavailable.", + "type": "boolean" +} - added
Output schema / properties / amendmentsAdded value: +{ + "description": "Known amendments to the original report. Absent when none were found.", + "items": { + "description": "Same-period amendment; its holdings are not merged.", + "oneOf": [ + { + "additionalProperties": false, + "description": "Readable amendment.", + "properties": { + "accession_number": { + "description": "Amendment accession for secedgar_get_filing.", + "type": "string" + }, + "amendment_type": { + "description": "Cover-page type.", + "enum": [ + "RESTATEMENT", + "NEW HOLDINGS" + ], + "type": "string" + }, + "filing_date": { + "description": "Amendment filing date (YYYY-MM-DD).", + "type": "string" + } + }, + "required": [ + "accession_number", + "filing_date", + "amendment_type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amendment with unavailable type.", + "properties": { + "accession_number": { + "description": "Amendment accession for secedgar_get_filing.", + "type": "string" + }, + "amendment_type": { + "const": "UNAVAILABLE", + "description": "Type could not be read.", + "type": "string" + }, + "filing_date": { + "description": "Amendment filing date (YYYY-MM-DD).", + "type": "string" + }, + "unavailable_reason": { + "description": "Why the type is unavailable; inspect with secedgar_get_filing.", + "enum": [ + "missing_header", + "unreadable_header", + "lookup_failed", + "lookup_stopped" + ], + "type": "string" + } + }, + "required": [ + "accession_number", + "filing_date", + "amendment_type", + "unavailable_reason" + ], + "type": "object" + } + ] + }, + "type": "array" +} - changed
Output schema / properties / dataset / descriptionPrevious value: -"Dataframe of every position, shaped by consolidate; rows carry the filer keys and join across quarters on cusip + reporting_period. Absent when canvas is unavailable or there are no holdings."New value: +"Original-report positions, shaped by consolidate; join on cusip + reporting_period. Amendment positions are excluded. Absent without canvas or holdings." - changed
Output schema / properties / holdings / items / properties / cusip / descriptionPrevious value: -"9-digit CUSIP identifier. Absent when omitted by the filer."New value: +"CUSIP. Absent if unreported." - changed
Output schema / properties / holdings / items / properties / investment_discretion / descriptionPrevious value: -"SOLE sole discretion, DFND defined (shared or advised), OTR other. Absent when not reported, and on consolidated positions."New value: +"SOLE sole, DFND shared/advised, OTR other. Absent if unreported or consolidated." - changed
Output schema / properties / holdings / items / properties / market_value_usd / descriptionPrevious value: -"Market value in whole USD at the reporting date; values from filings before 2023-01-03, reported in thousands, are scaled to whole USD. Absent when not reported."New value: +"Whole USD at report date; pre-2023-01-03 filing values scaled from thousands. Absent if unreported." - changed
Output schema / properties / holdings / items / properties / shares_or_principal_amount / descriptionPrevious value: -"Shares (equities) or principal amount (debt). Absent when not reported."New value: +"Shares or debt principal. Absent if unreported." - changed
Output schema / properties / holdings / items / properties / shares_or_principal_type / descriptionPrevious value: -"SH shares, PRN principal amount (bonds, notes). Absent when not reported."New value: +"SH shares; PRN debt principal. Absent if unreported." - changed
Output schema / properties / holdings / items / properties / title_of_class / descriptionPrevious value: -"Security class (e.g., \"COM\", \"CL A\", \"ETF\"). Absent when not reported."New value: +"Security class (COM, CL A, ETF). Absent if unreported." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no filing was found or the result is empty, with alternatives."New value: +"Amendment disclosure, incomplete discovery, paging, and dataframe guidance." - changed
Output schema / properties / reporting_period / descriptionPrevious value: -"Calendar-quarter end this 13F covers (YYYY-MM-DD), from the cover page. Absent when the filing omits it."New value: +"Cover-page quarter end (YYYY-MM-DD). Absent if omitted." - changed
Output schema / properties / total_holdings_in_filing / descriptionPrevious value: -"Raw information-table rows in this filing, before consolidation and limit."New value: +"Original raw row count before consolidation or paging." - changed
Output schema / properties / total_positions / descriptionPrevious value: -"Distinct positions after consolidating sub-lines, before limit. Present only when consolidate=true."New value: +"Distinct positions before paging. Only with consolidate=true."
13 tool updates
- Changed
secedgar_company_search1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_match`: No company matches the query. `multiple_matches`: 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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. 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`: 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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_compare_companies1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `unknown_concept`: Every requested concept is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `unknown_concept`: Every requested concept is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_fetch_frames1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_find_holders1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: No cusip was given and the issuer does not resolve to a known EDGAR company. `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: No cusip was given and the issuer does not resolve to a known EDGAR company. `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_beneficial_owners1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. 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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_filing2 fields changed- changed
Input schema / properties / section / descriptionPrevious value: -"Jump to a named section, matched against every detected heading and the document's own lines (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'). The first match wins, in this order: a heading equal to the value, or whose title after its Item/Part marker equals it; the first Item or Part heading containing it; a document line equal to it — a subheading the outline omits ('Liquidity and Capital Resources'); the first other heading containing it; a document line starting with it. In a proxy statement (DEF 14A and its variants), whose ITEM headings are ballot proposals, the first heading of any kind containing the value comes before both document-line steps. Within each heading step a body heading wins over a table-of-contents row, which lands only when nothing else at that step matches. A line landing says so in the notice; table-of-contents rows and wrapped cross-references are never line landings. A leading 20-F sub-item label on a heading or line ('3D.', 'B.') is ignored, so 'risk factors' reaches '3D. RISK FACTORS'; the value itself is matched as given. A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16, and 'part i' never reaches Part II. Every step ignores case, whitespace, and quote style, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones; the steps comparing a whole heading or line (equal to, starting with) also ignore the punctuation between an Item or Part marker and its title, so 'Item 1A Risk Factors' reaches 'Item 1A. – Risk Factors'. Takes precedence over offset when both are provided, so leave it out when paging on with next_offset. On a miss, the error message includes the detected outline so you can pick the correct heading."New value: +"Jump to a named section, matched against every detected heading and the document's own lines (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'). The first match wins, in this order: a heading equal to the value, or whose title after its Item/Part marker equals it; the first Item or Part heading containing it; a document line equal to it — a subheading the outline omits ('Liquidity and Capital Resources') — unless the line labels a table row; the first other heading containing it; a table-row label equal to it, else a document line starting with it. In a proxy statement (DEF 14A and its variants), whose ITEM headings are ballot proposals, the first heading of any kind containing the value comes before both document-line steps. Within each heading step a body heading wins over a table-of-contents row, which lands only when nothing else at that step matches. A line landing says so in the notice; table-of-contents rows and wrapped cross-references are never line landings. A leading 20-F sub-item label on a heading or line ('3D.', 'B.') is ignored, so 'risk factors' reaches '3D. RISK FACTORS'; the value itself is matched as given. A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16, and 'part i' never reaches Part II. Every step ignores case, whitespace, and quote style, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones; the steps comparing a whole heading or line (equal to, starting with) also ignore the punctuation between an Item or Part marker and its title, so 'Item 1A Risk Factors' reaches 'Item 1A. – Risk Factors'. Takes precedence over offset when both are provided, so leave it out when paging on with next_offset. On a miss, the error message includes the detected outline so you can pick the correct heading." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string matched no detected heading and no line of the document. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string matched no detected heading and no line of the document. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_financials1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it — under \"annual\", an instant concept with no value dated on a fiscal-year end. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it — under \"annual\", an instant concept with no value dated on a fiscal-year end. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_fund_holdings1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series. `ambiguous_fund`: The fund name matches several EDGAR companies. `series_required`: The input resolves to a registrant trust that files reports for more than one fund series. `no_filings_found`: No NPORT-P report exists for this fund, or none covers the report_date requested. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series. `ambiguous_fund`: The fund name matches several EDGAR companies. `series_required`: The input resolves to a registrant trust that files reports for more than one fund series. `no_filings_found`: No NPORT-P report exists for this fund, or none covers the report_date requested. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_insider_transactions1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: A call without a date window finds no Form 4 filings in the recent submissions window. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: A call without a date window finds no Form 4 filings in the recent submissions window. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_institutional_holdings1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR matches — the entity files none, none exists for the requested quarter in the recent submissions window or the archive pages searched, or the manager filed a 13F-NT notice instead (for the requested quarter, or as its only recent 13F filing when no quarter is given). `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR matches — the entity files none, none exists for the requested quarter in the recent submissions window or the archive pages searched, or the manager filed a 13F-NT notice instead (for the requested quarter, or as its only recent 13F filing when no quarter is given). `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_material_events1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. 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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_get_snapshot1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler."
- Changed
secedgar_search_filings6 fields changed- changed
Input schema / properties / filed_after / descriptionPrevious value: -"Only include filings filed on or after this date (YYYY-MM-DD). This tool filters by date only with both bounds — pair it with filed_before."New value: +"Only include filings filed on or after this date (YYYY-MM-DD). Use alone or with filed_before; alone, the search runs through today (UTC)." - changed
Input schema / properties / filed_before / descriptionPrevious value: -"Only include filings filed on or before this date (YYYY-MM-DD). This tool filters by date only with both bounds — pair it with filed_after."New value: +"Only include filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after; alone, the search starts at 2001-01-01, or at 1993-01-01 (the archive start) for a date before 2001." - changed
Input schema / properties / query / descriptionPrevious value: -"Full-text search query. Optional — omit (or pass \"\") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms to browse by form and date. When present, supports exact phrases (\"material weakness\"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. A multi-class share ticker resolves in either form — ticker:BRK-B and ticker:BRK.B scope to the same issuer. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax."New value: +"Full-text search query. Optional — omit (or pass \"\") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms and browse by form type (forms) and date. When present, supports exact phrases (\"material weakness\"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. A multi-class share ticker resolves in either form — ticker:BRK-B and ticker:BRK.B scope to the same issuer. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax." - changed
Output schema / properties / effectiveQuery / descriptionPrevious value: -"The query as executed: a ticker:/cik: token shows as \"(entity scope: CIK …)\", a forms-only browse as \"(browse: forms …)\", and a pre-2001 range names its archive route and dates."New value: +"The query as executed: \"(entity scope: CIK …)\" for a ticker:/cik: token, \"(browse: forms …)\" for a forms-only browse, a pre-2001 range's archive route and dates (and quarters read, if the full-index cap bound), and \"(filed <after> to <before>)\" for a full-text search given one bound." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of filed_after or filed_before was provided. `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company. `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number. `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history. `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone). `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company. `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number. `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history. `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone). `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan. `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. `sec_unreachable`: SEC EDGAR gave no complete, readable response — on the last attempt made (the third, or an earlier one once this call's 40-second budget for SEC failures ran out) the connection failed, no response headers arrived within 15 seconds, or the body broke off or stalled for 15 seconds, each wait capped at what was left of that budget; a 200 body was not the JSON SEC serves; or earlier SEC failures had spent that budget, so the request was never sent. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "unresolved_ticker", - "invalid_cik", - "entity_not_found", - "missing_criteria", - "pre2001_full_text_unscoped", - "rate_limited", - "sec_unreachable" -]New value: +[ + "unresolved_ticker", + "invalid_cik", + "entity_not_found", + "missing_criteria", + "pre2001_full_text_unscoped", + "rate_limited", + "sec_unreachable" +]
13 tool updates
- Changed
secedgar_company_search2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_match`: No company matches the query. `multiple_matches`: 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."New value: +"Machine-readable failure mode. Declared by this tool: `no_match`: No company matches the query. `multiple_matches`: 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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_match", - "multiple_matches", - "rate_limited" -]New value: +[ + "no_match", + "multiple_matches", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_compare_companies2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `unknown_concept`: Every requested concept is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `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."New value: +"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `unknown_concept`: Every requested concept is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_companies_resolved", - "no_comparable_data", - "unknown_concept", - "rate_limited" -]New value: +[ + "no_companies_resolved", + "no_comparable_data", + "unknown_concept", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_fetch_frames2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_concept", - "no_data", - "rate_limited" -]New value: +[ + "unknown_concept", + "no_data", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_find_holders2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: No cusip was given and the issuer does not resolve to a known EDGAR company. `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given. `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."New value: +"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: No cusip was given and the issuer does not resolve to a known EDGAR company. `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "issuer_not_found", - "ambiguous_issuer", - "rate_limited" -]New value: +[ + "issuer_not_found", + "ambiguous_issuer", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_beneficial_owners2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "issuer_not_found", - "ambiguous_issuer", - "no_filings_found", - "rate_limited" -]New value: +[ + "issuer_not_found", + "ambiguous_issuer", + "no_filings_found", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_filing5 fields changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Character offset into the extracted document text. Pass next_offset from a truncated response to continue reading the next page. Default 0 reads from the beginning."New value: +"Character offset into the extracted document text. Pass next_offset from a truncated response to continue reading the next page, and leave section out: section takes precedence over offset. Default 0 reads from the beginning." - changed
Input schema / properties / section / descriptionPrevious value: -"Jump to a named section, matched case-insensitively against every detected heading (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'): a heading equal to the value, or whose title after its Item/Part marker equals it, wins first; otherwise the first heading containing it. A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16, and 'part i' never reaches Part II. With no heading match, a line of the document equal to the value, or else starting with it, is used — a subheading the outline omits ('Liquidity and Capital Resources') — and the notice says so; table-of-contents rows and wrapped cross-references are skipped. Matching also ignores whitespace and quote-style differences, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones. Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading."New value: +"Jump to a named section, matched against every detected heading and the document's own lines (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'). The first match wins, in this order: a heading equal to the value, or whose title after its Item/Part marker equals it; the first Item or Part heading containing it; a document line equal to it — a subheading the outline omits ('Liquidity and Capital Resources'); the first other heading containing it; a document line starting with it. In a proxy statement (DEF 14A and its variants), whose ITEM headings are ballot proposals, the first heading of any kind containing the value comes before both document-line steps. Within each heading step a body heading wins over a table-of-contents row, which lands only when nothing else at that step matches. A line landing says so in the notice; table-of-contents rows and wrapped cross-references are never line landings. A leading 20-F sub-item label on a heading or line ('3D.', 'B.') is ignored, so 'risk factors' reaches '3D. RISK FACTORS'; the value itself is matched as given. A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16, and 'part i' never reaches Part II. Every step ignores case, whitespace, and quote style, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones; the steps comparing a whole heading or line (equal to, starting with) also ignore the punctuation between an Item or Part marker and its title, so 'Item 1A Risk Factors' reaches 'Item 1A. – Risk Factors'. Takes precedence over offset when both are provided, so leave it out when paging on with next_offset. On a miss, the error message includes the detected outline so you can pick the correct heading." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string matched no detected heading and no line of the document. `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."New value: +"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string matched no detected heading and no line of the document. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "document_not_found", - "no_documents", - "binary_document", - "filing_not_found", - "offset_out_of_range", - "section_not_found", - "rate_limited" -]New value: +[ + "document_not_found", + "no_documents", + "binary_document", + "filing_not_found", + "offset_out_of_range", + "section_not_found", + "rate_limited", + "sec_unreachable" +] - changed
Output schema / properties / next_offset / descriptionPrevious value: -"Offset of the next page, to pass as offset; present while content_truncated is true."New value: +"Offset of the next page, to pass as offset without section; present while content_truncated is true."
- Changed
secedgar_get_financials2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it — under \"annual\", an instant concept with no value dated on a fiscal-year end. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it — under \"annual\", an instant concept with no value dated on a fiscal-year end. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_company", - "unknown_concept", - "no_concept_data", - "no_frame_data", - "no_period_data", - "no_unit_data", - "rate_limited" -]New value: +[ + "company_not_found", + "ambiguous_company", + "unknown_concept", + "no_concept_data", + "no_frame_data", + "no_period_data", + "no_unit_data", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_fund_holdings2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series. `ambiguous_fund`: The fund name matches several EDGAR companies. `series_required`: The input resolves to a registrant trust that files reports for more than one fund series. `no_filings_found`: No NPORT-P report exists for this fund, or none covers the report_date requested. `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."New value: +"Machine-readable failure mode. Declared by this tool: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series. `ambiguous_fund`: The fund name matches several EDGAR companies. `series_required`: The input resolves to a registrant trust that files reports for more than one fund series. `no_filings_found`: No NPORT-P report exists for this fund, or none covers the report_date requested. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "fund_not_found", - "ambiguous_fund", - "series_required", - "no_filings_found", - "rate_limited" -]New value: +[ + "fund_not_found", + "ambiguous_fund", + "series_required", + "no_filings_found", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_insider_transactions2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: A call without a date window finds no Form 4 filings in the recent submissions window. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: A call without a date window finds no Form 4 filings in the recent submissions window. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "no_filings_found", - "rate_limited" -]New value: +[ + "company_not_found", + "no_filings_found", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_institutional_holdings2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR matches — the entity files none, none exists for the requested quarter in the recent submissions window or the archive pages searched, or the manager filed a 13F-NT notice instead (for the requested quarter, or as its only recent 13F filing when no quarter is given). `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR matches — the entity files none, none exists for the requested quarter in the recent submissions window or the archive pages searched, or the manager filed a 13F-NT notice instead (for the requested quarter, or as its only recent 13F filing when no quarter is given). `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_entity", - "no_filings_found", - "no_info_table", - "rate_limited" -]New value: +[ + "company_not_found", + "ambiguous_entity", + "no_filings_found", + "no_info_table", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_material_events2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_match", - "multiple_matches", - "rate_limited" -]New value: +[ + "no_match", + "multiple_matches", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_get_snapshot2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_company", - "no_company_facts", - "rate_limited" -]New value: +[ + "company_not_found", + "ambiguous_company", + "no_company_facts", + "rate_limited", + "sec_unreachable" +]
- Changed
secedgar_search_filings2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of filed_after or filed_before was provided. `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company. `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number. `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history. `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone). `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan. `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."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of filed_after or filed_before was provided. `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company. `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number. `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history. `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone). `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan. `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. `sec_unreachable`: The last of three attempts to reach SEC EDGAR got no HTTP response — the connection failed, or no response headers arrived within 15 seconds. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "unresolved_ticker", - "invalid_cik", - "entity_not_found", - "missing_criteria", - "pre2001_full_text_unscoped", - "rate_limited" -]New value: +[ + "invalid_date_range", + "unresolved_ticker", + "invalid_cik", + "entity_not_found", + "missing_criteria", + "pre2001_full_text_unscoped", + "rate_limited", + "sec_unreachable" +]
5 tool updates
- Changed
secedgar_company_search7 fields changed- changed
Input schema / properties / filing_limit / descriptionPrevious value: -"Maximum number of filings to return in the inline list."New value: +"Maximum number of filings to return in the inline list. The list holds at most 50; a larger value returns 50, and the notice names where the rest are." - changed
Input schema / properties / filing_limit / maximumPrevious value: -50New value: +1000 - changed
Output schema / properties / cap / descriptionPrevious value: -"The `filing_limit` that was applied."New value: +"The inline limit applied: `filing_limit`, at most 50." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Dataframe of the full filtered history (recent window plus archive pages), staged only when the scan went past the recent window and the history exceeds filing_limit."New value: +"Dataframe of the full filtered history (recent window plus archive pages), staged only when the scan went past the recent window and the history exceeds the inline list (filing_limit, at most 50)." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no filings matched the forms filter, or when filing_limit withheld some."New value: +"Guidance when no filings matched the forms filter, or when the inline list withheld some — naming the dataframe, a larger filing_limit, or a secedgar_search_filings call to page through the rest." - changed
Output schema / properties / total_filings / descriptionPrevious value: -"Filings matching the filter across everything scanned; can exceed filing_limit."New value: +"Filings matching the filter across everything scanned; can exceed the inline list." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when more filings matched than `filing_limit` allowed into the inline list."New value: +"True when more filings matched than the inline list holds."
- Changed
secedgar_compare_companies2 fields changed- changed
Input schema / properties / period_type / descriptionPrevious value: -"Align on full calendar years (annual) or calendar quarters (quarterly). Quarterly comparisons of off-calendar filers are missing at least one calendar quarter per year — see caveats."New value: +"Align on fiscal years, each under the calendar-year key SEC frames it as (annual), or on calendar quarters (quarterly). Quarterly comparisons of off-calendar filers are missing at least one calendar quarter per year — see caveats." - changed
Output schema / properties / caveats / descriptionPrevious value: -"Comparability warnings (company-specific ones prefixed with the name), else empty: missing quarters; a concept stopping 2+ years behind the company's other reporting; period ends differing within a period; units differing across companies; values only before the inline window; merged inputs."New value: +"Comparability warnings (company ones prefixed with the name), else empty: missing quarters; a concept 2+ years behind the company's other lines; an instant with no fiscal-year-end value (annual); differing period ends or units; values only before the inline window; merged inputs."
- Changed
secedgar_dataframe_query2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment. `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*). `missing_table`: The SQL query references a df_<id> table that does not exist or has expired. `invalid_sql`: The SELECT fails to prepare — an unknown column or an invalid expression — or hits an engine error no more specific reason covers. `sql_execution_error`: The SELECT prepared but failed on the data it read — a cast or conversion that does not fit, an out-of-range value, or invalid input to a function. `register_as_clash`: The register_as target name already exists on the canvas. `non_select_statement`: The SQL is not a SELECT (DROP, INSERT, UPDATE, DDL, PRAGMA, EXPLAIN, etc.) or does not parse — only read-only SELECTs run against dataframes. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading or external-data table function such as read_csv, read_parquet, or glob. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist, such as the range() or generate_series() table functions. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment. `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*). `missing_table`: The SQL query references a df_<id> table that does not exist or has expired. `invalid_sql`: The SELECT fails to prepare — an unknown column or an invalid expression — or hits an engine error no more specific reason covers. `sql_execution_error`: The SELECT prepared but failed on the data it read — a cast or conversion that does not fit, an out-of-range value, or invalid input to a function. `register_as_clash`: The register_as target name already exists on the canvas. `non_select_statement`: The SQL is not a SELECT (DROP, INSERT, UPDATE, DDL, PRAGMA, EXPLAIN, etc.) or does not parse — only read-only SELECTs run against dataframes. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading or external-data table function (read_csv, read_parquet, glob), a function that reads an engine setting (current_setting, current_schema), or one that runs SQL or names a table from a string (query_table, or query() over anything but a single string literal). `sql_read_only`: The SQL names a file as a table (FROM 'data.csv') — the dataframe engine reads no files. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist, such as the range() or generate_series() table functions. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "canvas_unavailable", - "system_catalog_access", - "missing_table", - "invalid_sql", - "sql_execution_error", - "register_as_clash", - "non_select_statement", - "multi_statement", - "denied_function", - "plan_operator_not_allowed" -]New value: +[ + "canvas_unavailable", + "system_catalog_access", + "missing_table", + "invalid_sql", + "sql_execution_error", + "register_as_clash", + "non_select_statement", + "multi_statement", + "denied_function", + "sql_read_only", + "plan_operator_not_allowed" +]
- Changed
secedgar_get_filing4 fields changed- changed
Input schema / properties / section / descriptionPrevious value: -"Jump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16. Matching also ignores whitespace and quote-style differences, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones. Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading."New value: +"Jump to a named section, matched case-insensitively against every detected heading (e.g. 'risk factors', 'item 7', 'item 2.02', 'certain relationships'): a heading equal to the value, or whose title after its Item/Part marker equals it, wins first; otherwise the first heading containing it. A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16, and 'part i' never reaches Part II. With no heading match, a line of the document equal to the value, or else starting with it, is used — a subheading the outline omits ('Liquidity and Capital Resources') — and the notice says so; table-of-contents rows and wrapped cross-references are skipped. Matching also ignores whitespace and quote-style differences, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones. Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string did not match any detected heading in the document. `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."New value: +"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string matched no detected heading and no line of the document. `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." - changed
Output schema / properties / notice / descriptionPrevious value: -"How to read the next page, and which file was read when the archive does not serve the indexed primary."New value: +"How to read the next page, which file was read when the archive does not serve the indexed primary, when section landed on a document line rather than a detected heading, and how many headings were detected when the outline lists fewer." - changed
Output schema / properties / outline / descriptionPrevious value: -"Up to 50 headings, on the first page of a truncated response (offset=0, no section); pass a heading offset as offset, or its text as section."New value: +"Up to 50 detected headings, on the first page of a truncated response (offset=0, no section). Past 50, Item and Part headings come first (bare TOC copies of titled ones dropped), then the earliest others; the notice gives the detected count. Pass a heading offset as offset, or its text as section."
- Changed
secedgar_get_financials3 fields changed- changed
Input schema / properties / period_type / descriptionPrevious value: -"Filter to annual (FY) or quarterly (Q1-Q4) data. \"all\" returns both. When omitted, defaults to \"annual\"; instant (balance-sheet) concepts automatically fall back to returning the full series on the first call when the annual filter yields nothing (#48)."New value: +"Filter to annual (FY) or quarterly (Q1-Q4) data. \"all\" returns both. For an instant (balance-sheet) concept, \"annual\" returns the values dated on the filer's fiscal-year ends. When omitted, defaults to \"annual\", except that an instant concept returns its full series." - changed
Output schema / properties / data / descriptionPrevious value: -"Deduplicated series, newest first, one value per calendar period. A period SEC framed on a proxy statement figure takes the filer's own report instead; an annual period framed on a 10-Q trailing-twelve-month figure is left out."New value: +"Deduplicated series, newest first, one value per calendar period. A proxy-framed period takes the filer's own report; an annual frame held by a 10-Q trailing-twelve-month figure is left out. An instant's annual values are its fiscal-year-end values (CY2025Q2I for a June year end)." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it — under \"annual\", an instant concept with no value dated on a fiscal-year end. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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."
15 tool updates
- Changed
secedgar_company_search13 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Company ticker symbol (e.g., \"AAPL\", \"VOO\"), name (e.g., \"Apple\"), or CIK number (e.g., \"320193\"). Ticker is the fastest lookup and works for equities, ETFs, and mutual funds; a multi-class share ticker resolves in either form (\"BRK-B\" or \"BRK.B\"). Name search matches current and former names, and the corporate suffix does not have to match the registry's form (\"Beacon Financial Corporation\" finds \"Beacon Financial Corp\") — but Corp, Inc, Co, and Ltd stay distinct from each other, since separate registrants differ only by which one they use."New value: +"Company ticker symbol (e.g., \"AAPL\", \"VOO\"), name (e.g., \"Apple\"), or CIK number (e.g., \"320193\"). Ticker is the fastest lookup and works for equities, ETFs, and mutual funds; a multi-class share ticker resolves in either form (\"BRK-B\" or \"BRK.B\"). Name search matches current and former names, preferring a name the query matches exactly over one it only starts or appears in. The corporate suffix (Inc, Corp, Co, Ltd, PLC, LLC, LP, N.V., S.A., AG, SE) can be left off (\"Apple\" finds \"Apple Inc.\"; \"Rio Tinto\" lists both the Ltd and the PLC) or spelled out (\"Beacon Financial Corporation\" finds \"Beacon Financial Corp\"), but a suffix you include must match — Corp, Inc, Co, and Ltd stay distinct from each other, since separate registrants differ only by which one they use." - changed
Output schema / properties / class_id / descriptionPrevious value: -"SEC fund class ID (e.g. \"C000092055\"). Present when the query resolved via a fund ticker (ETF or mutual fund)."New value: +"SEC fund class ID (e.g. \"C000092055\"), present alongside series_id." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding the full filtered filing history (recent + archive pages), registered only when the scan reached beyond the recent window and the history exceeds filing_limit. Query the complete history — filings by form by year — with secedgar_dataframe_query; the inline `filings` list stays capped at filing_limit."New value: +"Dataframe of the full filtered history (recent window plus archive pages), staged only when the scan went past the recent window and the history exceeds filing_limit." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when the archive scan hit its page cap before exhausting the manifest — older matching filings exist beyond the dataframe."New value: +"True when the archive scan hit its page cap, so older matching filings exist beyond the dataframe." - changed
Output schema / properties / filings / items / properties / accession_number / descriptionPrevious value: -"Filing accession number, dash format (e.g., 0000320193-23-000106). Pass to secedgar_get_filing."New value: +"Accession number, dash format (e.g., 0000320193-23-000106). Pass to secedgar_get_filing." - changed
Output schema / properties / filings / items / properties / report_date / descriptionPrevious value: -"Period of report (YYYY-MM-DD). Absent for filings without a reporting period (proxy statements, ownership reports)."New value: +"Period of report (YYYY-MM-DD). Absent for forms without one (proxy statements, ownership reports)." - changed
Output schema / properties / fiscal_year_end / descriptionPrevious value: -"Fiscal year end (MM-DD format, e.g., \"09-26\"). Absent for filers SEC records no fiscal year end for (e.g. private or pre-IPO entities)."New value: +"Fiscal year end (MM-DD, e.g. \"09-26\"). Absent when SEC records none (e.g., private or pre-IPO entities)." - changed
Output schema / properties / history_scanned_through / descriptionPrevious value: -"Oldest filing date reached by the scan (YYYY-MM-DD). Filings older than this were not examined: the recent window holds the last year or 1,000 filings, whichever is more, and older filings live in archive pages fetched only when a date filter or an under-filled form filter requires them. Absent when no filings were scanned."New value: +"Oldest filing date the scan reached (YYYY-MM-DD); nothing older was examined. Archive pages past the recent window (last year or 1,000 filings) are read only for a date filter or an under-filled form filter. Absent when nothing was scanned." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when include_filings=true but no filings matched the forms filter, or when filing_limit withheld some."New value: +"Guidance when no filings matched the forms filter, or when filing_limit withheld some." - changed
Output schema / properties / series_id / descriptionPrevious value: -"SEC fund series ID (e.g. \"S000002839\"). Present when the query resolved via a fund ticker (ETF or mutual fund)."New value: +"SEC fund series ID (e.g. \"S000002839\"), when the query resolved via a fund ticker (ETF or mutual fund)." - changed
Output schema / properties / state_of_incorporation / descriptionPrevious value: -"State of incorporation (US two-letter code, e.g. \"DE\"). Omitted for some entities, including many foreign filers and individuals."New value: +"State of incorporation (US two-letter code, e.g. \"DE\"). Absent for many foreign filers and individuals." - changed
Output schema / properties / total_filings / descriptionPrevious value: -"Total filings matching the filter across everything scanned (recent window + any archive pages), which may exceed filing_limit and the inline list."New value: +"Filings matching the filter across everything scanned; can exceed filing_limit."
- Changed
secedgar_compare_companies17 fields changed- changed
Output schema / properties / caveats / descriptionPrevious value: -"Comparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept whose values stop at least two full years behind the rest of that company's reporting (either an XBRL tag SEC has retired, or a current tag the filer stopped using), period ends that differ inside one aligned period, concepts whose unit differs across companies, and — one line per concept — the companies that report a concept but have no value inside the inline periods, each with its newest period (its values are in the dataframe), and the concept inputs merged because they name the same concept. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging."New value: +"Comparability warnings (company-specific ones prefixed with the name), else empty: missing quarters; a concept stopping 2+ years behind the company's other reporting; period ends differing within a period; units differing across companies; values only before the inline window; merged inputs." - changed
Output schema / properties / cells / items / properties / frame / descriptionPrevious value: -"Underlying XBRL frame, which differs from period for point-in-time concepts (e.g. frame CY2024Q3I under period CY2024)."New value: +"Underlying XBRL frame; differs from period for point-in-time concepts (CY2024Q3I under CY2024)." - changed
Output schema / properties / cells / items / properties / tag / descriptionPrevious value: -"XBRL tag this value was reported under — one concept can walk several tags, so it can differ between periods of the same company."New value: +"XBRL tag this value was reported under; can differ between periods of one company." - changed
Output schema / properties / companies / items / descriptionPrevious value: -"One company that resolved and contributed to the matrix."New value: +"One company that contributed to the matrix." - changed
Output schema / properties / concepts / descriptionPrevious value: -"Concepts covered, in the order supplied. Inputs that name the same concept (revenue and Revenue, or one raw tag spelled twice) appear once, under the first spelling."New value: +"Concepts covered, in input order; inputs naming the same concept appear once, under the first spelling." - changed
Output schema / properties / concepts / items / properties / units / descriptionPrevious value: -"Distinct units this concept resolved to across the companies. More than one means the values are not directly comparable — see caveats."New value: +"Units this concept resolved to across companies; more than one means values are not directly comparable." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding the full aligned series across every period, not just the inline window. Columns match cells[]. Absent when canvas is unavailable."New value: +"Dataframe of the full aligned series, every period, with cells[] columns. Absent when canvas is unavailable." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / failed_companies / descriptionPrevious value: -"Companies excluded from the matrix. The comparison proceeds with the rest rather than failing the whole call."New value: +"Companies excluded from the matrix; the rest still compare." - changed
Output schema / properties / failed_companies / items / descriptionPrevious value: -"One company that could not be included, with a machine-readable reason."New value: +"One company that could not be included." - changed
Output schema / properties / failed_companies / items / properties / reason / descriptionPrevious value: -"Machine-readable failure. not_found: the input matched no CIK. ambiguous: it matched several, and the message lists them. no_company_facts: it resolved but the filer reports no XBRL. Match on this rather than the message."New value: +"not_found: no CIK matched. ambiguous: several matched; the message lists them. no_company_facts: resolved, but the filer reports no XBRL. Match on this, not the message." - changed
Output schema / properties / gaps / descriptionPrevious value: -"Company-concept pairs with no value in any period. Deliberately explicit — a missing value is never interpolated or zero-filled. A pair with values only in periods older than the inline window is not a gap; caveats names it."New value: +"Company-concept pairs with no value in any period (never zero-filled). A pair with values only before the inline window appears in caveats instead." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when the inline matrix dropped periods, or when the full aligned series is staged as a dataframe."New value: +"Guidance when the inline matrix dropped periods, or the full series is staged as a dataframe." - changed
Output schema / properties / periods / descriptionPrevious value: -"Calendar period keys covered by the inline matrix, newest first. Shorter than the requested periods when the cell count forced the window to shrink — the enrichment trailer reports the drop."New value: +"Period keys in the inline matrix, newest first; shorter than requested when the cell count shrank it (see notice)." - changed
Output schema / properties / unknown_concepts / descriptionPrevious value: -"Requested concepts that are neither a supported friendly name nor an XBRL tag (UpperCamelCase, e.g. NetIncomeLoss), reported once each rather than as a gap per company — secedgar_search_concepts lists every supported name. Empty when every concept resolved."New value: +"Concepts that are neither a supported name nor an XBRL tag, reported once instead of as per-company gaps; secedgar_search_concepts lists supported names. Empty when all resolved." - changed
Output schema / properties / unknown_concepts / items / properties / concept / descriptionPrevious value: -"Concept as supplied (trimmed) — neither a supported friendly name nor an XBRL tag."New value: +"Concept as supplied, trimmed." - changed
Output schema / properties / unknown_concepts / items / properties / derivation / descriptionPrevious value: -"How to build it from supported concepts when it is a standard combination, e.g. \"operating_cash_flow − capex\"."New value: +"How to build it from supported concepts, when it is a standard combination (e.g., \"operating_cash_flow − capex\")."
- Changed
secedgar_dataframe_query2 fields changed- changed
Output schema / properties / row_count / descriptionPrevious value: -"Rows the query produced, up to `row_limit` (exceeds `rows.length` when `preview` returned fewer). Read it with `row_count_capped`: when that is true this number is the `row_limit` cap itself, and the size of the full result is not in this response."New value: +"Rows the query produced, up to `row_limit`; exceeds `rows.length` when `preview` returned fewer. When `row_count_capped` is true this is the cap, not the full size." - changed
Output schema / properties / row_count_capped / descriptionPrevious value: -"True when the query matched more rows than `row_limit`, so `row_count` is that cap rather than a total. False means `row_count` is exact — including when it happens to equal `row_limit`."New value: +"True when more rows matched than `row_limit`, so `row_count` is the cap; false means `row_count` is exact."
- Changed
secedgar_fetch_frames14 fields changed- changed
Output schema / properties / caveats / descriptionPrevious value: -"Data-completeness warnings specific to this query. Populated for duration periods 'CY####Q[1-4]', where SEC XBRL omits filers' fiscal Q4 (reported only as the 10-K residual) — affected filers are silently absent from the frame. Populated for annual ('CY####') NetIncomeLoss frames, where a filer's row can be its proxy statement's pay-versus-performance figure rather than the 10-K's. Populated for an annual frame whose calendar year is still open or inside its 10-K filing window, where a filer's row can be a trailing-twelve-month figure from a 10-Q rather than a fiscal year. Also flags a value distribution whose top rows look like split or scale-factor artifacts. Otherwise empty."New value: +"Completeness warnings, else empty: quarterly frames (CY####Q#) omit fiscal-Q4 filers; annual NetIncomeLoss rows may be proxy pay-versus-performance figures; an annual frame still open or in its 10-K window may hold 10-Q trailing-twelve-month figures; top rows may be split or scale artifacts." - changed
Output schema / properties / data / items / properties / location / descriptionPrevious value: -"Business location (state or country). Absent when SEC has no location for this filer."New value: +"Business location (state or country). Absent when SEC has none." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe handle holding the full frames response. Absent when canvas is unavailable or materialization failed."New value: +"Dataframe of the full frame, every reporter. Absent when canvas is unavailable or staging failed." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / next_offset / descriptionPrevious value: -"Offset to pass on the next call to continue down the ranking. Absent on the last page (no companies remain past this one)."New value: +"Offset for the next page down the ranking. Absent on the last page." - changed
Output schema / properties / offset / descriptionPrevious value: -"Rank the returned page starts at, 0-based — the effective offset applied."New value: +"Rank the returned page starts at, 0-based." - changed
Output schema / properties / period_end_range / descriptionPrevious value: -"Range of period_end dates across the frame. SEC normalizes to calendar periods but filers report against their own fiscal year-ends, so a \"CY2023\" duration frame can contain period_ends from 2023-01-31 (January-FY filers like Walmart) to 2024-12-31 (calendar-FY filers reported late). Wide ranges mean cross-comparison mixes fiscal periods."New value: +"Range of period_end dates; filers report on their own fiscal years, so \"CY2023\" can span 2023-01-31 to 2024-12-31, mixing fiscal periods." - changed
Output schema / properties / related_tags / descriptionPrevious value: -"Alternate-DEFINITION XBRL tags (distinct from same-meaning `unqueried_tags`) that a meaningful share of filers use as their primary line for this metric — e.g. `cash` filers reporting `CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents` (incl. restricted cash), `equity` filers reporting `StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest` (incl. noncontrolling interest). These filers are NOT in `data` or the dataframe, so a whole-universe screen on the base tag silently under-counts. To recover them, run a separate fetch_frames against the alternate tag — do NOT blindly UNION (definitions differ; you would mix or double-count). Empty when the concept has no known high-coverage alternate."New value: +"Alternate-definition tags many filers use as their primary line (e.g., cash including restricted cash); those filers are absent from data. Fetch each separately; never blindly UNION, since definitions differ. Empty when none is known." - changed
Output schema / properties / related_tags / items / properties / tag / descriptionPrevious value: -"Alternate XBRL tag a meaningful share of filers report this metric under instead."New value: +"Alternate XBRL tag those filers report under." - changed
Output schema / properties / taxonomy / descriptionPrevious value: -"Frames namespace the tag was read from (us-gaap or dei) — a friendly name mapped to dei reads dei under the us-gaap default."New value: +"Frames namespace the tag was read from (us-gaap or dei); a friendly name mapped to dei reads dei." - changed
Output schema / properties / unit / descriptionPrevious value: -"Unit of measure used for the lookup (always normalized to dashed form, e.g. \"USD-per-shares\")."New value: +"Unit of measure, in dashed form (e.g., \"USD-per-shares\")." - changed
Output schema / properties / unqueried_tags / descriptionPrevious value: -"Other same-meaning XBRL tags in the friendly-name mapping that this call did NOT query (historical/variant spellings of the same metric). Empty for raw tags or single-tag concepts — for alternate-DEFINITION tags some filers use instead, see `related_tags`. For \"revenue\" this typically lists `Revenues`, `SalesRevenueNet`, `SalesRevenueGoodsNet` — filers reporting under legacy variants are absent from `data`; call again per tag and UNION/COALESCE in SQL to recover them."New value: +"Same-meaning mapped tags this call did not query (e.g., SalesRevenueNet for revenue); their filers are absent from data, so fetch each and UNION/COALESCE in SQL. Empty for raw tags and single-tag concepts." - changed
Output schema / properties / value_distribution / descriptionPrevious value: -"Distribution stats across the full frame, computed during materialization. Use `max_to_p95_ratio` as the primary outlier signal — it catches scale-factor anomalies even when median is 0 or negative."New value: +"Distribution across the full frame; max_to_p95_ratio is the outlier signal." - changed
Output schema / properties / value_distribution / properties / max_to_p95_ratio / descriptionPrevious value: -"Maximum value divided by 95th percentile. Robust to zero/negative bulk (unlike median-based ratios — many frames have median = 0 or negative, e.g. EPS with many loss-making filers). Typical heavy-tail frames sit in the 10–50× range (mega-caps over the rest); ratios above ~200× usually indicate a filer-side XBRL scale-factor error (wrong `decimals` attribute) — verify the topmost row(s) in `data` before trusting absolute rankings."New value: +"Max divided by p95. Heavy-tail frames sit near 10–50×; above ~200× usually means a filer-side scale-factor error, so check the top rows of data before trusting rankings."
- Changed
secedgar_find_holders13 fields changed- changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding every fetched filer row, each carrying the issuer key and quarter so it joins across issuers and quarters. Absent when the result fits inline, canvas is unavailable, or materialization failed. Query with secedgar_dataframe_query."New value: +"Dataframe of every fetched filer row, keyed by issuer and quarter for cross-issuer joins. Absent when the result fits inline, canvas is unavailable, or staging failed." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when more filers exist beyond the fetch budget — total_filings exceeds fetched."New value: +"True when total_filings exceeds fetched, so more filers exist." - changed
Output schema / properties / fetched / descriptionPrevious value: -"Filings retrieved from the index, capped by the fetch budget of 500. Equals total_filings when the whole window fit inside the budget."New value: +"Filings retrieved, at most 500; equals total_filings when the window fit." - changed
Output schema / properties / holders / descriptionPrevious value: -"One page of filers, capped at limit. Order carries no position-size meaning — see the ordering note."New value: +"One page of filers, capped at limit; order says nothing about position size." - changed
Output schema / properties / holders / items / properties / filer_cik / descriptionPrevious value: -"Filer CIK, zero-padded to 10 digits. Pass as company to secedgar_get_institutional_holdings for this manager's positions."New value: +"Filer CIK, zero-padded to 10 digits; pass as company to secedgar_get_institutional_holdings." - changed
Output schema / properties / holders / items / properties / filer_name / descriptionPrevious value: -"Institutional manager that filed, with ticker/CIK parentheticals stripped."New value: +"Institutional manager that filed, ticker/CIK parentheticals stripped." - changed
Output schema / properties / holders / items / properties / form / descriptionPrevious value: -"Form type, \"13F-HR\" or \"13F-HR/A\" for an amendment. Absent when the index carries no form tag."New value: +"\"13F-HR\", or \"13F-HR/A\" for an amendment. Absent when the index carries no form tag." - changed
Output schema / properties / holders_in_quarter / descriptionPrevious value: -"Distinct managers among the fetched filings reporting this quarter as their period — the set paged by limit and materialized on the dataframe. Lower than fetched by the filings dropped as amendments restating other quarters, and by managers that amended this quarter (kept once, at their latest filing)."New value: +"Distinct managers reporting this quarter among fetched filings: the set limit pages and the dataframe holds. Other-quarter amendments drop; a manager that amended counts once, at its latest filing." - changed
Output schema / properties / quarter / descriptionPrevious value: -"Reporting quarter searched, \"YYYY-QN\" — the requested one, or the applied default."New value: +"Reporting quarter searched, \"YYYY-QN\": the requested one or the default." - changed
Output schema / properties / resolved_issuer_name / descriptionPrevious value: -"EDGAR-conformed company name the issuer resolved to, and the phrase that was searched. Absent when cusip was supplied (no company lookup runs)."New value: +"EDGAR-conformed name the issuer resolved to, also the phrase searched. Absent when cusip was supplied." - changed
Output schema / properties / search_mode / descriptionPrevious value: -"Which key matched the information tables. \"cusip\" matches the identifier the table itself carries; \"name\" phrase-matches the filing text and is looser in both directions."New value: +"\"cusip\" matches the information table's identifier; \"name\" phrase-matches filing text, looser both ways." - changed
Output schema / properties / total_filings / descriptionPrevious value: -"Total 13F-HR filings matching the search key inside the filing window, as reported by the index. A slight over-count of this quarter's holders on two counts, both of which the returned rows correct for: a few percent are amendments restating an older quarter, and a few more are managers amending their own report for this quarter, which puts them in the window twice."New value: +"13F-HR filings matching the search key in the window, per the index; slightly over-counts holders (amendments of older quarters, managers amending this one), which holders_in_quarter corrects."
- Changed
secedgar_get_beneficial_owners20 fields changed- changed
Output schema / properties / dataset / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / event_date / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / purpose_of_transaction / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / purpose_truncated / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / aggregate_amount_owned / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / cik / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / citizenship / descriptionPrevious 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)." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / excludes_certain_shares / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / notes / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / percent_of_class / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / reporting_persons / items / properties / person_types / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / security_class / descriptionPrevious 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." - changed
Output schema / properties / filings_parsed / descriptionPrevious value: -"Filings actually fetched and parsed — total_structured_filings capped by limit."New value: +"Filings fetched and parsed: total_structured_filings capped by limit." - changed
Output schema / properties / legacy_filings_before_coverage / descriptionPrevious 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." - changed
Output schema / properties / notice / descriptionPrevious 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." - changed
Output schema / properties / structured_coverage_from / descriptionPrevious 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." - changed
Output schema / properties / total_structured_filings / descriptionPrevious 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."
- Changed
secedgar_get_filing27 fields changed- changed
Input schema / properties / section / descriptionPrevious value: -"Jump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). Matching also ignores whitespace and quote-style differences, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones. Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading."New value: +"Jump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). A value ending in a number matches only that number: 'item 1' reaches Item 1 and Item 1A, never Items 10–16. Matching also ignores whitespace and quote-style differences, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones. Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading." - changed
Output schema / properties / content_total_length / descriptionPrevious value: -"Full document length before any truncation."New value: +"Full document length in characters." - changed
Output schema / properties / documents / descriptionPrevious value: -"Filing documents grouped by category. Every name is a valid document input EXCEPT entries carrying binary: true — scanned pages, PDFs, packaged archives and spreadsheets, which hold no text and are rejected with a binary_document error. Scans can outnumber readable documents in a filing, so read the flag before picking a name. XBRL viewer artifacts are suppressed by default; setting include_xbrl=true surfaces them under the xbrl bucket."New value: +"Filing documents by category. Any name is a valid document input except entries with binary: true, which fail with binary_document; scans can outnumber readable documents." - changed
Output schema / properties / documents / properties / auxiliary / descriptionPrevious value: -"Other supporting documents that aren't the primary, exhibits, or XBRL artifacts (cover pages, audit consent letters, embedded graphics)."New value: +"Other supporting documents: cover pages, consent letters, graphics." - changed
Output schema / properties / documents / properties / auxiliary / items / properties / binary / descriptionPrevious value: -"Present and true when the entry holds binary bytes — a scanned page or logo, a PDF exhibit, a packaged archive or spreadsheet. These cannot be converted to text and are rejected by the document input. Absent for readable entries."New value: +"True for a binary entry (scan, PDF, archive, spreadsheet); absent otherwise." - changed
Output schema / properties / documents / properties / auxiliary / items / properties / description / descriptionPrevious value: -"Human-readable description (e.g., \"Annual Report\", \"Subsidiaries of the Registrant\"). Absent when SEC published none for this entry."New value: +"SEC description (e.g., \"Subsidiaries of the Registrant\"). Absent when none." - changed
Output schema / properties / documents / properties / auxiliary / items / properties / type / descriptionPrevious value: -"SEC document type from the submission header (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\", \"XML\"). When the submission header is unavailable, falls back to a label inferred from the filename: known XBRL artifacts (\"XBRL-LINKBASE\", \"XBRL-INSTANCE\", etc.), \"exhibit\" for common exhibit filename patterns (ex-21.htm, exhibit21, dex991), \"GRAPHIC\"/\"PDF\"/\"BINARY\" for known binary file extensions, and \"unknown\" for everything else."New value: +"SEC document type (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\"), or without a submission header a filename-inferred label (\"exhibit\", \"PDF\", \"unknown\")." - changed
Output schema / properties / documents / properties / exhibits / descriptionPrevious value: -"Filed exhibits (EX-21 subsidiaries, EX-31/32 certifications, EX-99 press releases, etc.). Excludes XBRL technical exhibits (EX-101.*). Identified by the EX- prefix on the document type, or by common exhibit filename patterns when the submission header is unavailable (type \"exhibit\"). Exhibits with unrecognizable filenames may still appear under auxiliary in the header-less case."New value: +"Filed exhibits (EX-21, EX-31/32, EX-99, etc.), excluding XBRL EX-101.*; without a submission header, matched by filename (type \"exhibit\"), the rest under auxiliary." - changed
Output schema / properties / documents / properties / exhibits / items / properties / binary / descriptionPrevious value: -"Present and true when the entry holds binary bytes — a scanned page or logo, a PDF exhibit, a packaged archive or spreadsheet. These cannot be converted to text and are rejected by the document input. Absent for readable entries."New value: +"True for a binary entry (scan, PDF, archive, spreadsheet); absent otherwise." - changed
Output schema / properties / documents / properties / exhibits / items / properties / description / descriptionPrevious value: -"Human-readable description (e.g., \"Annual Report\", \"Subsidiaries of the Registrant\"). Absent when SEC published none for this entry."New value: +"SEC description (e.g., \"Subsidiaries of the Registrant\"). Absent when none." - changed
Output schema / properties / documents / properties / exhibits / items / properties / type / descriptionPrevious value: -"SEC document type from the submission header (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\", \"XML\"). When the submission header is unavailable, falls back to a label inferred from the filename: known XBRL artifacts (\"XBRL-LINKBASE\", \"XBRL-INSTANCE\", etc.), \"exhibit\" for common exhibit filename patterns (ex-21.htm, exhibit21, dex991), \"GRAPHIC\"/\"PDF\"/\"BINARY\" for known binary file extensions, and \"unknown\" for everything else."New value: +"SEC document type (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\"), or without a submission header a filename-inferred label (\"exhibit\", \"PDF\", \"unknown\")." - changed
Output schema / properties / documents / properties / primary / descriptionPrevious value: -"Primary filing document(s). Typically a single entry whose type matches the form (e.g., \"10-K\")."New value: +"Primary document(s), typically one entry whose type matches the form." - changed
Output schema / properties / documents / properties / primary / items / properties / binary / descriptionPrevious value: -"Present and true when the entry holds binary bytes — a scanned page or logo, a PDF exhibit, a packaged archive or spreadsheet. These cannot be converted to text and are rejected by the document input. Absent for readable entries."New value: +"True for a binary entry (scan, PDF, archive, spreadsheet); absent otherwise." - changed
Output schema / properties / documents / properties / primary / items / properties / description / descriptionPrevious value: -"Human-readable description (e.g., \"Annual Report\", \"Subsidiaries of the Registrant\"). Absent when SEC published none for this entry."New value: +"SEC description (e.g., \"Subsidiaries of the Registrant\"). Absent when none." - changed
Output schema / properties / documents / properties / primary / items / properties / type / descriptionPrevious value: -"SEC document type from the submission header (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\", \"XML\"). When the submission header is unavailable, falls back to a label inferred from the filename: known XBRL artifacts (\"XBRL-LINKBASE\", \"XBRL-INSTANCE\", etc.), \"exhibit\" for common exhibit filename patterns (ex-21.htm, exhibit21, dex991), \"GRAPHIC\"/\"PDF\"/\"BINARY\" for known binary file extensions, and \"unknown\" for everything else."New value: +"SEC document type (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\"), or without a submission header a filename-inferred label (\"exhibit\", \"PDF\", \"unknown\")." - changed
Output schema / properties / documents / properties / xbrl / descriptionPrevious value: -"XBRL viewer artifacts and machine-readable taxonomy files. Only present when include_xbrl=true."New value: +"XBRL viewer artifacts and taxonomy files. Present only when include_xbrl=true." - changed
Output schema / properties / documents / properties / xbrl / items / properties / binary / descriptionPrevious value: -"Present and true when the entry holds binary bytes — a scanned page or logo, a PDF exhibit, a packaged archive or spreadsheet. These cannot be converted to text and are rejected by the document input. Absent for readable entries."New value: +"True for a binary entry (scan, PDF, archive, spreadsheet); absent otherwise." - changed
Output schema / properties / documents / properties / xbrl / items / properties / description / descriptionPrevious value: -"Human-readable description (e.g., \"Annual Report\", \"Subsidiaries of the Registrant\"). Absent when SEC published none for this entry."New value: +"SEC description (e.g., \"Subsidiaries of the Registrant\"). Absent when none." - changed
Output schema / properties / documents / properties / xbrl / items / properties / type / descriptionPrevious value: -"SEC document type from the submission header (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\", \"XML\"). When the submission header is unavailable, falls back to a label inferred from the filename: known XBRL artifacts (\"XBRL-LINKBASE\", \"XBRL-INSTANCE\", etc.), \"exhibit\" for common exhibit filename patterns (ex-21.htm, exhibit21, dex991), \"GRAPHIC\"/\"PDF\"/\"BINARY\" for known binary file extensions, and \"unknown\" for everything else."New value: +"SEC document type (e.g., \"10-K\", \"EX-21.1\", \"GRAPHIC\"), or without a submission header a filename-inferred label (\"exhibit\", \"PDF\", \"unknown\")." - changed
Output schema / properties / form / descriptionPrevious value: -"Form type (e.g., \"10-K\", \"10-Q\"). From the company's submissions feed for a recent filing, else from the filing's own SEC header. Absent only when neither source carries it."New value: +"Form type (e.g., \"10-K\"), from the submissions feed or the filing's SEC header. Absent only when neither has it." - changed
Output schema / properties / next_offset / descriptionPrevious value: -"Character offset to pass as offset on the next call to continue reading. Only present when the response was truncated. Calling agents should follow this until content_truncated is false."New value: +"Offset of the next page, to pass as offset; present while content_truncated is true." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance on reading the next page when the content was capped."New value: +"How to read the next page, and which file was read when the archive does not serve the indexed primary." - changed
Output schema / properties / outline / descriptionPrevious value: -"Document outline — up to 50 detected headings with their character offsets. Present on the first page of a truncated response (offset=0, no section). Use a heading offset as offset, or pass heading text as section, to jump to that section."New value: +"Up to 50 headings, on the first page of a truncated response (offset=0, no section); pass a heading offset as offset, or its text as section." - changed
Output schema / properties / outline / items / properties / offset / descriptionPrevious value: -"Character offset of this heading in the full document. Pass as offset to jump directly to this section."New value: +"Character offset of this heading in the full document; pass as offset." - changed
Output schema / properties / period_ending / descriptionPrevious value: -"Period the filing reports on (YYYY-MM-DD), from the same source as form. Absent for forms with no period of report (S-8, Form 4, proxy statements) and when neither source carries it."New value: +"Period of report (YYYY-MM-DD), from the same source as form. Absent for forms without one (S-8, Form 4, proxy statements) or when neither source has it." - changed
Output schema / properties / primary_document / descriptionPrevious value: -"Filename of the filing's actual primary document (e.g., the 10-K HTML file)."New value: +"Filename of the primary document. When the archive does not serve the one the index names (common in 2000–2001), this is the full submission file <accession>.txt instead; the notice names both." - changed
Output schema / properties / requested_document / descriptionPrevious value: -"Filename of the specific document requested via the document param. Only present when document differs from primary_document."New value: +"Filename requested via document. Present only when it differs from primary_document."
- Changed
secedgar_get_financials15 fields changed- added
Input schema / properties / unitAdded value: +{ + "description": "SEC unit key to read the series in, for a concept reported in more than one (e.g. \"ZAR\" and a \"USD\" convenience translation, or \"USD/EUR\" among exchange-rate pairs). \"USD-per-shares\" is read as \"USD/shares\". When omitted, the series takes the unit of its newest value, then the unit with more periods; any other units are named in caveats.", + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / caveats / descriptionPrevious value: -"Data-completeness warnings about the returned series. Two kinds. On quarterly results, one entry when one or two calendar quarters are absent from every recent qualifying year — SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact, so the calendar quarter fiscal Q4 spans has no frame-tagged value, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. Applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones. On any result, one entry when the series stops well short of today — either because the concept resolved to an XBRL tag SEC has retired from the taxonomy (the current tags reported nothing), or because a current tag's series ends more than two years plus a filing window back, which is what a filer migrating to a different element or dropping the disclosure looks like. Absent when the series has nothing to flag."New value: +"Completeness warnings, absent when none apply: other units the concept is reported in, with period counts and spans (pass unit to read one); quarters missing from every recent year (SEC reports fiscal Q4 only within the 10-K); a series ending well short of today (a retired or dropped tag)." - changed
Output schema / properties / concept / descriptionPrevious value: -"XBRL tag behind the newest value. A friendly name can walk several tags, so each row names its own."New value: +"XBRL tag behind the newest value; each row names its own tag." - changed
Output schema / properties / data / descriptionPrevious value: -"Deduplicated time series, newest first — one value per calendar period. Where SEC's period frame sits on a proxy statement's figure (the pay-versus-performance table re-tags net income), the value comes from the filer's own report of the same period; an annual period SEC framed on a 10-Q's trailing-twelve-month figure is left out, since the filer has not closed that year."New value: +"Deduplicated series, newest first, one value per calendar period. A period SEC framed on a proxy statement figure takes the filer's own report instead; an annual period framed on a 10-Q trailing-twelve-month figure is left out." - changed
Output schema / properties / data / items / descriptionPrevious value: -"One reported value with its period, fiscal context, source filing, and source tag."New value: +"One reported value with its period, source filing, and tag." - changed
Output schema / properties / data / items / properties / fiscal_period / descriptionPrevious value: -"Fiscal period of the source filing (FY, Q1, Q2, Q3, Q4), not the data period. Null when the source filing did not encode a fiscal period."New value: +"Fiscal period of the source filing (FY, Q1–Q4), not of the data period. Null when not encoded." - changed
Output schema / properties / data / items / properties / fiscal_year / descriptionPrevious value: -"Fiscal year of the source filing, not the data period — every comparative period restated in the same filing carries that filing's fiscal year, so use end (or period) as the time key. Null when the source filing did not encode a fiscal year."New value: +"Fiscal year of the source filing, not of the data period (restated comparatives carry the filing's year); key time on end. Null when not encoded." - changed
Output schema / properties / data / items / properties / tag / descriptionPrevious value: -"XBRL tag this value was reported under — differs from concept when an older or successor tag in the friendly name answers this period."New value: +"XBRL tag this value was reported under; differs from concept when an older or successor tag answers this period." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe handle holding the same time series. Use for cross-company JOINs via secedgar_dataframe_query. The source-filing fiscal keys are materialized as source_filing_fy/source_filing_fp — order, group, and window by period_end, not by those columns. Absent when canvas is unavailable."New value: +"Dataframe of the same series; fiscal keys are source_filing_fy/source_filing_fp, so order by period_end. Absent when canvas is unavailable." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / description / descriptionPrevious value: -"XBRL taxonomy description of the concept tag. Often absent for company-extension tags or older concepts."New value: +"XBRL taxonomy description of the tag. Often absent for extension tags and older concepts." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it. `no_unit_data`: The unit input names a unit the resolved concept is not reported in for this company. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_company", - "unknown_concept", - "no_concept_data", - "no_frame_data", - "no_period_data", - "rate_limited" -]New value: +[ + "company_not_found", + "ambiguous_company", + "unknown_concept", + "no_concept_data", + "no_frame_data", + "no_period_data", + "no_unit_data", + "rate_limited" +] - changed
Output schema / properties / tags_tried / descriptionPrevious value: -"XBRL tags that were attempted (shown when using friendly names that map to multiple tags)."New value: +"XBRL tags attempted, when a friendly name maps to several." - changed
Output schema / properties / unit / descriptionPrevious value: -"Unit of measure of the newest value (e.g., \"USD\", \"shares\", \"USD/shares\")."New value: +"Unit of every value in data (e.g., \"USD\", \"USD/shares\"): the unit input when given (an unreported one fails with no_unit_data), else the newest value's unit, then the unit with more periods. A series never mixes units."
- Changed
secedgar_get_fund_holdings17 fields changed- changed
Output schema / properties / available_report_periods / descriptionPrevious value: -"Period end dates of this fund's reports, newest first — the horizon report_date can address, not the fund's full history. It reaches back roughly a decade of quarterly reports, and a period older than that is refused rather than served. A period inside the horizon can still be missing from the list: the dates come from the registrant's recent submissions window, which a trust filing thousands of reports a year outruns in months, and a report the window no longer reaches is dated by reading it only when report_date asks for it."New value: +"Period end dates of this fund's reports, newest first: what report_date can address, about a decade back. A trust filing thousands of reports a year can miss periods here that report_date still reaches." - changed
Output schema / properties / class_ids / descriptionPrevious value: -"SEC class IDs of the share classes covered. One report covers every class of the series, so a fund with both an ETF and an admiral-share class reports them together."New value: +"SEC class IDs covered; one report covers every class of the series." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding every position in the report (the inline holdings[] is a preview capped at limit). Each row carries the fund keys — series_id, registrant_cik, report_period_date, accession_number — alongside the position fields, so it joins against the 13F and insider dataframes on cusip. Absent when canvas is unavailable or the report had no positions."New value: +"Dataframe of every position, each row carrying the fund keys; joins 13F and insider dataframes on cusip. Absent when canvas is unavailable or the report had no positions." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / holdings / items / properties / asset_category / descriptionPrevious value: -"SEC asset-type code — EC equity-common, EP equity-preferred, DBT debt, RA repurchase agreement, STIV short-term investment vehicle, DE derivative. A filer that classifies a position as Other reports its own label here instead of a code (\"Right\"), because the code in that case is just \"OTHER\"."New value: +"SEC asset-type code (EC equity-common, EP equity-preferred, DBT debt, RA repurchase agreement, STIV short-term investment vehicle, DE derivative), or the filer's own label for Other (\"Right\")." - changed
Output schema / properties / holdings / items / properties / balance / descriptionPrevious value: -"Units held, counted in whatever `units` names — shares, principal, or contracts."New value: +"Units held, in whatever `units` names (shares, principal, or contracts)." - changed
Output schema / properties / holdings / items / properties / issuer_category / descriptionPrevious value: -"SEC issuer-type code — CORP corporate, MUN municipal, USGSE US government-sponsored, RF registered fund. A filer that classifies an issuer as Other reports its own label here instead of a code (\"Future\", \"Warrant\")."New value: +"SEC issuer-type code (CORP corporate, MUN municipal, USGSE US government-sponsored, RF registered fund), or the filer's own label for Other (\"Future\")." - changed
Output schema / properties / holdings / items / properties / name / descriptionPrevious value: -"Issuer name as the fund reports it. A derivative position routinely reports the literal \"N/A\" here and names the instrument in title instead, so group and label positions by title when asset_category marks a derivative."New value: +"Issuer name as reported. Derivatives often report \"N/A\" and name the instrument in title." - changed
Output schema / properties / holdings / items / properties / percent_of_net_assets / descriptionPrevious value: -"Percent of the fund's net assets, as the filer computes it. Negative on a short position — a leveraged fund's swap or futures leg regularly reports several percent below zero — so this is not bounded at 0."New value: +"Percent of the fund's net assets as the filer computes it; negative on short positions, so not bounded at 0." - changed
Output schema / properties / is_final_filing / descriptionPrevious value: -"True when the fund reports this as its last filing on the series, which marks a liquidation or merger. Absent when the filing does not answer."New value: +"True when the fund marks this its last filing for the series (liquidation or merger). Absent when unstated." - changed
Output schema / properties / next_offset / descriptionPrevious value: -"Offset to pass on the next call to continue through the portfolio. Absent on the last page."New value: +"Offset for the next page. Absent on the last page." - changed
Output schema / properties / publication_lag_days / descriptionPrevious value: -"Days between the portfolio date and the filing date. Absent when the report omits its period date."New value: +"Days from the portfolio date to the filing date. Absent when the report omits its period date." - changed
Output schema / properties / report_period_date / descriptionPrevious value: -"Last day of the period this portfolio is reported as of (YYYY-MM-DD). Holdings are the fund's positions on this date, not today's. Absent only when the filer omits it."New value: +"Portfolio date (YYYY-MM-DD): positions as of this date, not today. Absent only when the filer omits it." - changed
Output schema / properties / report_period_end / descriptionPrevious value: -"Last day of the fiscal year the reporting period falls in (YYYY-MM-DD) — the fund's fiscal year end, not the portfolio date."New value: +"Fiscal year end the reporting period falls in (YYYY-MM-DD), not the portfolio date." - changed
Output schema / properties / series_id / descriptionPrevious value: -"SEC series ID of the fund this report covers. Absent when the registrant files as a single fund with no series structure, which is how some older exchange-traded trusts are organized."New value: +"SEC series ID of the fund. Absent when the registrant files as a single fund with no series." - changed
Output schema / properties / series_name / descriptionPrevious value: -"Fund name as the filer states it on the report. A closed-end fund organized as a single registrant names itself here with no series_id alongside; absent only when the filer leaves the field blank or writes \"N/A\"."New value: +"Fund name on the report; a single-registrant closed-end fund names itself here, with no series_id. Absent when blank or \"N/A\"." - changed
Output schema / properties / total_holdings / descriptionPrevious value: -"Positions in the report, before offset and limit — the size of the full portfolio."New value: +"Positions in the full report, before offset and limit."
- Changed
secedgar_get_insider_transactions18 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "issuer_name", - "issuer_cik", - "transactions", - "filings_scanned" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "issuer_name", + "issuer_cik", + "transactions", + "filings_scanned", + "filings_other_issuer" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding the full parsed transaction set from the scanned filings (the inline transactions[] is a preview capped at limit). Each row carries the issuer (issuer_cik, issuer_ticker) plus the transaction fields, so it aggregates net buy/sell by insider and joins across issuers. Query with secedgar_dataframe_query. Absent when canvas is unavailable or no transactions were parsed."New value: +"Dataframe of every parsed transaction, issuer keys on each row, for net buy/sell by insider and cross-issuer joins. Absent when canvas is unavailable or nothing parsed." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when Form 4 filings exist beyond those parsed — past the newest-filings sample, or, with a date window, inside the window beyond the 100-filing cap or past the 10 archive pages read. Narrow the window to reach the rest."New value: +"True when Form 4 filings exist past those parsed (the newest-filings sample, or a window's 100-filing or 10-page cap); narrow the window to reach them." - added
Output schema / properties / filings_other_issuerAdded value: +{ + "description": "Scanned Form 4 filings naming a different issuer, filed by this company as a reporting owner of another (e.g., a 10% holder of a fund). They are that issuer's activity, so they add no transactions here or in the dataframe.", + "type": "number" +} - changed
Output schema / properties / filings_scanned / descriptionPrevious value: -"Number of Form 4 filings scanned to produce the result."New value: +"Form 4 filings scanned, including those in filings_other_issuer." - changed
Output schema / properties / history_scanned_through / descriptionPrevious value: -"Filing date of the oldest Form 4 parsed (YYYY-MM-DD). Present only when a date window was given; absent when the window held no Form 4 filing."New value: +"Filing date of the oldest Form 4 parsed (YYYY-MM-DD). Present only with a date window that held a Form 4." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when results are empty after filtering — explains the filter applied and suggests alternatives."New value: +"Why the result is empty (the filter, or every scanned filing naming another issuer), and the dataframe pointer when staged." - changed
Output schema / properties / transactions / descriptionPrevious value: -"Insider transactions, newest filing first. Preview capped at `limit` — the full scanned set lives on the canvas dataframe (see `dataset`)."New value: +"Insider transactions, newest filing first, capped at limit; the dataframe holds the full parsed set." - changed
Output schema / properties / transactions / items / properties / direction / descriptionPrevious value: -"Whether shares were acquired or disposed. \"acquire\" = buy, award, exercise; \"dispose\" = sale, gift, return. Absent when shares_traded is absent."New value: +"\"acquire\" (buy, award, exercise) or \"dispose\" (sale, gift, return). Absent when shares_traded is." - changed
Output schema / properties / transactions / items / properties / is_derivative / descriptionPrevious value: -"True for derivative security transactions (options, RSUs, convertible notes). False for direct equity transactions."New value: +"True for derivative securities (options, RSUs, convertible notes); false for direct equity." - changed
Output schema / properties / transactions / items / properties / ownership_nature / descriptionPrevious value: -"Nature of indirect ownership (e.g., \"By Trust\", \"By Spouse\"). Only present when ownership_type is indirect."New value: +"Nature of indirect ownership (e.g., \"By Trust\"). Present only when ownership_type is indirect." - changed
Output schema / properties / transactions / items / properties / ownership_type / descriptionPrevious value: -"D = direct ownership, I = indirect (through a trust, family member, etc.). Absent when not reported."New value: +"Direct, or indirect (through a trust, family member, etc.). Absent when not reported." - changed
Output schema / properties / transactions / items / properties / price_per_share / descriptionPrevious value: -"Price per share in USD. 0 for gifts and RSU awards (no cash consideration). Absent when not reported."New value: +"Price per share in USD; 0 for gifts and RSU awards. Absent when not reported." - changed
Output schema / properties / transactions / items / properties / shares_owned_after / descriptionPrevious value: -"Total shares owned after this transaction, as reported. Absent when omitted by the filer."New value: +"Shares owned after this transaction, as reported. Absent when omitted." - changed
Output schema / properties / transactions / items / properties / shares_traded / descriptionPrevious value: -"Absolute number of shares involved (always positive). Absent when the filing omits this field. Use `direction` to distinguish acquisitions from disposals."New value: +"Shares involved, always positive; direction gives the sign. Absent when the filing omits it." - changed
Output schema / properties / transactions / items / properties / transaction_code / descriptionPrevious value: -"Single-letter SEC transaction code: P = purchase, S = sale, M = exercise, A = award, G = gift, F = tax withholding, C = conversion, others exist."New value: +"SEC transaction code: P purchase, S sale, M exercise, A award, G gift, F tax withholding, C conversion, among others." - changed
Output schema / properties / transactions / items / properties / transaction_type / descriptionPrevious value: -"Human-readable description of the transaction code (e.g., \"purchase\", \"sale\", \"conversion_of_derivative\")."New value: +"Plain-language name of the code (e.g., \"purchase\", \"conversion_of_derivative\")."
- Changed
secedgar_get_institutional_holdings15 fields changed- changed
Output schema / properties / accession_number / descriptionPrevious value: -"Accession number for this 13F-HR filing — pass to secedgar_get_filing for the full document."New value: +"Accession number of this 13F-HR — pass to secedgar_get_filing." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding every parsed position from this 13F filing (the inline holdings[] is a preview capped at limit). Each row carries the filer metadata (filer_cik, filer_name, reporting_period, filing_date, accession_number) plus the position fields, so it self-joins across quarters/filers on cusip + reporting_period. Reflects the consolidate setting (consolidated positions when true, raw info-table sub-lines with investment_discretion when false). Query with secedgar_dataframe_query. Absent when canvas is unavailable or the filing had no holdings."New value: +"Dataframe of every position, shaped by consolidate; rows carry the filer keys and join across quarters on cusip + reporting_period. Absent when canvas is unavailable or there are no holdings." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / holdings / descriptionPrevious value: -"One page of holdings, `limit` rows starting at `offset` — consolidated positions sorted by market value when consolidate=true, else raw information-table rows in filing order."New value: +"`limit` rows from `offset`: positions by market value when consolidate=true, else raw rows in filing order." - changed
Output schema / properties / holdings / items / properties / investment_discretion / descriptionPrevious value: -"SOLE = sole investment discretion, DFND = defined (shared/advised), OTR = other. Absent when not reported."New value: +"SOLE sole discretion, DFND defined (shared or advised), OTR other. Absent when not reported, and on consolidated positions." - changed
Output schema / properties / holdings / items / properties / market_value_usd / descriptionPrevious value: -"Market value of the position in whole USD at the reporting date. SEC Form 13F has reported whole dollars since the 2023 amendments; values from filings before 2023-01-03 (originally thousands) are normalized to whole USD. Absent when not reported."New value: +"Market value in whole USD at the reporting date; values from filings before 2023-01-03, reported in thousands, are scaled to whole USD. Absent when not reported." - changed
Output schema / properties / holdings / items / properties / put_call / descriptionPrevious value: -"Options designation. Present only when the row represents a put or call option position."New value: +"Present only on a put or call option position." - changed
Output schema / properties / holdings / items / properties / shares_or_principal_amount / descriptionPrevious value: -"Number of shares (for equities) or principal amount (for debt securities). Absent when not reported."New value: +"Shares (equities) or principal amount (debt). Absent when not reported." - changed
Output schema / properties / holdings / items / properties / shares_or_principal_type / descriptionPrevious value: -"SH = share position, PRN = principal amount (bonds, notes). Absent when not reported."New value: +"SH shares, PRN principal amount (bonds, notes). Absent when not reported." - changed
Output schema / properties / next_offset / descriptionPrevious value: -"Offset to pass on the next call to continue through the positions. Absent on the last page (no rows remain past this one)."New value: +"Offset for the next page. Absent on the last page." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no filings were found or the result set is empty — suggests alternatives."New value: +"Guidance when no filing was found or the result is empty, with alternatives." - changed
Output schema / properties / offset / descriptionPrevious value: -"Row the returned page starts at, 0-based — the effective offset applied."New value: +"Row the returned page starts at, 0-based." - changed
Output schema / properties / reporting_period / descriptionPrevious value: -"The calendar-quarter end date this 13F covers (YYYY-MM-DD), from the filing cover page. Absent if not surfaced in the filing."New value: +"Calendar-quarter end this 13F covers (YYYY-MM-DD), from the cover page. Absent when the filing omits it." - changed
Output schema / properties / total_holdings_in_filing / descriptionPrevious value: -"Total number of raw information-table rows in this filing, before consolidation and the limit."New value: +"Raw information-table rows in this filing, before consolidation and limit." - changed
Output schema / properties / total_positions / descriptionPrevious value: -"Number of distinct positions after consolidating info-table sub-lines, before the limit. Present only when consolidate=true."New value: +"Distinct positions after consolidating sub-lines, before limit. Present only when consolidate=true."
- Changed
secedgar_get_material_events15 fields changed- changed
Output schema / properties / cik / descriptionPrevious value: -"Central Index Key of the resolved company, zero-padded to 10 digits."New value: +"Resolved CIK, zero-padded to 10 digits." - changed
Output schema / properties / dataset / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / accession_number / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / items / descriptionPrevious 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)." - changed
Output schema / properties / filings / items / properties / items / items / properties / label / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / items / items / properties / regime / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / primary_document / descriptionPrevious 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." - changed
Output schema / properties / filings / items / properties / report_date / descriptionPrevious 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." - changed
Output schema / properties / history_scanned_through / descriptionPrevious 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." - changed
Output schema / properties / item_distribution / descriptionPrevious 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." - changed
Output schema / properties / notice / descriptionPrevious 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." - changed
Output schema / properties / total_8k_scanned / descriptionPrevious 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." - changed
Output schema / properties / total_matched / descriptionPrevious 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."
- Changed
secedgar_get_snapshot15 fields changed- changed
Output schema / properties / caveats / descriptionPrevious value: -"Data-completeness warnings. One entry when one or two calendar quarters are absent from every recent qualifying year, because SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact — this applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. One further entry, prefixed with the concept name, per line whose values stop at least two full years behind the newest period this filer reports anywhere in the profile — either because the line resolved to an XBRL tag SEC has retired from the taxonomy, or because a current tag's series simply ends, which is what a migration to a different element or a dropped disclosure looks like. Empty when nothing needs flagging."New value: +"Completeness warnings, else empty: quarters missing from every recent year (SEC reports fiscal Q4 only within the 10-K), and, prefixed with the concept name, lines stopping 2+ years behind the filer's newest period." - changed
Output schema / properties / gaps / descriptionPrevious value: -"Concepts with no value for this filer. Deliberately explicit — a missing concept is never zero-filled or interpolated."New value: +"Concepts with no value for this filer, never zero-filled or interpolated." - changed
Output schema / properties / gaps / items / descriptionPrevious value: -"One concept the filer does not report, with the tags that were tried."New value: +"One concept the filer does not report." - changed
Output schema / properties / lines / items / descriptionPrevious value: -"One resolved concept with its latest value per period kind."New value: +"One concept with its latest values: duration concepts carry annual and quarterly as period_type allows; point-in-time concepts carry instant only." - changed
Output schema / properties / lines / items / properties / annual / descriptionPrevious value: -"Latest full-year (CY####) value. Absent for point-in-time concepts and when period_type excludes it."New value: +"Latest full-year (CY####) value." - changed
Output schema / properties / lines / items / properties / annual / properties / accession_number / descriptionPrevious value: -"Source filing accession number — pass to secedgar_get_filing."New value: +"Source filing accession number for secedgar_get_filing." - changed
Output schema / properties / lines / items / properties / annual / properties / tag / descriptionPrevious value: -"XBRL tag this value was reported under — differs from the line's tag when an older or successor tag in the concept answers this period."New value: +"XBRL tag behind this value; can differ from the line's tag." - changed
Output schema / properties / lines / items / properties / instant / descriptionPrevious value: -"Latest point-in-time (CY####Q#I) value. Present for balance-sheet and entity-info concepts."New value: +"Latest point-in-time (CY####Q#I) value." - changed
Output schema / properties / lines / items / properties / instant / properties / accession_number / descriptionPrevious value: -"Source filing accession number — pass to secedgar_get_filing."New value: +"Source filing accession number for secedgar_get_filing." - changed
Output schema / properties / lines / items / properties / instant / properties / tag / descriptionPrevious value: -"XBRL tag this value was reported under — differs from the line's tag when an older or successor tag in the concept answers this period."New value: +"XBRL tag behind this value; can differ from the line's tag." - changed
Output schema / properties / lines / items / properties / quarterly / descriptionPrevious value: -"Latest single-quarter (CY####Q#) value. Absent for point-in-time concepts and when period_type excludes it."New value: +"Latest single-quarter (CY####Q#) value." - changed
Output schema / properties / lines / items / properties / quarterly / properties / accession_number / descriptionPrevious value: -"Source filing accession number — pass to secedgar_get_filing."New value: +"Source filing accession number for secedgar_get_filing." - changed
Output schema / properties / lines / items / properties / quarterly / properties / tag / descriptionPrevious value: -"XBRL tag this value was reported under — differs from the line's tag when an older or successor tag in the concept answers this period."New value: +"XBRL tag behind this value; can differ from the line's tag." - changed
Output schema / properties / lines / items / properties / tag / descriptionPrevious value: -"XBRL tag behind the newest value — each point names its own when the concept walks several."New value: +"XBRL tag behind the newest value; each point names its own." - changed
Output schema / properties / lines / items / properties / unit / descriptionPrevious value: -"Unit of measure of the newest value (e.g. \"USD\", \"USD/shares\", \"shares\")."New value: +"Unit of every point on the line (e.g., \"USD\"). A concept in several units reads its newest value's unit, then the one with more periods; secedgar_get_financials reads the others."
- Changed
secedgar_search_concepts5 fields changed- changed
Output schema / properties / concepts / items / properties / group / descriptionPrevious value: -"Statement section this concept belongs to: income_statement, balance_sheet, cash_flow, per_share, or entity_info."New value: +"Statement section: income_statement, balance_sheet, cash_flow, per_share, or entity_info." - changed
Output schema / properties / concepts / items / properties / ifrs_tags / descriptionPrevious value: -"XBRL tags this friendly name resolves to under taxonomy \"ifrs-full\", tried in order — a different element set from tags, not a synonym list. Each one is confirmed present in a live 20-F filing. Absent when the concept has no IFRS equivalent, in which case taxonomy \"ifrs-full\" does not resolve it."New value: +"Tags under taxonomy \"ifrs-full\", tried in order; a different element set from tags, each seen in a live 20-F. Absent when there is no IFRS equivalent." - changed
Output schema / properties / concepts / items / properties / related_tags / descriptionPrevious value: -"Alternate-DEFINITION tags (different meaning from `tags`, not historical synonyms) that a meaningful share of filers report this metric under instead — surfaced by secedgar_fetch_frames as `related_tags`. Present only when the concept has a known high-coverage alternate (e.g. cash → restricted-cash-inclusive total, equity → NCI-inclusive total). Query these separately; do not blindly union them with the base tag."New value: +"Alternate-definition tags (not synonyms) many filers report this metric under, as secedgar_fetch_frames flags them (e.g., cash including restricted cash). Query them separately, never blindly unioned. Absent when none is known." - changed
Output schema / properties / concepts / items / properties / tags / descriptionPrevious value: -"XBRL tags this friendly name resolves to under us-gaap, tried in order. Multiple tags cover historical naming changes (e.g., pre- vs post-ASC 606 revenue) and can include a tag SEC has since retired, kept as a last-resort fallback for filers whose history predates its replacement."New value: +"XBRL tags under us-gaap, tried in order; several cover historical renames (pre- and post-ASC 606 revenue), possibly a retired tag as last resort." - changed
Output schema / properties / concepts / items / properties / unit / descriptionPrevious value: -"Unit of measure (USD, USD/shares, shares, pure). secedgar_fetch_frames accepts both slash and dashed forms."New value: +"Unit of measure (USD, USD/shares, shares, pure); secedgar_fetch_frames also takes the dashed form."
- Changed
secedgar_search_filings25 fields changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side up to its 10,000-result cap. Everywhere else the offset indexes the rows this call assembled and sorted: a single 100-row window for date sorts and entity targeting, the full matched set on a pre-2001 archive path, or both together on a range that crosses 2001-01-01. Offsets at or past those rows return nothing even when total is larger — switch to sort=relevance for deep pagination on a 2001-onward search, narrow the search (forms, dates, entity targeting), or query the dataframe. On a crossing range the two sides are assembled unevenly — the archive side contributes every row it matched, the full-text side one window of its total — so once the window runs out the rows jump to the pre-2001 era with the remaining full-text matches absent from the middle; search the 2001-onward era on its own to page through those."New value: +"Pagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side up to its 10,000-result cap, and the offset counts matching documents, not filings — EDGAR indexes each document of a filing separately — so a page lists the filings among its limit documents, which can be fewer than limit, and a filing whose matching documents straddle a page edge can recur on the next page; stepping by limit never skips one. Everywhere else the offset indexes the filings this call assembled and sorted: the filings of a single 100-document window for date sorts and entity targeting, the full matched set on a pre-2001 archive path, or both together on a range that crosses 2001-01-01. Offsets at or past those rows return nothing even when more filings match (a total above the rows fetched, or total_is_exact false) — switch to sort=relevance for deep pagination on a 2001-onward search, narrow the search (forms, dates, entity targeting), or query the dataframe. On a crossing range the two sides are assembled unevenly — the archive side contributes every row it matched, the full-text side the filings of one document window — so once the window runs out the rows jump to the pre-2001 era with the remaining full-text matches absent from the middle; search the 2001-onward era on its own to page through those." - changed
Output schema / properties / dataset / descriptionPrevious value: -"Canvas dataframe holding the fetched hits (full-text window, or the full pre-2001 archive match set), each tagged with its `source`. Absent when total ≤ inline limit, canvas is unavailable, or materialization failed. Query with secedgar_dataframe_query SQL."New value: +"Dataframe of every filing assembled (the full-text window, or the full pre-2001 match set). Absent when the rows fit inline, canvas is unavailable, or staging failed." - changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when more matches exist beyond the materialized set — the full-text window was exceeded, or a pre-2001 archive scan hit its cap. Each row carries a `source` column so provenance survives into secedgar_dataframe_query."New value: +"True when matches exist beyond the staged rows: the full-text window was exceeded, or an archive scan hit its cap." - changed
Output schema / properties / effectiveQuery / descriptionPrevious value: -"The query as executed against EDGAR (ticker/cik: tokens resolved to entity names)."New value: +"The query as executed: a ticker:/cik: token shows as \"(entity scope: CIK …)\", a forms-only browse as \"(browse: forms …)\", and a pre-2001 range names its archive route and dates." - changed
Output schema / properties / form_distribution / descriptionPrevious value: -"Count of results by form type. Helps narrow follow-up searches."New value: +"Filings in hand by form: every row assembled (what a dataframe holds), not only the page shown. Sums to total when every matching filing is in hand and every row has a form." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no results were returned — echoes the query and suggests how to broaden."New value: +"Why nothing matched, what lies past a truncated list and how to reach it, or that offset passed the filings available." - changed
Output schema / properties / results / items / descriptionPrevious value: -"One matching filing hit."New value: +"One matching filing. period_ending, ticker, file_description, matched_documents, sic, and location are absent on pre-2001 archive rows (source submissions or full-index)." - changed
Output schema / properties / results / items / properties / accession_number / descriptionPrevious value: -"Filing accession number. Pass to secedgar_get_filing to retrieve the document text."New value: +"Accession number for secedgar_get_filing." - changed
Output schema / properties / results / items / properties / file_description / descriptionPrevious value: -"SEC-provided description of the matching document (e.g., \"EX-99.1\"). Absent when SEC published none, and for pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only."New value: +"SEC description of the first-ranked matching document (e.g., \"EX-99.1\"). Absent when SEC published none." - changed
Output schema / properties / results / items / properties / location / descriptionPrevious value: -"Business location (state or country code). Absent when SEC has no location for this filer, and for pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only."New value: +"Business location (state or country code). Absent when SEC has none." - added
Output schema / properties / results / items / properties / matched_documentsAdded value: +{ + "description": "Documents of this filing that matched, in rank order; the dataframe holds their filenames as a comma-separated column.", + "items": { + "additionalProperties": false, + "description": "One document of this filing that matched the query.", + "properties": { + "name": { + "description": "Document filename — pass as secedgar_get_filing document to read it.", + "type": "string" + }, + "type": { + "description": "EDGAR document type (e.g., \"EX-99.1\"), telling body from exhibit. Absent when the index has none.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / results / items / properties / period_ending / descriptionPrevious value: -"Period the filing reports on (YYYY-MM-DD). Absent for filings without a reporting period (e.g., proxy statements, ownership reports) and for all pre-2001 archive-sourced rows (source submissions/full-index), which carry no period field. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only."New value: +"Period the filing reports on (YYYY-MM-DD). Absent for forms without one (proxy statements, ownership reports)." - changed
Output schema / properties / results / items / properties / sic / descriptionPrevious value: -"SIC industry code for the filer. Absent for filers without a classification, and for pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only."New value: +"SIC industry code. Absent for filers without one." - changed
Output schema / properties / results / items / properties / source / descriptionPrevious value: -"Which EDGAR backend served this row: \"efts\" (2001+ full-text index), \"submissions\" (a pre-2001 entity-scoped filing history), or \"full-index\" (a pre-2001 unscoped quarterly index browse). A date range crossing 2001-01-01 is split at the boundary and returns rows of two sources in one result set, so read this per row rather than per result. Provenance is carried into the canvas dataframe as a `source` column."New value: +"\"efts\" (2001+ full-text), \"submissions\" (pre-2001 entity history), or \"full-index\" (pre-2001 quarterly index). A range crossing 2001-01-01 mixes sources; total sums its archive rows and the filings of one 100-document full-text window. Also a dataframe column." - changed
Output schema / properties / results / items / properties / ticker / descriptionPrevious value: -"Primary ticker symbol parsed from the EFTS display name. Absent for private filers, foreign filers without a US listing, filings whose display name omits the ticker parenthetical, and all pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only. For multi-class issuers (e.g., BRK-A / BRK-B), this is the first class listed."New value: +"Primary ticker; the first class for multi-class issuers (BRK-A / BRK-B). Absent for private filers, foreign filers without a US listing, and display names that omit it." - changed
Output schema / properties / scan / descriptionPrevious value: -"Present only on the pre-2001 entity-scoped free-text path, where no full-text index exists and terms are matched by reading documents. Reports the scan's shape so a partial read is never presented as a complete one. Each document read is the whole accession .txt — SEC's original flat-submission format concatenates every exhibit into one file, and pre-1997 filings expose no per-document URL at all — so a match may sit in an attached exhibit rather than the body of the requested form. Absent on every other path."New value: +"Pre-2001 entity-scoped free-text path only. Each candidate's whole accession .txt is read, so a match may sit in an exhibit rather than the body of the requested form." - changed
Output schema / properties / scan / properties / candidates / descriptionPrevious value: -"Filings the form + date pre-filter selected before any document was read."New value: +"Filings the form and date pre-filter selected." - changed
Output schema / properties / scan / properties / capped / descriptionPrevious value: -"True when candidates exceeded the document cap, so the unscanned remainder may hold further matches — narrow the form or date filter to bring them into range."New value: +"True when candidates exceeded the 50-document cap; unread filings may match, so narrow forms or dates." - changed
Output schema / properties / scan / properties / matched / descriptionPrevious value: -"Scanned filings whose text satisfied the query terms."New value: +"Scanned filings whose text satisfied the query." - changed
Output schema / properties / scan / properties / scanned / descriptionPrevious value: -"Candidate documents actually fetched and matched against. Capped at 50 per call."New value: +"Candidates fetched and matched, at most 50 per call." - changed
Output schema / properties / total / descriptionPrevious value: -"Total matching filings, which can exceed the rows returned inline or materialized. On the full-text (2001+) path this is capped at 10,000; entity targeting (ticker:/cik:) scopes server-side via the EFTS ciks param, so it is the entity's exact match count up to the cap. On a pre-2001 archive path it is the exact count within the scanned window (see total_is_exact). On a range crossing 2001-01-01 it is the sum of both eras' counts."New value: +"Matching filings, one per accession; can exceed the rows returned. A search with terms counts the filings among the full-text documents fetched (100 per request): a lower bound unless total_is_exact. A forms- or entity-only browse from 2001 on gives EDGAR's own count; earlier ranges count rows read." - added
Output schema / properties / total_documentsAdded value: +{ + "description": "EDGAR's count of matching full-text documents, capped at 10,000. A search counts a filing once per matching document; a browse matches one document per filing. Absent on pure pre-2001 archive paths.", + "type": "number" +} - changed
Output schema / properties / total_is_exact / descriptionPrevious value: -"False when total is a lower bound — the full-text path hit its 10,000 cap, a pre-2001 archive scan hit its page/quarter cap before exhausting the range, or a pre-2001 local text scan hit its document cap (scan.capped)."New value: +"False when total is a lower bound: a search with terms whose 100-document window missed matches (or a relevance page past offset 0), EDGAR's 10,000 cap, or a pre-2001 archive or text scan that hit its cap. True does not mean every match is in the rows: a browse total can exceed the window." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when results were capped by limit."New value: +"True when more filings match than are shown: limit capped the list, or total is a lower bound."
5 tool updates
- Changed
secedgar_compare_companies8 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "period_type", - "taxonomy", - "periods", - "companies", - "failed_companies", - "concepts", - "cells", - "gaps", - "caveats" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "period_type", + "taxonomy", + "periods", + "companies", + "failed_companies", + "concepts", + "cells", + "gaps", + "unknown_concepts", + "caveats" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / caveats / descriptionPrevious value: -"Comparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept whose values stop at least two full years behind the rest of that company's reporting (either an XBRL tag SEC has retired, or a current tag the filer stopped using), period ends that differ inside one aligned period, and concepts whose unit differs across companies. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging."New value: +"Comparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept whose values stop at least two full years behind the rest of that company's reporting (either an XBRL tag SEC has retired, or a current tag the filer stopped using), period ends that differ inside one aligned period, concepts whose unit differs across companies, and — one line per concept — the companies that report a concept but have no value inside the inline periods, each with its newest period (its values are in the dataframe), and the concept inputs merged because they name the same concept. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging." - changed
Output schema / properties / cells / items / properties / tag / descriptionPrevious value: -"XBRL tag that produced the value."New value: +"XBRL tag this value was reported under — one concept can walk several tags, so it can differ between periods of the same company." - changed
Output schema / properties / concepts / descriptionPrevious value: -"Concepts covered, in the order supplied."New value: +"Concepts covered, in the order supplied. Inputs that name the same concept (revenue and Revenue, or one raw tag spelled twice) appear once, under the first spelling." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `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."New value: +"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `unknown_concept`: Every requested concept is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_companies_resolved", - "no_comparable_data", - "rate_limited" -]New value: +[ + "no_companies_resolved", + "no_comparable_data", + "unknown_concept", + "rate_limited" +] - changed
Output schema / properties / gaps / descriptionPrevious value: -"Company-concept pairs with no data. Deliberately explicit — a missing value is never interpolated or zero-filled."New value: +"Company-concept pairs with no value in any period. Deliberately explicit — a missing value is never interpolated or zero-filled. A pair with values only in periods older than the inline window is not a gap; caveats names it." - added
Output schema / properties / unknown_conceptsAdded value: +{ + "description": "Requested concepts that are neither a supported friendly name nor an XBRL tag (UpperCamelCase, e.g. NetIncomeLoss), reported once each rather than as a gap per company — secedgar_search_concepts lists every supported name. Empty when every concept resolved.", + "items": { + "additionalProperties": false, + "description": "One requested concept that was not queried for any company.", + "properties": { + "concept": { + "description": "Concept as supplied (trimmed) — neither a supported friendly name nor an XBRL tag.", + "type": "string" + }, + "derivation": { + "description": "How to build it from supported concepts when it is a standard combination, e.g. \"operating_cash_flow − capex\".", + "type": "string" + }, + "suggestions": { + "description": "Up to three closest supported friendly names. Empty when a derivation applies or no name is close.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "concept", + "suggestions" + ], + "type": "object" + }, + "type": "array" +}
- Changed
secedgar_fetch_frames5 fields changed- added
Input schema / properties / taxonomyAdded value: +{ + "default": "us-gaap", + "description": "Frames namespace a raw XBRL tag is read from: us-gaap for financial-statement tags, dei for cover-page entity tags such as EntityCommonStockSharesOutstanding. SEC publishes frames for no other taxonomy. A friendly name keeps its own mapped taxonomy (shares_outstanding reads dei) unless dei is passed, which reads its tags from dei instead — the same rule as secedgar_get_financials.", + "enum": [ + "us-gaap", + "dei" + ], + "type": "string" +} - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "concept", - "period", - "unit", - "label", - "total_companies", - "offset", - "data", - "unqueried_tags", - "related_tags", - "value_distribution", - "period_end_range", - "caveats" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "concept", + "taxonomy", + "period", + "unit", + "label", + "total_companies", + "offset", + "data", + "unqueried_tags", + "related_tags", + "value_distribution", + "period_end_range", + "caveats" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / caveats / descriptionPrevious value: -"Data-completeness warnings specific to this query. Currently populated for duration periods 'CY####Q[1-4]', where SEC XBRL omits filers' fiscal Q4 (reported only as the 10-K residual) — affected filers are silently absent from the frame. Empty for annual ('CY####') and instant ('CY####Q#I') periods, where the underlying facts exist and the frame is complete."New value: +"Data-completeness warnings specific to this query. Populated for duration periods 'CY####Q[1-4]', where SEC XBRL omits filers' fiscal Q4 (reported only as the 10-K residual) — affected filers are silently absent from the frame. Populated for annual ('CY####') NetIncomeLoss frames, where a filer's row can be its proxy statement's pay-versus-performance figure rather than the 10-K's. Populated for an annual frame whose calendar year is still open or inside its 10-K filing window, where a filer's row can be a trailing-twelve-month figure from a 10-Q rather than a fiscal year. Also flags a value distribution whose top rows look like split or scale-factor artifacts. Otherwise empty." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input does not match a friendly name and SEC frames returned no data. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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." - added
Output schema / properties / taxonomyAdded value: +{ + "description": "Frames namespace the tag was read from (us-gaap or dei) — a friendly name mapped to dei reads dei under the us-gaap default.", + "type": "string" +}
- Changed
secedgar_get_financials10 fields changed- changed
Output schema / properties / concept / descriptionPrevious value: -"XBRL tag name used."New value: +"XBRL tag behind the newest value. A friendly name can walk several tags, so each row names its own." - changed
Output schema / properties / data / descriptionPrevious value: -"Deduplicated time series, newest first."New value: +"Deduplicated time series, newest first — one value per calendar period. Where SEC's period frame sits on a proxy statement's figure (the pay-versus-performance table re-tags net income), the value comes from the filer's own report of the same period; an annual period SEC framed on a 10-Q's trailing-twelve-month figure is left out, since the filer has not closed that year." - changed
Output schema / properties / data / items / descriptionPrevious value: -"One reported value with its period, fiscal context, and source filing."New value: +"One reported value with its period, fiscal context, source filing, and source tag." - added
Output schema / properties / data / items / properties / tagAdded value: +{ + "description": "XBRL tag this value was reported under — differs from concept when an older or successor tag in the friendly name answers this period.", + "type": "string" +} - changed
Output schema / properties / data / items / requiredPrevious value: -[ - "period", - "value", - "end", - "fiscal_year", - "fiscal_period", - "form", - "filed", - "accession_number" -]New value: +[ + "period", + "value", + "end", + "fiscal_year", + "fiscal_period", + "form", + "filed", + "accession_number", + "tag" +] - changed
Output schema / properties / description / descriptionPrevious value: -"XBRL taxonomy description for this concept. Often absent for company-extension tags or older concepts."New value: +"XBRL taxonomy description of the concept tag. Often absent for company-extension tags or older concepts." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `unknown_concept`: The concept input is neither a supported friendly name nor shaped like an XBRL tag, so no request is sent. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_company", - "no_concept_data", - "no_frame_data", - "no_period_data", - "rate_limited" -]New value: +[ + "company_not_found", + "ambiguous_company", + "unknown_concept", + "no_concept_data", + "no_frame_data", + "no_period_data", + "rate_limited" +] - changed
Output schema / properties / label / descriptionPrevious value: -"Human-readable label for the concept."New value: +"Human-readable taxonomy label of the concept tag." - changed
Output schema / properties / unit / descriptionPrevious value: -"Unit of measure (e.g., \"USD\", \"shares\", \"USD/shares\")."New value: +"Unit of measure of the newest value (e.g., \"USD\", \"shares\", \"USD/shares\")."
- Changed
secedgar_get_snapshot8 fields changed- added
Output schema / properties / lines / items / properties / annual / properties / tagAdded value: +{ + "description": "XBRL tag this value was reported under — differs from the line's tag when an older or successor tag in the concept answers this period.", + "type": "string" +} - changed
Output schema / properties / lines / items / properties / annual / requiredPrevious value: -[ - "period", - "value", - "period_end", - "form", - "accession_number" -]New value: +[ + "period", + "value", + "period_end", + "form", + "accession_number", + "tag" +] - added
Output schema / properties / lines / items / properties / instant / properties / tagAdded value: +{ + "description": "XBRL tag this value was reported under — differs from the line's tag when an older or successor tag in the concept answers this period.", + "type": "string" +} - changed
Output schema / properties / lines / items / properties / instant / requiredPrevious value: -[ - "period", - "value", - "period_end", - "form", - "accession_number" -]New value: +[ + "period", + "value", + "period_end", + "form", + "accession_number", + "tag" +] - added
Output schema / properties / lines / items / properties / quarterly / properties / tagAdded value: +{ + "description": "XBRL tag this value was reported under — differs from the line's tag when an older or successor tag in the concept answers this period.", + "type": "string" +} - changed
Output schema / properties / lines / items / properties / quarterly / requiredPrevious value: -[ - "period", - "value", - "period_end", - "form", - "accession_number" -]New value: +[ + "period", + "value", + "period_end", + "form", + "accession_number", + "tag" +] - changed
Output schema / properties / lines / items / properties / tag / descriptionPrevious value: -"XBRL tag that produced the value."New value: +"XBRL tag behind the newest value — each point names its own when the concept walks several." - changed
Output schema / properties / lines / items / properties / unit / descriptionPrevious value: -"Unit of measure (e.g. \"USD\", \"USD/shares\", \"shares\")."New value: +"Unit of measure of the newest value (e.g. \"USD\", \"USD/shares\", \"shares\")."
- Changed
secedgar_search_concepts2 fields changed- changed
Input schema / properties / group / descriptionPrevious value: -"Filter to a single financial statement group. income_statement covers P&L items; balance_sheet covers position items (use instant periods in secedgar_fetch_frames); cash_flow covers CF statement items; per_share covers EPS; entity_info covers DEI items like shares outstanding."New value: +"Filter to a single financial statement group. income_statement covers P&L items; balance_sheet covers position items (use instant periods in secedgar_fetch_frames); cash_flow covers CF statement items; per_share covers EPS and the diluted share count it divides by; entity_info covers DEI items like shares outstanding." - changed
Output schema / properties / concepts / items / properties / name / descriptionPrevious value: -"Friendly name to pass as the concept argument to secedgar_get_financials or secedgar_fetch_frames."New value: +"Friendly name to pass as `concept` to secedgar_get_financials or secedgar_fetch_frames, or in `concepts` to secedgar_compare_companies."
6 tool updates
- Changed
secedgar_company_search2 fields changed- changed
Input schema / properties / filed_after / descriptionPrevious 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 filings that predate the ~1000-filing recent window (e.g. a company's 2005 10-K)."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 filings that predate the recent window — the last year or 1,000 filings, whichever holds more (e.g. a company's 2005 10-K)." - changed
Output schema / properties / history_scanned_through / descriptionPrevious value: -"Oldest filing date reached by the scan (YYYY-MM-DD). Filings older than this were not examined: the recent window caps at ~1000 filings, and older filings live in archive pages fetched only when a date filter or an under-filled form filter requires them. Absent when no filings were scanned."New value: +"Oldest filing date reached by the scan (YYYY-MM-DD). Filings older than this were not examined: the recent window holds the last year or 1,000 filings, whichever is more, and older filings live in archive pages fetched only when a date filter or an under-filled form filter requires them. Absent when no filings were scanned."
- Changed
secedgar_get_beneficial_owners1 field changed- changed
Output schema / properties / legacy_filings_before_coverage / descriptionPrevious 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."
- Changed
secedgar_get_filing2 fields changed- changed
Output schema / properties / form / descriptionPrevious value: -"Form type (e.g., \"10-K\", \"10-Q\"). Absent for filings older than the last ~1,000 the company has filed (SEC does not surface metadata for those without a separate fetch)."New value: +"Form type (e.g., \"10-K\", \"10-Q\"). From the company's submissions feed for a recent filing, else from the filing's own SEC header. Absent only when neither source carries it." - changed
Output schema / properties / period_ending / descriptionPrevious value: -"Period the filing reports on (YYYY-MM-DD). Absent under the same conditions as form."New value: +"Period the filing reports on (YYYY-MM-DD), from the same source as form. Absent for forms with no period of report (S-8, Form 4, proxy statements) and when neither source carries it."
- Changed
secedgar_get_insider_transactions5 fields changed- added
Input schema / properties / filed_afterAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + ], + "description": "Only read Form 4 filings filed on or after this date (YYYY-MM-DD). A date window reaches filings older than the recent submissions window by paging into the archive, and with a canvas every Form 4 filed inside it is parsed, up to 100. Structured Form 4 XML begins in mid-2003, so an earlier window finds nothing." +} - added
Input schema / properties / filed_beforeAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + ], + "description": "Only read Form 4 filings filed on or before this date (YYYY-MM-DD). Use alone or with filed_after. Without either bound the tool reads the newest Form 4 filings." +} - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious value: -"True when more recent Form 4 filings exist beyond the scanned window — the dataframe is a recent sample, not the issuer's full Form 4 history. Use secedgar_search_filings with forms=[\"4\"] for exhaustive coverage."New value: +"True when Form 4 filings exist beyond those parsed — past the newest-filings sample, or, with a date window, inside the window beyond the 100-filing cap or past the 10 archive pages read. Narrow the window to reach the rest." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: No Form 4 filings exist for this company in the recent submissions window. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: A call without a date window finds no Form 4 filings in the recent submissions window. `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." - added
Output schema / properties / history_scanned_throughAdded value: +{ + "description": "Filing date of the oldest Form 4 parsed (YYYY-MM-DD). Present only when a date window was given; absent when the window held no Form 4 filing.", + "type": "string" +}
- Changed
secedgar_get_institutional_holdings2 fields changed- changed
Input schema / properties / quarter / descriptionPrevious value: -"Reporting quarter to target, in \"YYYY-QN\" format (e.g., \"2025-Q4\"). When omitted, returns the most recent 13F-HR available. Quarters map to the filing window: Q4 2025 = filings submitted roughly Jan–Mar 2026."New value: +"Reporting quarter to target, in \"YYYY-QN\" format (e.g., \"2025-Q4\"), matched exactly against each 13F-HR's period of report. When omitted, returns the most recent 13F-HR in the submissions feed's recent window (the last year or 1,000 filings, whichever holds more). Quarters map to the filing window: Q4 2025 = filings submitted roughly Jan–Mar 2026. A quarter older than the recent window is looked up in the archive, reading forward from the quarter end up to 10 archive pages. A quarter the manager covered with a 13F-NT notice (holdings reported by other managers) fails naming that notice." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR filings found for this entity in the recent submissions window. `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR matches — the entity files none, none exists for the requested quarter in the recent submissions window or the archive pages searched, or the manager filed a 13F-NT notice instead (for the requested quarter, or as its only recent 13F filing when no quarter is given). `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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."
- Changed
secedgar_get_material_events5 fields changed- changed
Input schema / properties / filed_after / descriptionPrevious 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)." - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Output schema / properties / dataset / descriptionPrevious 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." - changed
Output schema / properties / dataset / properties / truncated / descriptionPrevious 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." - changed
Output schema / properties / history_scanned_through / descriptionPrevious 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."
15 tool updates
- Changed
secedgar_company_search6 fields changed- removed
Input schema / properties / form_typesRemoved value: -{ - "description": "Filter filings to specific form types (e.g., [\"10-K\", \"10-Q\", \"8-K\"]). Without this, returns all form types.", - "items": { - "type": "string" - }, - "type": "array" -} - added
Input schema / properties / formsAdded value: +{ + "description": "Filter filings to specific form types (e.g., [\"10-K\", \"10-Q\", \"8-K\"]), matched exactly (case-insensitive) — list an amendment such as \"10-K/A\" to include it. Without this, returns all form types.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_match`: No company matches the query `multiple_matches`: 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`: 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_match", - "multiple_matches" -]New value: +[ + "no_match", + "multiple_matches", + "rate_limited" +] - changed
Output schema / properties / filings / descriptionPrevious value: -"Recent filings, filtered by form_types if specified."New value: +"Recent filings, filtered by forms if specified." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when include_filings=true but no filings matched the form_types filter, or when filing_limit withheld some."New value: +"Guidance when include_filings=true but no filings matched the forms filter, or when filing_limit withheld some."
- Changed
secedgar_compare_companies2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_companies_resolved`: None of the supplied company inputs resolved to a CIK. `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_companies_resolved", - "no_comparable_data" -]New value: +[ + "no_companies_resolved", + "no_comparable_data", + "rate_limited" +]
- Changed
secedgar_dataframe_describe1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment. Other values are possible when a failure originates below the handler."
- Changed
secedgar_dataframe_query2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*) `missing_table`: The SQL query references a df_<id> table that does not exist or has expired `invalid_sql`: The SQL statement contains a syntax or execution error not covered by a more specific reason `register_as_clash`: The register_as target name already exists on the canvas `non_select_statement`: The SQL is a non-SELECT statement (DROP, INSERT, UPDATE, DDL, etc.) — only read-only SELECTs run against dataframes Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: The DataCanvas service is not configured for this deployment. `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*). `missing_table`: The SQL query references a df_<id> table that does not exist or has expired. `invalid_sql`: The SELECT fails to prepare — an unknown column or an invalid expression — or hits an engine error no more specific reason covers. `sql_execution_error`: The SELECT prepared but failed on the data it read — a cast or conversion that does not fit, an out-of-range value, or invalid input to a function. `register_as_clash`: The register_as target name already exists on the canvas. `non_select_statement`: The SQL is not a SELECT (DROP, INSERT, UPDATE, DDL, PRAGMA, EXPLAIN, etc.) or does not parse — only read-only SELECTs run against dataframes. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading or external-data table function such as read_csv, read_parquet, or glob. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist, such as the range() or generate_series() table functions. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "canvas_unavailable", - "system_catalog_access", - "missing_table", - "invalid_sql", - "register_as_clash", - "non_select_statement" -]New value: +[ + "canvas_unavailable", + "system_catalog_access", + "missing_table", + "invalid_sql", + "sql_execution_error", + "register_as_clash", + "non_select_statement", + "multi_statement", + "denied_function", + "plan_operator_not_allowed" +]
- Changed
secedgar_fetch_frames2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input does not match a friendly name and SEC frames returned no data `no_data`: Concept resolves but no companies report this metric for the requested period and unit Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_concept`: The concept input does not match a friendly name and SEC frames returned no data. `no_data`: Concept resolves but no companies report this metric for the requested period and unit. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_concept", - "no_data" -]New value: +[ + "unknown_concept", + "no_data", + "rate_limited" +]
- Changed
secedgar_find_holders3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: No cusip was given and the issuer does not resolve to a known EDGAR company `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `issuer_not_found`: No cusip was given and the issuer does not resolve to a known EDGAR company. `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "issuer_not_found", - "ambiguous_issuer" -]New value: +[ + "issuer_not_found", + "ambiguous_issuer", + "rate_limited" +] - changed
Output schema / properties / holders / items / properties / filer_cik / descriptionPrevious value: -"Filer CIK, zero-padded to 10 digits. Pass as ticker_or_cik to secedgar_get_institutional_holdings for this manager's positions."New value: +"Filer CIK, zero-padded to 10 digits. Pass as company to secedgar_get_institutional_holdings for this manager's positions."
- Changed
secedgar_get_beneficial_owners2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "issuer_not_found", - "ambiguous_issuer", - "no_filings_found" -]New value: +[ + "issuer_not_found", + "ambiguous_issuer", + "no_filings_found", + "rate_limited" +]
- Changed
secedgar_get_filing2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive `no_documents`: Filing index lists items but no fetchable primary document was found `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return `filing_not_found`: No filing matches the accession number under any candidate CIK `offset_out_of_range`: The provided offset is at or beyond the end of the document `section_not_found`: The section string did not match any detected heading in the document Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `document_not_found`: A specific document was requested but not present in the filing archive. `no_documents`: Filing index lists items but no fetchable primary document was found. `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return. `filing_not_found`: No filing matches the accession number under any candidate CIK. `offset_out_of_range`: The provided offset is at or beyond the end of the document. `section_not_found`: The section string did not match any detected heading in the document. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "document_not_found", - "no_documents", - "binary_document", - "filing_not_found", - "offset_out_of_range", - "section_not_found" -]New value: +[ + "document_not_found", + "no_documents", + "binary_document", + "filing_not_found", + "offset_out_of_range", + "section_not_found", + "rate_limited" +]
- Changed
secedgar_get_financials2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries `no_period_data`: Concept has data but the period_type filter excluded all of it Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy. `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries. `no_period_data`: Concept has data but the period_type filter excluded all of it. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_company", - "no_concept_data", - "no_frame_data", - "no_period_data" -]New value: +[ + "company_not_found", + "ambiguous_company", + "no_concept_data", + "no_frame_data", + "no_period_data", + "rate_limited" +]
- Changed
secedgar_get_fund_holdings2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series `ambiguous_fund`: The fund name matches several EDGAR companies `series_required`: The input resolves to a registrant trust that files reports for more than one fund series `no_filings_found`: No NPORT-P report exists for this fund, or none for the requested report_date Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series. `ambiguous_fund`: The fund name matches several EDGAR companies. `series_required`: The input resolves to a registrant trust that files reports for more than one fund series. `no_filings_found`: No NPORT-P report exists for this fund, or none covers the report_date requested. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "fund_not_found", - "ambiguous_fund", - "series_required", - "no_filings_found" -]New value: +[ + "fund_not_found", + "ambiguous_fund", + "series_required", + "no_filings_found", + "rate_limited" +]
- Changed
secedgar_get_insider_transactions5 fields changed- added
Input schema / properties / companyAdded value: +{ + "description": "The issuer whose Form 4 filings to read — the company, not the reporting person. A ticker symbol (e.g., \"AAPL\"), a CIK with or without zero-padding (e.g., \"320193\" or \"0000320193\"), or a company name (current or former). A name matching several companies resolves to the top-ranked one — exact name first, then prefix, then substring — so pass a ticker or CIK when the issuer must be exact.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / ticker_or_cikRemoved value: -{ - "description": "Company ticker symbol (e.g., \"AAPL\") or 10-digit CIK number (e.g., \"0000320193\"). The issuer, not the reporting person.", - "minLength": 1, - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "ticker_or_cik" -]New value: +[ + "company" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The ticker or CIK does not resolve to a known company `no_filings_found`: No Form 4 filings exist for this company in the recent submissions window Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company. `no_filings_found`: No Form 4 filings exist for this company in the recent submissions window. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "no_filings_found" -]New value: +[ + "company_not_found", + "no_filings_found", + "rate_limited" +]
- Changed
secedgar_get_institutional_holdings5 fields changed- added
Input schema / properties / companyAdded value: +{ + "description": "The institutional filer whose 13F to fetch — a 10-digit CIK (e.g. \"0000102909\" for VANGUARD GROUP INC, the most reliable form), a ticker, or an entity name. A name is matched against the registrants in EDGAR's ticker file first (current and former names) and, when none match, resolved through EDGAR entity search, which covers institutional managers absent from that file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like \"AAPL\" finds that operating company's own filings (it files no 13F), not who holds it; use secedgar_find_holders for that direction.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / ticker_or_cikRemoved value: -{ - "description": "The institutional filer whose 13F to fetch — a 10-digit CIK (e.g. \"0000102909\" for VANGUARD GROUP INC, the most reliable form) or an entity name. Names resolve through EDGAR entity search, which covers institutional managers absent from the ticker file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like \"AAPL\" finds that operating company's own filings (it files no 13F), not who holds it; use secedgar_find_holders for that direction.", - "minLength": 1, - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "ticker_or_cik" -]New value: +[ + "company" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The ticker or CIK does not resolve to a known company or institution `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name) `no_filings_found`: No 13F-HR filings found for this entity in the recent submissions window `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a known company or institution. `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name). `no_filings_found`: No 13F-HR filings found for this entity in the recent submissions window. `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_entity", - "no_filings_found", - "no_info_table" -]New value: +[ + "company_not_found", + "ambiguous_entity", + "no_filings_found", + "no_info_table", + "rate_limited" +]
- Changed
secedgar_get_material_events2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_match", - "multiple_matches" -]New value: +[ + "no_match", + "multiple_matches", + "rate_limited" +]
- Changed
secedgar_get_snapshot2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `company_not_found`: The company input does not resolve to a CIK. `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous. `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "company_not_found", - "ambiguous_company", - "no_company_facts" -]New value: +[ + "company_not_found", + "ambiguous_company", + "no_company_facts", + "rate_limited" +]
- Changed
secedgar_search_filings6 fields changed- removed
Input schema / properties / end_dateRemoved value: -{ - "anyOf": [ - { - "const": "", - "type": "string" - }, - { - "description": "YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - } - ], - "description": "End of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering." -} - added
Input schema / properties / filed_afterAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + ], + "description": "Only include filings filed on or after this date (YYYY-MM-DD). This tool filters by date only with both bounds — pair it with filed_before." +} - added
Input schema / properties / filed_beforeAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + ], + "description": "Only include filings filed on or before this date (YYYY-MM-DD). This tool filters by date only with both bounds — pair it with filed_after." +} - removed
Input schema / properties / start_dateRemoved value: -{ - "anyOf": [ - { - "const": "", - "type": "string" - }, - { - "description": "YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - } - ], - "description": "Start of date range (YYYY-MM-DD). Both start_date and end_date must be provided for date filtering." -} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of start_date or end_date was provided `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone) `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: Only one of filed_after or filed_before was provided. `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company. `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number. `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history. `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone). `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "unresolved_ticker", - "invalid_cik", - "entity_not_found", - "missing_criteria", - "pre2001_full_text_unscoped" -]New value: +[ + "invalid_date_range", + "unresolved_ticker", + "invalid_cik", + "entity_not_found", + "missing_criteria", + "pre2001_full_text_unscoped", + "rate_limited" +]
12 tool updates
- Changed
secedgar_company_search1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_compare_companies2 fields changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when the inline matrix dropped periods, or when the full aligned series is staged as a dataframe.", + "type": "string" +}
- Changed
secedgar_dataframe_query4 fields changed- changed
Input schema / properties / row_limit / descriptionPrevious value: -"Hard cap on rows materialized in the response. Default 1000, max 10000. The full result lives on-canvas under register_as when provided — do not raise this to keep large results."New value: +"Hard cap on rows materialized in the response. Default 1000, max 10000. A query matching more rows than this stops at the cap and `row_count_capped` comes back true; the full result lives on-canvas under register_as when provided, so do not raise this to keep large results. One case is not detectable: a SQL LIMIT exactly equal to this cap reads identically to a result that genuinely holds that many rows, and is reported as exact." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "columns", - "row_count", - "rows" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "columns", + "row_count", + "row_count_capped", + "rows" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / row_count / descriptionPrevious value: -"Total rows the query produced (may exceed `rows.length` when capped)."New value: +"Rows the query produced, up to `row_limit` (exceeds `rows.length` when `preview` returned fewer). Read it with `row_count_capped`: when that is true this number is the `row_limit` cap itself, and the size of the full result is not in this response." - added
Output schema / properties / row_count_cappedAdded value: +{ + "description": "True when the query matched more rows than `row_limit`, so `row_count` is that cap rather than a total. False means `row_count` is exact — including when it happens to equal `row_limit`.", + "type": "boolean" +}
- Changed
secedgar_fetch_frames1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_find_holders1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_get_beneficial_owners1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_get_financials2 fields changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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." - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when the inline series was capped, or when the full series is staged as a dataframe.", + "type": "string" +}
- Changed
secedgar_get_fund_holdings1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_get_insider_transactions1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_get_institutional_holdings1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_get_material_events1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
- Changed
secedgar_search_filings1 field changed- changed
Output schema / properties / dataset / properties / name / descriptionPrevious 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."
1 tool update
- Changed
secedgar_get_filing1 field changed- changed
Input schema / properties / section / descriptionPrevious value: -"Jump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading."New value: +"Jump to a named section by case-insensitive substring match against detected headings (e.g. 'risk factors', 'item 7', 'certain relationships'). Matching also ignores whitespace and quote-style differences, so a heading copied from the outline resolves whether it carries the filing's non-breaking spaces and curly quotes or plain ones. Takes precedence over offset when both are provided. On a miss, the error message includes the detected outline so you can pick the correct heading."
2 tool updates
- Changed
secedgar_company_search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Company ticker symbol (e.g., \"AAPL\", \"VOO\"), name (e.g., \"Apple\"), or CIK number (e.g., \"320193\"). Ticker is the fastest lookup and works for equities, ETFs, and mutual funds. Name search matches current and former names."New value: +"Company ticker symbol (e.g., \"AAPL\", \"VOO\"), name (e.g., \"Apple\"), or CIK number (e.g., \"320193\"). Ticker is the fastest lookup and works for equities, ETFs, and mutual funds; a multi-class share ticker resolves in either form (\"BRK-B\" or \"BRK.B\"). Name search matches current and former names, and the corporate suffix does not have to match the registry's form (\"Beacon Financial Corporation\" finds \"Beacon Financial Corp\") — but Corp, Inc, Co, and Ltd stay distinct from each other, since separate registrants differ only by which one they use."
- Changed
secedgar_search_filings1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Full-text search query. Optional — omit (or pass \"\") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms to browse by form and date. When present, supports exact phrases (\"material weakness\"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax."New value: +"Full-text search query. Optional — omit (or pass \"\") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms to browse by form and date. When present, supports exact phrases (\"material weakness\"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. A multi-class share ticker resolves in either form — ticker:BRK-B and ticker:BRK.B scope to the same issuer. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax."
1 tool update
- Changed
secedgar_get_financials4 fields changed- removed
Output schema / properties / data / items / properties / fiscal_period / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / fiscal_period / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / fiscal_year / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / fiscal_year / typeAdded value: +[ + "number", + "null" +]
16 tool updates
- Changed
secedgar_company_search10 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cik", + "name", + "tickers", + "exchanges", + "sic", + "sic_description" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / capAdded value: +{ + "description": "The `filing_limit` that was applied.", + "type": "number" +} - added
Output schema / properties / errorAdded 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`: 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" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when include_filings=true but no filings matched the form_types filter."New value: +"Guidance when include_filings=true but no filings matched the form_types filter, or when filing_limit withheld some." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of filings returned inline.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when more filings matched than `filing_limit` allowed into the inline list.", + "type": "boolean" +} - removed
Output schema / requiredRemoved value: -[ - "cik", - "name", - "tickers", - "exchanges", - "sic", - "sic_description" -]
- Changed
secedgar_compare_companies6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "period_type", + "taxonomy", + "periods", + "companies", + "failed_companies", + "concepts", + "cells", + "gaps", + "caveats" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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_companies_resolved`: None of the supplied company inputs resolved to a CIK `no_comparable_data`: Companies resolved but not one of them reports any of the requested concepts for the requested period type Other values are possible when a failure originates below the handler.", + "examples": [ + "no_companies_resolved", + "no_comparable_data" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "period_type", - "taxonomy", - "periods", - "companies", - "failed_companies", - "concepts", - "cells", - "gaps", - "caveats" -]
- Changed
secedgar_dataframe_describe6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dataframes" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `canvas_unavailable`: The DataCanvas service is not configured for this deployment Other values are possible when a failure originates below the handler.", + "examples": [ + "canvas_unavailable" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "dataframes" -]
- Changed
secedgar_dataframe_query10 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "columns", + "row_count", + "rows" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / capAdded value: +{ + "description": "The row cap that actually bound — `preview` when it is lower than `row_limit`, otherwise `row_limit`.", + "type": "number" +} - added
Output schema / properties / errorAdded 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: `canvas_unavailable`: The DataCanvas service is not configured for this deployment `system_catalog_access`: The SQL query references a denied DuckDB system catalog (information_schema, pg_catalog, sqlite_master, duckdb_*) `missing_table`: The SQL query references a df_<id> table that does not exist or has expired `invalid_sql`: The SQL statement contains a syntax or execution error not covered by a more specific reason `register_as_clash`: The register_as target name already exists on the canvas `non_select_statement`: The SQL is a non-SELECT statement (DROP, INSERT, UPDATE, DDL, etc.) — only read-only SELECTs run against dataframes Other values are possible when a failure originates below the handler.", + "examples": [ + "canvas_unavailable", + "system_catalog_access", + "missing_table", + "invalid_sql", + "register_as_clash", + "non_select_statement" + ], + "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" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when the query returned no rows, or when results were capped."New value: +"Guidance when the query returned no rows, or when the row cap withheld some." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of rows returned inline.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the result set held more rows than the row cap allowed through.", + "type": "boolean" +} - removed
Output schema / requiredRemoved value: -[ - "columns", - "row_count", - "rows" -]
- Changed
secedgar_fetch_frames6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "concept", + "period", + "unit", + "label", + "total_companies", + "offset", + "data", + "unqueried_tags", + "related_tags", + "value_distribution", + "period_end_range", + "caveats" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `unknown_concept`: The concept input does not match a friendly name and SEC frames returned no data `no_data`: Concept resolves but no companies report this metric for the requested period and unit Other values are possible when a failure originates below the handler.", + "examples": [ + "unknown_concept", + "no_data" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "concept", - "period", - "unit", - "label", - "total_companies", - "offset", - "data", - "unqueried_tags", - "related_tags", - "value_distribution", - "period_end_range", - "caveats" -]
- Changed
secedgar_find_holders6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "issuer", + "search_mode", + "search_key", + "quarter", + "filed_from", + "filed_to", + "total_filings", + "total_is_exact", + "fetched", + "holders_in_quarter", + "holders", + "ordering" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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`: No cusip was given and the issuer does not resolve to a known EDGAR company `ambiguous_issuer`: The issuer name matches several EDGAR companies and no cusip was given Other values are possible when a failure originates below the handler.", + "examples": [ + "issuer_not_found", + "ambiguous_issuer" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "issuer", - "search_mode", - "search_key", - "quarter", - "filed_from", - "filed_to", - "total_filings", - "total_is_exact", - "fetched", - "holders_in_quarter", - "holders", - "ordering" -]
- Changed
secedgar_get_beneficial_owners6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded 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" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "issuer", - "issuer_cik", - "issuer_name", - "form_kind", - "total_structured_filings", - "filings_parsed", - "structured_coverage_from", - "legacy_filings_before_coverage", - "filings" -]
- Changed
secedgar_get_filing11 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "accession_number", + "cik", + "primary_document", + "documents", + "content", + "content_truncated", + "content_total_length", + "filing_url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / capAdded value: +{ + "description": "The `content_limit` that was applied.", + "type": "number" +} - added
Output schema / properties / errorAdded 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: `document_not_found`: A specific document was requested but not present in the filing archive `no_documents`: Filing index lists items but no fetchable primary document was found `binary_document`: The requested document is a binary entry (scanned image, PDF, archive) with no text to return `filing_not_found`: No filing matches the accession number under any candidate CIK `offset_out_of_range`: The provided offset is at or beyond the end of the document `section_not_found`: The section string did not match any detected heading in the document Other values are possible when a failure originates below the handler.", + "examples": [ + "document_not_found", + "no_documents", + "binary_document", + "filing_not_found", + "offset_out_of_range", + "section_not_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" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance on reading the next page when the content was capped.", + "type": "string" +} - changed
Output schema / properties / outline / descriptionPrevious value: -"Document outline — detected headings with their character offsets. Present on the first page of a truncated response (offset=0, no section). Use a heading offset as offset, or pass heading text as section, to jump to that section."New value: +"Document outline — up to 50 detected headings with their character offsets. Present on the first page of a truncated response (offset=0, no section). Use a heading offset as offset, or pass heading text as section, to jump to that section." - added
Output schema / properties / shownAdded value: +{ + "description": "Characters of document text returned on this page.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the document is longer than `content_limit` allowed through.", + "type": "boolean" +} - removed
Output schema / requiredRemoved value: -[ - "accession_number", - "cik", - "primary_document", - "documents", - "content", - "content_truncated", - "content_total_length", - "filing_url" -]
- Changed
secedgar_get_financials6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "company", + "cik", + "concept", + "label", + "unit", + "data" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `company_not_found`: The company input does not resolve to a CIK `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous `no_concept_data`: The company does not report any XBRL data for the resolved concept and taxonomy `no_frame_data`: Concept exists but has no frame-aligned (standard calendar period) entries `no_period_data`: Concept has data but the period_type filter excluded all of it Other values are possible when a failure originates below the handler.", + "examples": [ + "company_not_found", + "ambiguous_company", + "no_concept_data", + "no_frame_data", + "no_period_data" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "company", - "cik", - "concept", - "label", - "unit", - "data" -]
- Changed
secedgar_get_fund_holdings6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "fund", + "class_ids", + "registrant_cik", + "registrant_name", + "filing_date", + "form", + "accession_number", + "total_holdings", + "offset", + "available_report_periods", + "holdings", + "as_of" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `fund_not_found`: The fund input resolves to neither an EDGAR company nor a known fund series `ambiguous_fund`: The fund name matches several EDGAR companies `series_required`: The input resolves to a registrant trust that files reports for more than one fund series `no_filings_found`: No NPORT-P report exists for this fund, or none for the requested report_date Other values are possible when a failure originates below the handler.", + "examples": [ + "fund_not_found", + "ambiguous_fund", + "series_required", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "fund", - "class_ids", - "registrant_cik", - "registrant_name", - "filing_date", - "form", - "accession_number", - "total_holdings", - "offset", - "available_report_periods", - "holdings", - "as_of" -]
- Changed
secedgar_get_insider_transactions6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "issuer_name", + "issuer_cik", + "transactions", + "filings_scanned" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `company_not_found`: The ticker or CIK does not resolve to a known company `no_filings_found`: No Form 4 filings exist for this company in the recent submissions window Other values are possible when a failure originates below the handler.", + "examples": [ + "company_not_found", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "issuer_name", - "issuer_cik", - "transactions", - "filings_scanned" -]
- Changed
secedgar_get_institutional_holdings6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "filer_name", + "filer_cik", + "filing_date", + "accession_number", + "total_holdings_in_filing", + "offset", + "holdings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `company_not_found`: The ticker or CIK does not resolve to a known company or institution `ambiguous_entity`: The name resolves to multiple EDGAR entities (e.g. several filers sharing a legal name) `no_filings_found`: No 13F-HR filings found for this entity in the recent submissions window `no_info_table`: The 13F-HR filing was found but the information table XML document could not be located Other values are possible when a failure originates below the handler.", + "examples": [ + "company_not_found", + "ambiguous_entity", + "no_filings_found", + "no_info_table" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "filer_name", - "filer_cik", - "filing_date", - "accession_number", - "total_holdings_in_filing", - "offset", - "holdings" -]
- Changed
secedgar_get_material_events6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cik", + "company_name", + "total_matched", + "total_8k_scanned", + "item_distribution", + "filings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "cik", - "company_name", - "total_matched", - "total_8k_scanned", - "item_distribution", - "filings" -]
- Changed
secedgar_get_snapshot6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "company", + "cik", + "taxonomy", + "period_type", + "concepts_resolved", + "concepts_total", + "lines", + "gaps", + "caveats" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `company_not_found`: The company input does not resolve to a CIK `ambiguous_company`: The company input resolves to multiple entities and the target is ambiguous `no_company_facts`: The filer has no XBRL facts at all — pre-XBRL, foreign private issuer, or a non-operating registrant Other values are possible when a failure originates below the handler.", + "examples": [ + "company_not_found", + "ambiguous_company", + "no_company_facts" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "company", - "cik", - "taxonomy", - "period_type", - "concepts_resolved", - "concepts_total", - "lines", - "gaps", - "caveats" -]
- Changed
secedgar_search_concepts6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "total", + "concepts" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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.", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "total", - "concepts" -]
- Changed
secedgar_search_filings6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "total", + "total_is_exact", + "results", + "effectiveQuery" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `invalid_date_range`: Only one of start_date or end_date was provided `unresolved_ticker`: A ticker: targeting token in the query does not resolve to a known company `invalid_cik`: A cik: targeting token in the query is not a 1-10 digit number `entity_not_found`: A cik: targeting token on a pre-2001 date range names a CIK with no EDGAR submissions history `missing_criteria`: Neither a full-text query nor a forms filter was provided (a date range cannot stand alone) `pre2001_full_text_unscoped`: A date range reaching before 2001-01-01 carries free-text terms with no entity scope — no pre-2001 full-text index exists, and nothing bounds a local scan Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_date_range", + "unresolved_ticker", + "invalid_cik", + "entity_not_found", + "missing_criteria", + "pre2001_full_text_unscoped" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "total", - "total_is_exact", - "results", - "effectiveQuery" -]
3 tool updates
- Added
secedgar_get_beneficial_owners - Added
secedgar_get_fund_holdings - Changed
secedgar_search_filings12 fields changed- changed
Input schema / properties / forms / descriptionPrevious value: -"Filter to specific form types (e.g., [\"10-K\", \"10-Q\", \"8-K\"]). Without this, searches all form types. Note: \"10-K\" also matches amendments filed as 10-K/A. Ownership forms (3, 4, 5) are indexed by the reporting person (e.g., \"LEVINSON ARTHUR D\"), not the issuer — rows carry no transaction code, share count, or price. Use secedgar_get_insider_transactions to retrieve parsed ownership XML with person, relationship, transaction code, shares, and price."New value: +"Filter to specific form types (e.g., [\"10-K\", \"10-Q\", \"8-K\"]). Without this, searches all form types. Note: \"10-K\" also matches amendments filed as 10-K/A. SEC renamed the blockholder schedules on 2024-12-18 — filings before that date are \"SC 13D\"/\"SC 13G\", filings after are \"SCHEDULE 13D\"/\"SCHEDULE 13G\" — so a filter spanning that boundary must list both spellings. Ownership forms (3, 4, 5) are indexed by the reporting person (e.g., \"LEVINSON ARTHUR D\"), not the issuer — rows carry no transaction code, share count, or price. Use secedgar_get_insider_transactions to retrieve parsed ownership XML with person, relationship, transaction code, shares, and price." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset. For sort=relevance, EDGAR pages server-side up to its 10,000-result cap. For date sorts (the default) and entity targeting, the tool fetches a single 100-row window and slices it client-side — offsets at or past the window return nothing; switch to sort=relevance for deep pagination, or narrow the search (forms, dates, entity targeting)."New value: +"Pagination offset. For sort=relevance on a 2001-onward search, EDGAR pages server-side up to its 10,000-result cap. Everywhere else the offset indexes the rows this call assembled and sorted: a single 100-row window for date sorts and entity targeting, the full matched set on a pre-2001 archive path, or both together on a range that crosses 2001-01-01. Offsets at or past those rows return nothing even when total is larger — switch to sort=relevance for deep pagination on a 2001-onward search, narrow the search (forms, dates, entity targeting), or query the dataframe. On a crossing range the two sides are assembled unevenly — the archive side contributes every row it matched, the full-text side one window of its total — so once the window runs out the rows jump to the pre-2001 era with the remaining full-text matches absent from the middle; search the 2001-onward era on its own to page through those." - changed
Input schema / properties / query / descriptionPrevious value: -"Full-text search query. Optional — omit (or pass \"\") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. Full-text terms match only filings from 2001 onward (the EFTS index floor); for a pre-2001 date range, drop the text terms (browse by form/date) or add ticker:/cik: entity scope. When present, supports exact phrases (\"material weakness\"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default."New value: +"Full-text search query. Optional — omit (or pass \"\") to browse by form type and/or entity instead, e.g. every S-1 in a date window, or a company's filings via ticker:/cik:. A date range alone is not a valid search; pair it with forms or entity targeting. The EFTS index that serves free text starts at 2001-01-01; a date range reaching earlier needs ticker:/cik: entity scope, which lets the tool read that entity's filings and match the terms locally (bounded to 50 documents, a few seconds at SEC's request rate), or drop the text terms to browse by form and date. When present, supports exact phrases (\"material weakness\"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), and entity targeting (ticker:AAPL or cik:320193 in the query); terms are AND'd by default. The pre-2001 local scan honors the same phrase / OR / exclusion / wildcard syntax." - changed
Output schema / properties / results / items / properties / file_description / descriptionPrevious value: -"SEC-provided description of the matching document (e.g., \"EX-99.1\"). Absent when SEC published none, and for pre-2001 archive-sourced rows."New value: +"SEC-provided description of the matching document (e.g., \"EX-99.1\"). Absent when SEC published none, and for pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only." - changed
Output schema / properties / results / items / properties / location / descriptionPrevious value: -"Business location (state or country code). Absent when SEC has no location for this filer, and for pre-2001 archive-sourced rows."New value: +"Business location (state or country code). Absent when SEC has no location for this filer, and for pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only." - changed
Output schema / properties / results / items / properties / period_ending / descriptionPrevious value: -"Period the filing reports on (YYYY-MM-DD). Absent for filings without a reporting period (e.g., proxy statements, ownership reports) and for all pre-2001 archive-sourced rows (source submissions/full-index), which carry no period field."New value: +"Period the filing reports on (YYYY-MM-DD). Absent for filings without a reporting period (e.g., proxy statements, ownership reports) and for all pre-2001 archive-sourced rows (source submissions/full-index), which carry no period field. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only." - changed
Output schema / properties / results / items / properties / sic / descriptionPrevious value: -"SIC industry code for the filer. Absent for filers without a classification, and for pre-2001 archive-sourced rows."New value: +"SIC industry code for the filer. Absent for filers without a classification, and for pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only." - changed
Output schema / properties / results / items / properties / source / descriptionPrevious value: -"Which EDGAR backend served this row: \"efts\" (2001+ full-text index), \"submissions\" (a pre-2001 entity-scoped filing history), or \"full-index\" (a pre-2001 unscoped quarterly index browse). Provenance is carried into the canvas dataframe as a `source` column."New value: +"Which EDGAR backend served this row: \"efts\" (2001+ full-text index), \"submissions\" (a pre-2001 entity-scoped filing history), or \"full-index\" (a pre-2001 unscoped quarterly index browse). A date range crossing 2001-01-01 is split at the boundary and returns rows of two sources in one result set, so read this per row rather than per result. Provenance is carried into the canvas dataframe as a `source` column." - changed
Output schema / properties / results / items / properties / ticker / descriptionPrevious value: -"Primary ticker symbol parsed from the EFTS display name. Absent for private filers, foreign filers without a US listing, filings whose display name omits the ticker parenthetical, and all pre-2001 archive-sourced rows. For multi-class issuers (e.g., BRK-A / BRK-B), this is the first class listed."New value: +"Primary ticker symbol parsed from the EFTS display name. Absent for private filers, foreign filers without a US listing, filings whose display name omits the ticker parenthetical, and all pre-2001 archive-sourced rows. A range crossing 2001-01-01 returns both kinds of row together, so this field is populated on source=efts rows only. For multi-class issuers (e.g., BRK-A / BRK-B), this is the first class listed." - added
Output schema / properties / scanAdded value: +{ + "additionalProperties": false, + "description": "Present only on the pre-2001 entity-scoped free-text path, where no full-text index exists and terms are matched by reading documents. Reports the scan's shape so a partial read is never presented as a complete one. Each document read is the whole accession .txt — SEC's original flat-submission format concatenates every exhibit into one file, and pre-1997 filings expose no per-document URL at all — so a match may sit in an attached exhibit rather than the body of the requested form. Absent on every other path.", + "properties": { + "candidates": { + "description": "Filings the form + date pre-filter selected before any document was read.", + "type": "number" + }, + "capped": { + "description": "True when candidates exceeded the document cap, so the unscanned remainder may hold further matches — narrow the form or date filter to bring them into range.", + "type": "boolean" + }, + "matched": { + "description": "Scanned filings whose text satisfied the query terms.", + "type": "number" + }, + "scanned": { + "description": "Candidate documents actually fetched and matched against. Capped at 50 per call.", + "type": "number" + } + }, + "required": [ + "candidates", + "scanned", + "matched", + "capped" + ], + "type": "object" +} - changed
Output schema / properties / total / descriptionPrevious value: -"Total matching filings. On the full-text (2001+) path this is capped at 10,000; entity targeting (ticker:/cik:) scopes server-side via the EFTS ciks param, so it is the entity's exact match count up to the cap. On a pre-2001 archive path it is the exact count within the scanned window (see total_is_exact)."New value: +"Total matching filings, which can exceed the rows returned inline or materialized. On the full-text (2001+) path this is capped at 10,000; entity targeting (ticker:/cik:) scopes server-side via the EFTS ciks param, so it is the entity's exact match count up to the cap. On a pre-2001 archive path it is the exact count within the scanned window (see total_is_exact). On a range crossing 2001-01-01 it is the sum of both eras' counts." - changed
Output schema / properties / total_is_exact / descriptionPrevious value: -"False when total is a lower bound — the full-text path hit its 10,000 cap, or a pre-2001 archive scan hit its page/quarter cap before exhausting the range."New value: +"False when total is a lower bound — the full-text path hit its 10,000 cap, a pre-2001 archive scan hit its page/quarter cap before exhausting the range, or a pre-2001 local text scan hit its document cap (scan.capped)."
6 tool updates
- Changed
secedgar_compare_companies1 field changed- changed
Output schema / properties / caveats / descriptionPrevious value: -"Comparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept that resolved to an XBRL tag SEC has retired (so that company's values may stop years short of the others'), period ends that differ inside one aligned period, and concepts whose unit differs across companies. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging."New value: +"Comparability warnings: a filer missing one or two calendar quarters from the frame-tagged series, a concept whose values stop at least two full years behind the rest of that company's reporting (either an XBRL tag SEC has retired, or a current tag the filer stopped using), period ends that differ inside one aligned period, and concepts whose unit differs across companies. Company-specific warnings are prefixed with the company name. Empty when nothing needs flagging."
- Added
secedgar_find_holders - Changed
secedgar_get_financials1 field changed- changed
Output schema / properties / caveats / descriptionPrevious value: -"Data-completeness warnings about the returned series. Two kinds. On quarterly results, one entry when one or two calendar quarters are absent from every recent qualifying year — SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact, so the calendar quarter fiscal Q4 spans has no frame-tagged value, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. Applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones. On any result, one entry when the concept resolved to an XBRL tag SEC has retired from the taxonomy, which means the current tags reported nothing and the series may stop years short. Absent when the series has nothing to flag."New value: +"Data-completeness warnings about the returned series. Two kinds. On quarterly results, one entry when one or two calendar quarters are absent from every recent qualifying year — SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact, so the calendar quarter fiscal Q4 spans has no frame-tagged value, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. Applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones. On any result, one entry when the series stops well short of today — either because the concept resolved to an XBRL tag SEC has retired from the taxonomy (the current tags reported nothing), or because a current tag's series ends more than two years plus a filing window back, which is what a filer migrating to a different element or dropping the disclosure looks like. Absent when the series has nothing to flag."
- Changed
secedgar_get_institutional_holdings1 field changed- changed
Input schema / properties / ticker_or_cik / descriptionPrevious value: -"The institutional filer whose 13F to fetch — a 10-digit CIK (e.g. \"0000102909\" for VANGUARD GROUP INC, the most reliable form) or an entity name. Names resolve through EDGAR entity search, which covers institutional managers absent from the ticker file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like \"AAPL\" finds that operating company's own filings (it files no 13F), not who holds it."New value: +"The institutional filer whose 13F to fetch — a 10-digit CIK (e.g. \"0000102909\" for VANGUARD GROUP INC, the most reliable form) or an entity name. Names resolve through EDGAR entity search, which covers institutional managers absent from the ticker file; a name matching several filers (some legal names are shared across entities) returns those candidates so you can retry with the exact CIK. This is NOT the portfolio company — passing an issuer ticker like \"AAPL\" finds that operating company's own filings (it files no 13F), not who holds it; use secedgar_find_holders for that direction."
- Added
secedgar_get_material_events - Changed
secedgar_get_snapshot1 field changed- changed
Output schema / properties / caveats / descriptionPrevious value: -"Data-completeness warnings. One entry when one or two calendar quarters are absent from every recent qualifying year, because SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact — this applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. One further entry per line that resolved to an XBRL tag SEC has retired from the taxonomy, whose values may stop years short of the filer's latest report. Empty when nothing needs flagging."New value: +"Data-completeness warnings. One entry when one or two calendar quarters are absent from every recent qualifying year, because SEC reports a filer's fiscal Q4 as the 10-K residual rather than a discrete quarterly fact — this applies to calendar-year filers (no discrete Q4) as much as to off-calendar ones, and a filer whose other fiscal quarters span non-calendar durations loses a second quarter the same way. One further entry, prefixed with the concept name, per line whose values stop at least two full years behind the newest period this filer reports anywhere in the profile — either because the line resolved to an XBRL tag SEC has retired from the taxonomy, or because a current tag's series simply ends, which is what a migration to a different element or a dropped disclosure looks like. Empty when nothing needs flagging."
Related MCP Connectors
SEC XBRL MCP — wraps SEC EDGAR XBRL API (data.sec.gov)
EDGAR MCP — SEC EDGAR public APIs (free, no auth)
SEC MCP — SEC EDGAR public APIs (free, no auth)
XBRL filings index MCP — wraps the filings.xbrl.org JSON:API index run by XBRL International, plus…
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables querying FDIC-insured institutions, their Call Report financials, peer comparisons, failure records, and deposit market share via MCP, over stdio or Streamable HTTP.90 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.148 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceQuery US Treasury national debt, interest rates, exchange rates, and fiscal datasets via MCP with STDIO or Streamable HTTP.85 npm2Apache 2.0
- FlicenseNot gradedqualityBmaintenanceAn MCP server that provides natural-language access to SEC EDGAR filings, including company lookups, financial figures, insider transactions, and filing comparisons, over streamable HTTP for any MCP client.-
Glama MCP Gateway
Add one secure layer between your agents and this server.