/api/v1/form-13f/holdingsSearch raw 13F holdings grouped by filing using Lucene-like query syntax.
Search raw 13F holdings grouped by filing using Lucene-like query syntax.
10 tokensSince v1.0.0
Why use this
The headline analytics endpoint of FinRadar's institutional-holdings module — query any combination of CIK, date range, ticker, or CUSIP across 8M+ raw 13F holdings rows. Returns per-filing position rows (NOT pre-aggregated) with full voting authority, investment discretion, and put/call data preserved as filed. The bread-and-butter workflow for hedge-fund whale-watching: pass `cik:1067983 AND periodOfReport:2025-12-31` to get Berkshire Hathaway's Q4 2025 book exactly as filed. Pass `includeChanges=true` to also receive QoQ deltas (`changeShares`, `changePercent`, `status`, `previousPeriod`, `closedPositions`) — critical for momentum-detection workflows. Ticker/CUSIP queries auto-expand through CUSIP successor chains so a query for `holdings.ticker:GOOGL` will correctly capture the position even after Alphabet's 2014 share-class restructuring. Value-correction metadata (`valueCorrected`, `correctionMethod`, `originalValueTotal`) is included on every row to flag the 13F thousands-vs-actual-dollars reporting issue (Plan 51 holdings-quality layer). For lighter cover-page-only queries use `POST /api/v1/form-13f/cover-pages`.
Common use case
Retrieve Berkshire Hathaway's exact holdings as filed for Q3 2024, including share counts, voting authority, and CUSIP-level detail. Useful for regulatory analysis, filing-level audits, and replicating a widely-used commercial SEC-data API's queries.
Returns position-level 13F holdings for a filer — the headline analytics endpoint of the institutional-holdings module. Pass cik + optional period to get one quarter; pass includeChanges=true (v3.2.0) to also receive QoQ deltas (changeShares, changePercent, status, previousPeriod, closedPositions). Holdings are deduplicated to one row per CUSIP per filing — amendments collapse to the latest. CIK normalization handles the 6/7/10-char zero-padding inconsistency automatically. Pair with POST /api/v1/form-13f/cover-pages for filing-metadata-only lookups.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| query | body | required | — | — | Lucene-like query string. Field-scoped: `cik:1067983` (filer CIK, with or without zero-padding), `periodOfReport:2024-09-30` (exact quarter end), `periodOfReport:[2024-01-01 TO 2024-12-31]` (range), `filedAt:[A TO B]` (filing date range), `formType:"13F-HR"`, `holdings.ticker:AAPL` (chain-aware), `holdings.cusip:037833100` (chain-aware), `accessionNo:0001067983-24-000123`. Combine with `AND`/`OR`/`NOT`. Bare-word queries are matched against issuer name. | cik:1067983 AND periodOfReport:2025-12-31 |
| from | body | optional | 0 | — | Zero-based pagination offset (NUMBER of filings to skip — NOT a date despite the name). Increment by `size` to walk pages: `from=0` → page 1, `from=50` → page 2 (when `size=50`). Capped at 10000 server-side; for deeper backfills use date-range chunking via `periodOfReport:[A TO B]`. | 0 |
| size | body | optional | 50 | — | Number of filings (NOT individual holdings rows) to return per page, capped at 50 server-side. Each filing can carry 1-3000+ holdings rows so total payload size scales with `size × avg_holdings_per_filing`. For Berkshire-shaped books expect ~50 holdings per filing; for index-fund books (Vanguard, BlackRock) expect ~3000+. | 50 |
| sort | body | optional | — | — | Sort specification array (the widely-used commercial SEC-data API's shape). Each element is `{ <field>: { order: 'asc' | 'desc' } }`. Common: `[{"filedAt": {"order": "desc"}}]` (most recent first), `[{"periodOfReport": {"order": "asc"}}]` (chronological for time-series). Defaults to `filedAt DESC` when omitted. | [{"filedAt": {"order": "desc"}}] |
| includeChanges | body | optional | false | — | When `true` AND `holdings.ticker` is set in the query, adds QoQ change fields to each ticker-matching holding: `changeShares` (int), `changePercent` (float), `status` (`New`/`Increased`/`Decreased`/`Unchanged`/`Closed`). Also returns `closedPositions` array (positions present in prior quarter but absent now) and `previousPeriod` (quarter used for comparison). Uses canonical CUSIP matching via `cusip_normalized` so cross-quarter corporate actions (mergers, ticker changes, share-class collapses) are correctly tracked. ~30-50% latency overhead per call. | true |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| status | string | no | — |
| request_id | string | yes | — |
| timestamp | string | no | — |
| data | object | no | — |
| data.total | object | no | — |
| data.total.value | integer | no | — |
| data.total.relation | string | no | — |
| data.data | array | no | — |
| data.data[].accessionNo | string | yes | — |
| data.data[].formType | string | yes | — |
| data.data[].filedAt | string | yes | — |
| data.data[].cik | string | yes | — |
| data.data[].companyName | string | yes | — |
| data.data[].correctionMethod | string | yes | — |
| data.data[].periodOfReport | string | yes | — |
| data.data[].isAmendment | boolean | yes | — |
| data.data[].valueCorrected | boolean | yes | — |
| data.data[].tableEntryTotal | integer | yes | — |
| data.data[].tableValueTotal | integer | yes | — |
| data.data[].originalValueTotal | integer | yes | — |
| data.data[].holdings | array | no | — |
| data.data[].holdings[].nameOfIssuer | string | yes | — |
| data.data[].holdings[].titleOfClass | string | yes | — |
| data.data[].holdings[].cusip | string | yes | — |
| data.data[].holdings[].canonicalCusip | string | yes | — |
| data.data[].holdings[].ticker | string | yes | — |
| data.data[].holdings[].putCall | string | yes | — |
| data.data[].holdings[].investmentDiscretion | string | yes | — |
| data.data[].holdings[].otherManager | string | yes | — |
| data.data[].holdings[].figi | string | yes | — |
| data.data[].holdings[].value | integer | yes | — |
| data.data[].holdings[].shrsOrPrnAmt | object | no | — |
| data.data[].holdings[].shrsOrPrnAmt.sshPrnamt | number | yes | — |
| data.data[].holdings[].shrsOrPrnAmt.sshPrnamtType | string | no | — |
| data.data[].holdings[].votingAuthority | object | no | — |
| data.data[].holdings[].votingAuthority.Sole | number | yes | — |
| data.data[].holdings[].votingAuthority.Shared | number | yes | — |
| data.data[].holdings[].votingAuthority.None | number | yes | — |
| data.data[].holdings[].changeShares | number | yes | Optional; omitted when not applicable. |
| data.data[].holdings[].changePercent | number | yes | Optional; omitted when not applicable. |
| data.data[].holdings[].status | string | yes | Optional; omitted when not applicable. |
| data.closedPositions | array | no | Optional; omitted when not applicable. |
| data.previousPeriod | string | yes | Optional; omitted when not applicable. |
Sample response
·
- "status": "success"
- "request_id": null
- "timestamp": "2026-09-25T12:00:00Z"
- "data":
- "total":
- "data":
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 -X POST "https://api.finradar.ai/api/v1/form-13f/holdings" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "cik:1067983 AND periodOfReport:2025-12-31",
"from": "0",
"size": "50",
"sort": "[{\"filedAt\": {\"order\": \"desc\"}}]",
"includeChanges": "true"
}'Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).