# GET /v2/tickers/{ticker}/holdings

**ETF holdings**

Returns an ETF's constituents and their weights, heaviest first.

## Query / path parameters

| Name | In | Type | Required | Description |
|------|----|----|----------|-------------|
| `ticker` | path | string | yes | ETF symbol. Case-insensitive. Example: `SPY`. |
| `limit` | query | integer | no | Max holdings returned. Max 5000. When the cap cuts the list, the response sets `truncated: true` and `total` (the ETF's full holding count) — raise `limit` to at least `total` to get the full set, possible whenever `total` is within the 5000 cap (an over-cap `limit` is clamped to 5000, not an error). No `truncated` in the response means the list is complete. Default: `500`. Example: `10`. |

## Returns

- `as_of` (string) — Server time this response was assembled (ISO 8601).
- `ticker` (string) — The ETF you asked for.
- `is_etf` (boolean) — Whether the symbol is an ETF, from the instrument type on its ticker record.
- `count` (number) — Holdings in this page.
- `truncated` (boolean) — `true` when `limit` cut the list short.
- `total` (number) — Total constituents held, before `limit`.
- `holdings` (array) — Constituents, heaviest first, each with its weight.

## Status codes

- **200** — Success — the response shape is documented under Returns above.
- **400** — Invalid ticker (malformed symbol).
- **404** — `not_found` — the symbol is not in the tracked universe. A tracked non-ETF answers 200 with `is_etf: false` instead.

## Sample response

```json
{
  "as_of": "2026-08-11T21:24:24.565Z",
  "ticker": "SPY",
  "is_etf": true,
  "count": 3,
  "truncated": true,
  "total": 504,
  "holdings": [
    { "holding_ticker": "NVDA", "weight": 0.0776 },
    { "holding_ticker": "AAPL", "weight": 0.0744 },
    { "holding_ticker": "MSFT", "weight": 0.0456 }
  ]
}
```

## Notes

- `is_etf` reports whether the symbol is an ETF, from the instrument type on its ticker record. For a non-ETF it is false and `holdings` is empty; `is_etf: true` with `count: 0` means a real ETF whose holdings have not been ingested yet.
- The reverse lookup — "which ETFs hold NVDA" — is a `/v2/scan` filter on the `etf_holders` column, not an endpoint.
- Holdings data comes from a nightly post-close vendor refresh (AlphaVantage ETF profiles) — expect it to be up to a day behind.

---

Interactive sandbox + parameter editor: https://tickerbot.io/docs/endpoints/tickers/holdings
