Skip to content
/insider-module/api/insiders/aggregation/by-sector

Aggregate insider activity by sector or industry.

Aggregate insider activity by sector or industry. Returns metrics per group: transaction count, filing count, unique insiders (counted as distinct canonical owners — one per economic transaction, not raw distinct ReportingOwner names; matches /clusters.insider_count semantics), unique issuers, buy/sell counts, buy/sell values, net value, buy/sell shares, and net shares.

5 tokensSince v1.5.0

Why use this

Sector-level insider sentiment analysis and heatmap data.

Common use case

Building a sector heatmap showing where insider buying/selling is concentrated, or comparing insider activity across Technology vs Healthcare vs Energy sectors.

Sector / industry insider-activity heatmap aggregator — partitions all qualifying transactions in a lookback window into Sharadar-classified buckets and emits one row per bucket with 13 metrics covering count, value, share, breadth, and direction.

The most-used filter combinations:

  • Sector heatmapgroup_by=sector + filed_at_days=30 + sort_by=abs_net_value returns the top-N sectors by absolute net flow (largest mover regardless of direction).
  • C-suite-only conviction — add is_c_suite=true + exclude_10b5_1=true + min_value=1000000 to strip out routine 10b5-1 sales and surface only material discretionary activity.
  • Sector rotationgroup_by=sector + acquired_disposed_code=A to find sectors with concentrated insider BUYING (vs the default which mixes both directions into net_value).
  • Industry drill-downgroup_by=industry + sector=Technology to break Technology-sector activity into its constituent industries (Software—Application, Semiconductors, Consumer Electronics).

v3.x changed unique_insiders semantics to count UNIQUE BENEFICIAL OWNERS (post-canonical-owner dedup) — multiple LLC/trust vehicles of the same person now count as one (the previous behavior over-counted by 5-15% on average). This makes unique_insiders / unique_issuers a sharper breadth metric.

For the per-ticker rolled-up sentiment use GET /insider-module/api/insiders/summary/by-ticker/{ticker}; for the global all-market dashboard use GET /insider-module/api/insiders/stats/global.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
group_byqueryoptionalsectorGroup by 'sector' or 'industry'
sectorqueryoptionalFilter to a specific sectorTechnology
industryqueryoptionalFilter to a specific industryConsumer Electronics
filed_at_daysqueryoptional30Lookback window in days (1-3650)
transaction_daysqueryoptionalFilter by transaction date (days ago, 1-365)30
min_valuequeryoptionalMinimum transaction value1000000
max_valuequeryoptionalMaximum transaction value100000000
transaction_codequeryoptionalFilter by transaction code (P, S, M, etc.)P
acquired_disposed_codequeryoptionalFilter by A (Acquired) or D (Disposed)A
is_officerqueryoptionalFilter to officers onlytrue
is_directorqueryoptionalFilter to directors onlyfalse
is_ten_percent_ownerqueryoptionalFilter to 10%+ owners onlyfalse
is_c_suitequeryoptionalFilter to C-suite executives onlytrue
exclude_10b5_1queryoptionalfalseExclude pre-planned 10b5-1 trades
exclude_cashlessqueryoptionalfalseExclude cashless exercise sales
limitqueryoptional50Max groups to return (max 500)20
offsetqueryoptional0Pagination offset0
sort_byqueryoptionalabs_net_valueSort by: abs_net_value, net_value, total_value, transaction_count, or unique_insidersfiled_at

Response schema

FieldTypeNullableDescription
statusstringnoAlways `success` on 2xx.
dataarraynoArray of one row per `(group_by)` partition meeting the filter set. Sorted by `sort_by` parameter (default `abs_net_value DESC` — largest absolute net flow first, regardless of direction). When `sector` or `industry` filter is set, the array contains a single row.
data[].groupstringyesSector name (when `group_by=sector`) or industry name (when `group_by=industry`). Null for tickers without a Sharadar classification — these accumulate into a single 'unclassified' bucket so the ratios remain consistent.
data[].transaction_countintegernoTotal qualifying transactions in the group (post-filter). Excludes 10b5-1 trades when `exclude_10b5_1=true`; excludes cashless-exercise sales when `exclude_cashless=true`.
data[].filing_countintegernoDistinct Form 4 filings represented in the group (one filing can have many transactions; this is the unique-filing count).
data[].unique_insidersintegernoDistinct count of reporting persons in the group (post-canonical-owner dedup — multiple LLC/trust vehicles of the same beneficial owner count as one). Use as a breadth metric — high `unique_insiders / unique_issuers` ratio = signal spread across many insiders rather than concentrated in a few.
data[].unique_issuersintegernoDistinct count of issuer companies in the group. Combined with `unique_insiders` and `transaction_count`, gives a 3-way density view of the group's activity.
data[].buy_countintegernoCount of acquisition transactions (`acquired_disposed_code='A'`).
data[].sell_countintegernoCount of disposition transactions (`acquired_disposed_code='D'`).
data[].buy_valuenumbernoSum of `shares × price_per_share` across all buy-side transactions in the group, USD. Always non-negative.
data[].sell_valuenumbernoSum of `shares × price_per_share` across all sell-side transactions in the group, USD. Always non-negative.
data[].net_valuenumberno`buy_value - sell_value` (signed USD). The headline magnitude metric — positive = net buying, negative = net selling. Sort by `abs_net_value` to get the most-active groups regardless of direction.
data[].buy_sharesnumbernoSum of shares acquired (split-adjusted). Always non-negative.
data[].sell_sharesnumbernoSum of shares disposed. Always non-negative.
data[].net_sharesnumberno`buy_shares - sell_shares` (signed).
metaobjectyesResult metadata block — pagination + applied filters echo.
meta.totalintegernoTotal distinct groups matching the filter set (full count, not just the returned page).
meta.limitintegernoEffective page size (capped at 500 server-side).
meta.offsetintegernoEcho of the requested offset.
meta.has_morebooleanno`true` when another page is available.
meta.group_bystringnoEcho of the resolved `group_by` parameter (`'sector'` or `'industry'`). Source of truth for clients rendering 'Grouped by Sector'-style headings.
meta.filed_at_daysintegeryesEcho of the resolved lookback window (defaults to 30 when unset). Useful for clients to render 'Last 30 days' annotations.
request_idstringyesPer-request UUID for log correlation.
timestampstringnoISO-8601 UTC response timestamp.

Sample response

·
  • "status": "success"
  • "data":
    ]
  • "meta":
    • "total": 11
    • "limit": 50
    • "offset": 0
    • "has_more": false
    • "group_by": "sector"
    • "filed_at_days": 30
    }
}

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/aggregation/by-sector?api_Token=YOUR_API_KEY" \
  -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).