Skip to content
/api/v1/form-13f/fund/{cik}/daily-returns

Daily time-weighted 13F return index with SPY benchmark

Daily 13F-tracked return index time series for a fund, with SPY benchmark alongside. Rows failing the engine's integrity gate are quarantined and never served (2026-08-18).

free

Why use this

The cumulative time-weighted return index (normalized to 1.0 at the fund's first computable day) of the fund's disclosed 13F long book, marked to market daily. Composition is held fixed between quarterly filings (calendar-time copycat methodology); on filing-transition days the daily return prices the OLD basket at the new day's closes so manager buys/sells never register as performance. SPY index computed on the same day grid for alpha work.

Common use case

Rendering a WhaleWisdom/StockCircle-style fund performance chart, or computing custom window returns (anchor and endpoint return_index ratio) client-side.

Daily mark-to-market of the fund's disclosed 13F long book: the most recent quarterly composition is held fixed between filings, valued at each day's closes (split-adjusted share counts, unadjusted closes), and chained into a cumulative time-weighted index. On the first trading day a new filing governs, the daily return is computed from the OLD basket at the new day's prices — isolating price moves from the manager's buys/sells — and the identity of the exact filing that priced each day is tracked internally so amendments and late filings can never masquerade as performance.

Data-quality contract (2026-08-18): every computed day passes a write-time integrity gate; a stored day that fails it and cannot be repaired by recomputation is QUARANTINED — withdrawn from this endpoint (and from the /fund-performance rollups) rather than served. A daily reconciliation sweep detects and repairs series gaps and defective days through the same recompute pipeline; while a repair is pending, the affected dates are simply absent. Consequence for consumers: derive window returns from the return_index ratio at the endpoints you receive; absent dates are a repair-in-flight signal, not zeros.

This series measures the disclosed LONG book only — 13F does not reveal shorts, options hedges (excluded from the basket), cash, or intra-quarter trading. It is a tracking estimate, not fund NAV. For quarterly rollups (1y/3y/5y/10y/inception returns, S&P benchmark, alpha) see GET /api/v1/form-13f/fund-performance.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
cikpathrequiredFund CIK (6/7/10-char accepted; normalized to 10-char zero-padded)0001067983
periodqueryoptionalallWindow: '1y', '3y', '5y', '10y', or 'all' (calendar-day cutoffs: 365/1095/1825/3650 days back from today)1y
formatqueryoptionalchart'chart' = parallel arrays for charting libs; 'table' = one object per day incl. portfolio_value, holdings_count, price_coverage_pcttable

Response schema

FieldTypeNullableDescription
cikstringnoEchoed 10-char zero-padded CIK.
periodstringnoEchoed window selector.
data_pointsintegernoNumber of daily rows returned.
date_range.from / date_range.tostringnoISO dates of the first and last returned rows.
data.dates[]arrayno(format=chart) ISO trading dates. The day grid is the engine's pricing calendar; a date can be legitimately absent while a repair of a detected gap is pending — compute window returns from the index ratio of the endpoints you receive, never by counting rows.
data.return_index[]arrayno(format=chart) Cumulative time-weighted return index, 1.0 at inception. Window return between any two dates = index_b / index_a − 1. Cash flows (position changes disclosed by new filings) are stripped by construction — this tracks price performance of the disclosed book, NOT the fund's actual NAV.
data.sp500_return_index[]arrayyes(format=chart) SPY benchmark index chained on the same day grid, same normalization.
data.daily_return_pct[]arrayyes(format=chart) Day-over-day percent move. Null on a day whose prior-basket value could not be established (e.g. first day after an unreconstructable amendment replacement — the index carries unchanged rather than fabricating a move).
data[] (format=table)arraynoOne object per day: date, portfolio_value (USD mark-to-market of the disclosed book), return_index, daily_return_pct, sp500_return_index, holdings_count (priced names that day), price_coverage_pct (priced names / basket names × 100).

Sample response

·
  • "cik": "0001067983"
  • "period": "1y"
  • "data_points": 2
  • "date_range":
    • "from": "2026-08-14"
    • "to": "2026-08-17"
    }
  • "data":
    • "dates":
    • "return_index":
    • "sp500_return_index":
    • "daily_return_pct":
    }
}

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/daily-returns?period=1y&format=table" \
  -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).