/insider-module/api/insiders/aggregation/by-sectorAggregate 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.
Why use this
Common use case
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 heatmap —
group_by=sector+filed_at_days=30+sort_by=abs_net_valuereturns 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=1000000to strip out routine 10b5-1 sales and surface only material discretionary activity. - Sector rotation —
group_by=sector+acquired_disposed_code=Ato find sectors with concentrated insider BUYING (vs the default which mixes both directions intonet_value). - Industry drill-down —
group_by=industry+sector=Technologyto 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
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| group_by | query | optional | sector | — | Group by 'sector' or 'industry' | — |
| sector | query | optional | — | — | Filter to a specific sector | Technology |
| industry | query | optional | — | — | Filter to a specific industry | Consumer Electronics |
| filed_at_days | query | optional | 30 | — | Lookback window in days (1-3650) | — |
| transaction_days | query | optional | — | — | Filter by transaction date (days ago, 1-365) | 30 |
| min_value | query | optional | — | — | Minimum transaction value | 1000000 |
| max_value | query | optional | — | — | Maximum transaction value | 100000000 |
| transaction_code | query | optional | — | — | Filter by transaction code (P, S, M, etc.) | P |
| acquired_disposed_code | query | optional | — | — | Filter by A (Acquired) or D (Disposed) | A |
| is_officer | query | optional | — | — | Filter to officers only | true |
| is_director | query | optional | — | — | Filter to directors only | false |
| is_ten_percent_owner | query | optional | — | — | Filter to 10%+ owners only | false |
| is_c_suite | query | optional | — | — | Filter to C-suite executives only | true |
| exclude_10b5_1 | query | optional | false | — | Exclude pre-planned 10b5-1 trades | — |
| exclude_cashless | query | optional | false | — | Exclude cashless exercise sales | — |
| limit | query | optional | 50 | — | Max groups to return (max 500) | 20 |
| offset | query | optional | 0 | — | Pagination offset | 0 |
| sort_by | query | optional | abs_net_value | — | Sort by: abs_net_value, net_value, total_value, transaction_count, or unique_insiders | filed_at |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| status | string | no | Always `success` on 2xx. |
| data | array | no | Array 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[].group | string | yes | Sector 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_count | integer | no | Total 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_count | integer | no | Distinct Form 4 filings represented in the group (one filing can have many transactions; this is the unique-filing count). |
| data[].unique_insiders | integer | no | Distinct 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_issuers | integer | no | Distinct 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_count | integer | no | Count of acquisition transactions (`acquired_disposed_code='A'`). |
| data[].sell_count | integer | no | Count of disposition transactions (`acquired_disposed_code='D'`). |
| data[].buy_value | number | no | Sum of `shares × price_per_share` across all buy-side transactions in the group, USD. Always non-negative. |
| data[].sell_value | number | no | Sum of `shares × price_per_share` across all sell-side transactions in the group, USD. Always non-negative. |
| data[].net_value | number | no | `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_shares | number | no | Sum of shares acquired (split-adjusted). Always non-negative. |
| data[].sell_shares | number | no | Sum of shares disposed. Always non-negative. |
| data[].net_shares | number | no | `buy_shares - sell_shares` (signed). |
| meta | object | yes | Result metadata block — pagination + applied filters echo. |
| meta.total | integer | no | Total distinct groups matching the filter set (full count, not just the returned page). |
| meta.limit | integer | no | Effective page size (capped at 500 server-side). |
| meta.offset | integer | no | Echo of the requested offset. |
| meta.has_more | boolean | no | `true` when another page is available. |
| meta.group_by | string | no | Echo of the resolved `group_by` parameter (`'sector'` or `'industry'`). Source of truth for clients rendering 'Grouped by Sector'-style headings. |
| meta.filed_at_days | integer | yes | Echo of the resolved lookback window (defaults to 30 when unset). Useful for clients to render 'Last 30 days' annotations. |
| request_id | string | yes | Per-request UUID for log correlation. |
| timestamp | string | no | ISO-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
| Status | Label | Description |
|---|---|---|
| 200 | OK | Request succeeded. |
| 400 | Bad Request | Invalid query, body, or path parameter. |
| 401 | Unauthorized | Missing or invalid Authorization header / api_Token. |
| 402 | Payment Required | Insufficient token balance for this call. Top up |
| 429 | Too Many Requests | Rate limit exceeded for your tier (see /pricing for tier limits). Tier limits |
| 500 | Server Error | Unexpected 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).