---
title: "Per-fund portfolio time series"
method: GET
path: "/funds/{bw_fund_id}/portfolio"
tags: ["Funds"]
---

# Per-fund portfolio time series

`GET /funds/{bw_fund_id}/portfolio`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/funds/{bw_fund_id}/portfolio`
- Auth: HTTP bearer

Time series of portfolio-level return components and diagnostics from Slice 8's per-fund `ds_portfolio.zarr` on GCS. One row per teo (month-end). Optional inclusive `start_date` / `end_date` params trim the panel.

Bitemporal: `X-Data-As-Of` reflects the latest teo in the returned slice; `X-Data-Filing-Date` carries the registry's `latest_filing_date`.

## Path parameters

- `bw_fund_id` string, required

## Query parameters

- `start_date` string, date
- `end_date` string, date

## Response `200`

Time series rows.

- FundPortfolioHistoryResponse: Per-fund portfolio time series. Long-form rows indexed by teo (month-end). The `start_teo` / `end_teo` summary fields reflect the post-filter window, not the full panel.
  - `bw_fund_id` string, required
  - `ticker` string, nullable
  - `fund_name` string, nullable
  - `equity_style_9box` string, nullable
  - `n_periods` integer, required
  - `start_teo` string, date, required
  - `end_teo` string, date, required
  - `rows` FundPortfolioRow[], required
    - `teo` string, date, required
    - `portfolio_gross_return` number, float, nullable
    - `portfolio_market_return` number, float, nullable
    - `portfolio_sector_return` number, float, nullable
    - `portfolio_subsector_return` number, float, nullable
    - `portfolio_idiosyncratic_return` number, float, nullable
    - `identity_residual` number, float, nullable
    - `weight_sum` number, float, nullable
    - `n_holdings_active` integer, nullable
    - `effective_n` number, float, nullable
    - `top10_weight_sum` number, float, nullable

## Other responses

- `400`: Malformed date params or start_date > end_date.
- `402`: Insufficient prepaid balance.
- `404`: Fund not found, or zarr returned no rows for the date window.
- `429`: Rate limit exceeded.

---

[API](https://skmtc.dev/riskmodels/apis/riskmodels-api.md) · [All operations](https://skmtc.dev/riskmodels/apis/riskmodels-api/llms.txt) · [OpenAPI document](https://skmtc.dev/riskmodels/apis/riskmodels-api/revisions/1a034cad408a?raw)
