news

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.

get/api/news/insider/

Query parameters

cursorstring

Opaque cursor from a prior response's next_cursor. Omit for the newest page.

symbolstring
Example:NVDA

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.

min_relevanceinteger

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.

is_10b5_1boolean

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.

page_sizeinteger

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.

sort'published' | 'ingested'

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).

from_datestring date-time

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.

to_datestring date-time

Inclusive upper bound on time_published. A bare date covers the whole day; same clock caveat as from_date.

format'json' | 'csv'

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.

next_cursorstring nullable required

Opaque cursor for the next page. Pass it back as ?cursor= with the same sort mode. Default (sort=published) feed: the next older page, null when the end of the feed has been reached. Delta mode (sort=ingested): always non-null — it is your polling position; empty results means caught up, keep the cursor and poll again later.

symbol_notestring nullable

Crypto-collider hint, set only when symbol named a string a stock/ETF owns while an active cryptocurrency answers to the same base (crypto is addressed as <SYM>-USD, so BTC is the Grayscale ETF and BTC-USD the coin). One sentence naming the coin ticker to request; null for every other query. The page itself still serves the equity's feed — the string keeps its equity meaning.

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."
}

Changes