SEC Insider Trading API (Form 4): live + history since 2006
On Apify StoreGet every insider purchase and sale reported to the SEC on Form 4, from today's filings back to 2006, as clean JSON rows: who traded (director, CEO, 10% owner), what, when, how many shares, at what price, and how many they hold afterwards. Plus cluster-buy and cluster-sell signals: the moment two or more directors or officers of the same company buy, or sell, their own stock within a few weeks. Filter by ticker, CIK, transaction code, insider role, value and date. For investors, fintech apps and AI agents.
Pricing (pay per event): $0.0018 per transaction row ($1.80 per 1,000) and $0.02 per cluster signal. No start fee. You only pay for rows delivered, a transaction is never charged twice in a scheduled feed, and the Actor stops at your max charge limit.
Questions agents ask
- “Did any Tesla insiders buy shares in the last 90 days?”
- “Show insider cluster buys across the US market this month.”
- “List Nvidia insider sales over $1 million filed in 2024, with links to the Form 4s.”
Example
Input
{ "tickers": ["NVDA", "AAPL"], "transactionCodes": ["P", "S"], "minValueUsd": 100000,
"dateFrom": "2024-01-01", "maxResults": 1000 }Output
{
"record_type": "transaction",
"accession_number": "0000895126-15-000082",
"form": "4",
"issuer_name": "CHESAPEAKE ENERGY CORP",
"issuer_cik": "0000895126",
"ticker": "CHK",
"insider_name": "DUNHAM ARCHIE W",
"insider_cik": "0001192053",
"insider_roles": ["director"],
"officer_title": null,
"owner_count": 1,
"transaction_date": "2015-03-27",
"filing_date": "2015-03-31",
"transaction_code": "P",
"transaction_type": "Open-market or private purchase",
"acquired_disposed": "A",
"shares": 1000000,
"price": 13.98,
"value_usd": 13980000.0,
"shares_owned_after": 2635270,
"ownership": "direct",
"plan_10b5_1": false,
"cluster_insiders": 2,
"cluster_value_usd": 14029455.0,
"in_cluster": true,
"cluster_date": "2015-03-31",
"filing_url": "https://www.sec.gov/Archives/edgar/data/895126/000089512615000082/0000895126-15-000082-index.htm",
"source": "dera",
"source_url": "https://www.sec.gov/files/structureddata/data/insider-transactions-data-sets/2015q1_form345.zip",
"retrieved_at": "2026-11-05T16:15:49+00:00"
}What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
record_type | string | transaction = one Form 4 transaction; cluster = one cluster-buy or cluster-sell signal. |
cluster_side | string | null | Cluster rows only: buy = insiders buying together, sell = insiders selling together (10b5-1 plan sales excluded). |
accession_number | string | SEC accession number of the Form 4 filing. |
form | string | 4, or 4/A for an amendment. |
issuer_name | string | Company whose shares were traded, as filed. |
issuer_cik | string | SEC CIK of the issuer (10 digits). |
ticker | string | null | Issuer trading symbol as written in the filing. |
insider_name | string | Reporting person (the first one in a joint filing). |
insider_cik | string | null | SEC CIK of the reporting person. |
insider_roles | array | director, officer, ten_percent_owner, other (combined over all joint filers). |
officer_title | string | null | Officer title, e.g. Chief Executive Officer. |
owner_count | integer | Number of reporting persons on the filing (joint filings > 1). |
transaction_date | string | null | Date of the transaction (YYYY-MM-DD). |
filing_date | string | Date the SEC received the filing (YYYY-MM-DD). For cluster rows: the day the cluster rule was first met. |
accepted_at | string | null | EDGAR acceptance time with New York offset (live EDGAR rows only). |
transaction_code | string | Form 4 code: P purchase, S sale, A award, M option exercise, F tax withholding, G gift, ... |
transaction_type | string | null | Plain-English meaning of the transaction code. |
acquired_disposed | string | null | A = acquired, D = disposed. |
shares | number | null | Number of shares. |
price | number | null | Price per share in USD (null when the filing gives none). |
value_usd | number | null | shares x price. |
shares_owned_after | number | null | Shares owned after the transaction. |
ownership | string | null | direct or indirect (e.g. through a trust or fund). |
plan_10b5_1 | boolean | Made under a Rule 10b5-1 trading plan (checkbox since 2023, or a footnote saying so). |
security_title | string | null | Security, e.g. Common Stock. |
cluster_insiders | integer | null | Transactions: distinct directors/officers buying this issuer in the cluster window up to this filing date (null for non-buys or when the window reaches before the data read). Clusters: insiders in the cluster. |
cluster_value_usd | number | null | Total open-market purchase value of those insiders in the window. |
in_cluster | boolean | null | Purchases only: part of a cluster signal. |
cluster_date | string | null | Purchases in a cluster: the date of that cluster signal. |
first_filing_date | string | null | Cluster rows: filing date of the first buy in the cluster. |
cluster_window_days | integer | null | Cluster rows: the window used. |
insider_names | array | null | Cluster rows: the buying insiders. |
accession_numbers | array | null | Cluster rows: the Form 4 filings in the cluster. |
filing_url | string | EDGAR filing index page. |
source | string | edgar-xml (parsed Form 4 XML), dera (SEC Insider Transactions Data Sets) or derived (cluster). |
source_url | string | null | The exact SEC file the row was read from. |
retrieved_at | string | UTC time the row was produced. |
Coverage
Today's filings from the EDGAR live feed, minutes after the SEC accepts them; recent quarters from the EDGAR indexes and Form 4 XML; history from 2006 from the SEC's quarterly Insider Transactions Data Sets. Non-derivative table only: options and other derivatives are not included.
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>.
https://mcp.apify.com?tools=bosco_labs/sec-insider-trades
For “Did any Tesla insiders buy shares in the last 90 days?” the agent passes:
{"tickers": ["TSLA"], "transactionCodes": ["P"]}
stable, typed JSON, one row per Form 4 transaction (and one per cluster signal). Every row has schema_version and a source_url pointing to the exact SEC file the row came from (plus filing_url for the Form 4 itself), so the agent can cite its source.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~sec-insider-trades/run-sync-get-dataset-items with the input as JSON body. Cost: $0.0018 per transaction row and $0.02 per cluster signal.
Input fields
| Field | Type | Meaning |
|---|---|---|
lookbackDays | integer | Used only when dateFrom is empty: read filings from this many days back until today, e.g. 30. Empty = 90 days when tickers or ciks are set, 7 days for the whole market. Handy for schedules. |
dateFrom | string | Earliest filing date, YYYY-MM-DD, e.g. "2024-01-01". Data starts 2006-01-01. Empty = lookbackDays days before today (90 for tickers/CIKs, 7 for the whole market). |
dateTo | string | Latest filing date, YYYY-MM-DD, e.g. "2024-12-31". Empty = today, including today's filings from the live EDGAR feed. |
clusterBuysOnly | boolean | true = only open-market purchases that are part of a cluster: at least 2 different directors or officers of the same company buying, filed within clusterWindowDays, together worth at least $100,000. Default false. Also reads the window before the date range. |
clusterSellsOnly | boolean | true = only open-market sales that are part of a cluster (same rule as cluster buys, for sales). Pre-planned 10b5-1 plan sales are left out (filings flag them since April 2023). Default false. Can be combined with clusterBuysOnly. |
includeClusterSignals | boolean | true (default) = also output one row per cluster signal (record_type = "cluster"): the day a company's insider buying or selling first met the cluster rule, with the insiders and total value. Charged as a separate, higher-priced event. false = transaction rows only. |
clusterWindowDays | integer | How many days of filings count as one cluster of insider buying or selling, e.g. 14. Default 30. |
transactionCodes | array | Form 4 transaction codes to return, e.g. ["P"] for open-market purchases only. Default ["P", "S"] (open-market purchases and sales). Pass [] for all codes, including awards (A), tax withholding (F) and option exercises (M). |
insiderRoles | array | Only insiders with one of these roles: director, officer, ten_percent_owner, other, e.g. ["director", "officer"]. Empty = all roles. |
minValueUsd | integer | Minimum transaction value in USD (shares x price), e.g. 100000. Default 0 = no minimum. Transactions without a price count as 0. |
maxResults | integer | Maximum transaction rows, newest first, e.g. 500. Default 100, up to 200,000 per run (split bigger exports by date range). The run stops reading once it has this many, and returns at most this many cluster signals. |
onlyNewSinceLastRun | boolean | true = skip (and don't charge for) transactions and signals an earlier run with the same filters already delivered. For scheduled runs. Default false. Remembered in a named key-value store in your account. |
tickers | array | Optional: issuer stock tickers, e.g. ["AAPL", "TSLA"]. Leave empty to scan the whole market (the usual use: insider buying anywhere). Mapped to the company's CIK with the SEC's ticker list; history is also matched on the ticker as written in the filing. |
ciks | array | Issuer SEC Central Index Keys as digits, leading zeros optional, e.g. ["320193"] for Apple. Use for delisted or renamed companies the SEC's ticker list no longer has. Empty = no CIK filter. |
Sources, licence and limits
Is this the same data as OpenInsider and similar sites? Same source (SEC Form 4), but you get raw, complete rows through an API, 2006 onward, including amendments (form: "4/A"), joint filings and the 10b5-1 flag.
What about options? Grants, exercises and sales of options and other derivatives sit in the derivative table of Form 4 and are not included. Shares received from an exercise (code M) and sold (code S) are.
Joint filings? One row per transaction; insider_name is the first reporting person, owner_count the number of joint filers, and roles are combined.
Tickers that changed? Tickers are mapped to companies with the SEC's current list. For a delisted or renamed company, pass its CIK, or the old ticker for history (it matches the ticker written in the filings).
Why are some prices empty? Some filings give no price (awards, gifts) or only a footnote; price and value_usd are then null or 0, exactly as filed.
Legal basis? SEC filings are US government public records. See LEGAL.md. This is data, not investment advice.