Skip to content
/insider-module/api/insiders/transactions/search

Search insider transactions with advanced filters.

Search insider transactions with advanced filters. Each row includes total_beneficial_ownership and sector/industry classification.

10 tokensSince v1.5.0

Why use this

The screening workhorse for insider activity: filter every Form 4 transaction in our database by ticker, insider name, transaction type (purchase/sale/grant/exercise/gift), date range, minimum dollar value, C-suite-only, and sector/industry. Built for fund analysts and quant researchers running thesis-driven screens like 'all CEO open-market purchases over $1M in Healthcare in the last 30 days' or 'all Form 4 sales over 100K shares from S&P 500 issuers this quarter'. Each row carries the insider's `total_beneficial_ownership` so you can immediately gauge conviction (a $5M sale that's 2% of holdings is a different signal than a $5M sale that's 60% of holdings). Pair the `dedup_owners=true` flag with `min_value` filtering to avoid the +112-223% aggregate-flow inflation that joint-filer rows introduce on PE LP+GP+manager and 13D-group filings.

Common use case

Finding all C-suite purchases over $1M in the last 30 days across all companies.

Multi-criteria insider-transaction search — the workhorse endpoint for screeners that combine ticker + role + value + sector filters. Each row carries total_beneficial_ownership (sum across all ownership vehicles per insider per company) and sector/industry classification. Use dedup_owners=true to collapse joint-filer rows (PE LP+GP+manager, 13D groups, SPAC sponsors) into one canonical row per economic transaction — see v3.17.0 changelog for partition keys. For ticker-only history use GET /insider-module/api/insiders/transactions/by-ticker/{ticker}; for cluster signals use GET /insider-module/api/insiders/clusters.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
queryqueryrequiredREQUIRED free-text search (min 2 chars), matched case-insensitively in ONE field (`ILIKE '%query%'`) against ticker symbol, company name, AND insider name — e.g. `AAPL`, `Apple`, or `Buffett`. There is no separate `ticker`/`insider_name` param; this single field covers all three.AAPL
filed_at_daysqueryoptional7Look back this many days by FILING date (when the Form 4 landed on EDGAR). Default 7, range 1–3650.30
transaction_daysqueryoptionalLook back this many days by TRANSACTION (trade-execution) date. Range 1–365. Omit to bound only by filing date.30
transaction_codequeryoptionalFilter by raw SEC Form 4 transaction code (`P` purchase, `S` sale, `A` grant, `M` exercise, …); comma-separated for multiple. For the normalized 6-bucket version use `standard_type`.P
max_valuequeryoptionalMaximum dollar value (`shares × price_per_share`).5000000
is_officerqueryoptionalWhen `true`, restrict to Section 16 officers.true
is_directorqueryoptionalWhen `true`, restrict to directors.true
is_ten_percent_ownerqueryoptionalWhen `true`, restrict to 10% beneficial owners.true
exclude_10b5_1queryoptionalfalseWhen `true`, exclude pre-planned Rule 10b5-1 trades (keep only discretionary activity).true
exclude_cashlessqueryoptionalfalseWhen `true`, exclude cashless option exercises.true
exclude_sell_to_coverqueryoptionalfalseWhen `true`, exclude RSU sell-to-cover (tax-withholding) sales.true
standard_typequeryoptionalpurchase, sale, grant, exercise, gift, otherNormalized transaction type — accepts `purchase`, `sale`, `grant`, `exercise`, `gift`, `other`. This is FinRadar's mapping of the SEC's 10+ Form 4 transaction codes (P, S, A, M, G, F, etc.) into 6 buckets analysts actually filter on. Omit to include all types.purchase
min_valuequeryoptionalMinimum dollar value (`shares × price_per_share`) — rows with null price (code A grants) are EXCLUDED when this is set. Use to focus on material trades; `1000000` removes most exercise-and-immediate-sale noise. Always combined with the `dedup_owners=true` flag for trading-flow analysis to avoid double-counting joint-filer rows.1000000
is_c_suitequeryoptionalWhen `true`, restricts to C-suite officers (CEO/CFO/COO/CIO/CTO/General Counsel) — heuristic match against the `officer_title` field. Setting `false` is treated the same as omitting (i.e. NOT a 'non-C-suite-only' filter; it's an opt-in narrowing). Useful for screening insider conviction signals where lower-rank insider trades are noisier.true
limitqueryoptional50Maximum rows returned (default 50, capped at 1000 server-side). Combine with `filed_at_days`/`transaction_days` to widen the window; the endpoint does not currently support cursor pagination so for full backfills prefer date-range chunking over `offset` pagination.20
sectorqueryoptionalSector classification, case-sensitive (e.g. `Technology`, `Healthcare`, `Financial Services`, `Industrials`, `Consumer Cyclical`). Joins via `cusip → ticker → sector`. Rows whose ticker has no sector mapping are excluded when this filter is set.Technology
industryqueryoptionalIndustry classification, case-sensitive (more specific than `sector` — e.g. `Software—Application`, `Biotechnology`, `Semiconductors`). Use the `/financials/tickers` endpoint to enumerate exact valid values, since some industry strings contain em-dashes that must be URL-encoded.Consumer Electronics
dedup_ownersqueryoptionalfalseOpt-in server-side joint-filer dedup (introduced v3.17.0). When `true`, collapses joint-filer rows (PE LP+GP+manager, 13D groups, SPAC sponsors) into one canonical row per economic transaction and exposes `co_owners` (JSON array) + `co_owner_count` (int). Eliminates the +112-223% aggregate-flow inflation observed across joint Form 4 filings. When `false` or omitted, response is byte-identical to pre-3.17.0 (no new keys appear).true
collapse_joint_filersqueryoptionalfalseWithin-filing variant of `dedup_owners` (mirrors `/transactions/latest`). Collapses joint-filer rows of the SAME economic transaction reported on ONE Form 4 into a single canonical row (deterministic min `transaction_id` survivor) with an additive integer `co_owner_count` (no `co_owners` array). If both `dedup_owners` and this are set, `dedup_owners` wins. Default false → byte-identical per-owner shape.true

Response schema

FieldTypeNullableDescription
statusstringnoAlways `success` on a 2xx response.
dataarrayyesArray of matching transaction rows, ordered by `transaction_date DESC` (most recent first), tie-broken by `transaction_id DESC`. Empty array when no rows match — never null. One row per `(transaction × reporting_owner)` pair by default; one row per economic transaction when `dedup_owners=true`.
data[].transaction_idstringyesStable internal primary key from the `insiders_transactions` table. When `dedup_owners=true` this is the canonical winner of the joint-filer dedup partition (deterministic by lowest `transaction_id` across the joint group). Stable across re-runs and re-parses — safe to use as a deduplication key on the client side.
data[].tickerstringyesIssuer ticker (the company whose insider is trading), normalized to canonical hyphen form (e.g. `BRK-A`, `GOOG-L`). For multi-class issuers, the class actually traded on the Form 4 is preserved — NOT collapsed to the primary share class.
data[].insider_namestringyesReporting-person legal name as filed on Form 4 (Item 1). May be an individual or an entity (LP, fund vehicle, trust). Casing is preserved verbatim from the filing — do NOT use this as a join key; use `insider_cik` instead. For canonical resolution across name variants, see `/insider-module/api/insider/search`.
data[].insider_cikstringyesSEC-issued reporting-person CIK as a 10-character zero-padded string. Same insider may file at multiple companies — combine `insider_cik + ticker` for per-issuer position tracking. Use as the join key against `/api/v1/ownership/holders/{uuid}/filing-history` once you've resolved CIK → unified-holder UUID.
data[].sharesnumbernoShare count for the transaction exactly as filed on the Form 4 — NOT split-adjusted server-side (preserves the as-filed view); no split-adjusted insider surface exists. Form 4 Table II rows are always included on this endpoint and carry the derivative transaction amount, so the value can be an option/RSU contract count rather than a common-share count. Always positive; direction (acquired vs disposed) is encoded in `acquired_disposed_code`.
data[].price_per_sharenumberyesPer-share transaction price in USD (Form 4 Item 5 column 4). Null for code-A grants and code-G gifts where there is no consideration. NOT split-adjusted — the as-filed price, on the same as-filed basis as the `shares` field. For Form 4 Table II rows this is the price of the DERIVATIVE security itself (Table II column 8) — e.g. the premium on an open-market option or warrant trade — never the strike: the SEC instructs filers to leave column 8 blank on exercises and conversions and report the exercise/conversion price in column 2, so code-M rows serve null or 0 here. The strike is the separate `conversion_or_exercise_price` field on the same row.
data[].transaction_valuenumberyesComputed `shares × price_per_share` in USD (rounded to nearest cent). Null when `price_per_share` is null (grants/gifts have no dollar value). Useful for `min_value` filtering and aggregate-flow analysis — combine with `dedup_owners=true` to avoid joint-filer double-counting.
data[].transaction_datestringyesISO `YYYY-MM-DD` date the trade was executed (Form 4 Item 3, NOT the filing acceptance date). For the date the filing was disclosed publicly, see the parent filing's `filed_date`. Trade dates can pre-date filing dates by up to 2 business days under the SEC's filing window.
data[].sectorstringyesSector classification for the issuer (e.g. `Technology`, `Healthcare`, `Financial Services`). Null when the ticker is unmapped (private CUSIPs, recently-listed issuers, foreign issuers without ADRs).
data[].industrystringyesIndustry classification (more specific than `sector` — e.g. `Software—Application`, `Biotechnology`, `Semiconductors`). Null when unmapped. Em-dash characters are preserved verbatim — be careful with URL encoding when round-tripping.
data[].co_ownersarrayyesPresent only when `dedup_owners=true`. JSON array of joint-filer co-owners collapsed into this canonical row, each entry shape `{name, cik, is_officer, is_director, is_ten_percent_owner}`. Use to surface 'this trade was filed jointly by 3 entities' in UIs, or to enumerate the legal participants for compliance audit.
data[].co_owner_countintegeryesNumber of reporting owners collapsed into this canonical row. Present when `dedup_owners=true` (= length of `co_owners`) OR when `collapse_joint_filers=true` (within-filing count; no `co_owners` array). A value of `1` means there were no joint filers (single owner). Values ≥2 mean a joint filing — `2` is the most common (LP+GP), but PE filings with `count: 9+` exist (e.g. LGN Form 4 with $514M × 9 owners).
metaobjectyesResult metadata block: pagination state plus a verbatim echo of the applied filters. Use it to drive UI page counters AND to confirm server-side parameter coercion (e.g. ticker normalization to canonical hyphen form is reflected in `meta.applied_filters.ticker` if returned).
meta.pagination.totalintegernoTotal matching rows for the full filter set, computed via a parallel `COUNT(*)` query (NOT just the size of the returned page). Use for UI page counters; for cursor-only iteration the per-page array length is sufficient.
meta.pagination.limitintegernoEffective page size after server-side capping. Mirrors the `limit` query parameter when it was within bounds, OR is set to the server-side cap (currently 1000) when the requested limit exceeded the cap. Always check this rather than echoing the requested limit.

Sample response

·
  • "status": "success"
  • "data":
    ]
  • "meta":
    • "pagination":
    }
  • "error": null
  • "request_id": null
  • "timestamp": "2026-05-02T15:32:18.094000"
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/insider-module/api/insiders/transactions/search?api_Token=YOUR_API_KEY&query=AAPL&filed_at_days=30&transaction_days=30&transaction_code=P&max_value=5000000&is_officer=true&is_director=true&is_ten_percent_owner=true&exclude_10b5_1=true&exclude_cashless=true&exclude_sell_to_cover=true&standard_type=purchase&min_value=1000000&is_c_suite=true&limit=20&sector=Technology&industry=Consumer+Electronics&dedup_owners=true&collapse_joint_filers=true" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).

Try it

Related endpoints