/api/v1/nport/holders-of/{cusip}Reverse lookup: funds holding a security
Every fund whose latest published N-PORT report holds the given CUSIP — one row per fund with its position size — or pin one historical reporting month with period=.
Why use this
Common use case
The reverse index over the whole N-PORT holdings corpus: give it a security, get the funds that hold it. The default view answers "who holds it NOW" — for each fund, the position from its latest published reporting month that contains the CUSIP — while period= answers "who held it in month X" for any historical month.
Each row is one fund (series; whole-trust filers key by registrant so distinct trusts never merge; a trust that received its series id partway through is one fund, its earlier reports without one attributed to the series) with the position's size three ways: balance in the filed unit, val_usd, and pct_val of the fund's net assets — with fund_net_assets on the row so concentration is readable without a second call.
Scope note: this is the REGISTERED FUND ownership map (mutual funds + ETFs from their monthly N-PORT reports). It complements, and does not replace, the 13F institutional view: N-PORT covers bonds and derivatives position-by-position and reports monthly, while 13F covers all large institutional managers (including hedge funds, which file no N-PORT) quarterly on equities. For the 13F-side reverse lookup use POST /api/v1/form-13f/holdings in the Institutional Holdings group.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| cusip | path | required | — | — | 9-character CUSIP, alphanumeric. | 037833100 |
| period | query | optional | — | — | Pin ONE reporting month (ISO date, the month-end as_of) instead of the default latest-per-fund view. | 2026-05-31 |
| limit | query | optional | 100 | — | Rows per page (1-500). | 100 |
| offset | query | optional | 0 | — | Pagination offset. | 0 |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| status | string | no | — |
| request_id | string | yes | — |
| timestamp | string | no | — |
| data | array | no | One row per fund key, ordered by position USD value descending. |
| data[].series_id | string | yes | SEC fund series; null for whole-trust filings keyed by registrant. |
| data[].series_name | string | yes | Fund name as filed. |
| data[].reg_cik | string | no | Registrant CIK, zero-padded to ten characters. |
| data[].reg_name | string | yes | Registrant name as filed. |
| data[].as_of | string | yes | Reporting date of this position. Default results can contain different dates. |
| data[].accession_number | string | no | Source SEC filing accession. |
| data[].holding | object | no | — |
| data[].holding.name | string | yes | — |
| data[].holding.title | string | yes | — |
| data[].holding.balance | number | yes | Position quantity in the filed units. |
| data[].holding.units | string | yes | Filed unit code, such as NS for shares. |
| data[].holding.val_usd | number | yes | Position value in US dollars, unchanged from the filing. |
| data[].holding.pct_val | number | yes | As-filed percentage of fund net assets; 7.50593247848 means 7.50593247848%. No rescaling. |
| data[].holding.asset_cat | string | yes | — |
| data[].holding.derivative_cat | string | yes | — |
| data[].fund_net_assets | number | yes | Fund net assets in US dollars at the row's reporting date. |
| meta | object | no | — |
| meta.cusip | string | no | The exact security CUSIP used by the holder query. |
| meta.period | string | no | Requested reporting date or latest_per_fund. |
| meta.pagination | object | no | — |
| meta.pagination.total | integer | yes | Always null; no full-corpus count is performed. |
| meta.pagination.limit | integer | no | — |
| meta.pagination.offset | integer | no | — |
| meta.pagination.has_more | boolean | no | True when another page is available. |
Sample response
- "status": "success"
- "request_id": "nport-holders-example"
- "timestamp": "2026-09-27T00:00:00Z"
- "data":
- "meta":
- "cusip": "037833100"
- "period": "latest_per_fund"
- "pagination":
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/nport/holders-of/037833100?period=2026-05-31&limit=100&offset=0" \
-H "X-API-Key: YOUR_API_KEY"Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).