---
title: "Latest fund metrics"
method: GET
path: "/funds/{bw_fund_id}"
tags: ["Funds"]
---

# Latest fund metrics

`GET /funds/{bw_fund_id}`

## Request

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

Knowledge-mode portfolio return decomposition + diagnostics for a single mutual fund. Returns the gross / market / sector / subsector / idiosyncratic return components from the per-fund Slice 8 zarr (materialized in `public.funds_latest`), plus diagnostics (`weight_sum`, `n_holdings_active`, `effective_n`, `top10_weight_sum`) and registry-side meta. Bitemporal lineage on response headers (`X-Data-As-Of`, `X-Data-Filing-Date`).

Per-fund time series, holdings panel, and hedge ratios live in GCS Zarr and ship under `/funds/{bw_fund_id}/portfolio`, `/holdings`, `/hedge` in Stage B.2.

v1 returns the latest knowledge-mode answer only — `?as_of=` / `?mode=` is deferred to v2 (schema is forward-compatible).

## Path parameters

- `bw_fund_id` string, required

## Response `200`

Latest fund metrics.

- FundMetricsResponse: Latest knowledge-mode metrics for a single mutual fund. Joins `public.funds` (registry) with `public.funds_latest` (the wide-row snapshot) and groups return components / diagnostics / meta into nested objects. Bitemporal triple is at the top level; lineage in `_metadata`.
  - `bw_fund_id` string, required
  - `ticker` string, nullable
  - `fund_name` string, nullable
  - `equity_style_9box` 'Large Value' | 'Large Blend' | 'Large Growth' | 'Mid Value' | 'Mid Blend' | 'Mid Growth' | 'Small Value' | 'Small Blend' | 'Small Growth', nullable
  - `report_date` string, date, required
  - `filing_date` string, date, required
  - `extracted_at` string, date-time, required
  - `returns` object, required: Portfolio-level return components from the per-fund Slice 8 zarr.
    - `gross` number, float, nullable
    - `market` number, float, nullable
    - `sector` number, float, nullable
    - `subsector` number, float, nullable
    - `idiosyncratic` number, float, nullable
    - `identity_residual` number, float, nullable: L3 noise diagnostic (gross − sum of layer returns).
  - `diagnostics` object, required
    - `weight_sum` number, float, nullable: ERM3 universe coverage (fraction of fund AUM in mapped symbols).
    - `n_holdings_active` integer, nullable
    - `effective_n` number, float, nullable: HHI-derived diversification (1 / sum(w_i^2)).
    - `top10_weight_sum` number, float, nullable
  - `meta` object, required
    - `total_adj_mv` number, float, nullable
    - `n_funds_in_cell_at_report_date` integer, nullable
    - `morningstar_category` string, nullable
    - `primary_bw_fund_id` string, nullable
    - `status` 'active' | 'delisted', nullable
    - `death_date` string, date, nullable
    - `latest_report_date` string, date, nullable: Period end of the fund's last reported holdings.
  - `_metadata` object, required
    - `model_version` string, nullable
    - `factor_set_id` string, nullable
    - `data_as_of` string, date
    - `data_freshness` string, date-time
    - `last_synced_at` string, date-time

## Other responses

- `402`: Insufficient prepaid balance.
- `404`: Fund not found, or registry exists but no funds_latest row yet.
- `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)
