// guide
Insider Trading Screener: Filter SEC Form 4 by Code, Size & Returns
Updated 2026-06-16. By Theodor Nielsen, founder of Form4API.
// answer
To screen insider trades, add filter parameters to /v1/transactions: transaction code, trade size, post-trade return, date range, and more. A single significant=true applies the common signal preset — open-market only, excluding 10b5-1 plan trades and derivatives. The same grammar drives the screener UI and the CSV export endpoint.
Core filters
Every screen is a GET /v1/transactions with query parameters. The core set is available on every plan:
- Entity:
ticker,cik(company), orinsider_cik(a specific insider). - Transaction code:
code=Pfor a single code,codes=P,Sfor several, orcategory=open_marketfor a named group. Invert withexclude_codes/exclude_category. - Date range:
fromandto(ISO dates) on the transaction date. - Quality switches:
exclude_10b5=truedrops pre-scheduled plan trades;exclude_derivative=truedrops option/derivative rows.
See the Form 4 guide for what each transaction code means, and the docs for the full category list.
The significant preset
Most signal work wants the same starting point: open-market transactions only, with 10b5-1 plan trades and derivatives removed. Rather than set three parameters every time, pass significant=true, which seeds exactly that — category=open_market, exclude_10b5=true, exclude_derivative=true. Any explicit parameter you also pass wins over the preset, so you can start broad and narrow from there.
# Open-market, no 10b5-1, no derivatives — the signal baseline curl "https://api.form4api.com/v1/transactions?significant=true&per_page=50" \ -H "X-Api-Key: $FORM4API_KEY"
Size & return filters (Pro plan)
The higher-signal filters — trade size and post-trade performance — require the Pro plan or higher. On the free tier they return a 403 with a clear upgrade message.
- Trade size:
min_value/max_value(dollar value = shares × price) andmin_shares/max_shares. - Post-trade return:
min_return_1d,min_return_1w,min_return_1m,min_return_3m,min_return_6m(and theirmax_counterparts). Values are fractions —0.1means 10%. Require all horizons populated withhas_returns=true. - Institutional context:
inst_ownership_trend=increasing(ordecreasing/stable) restricts to companies whose 13F-HR institutional ownership is moving that way.
Example screens
High-conviction open-market buys of at least $100k:
curl "https://api.form4api.com/v1/transactions?significant=true&code=P&min_value=100000&per_page=50" \ -H "X-Api-Key: $FORM4API_KEY"
Buys that were up 10%+ three months later (back-test the setup):
curl "https://api.form4api.com/v1/transactions?code=P&min_return_3m=0.1&has_returns=true" \ -H "X-Api-Key: $FORM4API_KEY"
Open-market buys in Q1 2026 where institutions are also accumulating:
curl "https://api.form4api.com/v1/transactions?significant=true&code=P&from=2026-01-01&to=2026-03-31&inst_ownership_trend=increasing" \ -H "X-Api-Key: $FORM4API_KEY"
Need the whole result set, not a page? Swap /v1/transactions for /v1/transactions/export to stream the same filtered rows as CSV — handy for a spreadsheet or a backtest.
Screener vs the signals endpoint
Screening with /v1/transactions builds your own criteria from raw trades. If you would rather consume ready-made signals, the /v1/signals endpoint returns pre-computed cluster buys and sells — filter with cluster_buy=true or cluster_sell=true — and /v1/signals/sentiment/{ticker} returns a monthly insider-sentiment score. The signals and sentiment endpoints require the Business plan or higher.
curl "https://api.form4api.com/v1/signals?cluster_buy=true&per_page=20" \ -H "X-Api-Key: $FORM4API_KEY"
Frequently asked questions
How do I screen insider trades?
Screen by adding filter parameters to the /v1/transactions endpoint. Combine entity filters (ticker, cik, insider_cik), transaction code (code or a comma-separated codes list, or a named category), a date range (from, to), and switches like exclude_10b5 and exclude_derivative. A single significant=true parameter applies the common "real signal" preset in one shot — open-market only, with 10b5-1 plan trades and derivative transactions excluded. The same filter grammar works on /v1/transactions/export to stream the matching rows as CSV.
How do I filter for high-conviction insider buys?
Start from significant=true (open-market, no 10b5-1, no derivatives), restrict to purchases with code=P, and add a size floor with min_value (dollar value) or min_shares. For example, significant=true&code=P&min_value=100000 returns open-market purchases worth at least $100,000. The size and value filters require the Pro plan or higher; on the free tier they return a 403 telling you to upgrade.
Can I screen insider trades by their subsequent return?
Yes — Form4API computes post-trade returns at 1-day, 1-week, 1-month, 3-month, and 6-month horizons, and you can filter on them with min_return_1m, max_return_3m, and so on, or require fully-populated returns with has_returns=true. For example, code=P&min_return_3m=0.1&has_returns=true finds open-market buys that were up at least 10% three months later — returns are expressed as fractions, so 0.1 means 10%. This is useful for back-testing which insiders or setups actually preceded gains. Return-based filters are a Pro-plan feature.
What is the difference between the screener and the signals endpoint?
The /v1/transactions filters let you screen raw transactions ad hoc on any combination of code, size, date, and return. The /v1/signals endpoint instead returns pre-computed signals — cluster buys and cluster sells — that the platform derives from those transactions, filtered with cluster_buy=true or cluster_sell=true. Screening is for building your own criteria; signals are for consuming ready-made ones. The signals and sentiment endpoints require the Business plan or higher.