Skip to content
/api/v1/form-13f/fund/{cik}/cusip/{cusip}/history

Per-quarter share + value history for a single (fund, CUSIP) position — the chronological trail of one security held by one filer across every 13F-HR quarter we have on file.

Per-quarter share + value history for a single (fund, CUSIP) position — the chronological trail of one security held by one filer across every 13F-HR quarter we have on file.

Why use this

Drill into ONE position's full timeline: every quarter the position appeared in the fund's 13F, the split-adjusted share count, the reported USD value, the QoQ share delta, and a transaction-type classification (`new` / `increased` / `decreased` / `unchanged`). Mirrors the same canonical filing-selection logic as [GET /api/v1/form-13f/fund/{cik}](/docs/institutional-holdings/form-13f-api/get-form-13f-fund-cik) — for each `period_of_report` we pick the filing with the MOST non-option holdings (#264 amendment-handling pattern) so a 4-holding 'correction' amendment doesn't overwrite the 36-holding original. CUSIP-keyed (not ticker) because tickers change on mergers / spinoffs / reuse — CUSIPs are the canonical 13F security identifier.

Common use case

Powering the chevron-expanded position row on `/filer/<slug>-<cik>/` — a per-position transaction-timeline chart (bars = shares held per quarter, line = USD value, colored markers for `new` / `increased` / `decreased` transitions). Also useful for headline narratives like Berkshire's AAPL buying spree 2016-2018 (`/fund/0001067983/cusip/037833100/history` returns the full ramp: 9.8M shares in 2016-Q1 → 251.9M in 2018-Q2).

Returns the full chronological trail of ONE position held by ONE filer — every quarter we have a 13F filing where the (CIK, CUSIP) appeared, the shares held, the reported value, the QoQ share delta, and a transaction-type classification. Used by the FinRadar.ai filer-page transaction-timeline chart on the chevron-expanded position row (replaces the placeholder that used to read 'Transaction-timeline chart coming next — needs per-ticker quarterly history endpoint').

Why CUSIP-keyed (not ticker): tickers change. Mergers (SHEN → CALX 2024), spinoffs (GOOG/GOOGL 2014), ticker reuse, and corporate-action chains (SIRI's 2024 reverse split flipped CUSIP 82968B103 → 829933100 mid-quarter) all break ticker-keyed timelines. CUSIPs are the canonical 13F security identifier — frontend rows from GET /api/v1/form-13f/fund/{cik} already carry both cusip and canonicalCusip, pass either back here.

Filing selection per quarter matches GET /api/v1/form-13f/fund/{cik} and CostBasisService exactly — for each period_of_report we pick the filing with the MOST non-option holdings (#264 amendment-handling). So a fund that filed a 36-holding 13F-HR and then a 4-holding 13F-HR/A 'correction' amendment shows the 36-holding original on this endpoint, NOT the 4-holding amendment.

Closed positions appear in the history up through their last reported quarter — once the fund has zero shares of the security, there is no row for subsequent quarters (no synthetic 0-share emit). Frontends rendering the chart should interpret 'no entry for quarter X' as 'position closed before X'; the chart axis can drop to 0 by interpolating. Share counts are SPLIT-ADJUSTED — forward-adjusted to the latest split basis via the split feed (ticker-keyed) so a stock split is NOT mislabelled as a phantom buy/sell; the timeline is continuous and only real trading moves the line. Each row also carries shares_raw (the literal as-filed count), and the response carries top-level split_adjusted + splits[] for reconciliation. value is left raw (13F value = shares × quarter-end price, already split-invariant). If the ticker can't be resolved or the split-feed read fails, the endpoint degrades to raw (unadjusted) shares rather than erroring.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
cikpathrequired——Fund CIK in 10-char zero-padded form (e.g. `0001067983` for Berkshire Hathaway, `0001536411` for Duquesne Family Office). Server-side normalization handles 6/7/10-char input forms (the endpoint accepts `1067983` and pads it for you).0001067983
cusippathrequired——Canonical 9-character CUSIP for the security (`current_cusip` column in `normalized_holdings_deduped`). Pass the `cusip` (or `canonicalCusip` for chained-CUSIP fallback) from any holdings row on [GET /api/v1/form-13f/fund/{cik}](/docs/institutional-holdings/form-13f-api/get-form-13f-fund-cik). Validated server-side: alphanumeric only, ≤ 12 chars — anything else returns 400 BAD_REQUEST.037833100

Response schema

FieldTypeNullableDescription
statusstringno—
request_idstringyes—
timestampstringno—
dataobjectno—
data.cikstringno—
data.cusipstringno—
data.tickerstringyes—
data.namestringyes—
data.quartersintegerno—
data.split_adjustedbooleanno—
data.splitsarrayno—
data.splits[].datestringno—
data.splits[].rationumberno—
data.historyarrayno—
data.history[].quarter_datestringno—
data.history[].sharesintegerno—
data.history[].shares_rawintegerno—
data.history[].valueintegerno—
data.history[].shares_deltaintegerno—
data.history[].transaction_typestringno—

Sample response

·
  • "cik": "0001067983"
  • "cusip": "037833100"
  • "ticker": "AAPL"
  • "name": "APPLE INC"
  • "quarters": 4
  • "split_adjusted": true
  • "splits":
    ]
  • "history":
    ]
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/api/v1/form-13f/fund/0001067983/cusip/037833100/history" \
  -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).