A new kind of ETF holdings API.

What an ETF holds, and which ETFs hold a stock — both directions, in the same table as the prices, indicators and fundamentals of every constituent. Ask an ETF for its constituents and you get them weight-ranked with the sector breakdown; ask the table which stocks a fund holds and it is a column on every row, so “QQQ members that are overbought” is one WHERE clause, not a holdings download joined to a price feed.

Free plan. Every ticker, every signal, real-time data, all-time history.

what you get

The capability, itemized.

Constituents, weight-rankedEvery holding and its weight, heaviest first, up to 5,000 per call — total and truncated tell you when a fund has more
Sector breakdownThe ETF’s weight per sector — eleven for a broad-market fund — as one call
The reverse lookupetf_holders is an array column on every stock: the ETFs that hold it, ordered by its weight in each — filter it in SQL with 'SPY' = ANY(etf_holders)
Members as a universeScreen or alert on an ETF’s constituents by putting the holdings condition in the same q as any other column
Every US-listed ETFETFs are rows of the ticker table like any equity — price, volume, indicators and history on the fund itself, holdings behind it
Refreshed nightlyHoldings and the reverse column update after each close, so a fund’s rebalance shows up in the next morning’s screens

Every read runs in three tenses: live, as of any past moment (add ?asof=; no look-ahead, no survivorship bias), or on push — the same query as a webhook that fires when the answer changes. Under it sits the computed table: every US equity plus rates, FX and crypto, every signal precomputed and refreshed continuously, all-time history. Data included — there’s no feed to bring.

one call

QQQ constituents with RSI above 70.

The reverse lookup as a scan condition — the holdings column and an indicator column in one WHERE:

GET /v2/scan?q='QQQ' = ANY(etf_holders) AND rsi_14 > 70
    &columns=ticker,rsi_14&limit=3

// → { "as_of": "2026-08-24T14:38:29Z", "count": 3, "results": [
//     { "ticker": "ABNB", "rsi_14": 74.86 },
//     { "ticker": "DASH", "rsi_14": 72.59 },
//     { "ticker": "WBD",  "rsi_14": 71.42 } ] }

The other direction is /v2/tickers/SPY/holdings — 504 constituents, NVDA 7.9% at the top — and /v2/tickers/SPY/sectors for the eleven-sector split. The reverse column is ordered by the stock’s weight in each fund, so etf_holders[1] is the ETF it matters most to.

Ready to wire it into something? Build a stock screener walks it end to end. Reference: ETF holdings · ETF sectors · scan · the SQL surface.

questions

FAQ

Which ETFs are covered?

Every US-listed ETF is a row of the ticker table, with the same price, volume, indicator and history columns as a stock. Holdings and sector weights are served for funds that disclose them; a fund with no disclosed constituents returns an empty list rather than an error.

Can I get holdings as of a past date?

Not today. Holdings, sector weights and the etf_holders column are current snapshots, refreshed nightly; a scan with ?asof= reports that column as unavailable rather than guessing. Every other column on the constituents’ rows — price, indicators, fundamentals — is readable as of any past moment.

Is this only for equity ETFs?

Holdings are available wherever the fund discloses constituents that are themselves tickers in the table, so equity and sector funds are the fully joined case. Bond, commodity and leveraged funds appear as rows with their own price history; their holdings are not equities and are not decomposed.

How does Tickerbot work with AI agents?

Every call here is also a native tool call: install the MCP server and Claude, ChatGPT, Cursor, or any MCP runtime queries the market directly. Computed state is what makes that work well: hand a model raw data and its context window fills with math to do; hand it computed answers and the context goes to decisions. A scan returns the tickers matching your condition: a list, not a workload.

How does Tickerbot pricing work?

The Free plan needs no card and carries the full data side: every ticker, every signal, real-time data, all-time history and as-of queries, at 10,000 calls a month and 60 a minute. Paid plans start at $29/mo, remove the monthly cap, and raise the rate limit; webhooks and streaming come with them. Data depth is never a tier lever: every plan sees the same table.

in the wild

900K+ calls served, and counting.

What people are saying.

“dude. whoah.”
President, ShopifyHarley Finkelstein
“Tickerbot is insane. It turns Claude into a quant.”
Quantitative Finance MScLounes Vennema
“Best value for hobbyists and advanced traders alike.”
AI Engineer, ImergeRon Reid

get started

Get a key. Run a scan.

Free plan. Every ticker, every signal, real-time data, all-time history.