Insider-transaction news (SEC Form 4)
Dedicated insider feed (category=insider): SEC EDGAR Form 4 insider activity ONLY — one deterministic-templated row per filing event (a filing's non-derivative trades of one type and holding form, aggregated: total shares, volume-weighted average price and executed range, total value), surfaced shortly after filing, with the relevance score computed from the event's total (size, buy vs. sell, 10b5-1 plan or not). Same enriched shape, ticker and relevance_score >= 4 filtering, and cursor-based pagination as /api/news/. Equivalent to /api/news/?category=insider, surfaced as a first-class route. For aggregate stats instead of the stream, see /api/symbols/{ticker}/insider-summary/.
To watch for new filings, poll with sort=ingested rather than re-reading the newest page: a Form 4 is filed up to several days after the trade it reports, so a new event often enters the feed already below the head of the publish-ordered page. Delta mode orders by the moment the row became available, so it never misses one. The contract is identical to /api/news/?sort=ingested — see that endpoint for the full description.
Query parameters
Opaque cursor from a prior response's next_cursor. Omit for the newest page.
Filter to insider news that mentions this ticker. Delisted symbols return their history; a renamed company's current ticker also matches rows tagged with its former ticker. ticker is accepted as an alias.
Override the default ≥4 threshold. Insider rows score deterministically from the event's summed dollar value (plus buy/10b5-1 modifiers), so this acts as an "only large trades" dial — e.g. min_relevance=7 keeps roughly $10M+ events.
Filter on the same field each item's insider block reports: the event's Rule 10b5-1 status. Omit for every event; false returns discretionary trades only — the "hide pre-scheduled sales" dial, since a 10b5-1 ladder was set up months earlier and carries no timing decision; true returns plan events only. Event-level, like the field itself: a filing whose group mixes plan and discretionary tranches counts as a plan event on both. The two values partition the feed, so true and false pages always add up to the unfiltered one.
Items per page, default 10. Any value from 1 to 20 is accepted on every tier; 21-50 requires a Pro key. A value outside 1-50, or an over-20 page without a Pro key, returns 400. limit is accepted as an alias.
published (default) is the reverse-chronological feed. ingested is delta-polling mode, with the same contract as on /api/news/: rows in the order they became available, ascending, next_cursor always returned (empty results = caught up), and all other filters applied unchanged. Prefer it for watching insider activity — a Form 4 is filed days after the trade it reports, so a new event routinely lands below the newest page of the publish-ordered feed and a poller reading only the head misses it. Cursors are mode-specific: a cursor is only valid with the sort mode that issued it (a mismatch returns 400).
Inclusive lower bound on time_published, identical in format and behaviour to the parameter on /api/news/ (ISO-8601, naive read as UTC, tier-gated with 403, refused with sort=ingested). Note which clock it is: time_published is when the filing reached the feed, NOT the insider's transaction_date reported in the insider block. A Form 4 is filed days after the trade, so a window over trade dates is a different question and this parameter does not answer it.
Inclusive upper bound on time_published. A bare date covers the whole day; same clock caveat as from_date.
Response format. json (default) is the page described below. csv streams the same feed as a file: one row per insider event, the same filters (symbol, min_relevance, is_10b5_1, from_date/to_date, sort, cursor), walked page by page on the server up to your plan's row cap — Free 500, Basic 2 000, Pro 10 000 rows per file — inside your plan's archive horizon (30 / 90 / 180 days). page_size has no effect on CSV. One request counts once against your rate limit, whatever the file's length.
The export never fails part-way. Where a JSON page past the horizon returns 403, the file stops at the horizon and the response headers say so (X-Alphai-Truncated: archive_horizon). Validation errors (a bad cursor, an inverted window, a window with sort=ingested) are the same 400 JSON bodies as for format=json, sent before any row.
Response: Content-Type: text/csv; charset=utf-8, Content-Disposition: attachment; filename="alphai-insider-<date>.csv", Cache-Control: private, no-store, plus the X-Alphai-* headers listed under the 200 response: X-Alphai-Rows (data rows in the file), X-Alphai-Row-Cap (your plan's cap), X-Alphai-Truncated (row_cap — more rows exist, continue with the cursor; archive_horizon — the walk reached your plan's archive depth; false — the file holds everything the filters select) and X-Alphai-Next-Cursor (present when there is more: the same token a JSON page would have returned at that position, so you can continue in either format).
Columns, in order: uid, time_published, tickers (|-joined), title, url, category, relevance_score, side, transaction_code, shares, avg_price_usd, total_value_usd, is_10b5_1, insider_name, insider_title, is_officer, is_director, is_ten_percent_owner, transaction_date, filed_at, late_filing, summary — the JSON item's fields and its insider block flattened (event columns are empty for a row without a block). RFC 4180 quoting, LF line endings, UTF-8, timestamps in ISO 8601 UTC (Z), booleans true/false, an empty cell for null, never the article body. A free-text cell that begins with =, +, -, @ or a tab is prefixed with an apostrophe so it cannot run as a formula when the file is opened in a spreadsheet.
Select the format with this parameter only: an Accept: text/csv header on its own still returns JSON, and a client that sends Accept: application/json together with format=csv gets 406. With sort=ingested and no cursor the file holds the newest rows (up to the cap) in ingest order and the cursor parks at the head, like the JSON prime page; with a cursor it holds everything since that position, with rows older than your archive horizon skipped and reported as archive_horizon.
Response
A page of enriched insider-transaction articles. Each item additionally carries the structured insider event block (side / shares / average price / total value / reporting owner) — populated on this endpoint only. With format=csv, the same rows as a streamed CSV file: see the format parameter for the columns, the per-plan row caps and the X-Alphai-* headers.
Example response
{
"results": [
{
"enrichment": {
"tickers": [
"NVDA"
],
"news_context_enhancement": {
"key_entities": [
{
"type": "company"
}
]
}
},
"earnings": {
"fiscal_period": "Second Quarter Fiscal 2027",
"key_metrics": [
{
"value": "$96.2 billion",
"numeric": 96.2,
"unit": "USD"
}
]
},
"story_id": "788e477c66f3849b",
"sources_count": 3,
"sources": [
"reuters.com",
"apnews.com",
"bloomberg.com"
],
"insider": {
"transaction_code": "S",
"shares": "25000",
"avg_price_usd": "187.32",
"total_value_usd": "4683000",
"insider_name": "STEVENS MARK A",
"insider_title": "Director",
"transaction_date": "2026-07-09",
"filed_at": "2026-07-11T20:31:04Z"
},
"filing": {
"items": [
"5.02",
"9.01"
],
"primary_item": "5.02",
"accession_number": "0001193125-26-231145",
"filed_at": "2026-09-18T20:05:12Z",
"event_date": "2026-09-16",
"exhibit_url": "https://www.sec.gov/Archives/edgar/data/1045810/000104581026000123/ex99-1.htm"
}
}
],
"symbol_note": "'BTC' is Grayscale Bitcoin Mini Trust ETF (a stock/ETF ticker). The cryptocurrency with this symbol trades as BTC-USD — request BTC-USD for coin news."
}