---
title: "Fund holdings, full book with shorts"
method: GET
path: "/funds/{bw_fund_id}/holdings"
tags: ["Funds"]
---

# Fund holdings, full book with shorts

`GET /funds/{bw_fund_id}/holdings`

## Request

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

The fund's full book at its latest filed report (SEC N-PORT), shorts included as negative `adj_mv`, ranked by |adj_mv|. Each holding has `ticker`, `bw_sym_id`, `adj_mv` and a signed `weight` against filed net assets (gross when a filing reports none; see `weight_basis`). `book` gives long/short/net/gross totals over every position, in dollars and as a fraction of net assets. Ask for `limit=5000` to get the whole book; the positions can go straight into `POST /portfolio/exposure`. A fund with no holdings panel falls back to its 25 largest longs (`source: top_25_longs`).

## Path parameters

- `bw_fund_id` string, required

## Query parameters

- `limit` integer

## Response `200`

The fund's book (or the top-25 fallback).

- FundHoldingsResponse: A fund's book at its latest filed report, shorts included, ranked by |adj_mv|. `aum_reported` is the fund's reported net assets; `aum_erm3` is the net value of its in-model positions (for a long/short fund this is small, so weights use `aum_reported`).
  - `bw_fund_id` string, required
  - `ticker` string, nullable
  - `fund_name` string, nullable
  - `equity_style_9box` string, nullable
  - `source` 'full_book' | 'top_25_longs': `full_book`: every position from the fund's holdings panel. `top_25_longs`: fallback for a fund with no panel, holding only its 25 largest long positions.
  - `teo` string, date, required: Report date of the filing the book comes from.
  - `filing_date` string, date, nullable: SEC filing date of that report.
  - `aum_reported` number, float, nullable
  - `aum_erm3` number, float, nullable
  - `net_assets` number, nullable: Net assets from the filing's own N-PORT header. Null when the filing has none (then `aum_reported` is only the sum of positions).
  - `weight_basis` 'net_assets' | 'gross': Denominator of each holding's `weight`: `net_assets` when the filing reports them, else the book's gross value. Never the net in-model value, which for a long/short fund would inflate weights.
  - `book` object: Totals over every position, whatever `limit` is. Present when `source` is `full_book`.
    - `n_long` integer
    - `n_short` integer
    - `long_mv` number
    - `short_mv` number
    - `net_mv` number
    - `gross_mv` number
    - `long_pct_nav` number, nullable: long_mv / net_assets
    - `short_pct_nav` number, nullable: short_mv / net_assets
    - `net_pct_nav` number, nullable: net_mv / net_assets
    - `gross_pct_nav` number, nullable: gross_mv / net_assets
  - `coverage` object: How much of the filed book the response covers, over every position. Small caps outside the symbol registry come back with `ticker: null`; filed positions that could not be matched to any security are not in `holdings` at all. Present when `source` is `full_book`.
    - `n_positions` integer
    - `n_with_ticker` integer
    - `gross_with_ticker` number: Share of `book.gross_mv` in positions that have a ticker (0–1).
    - `unmatched_mv` number, nullable: Net (signed) adj_mv of filed positions not matched to any security.
  - `n_holdings_returned` integer, required
  - `n_total_holdings` integer, required
  - `holdings` FundHolding[], required
    - `ticker` string, nullable: Ticker from the symbol registry. Null for the few holdings whose symbol is not in the registry; `bw_sym_id` still identifies them.
    - `bw_sym_id` string, required: Internal symbol id. Resolve to ticker via POST /api/data/symbols/batch with {"symbols": [...]}.
    - `adj_mv` number, float, required: Adjusted market value (USD) of this position at the report date. Negative for a short.
    - `weight` number, float, nullable: Signed fraction of the denominator named by the response's `weight_basis` (reported net assets on `/funds/{bw_fund_id}/holdings`; `aum_erm3` in fund snapshots). Null when that denominator is null/0.

## Other responses

- `400`: Malformed limit param.
- `402`: Insufficient prepaid balance.
- `404`: Fund not found, or no holdings panel.
- `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)
