/v2/insider returns one trailing-90-day rollup plus the most recent transaction rows. The work is reading two summaries correctly: market_activity is the open-market buy/sell signal, and all_activity is every Form 4 kind including exercises and gifts. Mix them up and a quiet quarter looks like a sell-off.
One call
insider.py
limit only caps how many recent_transactions rows come back; it does not change the summary math.
The summary, from a live AAPL response
insider.data.summary_90d
- Open-market: 0 buys, 13 sells, net -397,759 shares worth -$111.7M.
net_directionisselling. These are the cash trades insiders chose to make, the part most people mean by “insider selling.” - All Form 4 activity: 43 transactions across 7 insiders. Of those, only 13 are open-market sales; the other 30 are 22 derivative exercises, 6 tax-withholding events, and 2 gifts.
net_shares_all_kindsis positive (+25,895) because exercises add shares, which is why you never quote the all-activity net as a sell figure. - 10b5-1:
ten_b5_1_plan_ratio_pctis 0. None of these sales were affirmatively disclosed as 10b5-1 plan sales: every row carriesten_b5_1: { "available": false, "reason": "trading_plan_not_disclosed" }, meaning the filing made no statement either way. Read a 0% ratio as undisclosed, not discretionary: you cannot conclude these were unplanned, only that no plan was reported. Plan sales (whereten_b5_1is the literaltrue) carry less signal because they were set up in advance.
Recent rows
Each row carries atransaction_code (the raw Form 4 code) and a plain-English transaction_kind. The codes map as P open_market_purchase, S open_market_sale, M derivative_exercise, A award_grant, F tax_withholding, G gift. Two rows from the live response:
insider.data.recent_transactions[0..2] (trimmed)
limit default). On the gift row, price_per_share and value_usd are objects with available: false and a reason, because a gift has no market price. Treat that as “no dollar figure,” never as a $0 trade. Exercises (derivative_exercise_price_not_disclosed) and tax withholding (tax_withholding_no_market_price) carry the same shape.
ten_b5_1 is three-state and the API never returns a bare false: it is the literal true when the filing affirmatively discloses a 10b5-1 plan sale, or the envelope { "available": false, "reason": "trading_plan_not_disclosed" } when it does not. The not-disclosed envelope is silence, not a “no”; never render it as “insider was NOT on a plan.”
Notices
summary_90d.notices flags anything that bounds the rollup. Two you will see:
recent_transactions_limited_to_N: more rows exist than thelimityou asked for; raiselimit(up to 200) to see them.scanned_latest_200_filings_only: the 90-day window held more than 200 Form 4 filings, so the rollup covers the most recent 200. Surface this; the summary is complete only up to that cap.
notices through to the reader verbatim. Dropping it hides the boundary on the numbers.
A reportable answer
answer
Scope
/v2/insideris Form 4 transactions plus Form 144 intent-to-sell notices. Institutional ownership and 13F holders are private beta, not part of this public-core route.- ETFs and foreign private issuers that file 20-F/40-F/6-K return
unsupportedhere, because there are no domestic Form 4 filers to scan. See coverage and gaps.
SEC risk review
For the prose of a filing (risk factors, MD&A), walk the section endpoints instead.