---
title: "ETF capabilities, identifiers and base metrics"
method: GET
path: "/data/etf/{ticker}"
tags: ["Funds Data Plane"]
---

# ETF capabilities, identifiers and base metrics

`GET /data/etf/{ticker}`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/data/etf/{ticker}`
- Auth: one of:
  - HTTP bearer
  - none

One ETF: `capabilities` (cascade, priced, priced_from, holdings, holdings_as_of, factor_role) and `identifiers` (bw_sym_id, bw_etf_id, figi, cik, ticker; null where unknown) for every known fund — the holdings catalog, the priced ETF return store, the cascade lists, or an ETF row in the symbol registry. 404 with `code: symbol_not_found` only when the ticker is on none of them.

Funds with holdings also carry the latest knowledge-mode metrics — registry-level metadata (`portfolio_id`, `source_kind`, `teo_frequency`, `sponsor`) and the latest aggregate metrics from the canonical PortfolioSurface zarr (`aum_reported`, `aum_erm3`, `coverage_pct`, `n_total_holdings`, `report_date`, `availability_date`). Bitemporal lineage on response headers — never collapsed: `X-Data-As-Of` (= `report_date`) and `X-Data-Availability` (= `availability_date`). No per-holding rows — call `/api/data/etf/{ticker}/holdings` for those.

## Path parameters

- `ticker` string, required

## Response `200`

ETF capabilities and identifiers; for funds with holdings, also the latest metrics block.

- object
  - `ticker` string, required
  - `name` string, nullable
  - `capabilities` EtfCapabilities, required: What the API can do with an ETF. Three capabilities, any combination per fund (docs/ETF_COVERAGE.md).
    - `cascade` boolean: Hedge leg in the ERM3 SPY / sector / subsector cascade.
    - `priced` boolean: Daily returns in the ETF return store: /ticker-returns, covariance, beta to SPY.
    - `priced_from` string, date, nullable: First date with a daily return.
    - `holdings` boolean: Look-through holdings: /data/etf/{ticker}/holdings, benchmark fit.
    - `holdings_as_of` string, date, nullable: Latest holdings report date (/data/etf/{ticker} only; null in lists).
    - `factor_role` string: market, sector, subsector, style, macro:<factor> or none.
  - `identifiers` EtfIdentifiers, required: Open identifiers only (FIGI, CIK, BW ids); null where unknown.
    - `bw_sym_id` string, nullable
    - `bw_etf_id` string, nullable
    - `figi` string, nullable
    - `cik` string, nullable: 10-digit zero-padded SEC CIK.
    - `ticker` string
  - `portfolio_id` string: Holdings funds only.
  - `source_kind` 'etf'
  - `teo_frequency` 'daily'
  - `sponsor` string, nullable
  - `report_date` string, date
  - `availability_date` string, date, nullable
  - `aum_reported` number, nullable
  - `aum_erm3` number, nullable
  - `coverage_pct` number, nullable: aum_erm3 / aum_reported — in-ERM3 share of the resolved sleeve.
  - `n_total_holdings` integer

## Other responses

- `404`: Ticker is on no ETF list (`code` = symbol_not_found).

---

[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)
