Envelope
Every delivery is aPOST of the same JSON envelope. Only data.object varies by event type.
Payload shapes
Three shapes cover every event type that carries a dataset array, and each catalog entry below names which one it uses.filing_items.metadata.created is the exception: it carries filing metadata rather than data, and its shape is documented with the event itself.
Filing-level
Used by the four statement events, the three segment events, and the two insider events. A header identifying the filing, plus an array named after the event’s dataset.
Each array entry is identical to a single entry from the corresponding API response.
Header vs. entry
form_type. Statement entries carry their own form_type recording which form that row came from. It matches the header for the filing’s reported period, and is null on ttm entries, because a trailing twelve month window can span multiple filings. Read the header when you want the filing; read the entry when you want that row’s provenance. Segment entries carry no form_type, filing_date, or filing_datetime.Release-level
Used by the three earnings intelligence events. Keyed to an earnings release rather than a filing period.Earnings
Used only byearnings.created. The data.object is a single entry from the GET /earnings/ response, with no wrapper array.
Event types
Listed alphabetically.balance_sheets.created
Fires when a filing’s balance sheets are extracted, within minutes of a 10-K, 10-Q, 20-F, or 6-K being processed.
Shape: filing-level, carrying balance_sheets. Entries match GET /financials/balance-sheets.
balance_sheet_segments.created
Fires when a filing reports balance sheet segment breakdowns. Balance sheet segments are rarer than income statement segments, so expect this event for fewer filings.
Shape: filing-level, carrying balance_sheet_segments. Entries match GET /financials/balance-sheets/segments.
cash_flow_statements.created
Fires when a filing’s cash flow statements are extracted, within minutes of a 10-K, 10-Q, 20-F, or 6-K being processed.
Shape: filing-level, carrying cash_flow_statements. Entries match GET /financials/cash-flow-statements.
cash_flow_statement_segments.created
Fires when a filing reports cash flow statement segment breakdowns. Like balance sheet segments, these are reported by fewer filings.
Shape: filing-level, carrying cash_flow_statement_segments. Entries match GET /financials/cash-flow-statements/segments.
earnings.created
Fires when we parse a new earnings release (8-K) or quarterly/annual report, within minutes of the filing hitting EDGAR.
Shape: earnings. The data.object is a single GET /earnings/ entry, so any parser written against the Earnings API works unchanged.
filing_items.metadata.created
Fires when a filing’s items become available, which is the moment GET /filings/items can serve them quickly. Covers 10-K, 10-Q, and 8-K filings and their amendments (10-K/A, 10-Q/A, 8-K/A), one event per filing.
This event carries metadata, not filing text. Filing text runs to megabytes, which would blow the 10 second delivery deadline, so the payload gives you the filing header, the items it contains, and a
url to fetch the text from. Treat it as a notification to go pull, not as the data itself.available_items. The values are exactly what the item query parameter accepts, so you can filter before spending a call. Append &item=<name> to the url to fetch a single section:
Item-1A, 10-Q items are part-qualified as Part-1,Item-2, and 8-K items carry their decimal number as Item-2.02. A filing contains any subset, so check available_items rather than assuming a given item is present. This makes the event a cheap filter: an agent that only cares about earnings releases can watch for Item-2.02 and ignore every other 8-K without fetching anything.
Fetching the url is a normal billed API call, and it hits a warm cache. See GET /filings/items for the response schema and the full list of item names.
financial_metrics.created
Fires when a filing’s financial metrics (valuation, margins, ratios, growth) are computed.
Shape: filing-level, carrying financial_metrics. Entries match GET /financial-metrics.
forward_guidance.created
Fires when an earnings release contains forward guidance, minutes after earnings.created once we finish analyzing the release.
Shape: release-level, carrying forward_guidance. Entries match GET /kpi/guidance.
income_statements.created
Fires when a filing’s income statements are extracted, within minutes of a 10-K, 10-Q, 20-F, or 6-K being processed.
Shape: filing-level, carrying income_statements. Entries match GET /financials/income-statements.
"period": "ttm" appears alongside the quarterly or annual one. Entries are ordered by period type, so on annual filings the ttm entry comes first.
income_statement_segments.created
Fires when a filing reports income statement segment breakdowns. This is the most common of the three segment events.
Shape: filing-level, carrying income_statement_segments. Entries match GET /financials/income-statements/segments.
insider_ownership.created
Fires when an insider reports positions they hold rather than trades: SEC Form 3 initial ownership statements, Form 5 filings that include holdings, and their amendments (3/A, 5/A). One event per filing, delivered once daily in the early morning UTC covering the previous day’s filings.
Shape: filing-level, carrying insider_ownership. Entries match GET /insider-ownership.
A single Form 5 that reports both transactions and holdings fires both events: one
insider_trades.created and one insider_ownership.created, sharing the same accession_number.insider_trades.created
Fires when a company insider reports buying or selling stock: SEC Form 4, Form 5 annual statements that include transactions, and their amendments (4/A, 5/A). One event per filing, delivered once daily in the early morning UTC covering the previous day’s filings.
Shape: filing-level, carrying insider_trades, with one entry per reported transaction in filing order. Entries match GET /insider-trades.
4/A, 5/A) is its own filing with its own accession_number, so it fires its own event containing the complete, amended set of transactions. Treat its contents as replacing what the original filing reported.
non_gaap_metrics.created
Fires when an earnings release contains non-GAAP metrics, minutes after earnings.created.
Shape: release-level, carrying non_gaap_metrics. Entries match GET /kpi/non-gaap.
operating_kpis.created
Fires when operating KPIs are extracted from a new earnings release, minutes after earnings.created.
Shape: release-level, carrying operating_kpis. Entries match GET /kpi/metrics.
Handling multiple earnings events
A single quarter of earnings can produce more than oneearnings.created event as the SEC filing chain progresses:
- The 8-K earnings release fires first, typically hours after announcement.
- The 10-Q (or 10-K for the fiscal-year quarter) follows 30 to 45 days later with the full GAAP-audited numbers, segments, and footnotes-derived metrics.
(ticker, report_period) but different accession_numbers and different data.object.source_type values ("8-K" vs "10-Q" vs "10-K").
Three reasonable ways to handle this:
- Dedupe by
(ticker, report_period)— process the first event you see, ignore the later one. Use when latency matters more than completeness. - Always process the most recent
source_type— keep the 10-Q’s richer data, discard the earlier 8-K once it arrives. Use when you need the full GAAP record. - Process both — emit your downstream signal twice. Use when you have separate “first signal” and “final record” consumers, such as real-time alerting plus an analytics warehouse.
event.id, the same one we use for retry idempotency. The dedup key on your side is (ticker, report_period) if you want once-per-quarter semantics. Foreign issuers and microcaps that don’t file 8-Ks fire only one event per period (the 10-Q, 10-K, or 20-F).
Timing summary
See also
- Webhooks reference — delivery, retries, signature verification, debugging.
- How to set up webhooks — step-by-step with a working Python receiver.