/api/insiders/holdings/snapshot/{snapshot_date}Holdings snapshot at a specific historical date.
Holdings snapshot at a specific historical date. Returns the rolled-up insider holdings table as it stood on that date (after applying all Form 4 transactions filed up to and including that date).
Why use this
Common use case
Time-machine view of insider holdings — reconstructs the position table for ANY ticker (or insider, or both) AS OF the requested calendar date. The dated path-parameter form (e.g. /snapshot/2025-09-15) is the REST-idiomatic shape preferred for caching and audit URLs.
The implementation walks reported_date <= snapshot_date with per-vehicle MAX-date dedup, so a transaction filed AFTER snapshot_date but reporting an earlier transaction_date does NOT bleed into the snapshot — the snapshot reflects what was KNOWABLE on that date, not the post-amendment ground truth. This matters for compliance audits where 'what did the world know on day X' is the relevant question.
Use cases:
- Regulatory reconstruction — 'reproduce the insider holdings table as it stood on the day of the trading halt'.
- Backtest cluster signals — pair with GET /insider-module/api/insiders/clusters on a different
dayswindow to see what holdings looked like at signal-fire time. - Quarter-end diffs — call twice with
snapshot_date=2025-12-31andsnapshot_date=2026-03-31and diff client-side.
For live current holdings (today's view) use GET /insider-module/api/insiders/holdings/by-ticker/{ticker}; for the alias variant with query-parameter as_of see GET /insider-module/api/insiders/holdings/snapshot.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| snapshot_date | path | required | — | — | The as-of date in ISO `YYYY-MM-DD` format. Server walks `reported_date <= snapshot_date` with per-vehicle MAX-date dedup. Returns HTTP 400 on malformed dates. | 2026-04-01 |
| ticker | query | optional | — | — | Filter to a single issuer (recommended for performance — full-market snapshots can return 100K+ rows). When unset, scans every issuer with holdings on file. | AAPL |
| insider_cik | query | optional | — | — | Filter to a single insider (10-character zero-padded; shorter forms auto-padded). Combine with `ticker` for very narrow drill-downs (e.g. 'Cook's AAPL position on 2025-09-15'). | 0001214156 |
| limit | query | optional | 100 | — | Maximum rows returned per page (capped at 1000). | 100 |
| offset | query | optional | 0 | — | Zero-based pagination offset. Walk pages with `offset += limit`. | 0 |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| status | string | no | Always `success` on 2xx. |
| data | array | no | Array of insider holding rows reflecting the position table AS-OF `snapshot_date`. One row per `(insider, security_title, ownership_nature, indirect_owner_name)` combination — the most-recent reported snapshot per vehicle on or before `snapshot_date`. Sorted by `(issuer_cik, insider_name)`. Empty when no qualifying holdings. |
| data[].holding_id | string | no | Internal UUID for the holding row, serialized as a string. |
| data[].security_title | string | no | Title of the security (e.g. `Common Stock`). |
| data[].amount_owned | number | no | Number of shares held in this vehicle as of `snapshot_date`. Defaults to `0` for filings missing the value. |
| data[].ownership_nature | string | no | `'direct'` or `'indirect'`. Defaults to `'direct'` when source filing's nature field is missing. |
| data[].reported_date | string | yes | ISO `YYYY-MM-DD` date of the source filing reporting this position. Always ≤ `snapshot_date`. |
| data[].indirect_owner_name | string | yes | Indirect-vehicle name when `ownership_nature='indirect'`. |
| data[].ticker | string | yes | Issuer ticker (canonical hyphen form). |
| data[].company_name | string | yes | Issuer name. |
| data[].sector | string | yes | Sharadar sector classification. |
| data[].industry | string | yes | Sharadar industry classification. |
| data[].issuer_cik | string | yes | Issuer CIK. |
| data[].insider_name | string | yes | Reporting-person legal name (verbatim from the source filing). |
| data[].insider_cik | string | yes | Reporting-person CIK. |
| data[].total_beneficial_ownership | number | yes | Aggregate shares this insider beneficially owned at this issuer across ALL vehicles AS OF the snapshot. Null when the underlying filings do not report it. |
| meta | object | yes | Result metadata block. |
| meta.snapshot_date | string | no | ISO `YYYY-MM-DD` echo of the path-parameter `snapshot_date` (verbatim — server doesn't re-format). |
| meta.pagination | object | no | Pagination sub-block. |
| meta.pagination.total | integer | no | Total matching holding rows for the filter set. |
| 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. |
| request_id | string | yes | Per-request UUID for log correlation. |
| timestamp | string | no | ISO-8601 UTC response timestamp. |
Sample response
- "status": "success"
- "data":
- "meta":
- "snapshot_date": "2026-04-01"
- "pagination":
- "request_id": "9d4e6f7a-8b1c-4d2e-3f5a-6b7c8d9e0f1a"
- "timestamp": "2026-05-02T15:58:32.105Z"
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/api/insiders/holdings/snapshot/{snapshot_date}?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).