Get a ticker's holdings
https://api.tickerbot.io/ v2/ tickers/ {ticker}/ holdingsReturns an ETF's constituents and their weights, heaviest first, and its sector weights.
Path parameters
stringrequiredETF symbol. Case-insensitive.
Query parameters
integerdefault 500Max 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.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
tickerstringThe ETF you asked for.
is_etfbooleanWhether the symbol is an ETF, from the instrument type on its ticker record.
countnumberHoldings in this page.
totalnumberTotal constituents held, before limit.
truncatedbooleantrue when limit cut the list short.
holdingsarrayConstituents, heaviest first, each with its weight.
sectorsarraySector weights, heaviest first, in the vendor's ETF-profile vocabulary. Always complete: limit, count, total and truncated are about holdings.
Status codes
| Code | Meaning |
|---|---|
200 | Success — the response shape is documented under Returns above. |
400 | Invalid ticker (malformed symbol). |
404 | not_found: not a ticker we track. A tracked non-ETF answers 200 with is_etf: false instead. |
Notes
is_etf: truewithcount: 0means a real ETF whose holdings have not been ingested yet.- The other direction, which ETFs hold a stock, is the
etf_holderssignal on every ticker (GET /v2/tickers/NVDAlists them, the biggest position first), and a screen:POST /v2/scanwithqset to'SMH' = ANY(etf_holders)returns everything SMH holds. - Sector NAMES here are the vendor's ETF-profile vocabulary (
INFORMATION TECHNOLOGY,CONSUMER DISCRETIONARY,MATERIALS), NOT the values thesectorsignal carries on a ticker (Technology,Consumer Cyclical,Basic Materials). The two line up conceptually but not as strings, so passing a value from here into a screen'sqmatches nothing. - Holdings and sector data come from a nightly post-close refresh of ETF profile data, so expect them to be up to a day behind.
- Path history:
GET /v2/etf/{ticker}/holdingsis the older spelling of this read and keeps working, permanently, with the same response.GET /v2/tickers/{ticker}/sectorsandGET /v2/etf/{ticker}/sectorskeep serving the sector mix alone (countcounts sectors there). All three carry aLinkheader naming this path.