/insider-module/api/insiders/holdings/by-ticker/{ticker}Current insider holdings for a ticker.
Current insider holdings for a ticker. Each row includes total_beneficial_ownership aggregated across all ownership vehicles and sector/industry classification from Sharadar.
Why use this
Common use case
Current insider position table for one issuer — one row per (insider, security, vehicle) snapshot, derived from the most-recent Form 3/4/5 filing reporting that position. Combines non-derivative (Form 4 Table I) and derivative (Table II) holdings when include_derivative=true (default). Pagination is applied AFTER combining, so a single page can mix both kinds.
The meta.company block surfaces issuer identity (ticker/name/cik) so UIs don't need a second call to render the page header. The meta.summary block is page-scoped (not full-set) — useful as a quick chip but for full-issuer totals call this with a high limit or aggregate total_beneficial_ownership client-side.
Note: each total_beneficial_ownership field is the cross-vehicle rollup (direct + all indirect) for that insider AT this issuer — not the same as amount_owned which is per-vehicle. For the time-machine view (positions as-of a historical date) use GET /api/insiders/holdings/snapshot/{snapshot_date}; for an insider's cross-issuer holdings use GET /insider-module/api/insiders/holdings/by-insider/{cik}.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| ticker | path | required | — | — | Stock Ticker | AAPL |
| limit | query | optional | 50 | — | Limit results | 20 |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| status | string | no | Always `success` on 2xx. |
| data | array | no | Array of unique-position holding rows for the requested issuer. One row per `(insider, security_title, ownership_nature, indirect_owner_name)` combination — the most-recent reported snapshot per vehicle. Combines Form 4 Table I (non-derivative) and Table II (derivative) when `include_derivative=true` (default). Empty array when the ticker has no insider holdings on file. Returns HTTP 404 when the ticker cannot be resolved at all. |
| data[].holding_id | string | no | Stable internal UUID for this holding row, serialized as a string. Safe to use as a deduplication key on the client. |
| data[].security_title | string | no | Title of the security (e.g. `Common Stock`, `Class A Common Stock`, `Stock Option`, `Restricted Stock Unit`). For derivatives the underlying is in `underlying_security_title`. |
| data[].amount_owned | number | no | Number of shares (or contract units, for derivatives) currently owned in this vehicle. Defaults to `0` for filings missing the value. Split-adjusted to match transaction rows. |
| data[].ownership_nature | string | no | `'direct'` (held in own name) or `'indirect'` (held via trust, LLC, family). Defaults to `'direct'` when the source filing's nature field is missing. |
| data[].reported_date | string | yes | ISO `YYYY-MM-DD` date of the source Form 3/4/5 filing that reported this position (the snapshot's as-of date). Subsequent transactions in newer filings supersede. |
| data[].indirect_owner_name | string | yes | When `ownership_nature='indirect'`, the name of the indirect-ownership vehicle (e.g. `'GRAT Trust 2024'`, `'Family Limited Partnership'`). Null for direct ownership. |
| data[].is_derivative | boolean | no | `true` for option/warrant/RSU positions (Form 4 Table II); `false` for cash-equity positions (Table I). |
| data[].conversion_or_exercise_price | number | yes | Exercise/conversion price in USD for derivatives (the strike). Null for non-derivative rows. |
| data[].expiration_date | string | yes | ISO `YYYY-MM-DD` expiration date for derivatives. Null for non-derivative rows or perpetual instruments. |
| data[].underlying_security_title | string | yes | For derivatives, the underlying security title (e.g. `'Common Stock'` for an option). Null for non-derivatives. |
| data[].total_beneficial_ownership | number | yes | Aggregate shares this insider beneficially owns at this issuer across ALL vehicles (direct + indirect; the cross-vehicle rollup). Null when the underlying filings do not report it. Distinct from `amount_owned` (per-vehicle) — use this for conviction-magnitude analysis. |
| data[].sector | string | yes | Sharadar sector classification for the issuer. Null when unmapped. |
| data[].industry | string | yes | Sharadar industry classification for the issuer. Null when unmapped. |
| data[].insider_name | string | yes | Reporting-person legal name (verbatim from the most-recent filing reporting this position). |
| data[].insider_cik | string | yes | Reporting-person CIK (10-character zero-padded). |
| data[].is_entity | boolean | yes | `true` for entity reporters (LP, fund vehicle, trust). |
| data[].is_director | boolean | no | Director relationship to the issuer (current). |
| data[].is_officer | boolean | no | Officer relationship to the issuer (current). |
| data[].is_ten_percent_owner | boolean | no | 10%-beneficial-owner relationship (current). |
| data[].insider_title | string | yes | Officer title raw text (e.g. `'Chief Financial Officer'`). |
| data[].is_c_suite | boolean | no | C-suite indicator. |
| data[].accession_number | string | yes | Source filing's SEC accession number. |
| data[].filed_at | string | yes | ISO-8601 UTC filing acceptance timestamp. |
| data[].accepted_at | string | yes | ISO-8601 UTC EDGAR acceptance timestamp. |
| data[].published_at | string | yes | ISO-8601 UTC RSS-publication timestamp. |
| data[].rss_updated_at | string | yes | ISO-8601 UTC most-recent RSS update. |
| meta | object | yes | Result metadata block — pagination + company profile + holdings summary. |
| meta.pagination | object | no | Pagination sub-block. |
| meta.pagination.total | integer | no | Total combined holdings rows (non-derivative + derivative). |
| meta.pagination.limit | integer | no | Effective page size. |
| meta.pagination.offset | integer | no | Echo of requested offset. |
| meta.pagination.has_more | boolean | no | `true` when another page is available. |
| meta.company | object | no | Company profile block (ticker, name, cik) — surfaces issuer identity so UIs don't need a separate company-info call. |
| meta.company.ticker | string | no | Issuer ticker (canonical hyphen form). Falls back to the upper-cased path parameter when the issuer has no CompanyStub row. |
| meta.company.name | string | no | Issuer name. Falls back to `'Unknown'` when missing. |
| meta.company.cik | string | no | Issuer CIK. |
| meta.summary | object | no | Holdings summary block computed across the CURRENT PAGE (not the entire filtered set) — direct/indirect totals + unique-insider count. Use as a quick UI chip; for full-set totals run `total_beneficial_ownership` aggregation client-side. |
| meta.summary.total_insiders | integer | no | Distinct count of insiders with positions in the current page. |
| meta.summary.total_shares_direct | number | no | Sum of `amount_owned` across non-derivative direct rows in the current page. |
| meta.summary.total_shares_indirect | number | no | Sum of `amount_owned` across non-derivative indirect rows in the current page. |
| request_id | string | yes | Per-request UUID for log correlation. |
| timestamp | string | no | ISO-8601 UTC response timestamp. |
Sample response
- "status": "success"
- "data":
- "meta":
- "pagination":
- "company":
- "summary":
- "request_id": "5b7d3c1a-8f2e-4a6b-9d4e-c5b6a7d8e9f0"
- "timestamp": "2026-05-02T15:42:18.703Z"
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/holdings/by-ticker/{ticker}?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).