/api/v1/ownership/positions/issuer/{issuer_cik}/holdersAll holders of an issuer from position events, deduplicated via unified_holders.
All holders of an issuer from position events, deduplicated via unified_holders.
Why use this
Common use case
All holders of an issuer rolled up from the Phase 47 unified position-event ledger — the single canonical 'who owns this stock?' rollup that spans 13F + 13D/G + Form 4 reporting regimes. Each holder appears EXACTLY ONCE regardless of how many filing types contributed (a fund that filed both 13F and 13D appears as one row with sources: ["13F", "13D"]). Order: by shares_held DESC. The percent_of_class is the latest known across all source filings — typically derived from 13F (computed server-side as shares_held / shares_outstanding) or directly reported on 13D/G. Share counts are NOT split-adjusted server-side per the Phase 52 redirect convention; for split-adjusted aggregation use GET /api/v1/tickers/{ticker}/fund-trends. For the time-ordered event-feed view of the same data use GET /api/v1/ownership/positions/issuer/{issuer_cik}/timeline. For per-holder position history (a single holder's position evolution over time) use GET /api/v1/ownership/positions/{holder_uuid}/issuer/{issuer_cik}/history.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| issuer_cik | path | required | — | — | Issuer CIK (the company being analyzed). Both 10-character zero-padded (`0000320193`) and short unpadded (`320193`) formats accepted. Returns 404 when no positions have ever been observed for the issuer (rare; typically only pre-IPO entities or de-registered issuers). | 0000320193 |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| issuer_cik | string | no | Echoed issuer CIK in 10-character zero-padded form. |
| issuer_ticker | string | yes | Resolved issuer ticker (canonical hyphen form). Null when the issuer has no public-equity ticker. |
| as_of | string | no | ISO-8601 UTC timestamp of the latest contributing event across all holders. Use to verify staleness (>30 days warrants a refresh during 13F filing windows). |
| holders | array | no | Array of unified-holder rows for this issuer. Order: by `shares_held` DESC (largest holders first). Deduplicated via Phase 47 unified-holder layer — a fund that filed both 13F and 13D for the same position appears as ONE row, not two. |
| holders[].holder_uuid | string | no | Phase 47 unified-holder UUID. |
| holders[].name | string | no | Canonical holder name. |
| holders[].cik | string | yes | Primary 10-char zero-padded holder CIK. |
| holders[].type | string | no | Holder classification — `individual` / `institution` / `group`. |
| holders[].shares_held | integer | no | Latest known share count for this holder. NOT split-adjusted server-side (preserves the as-filed view per Phase 52 redirect convention) — for split-adjusted aggregation queries use [GET /api/v1/tickers/{ticker}/fund-trends](/docs/company-data/ticker-research/get-tickers-ticker-fund-trends) instead. |
| holders[].percent_of_class | number | yes | Latest known percent of class held (0.0-100.0 decimal). Null on Form-4-only holders where the underlying filing did not include a class-percentage calculation. |
| holders[].sources | array | no | Array of source-flag strings indicating which SEC reporting regimes contributed to this position — e.g. `["13F"]` (13F filer only), `["13D", "13F"]` (filed both), `["Form 4"]` (Section 16 insider only). Multi-source positions are common for activist 13F filers who cross 5% (Buffett's BRK both files 13F and 13D for AAPL pre-2020). |
| holders[].last_event_at | string | no | ISO-8601 UTC timestamp of the most-recent event affecting this position. The chronological sort key for 'recently active holders'. |
| meta | object | no | Pagination block: `{ total: integer, limit: integer, offset: integer }`. `total` is the holder count for this issuer. |
Sample response
- "issuer_cik": "0000320193"
- "issuer_ticker": "AAPL"
- "as_of": "2026-04-15T20:14:32Z"
- "holders":
- "meta":
- "total": 4218
- "limit": 50
- "offset": 0
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/v1/ownership/positions/issuer/{issuer_cik}/holders?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).