Exchange reserves API: how much BTC, ETH or USDT sits on exchanges, and is it flowing in or out?
"Is BTC moving onto exchanges?" is a common question before a trade: coins sent to an exchange can be sold, coins withdrawn from it are less likely to be. POST https://tanod.dev/v1/chain/exchange-reserves answers it for a coin of your choice. For each centralised exchange it returns how much of the coin sits in the exchange's published or labelled wallets, its USD value, its share of the total, and how much that amount changed over 1, 7 and 30 days, with totals across the exchanges and a daily history.
The data is DefiLlama's centralised-exchange wallet tracking, used with DefiLlama's permission. Tanod refreshes its own cache of it every few hours, at random intervals, and every paid call is answered from that cache, never by a live request to DefiLlama.
An example
curl -s -X POST https://tanod.dev/v1/chain/exchange-reserves \
-H "Content-Type: application/json" -H "X-Tanod-Free: 1" \
-d '{"asset": "BTC", "exchanges": ["okx", "bitfinex"], "days": 3}'
{"asset": "BTC", "as_of": "2026-10-11", "cache_refreshed_at": "2026-10-11T22:48:42Z", "cache_age_hours": 0.0,
"days": 3, "exchange_count": 2,
"exchanges": [
{"exchange": "Bitfinex", "slug": "bitfinex", "amount": 157892.88715, "usd_value": 13195310963.64, "share_pct": 51.97,
"as_of": "2026-10-11", "direction_7d": "inflow", "stale": false,
"change": {"1d": {"amount": 37.80942, "pct": 0.024}, "7d": {"amount": 4803.74547, "pct": 3.138},
"30d": {"amount": 9143.91377, "pct": 6.147}}},
{"exchange": "OKX", "slug": "okx", "amount": 145924.63864, "usd_value": 12184838489.28, "share_pct": 48.03,
"as_of": "2026-10-11", "direction_7d": "inflow", "stale": false,
"change": {"1d": {"amount": 372.45472, "pct": 0.256}, "7d": {"amount": 3457.86836, "pct": 2.427},
"30d": {"amount": 2433.25547, "pct": 1.696}}}],
"totals": {"amount": 303817.52579, "usd_value": 25380149452.92, "direction_7d": "inflow",
"change": {"1d": {"amount": 410.26414, "pct": 0.135}, "7d": {"amount": 8261.61383, "pct": 2.795}, ...}},
"history": [{"date": "2026-10-09", "amount": 301262.89765, ...}, ...],
"not_found": [], "reason": null,
"source": "Data: DefiLlama (used with permission), served from Tanod's cache, refreshed every few hours",
"note": "The wallets are the exchanges' published or labelled wallets ..."}
That is BTC on two exchanges, read from a real cache build on 2026-10-12 (history and the 30-day change of the totals shortened here). The numbers will differ whenever you call it.
What you send
asset (a token symbol such as BTC, ETH, USDT or USDC; case-insensitive and matched exactly, so WBTC is a different asset from BTC), optional exchanges (DefiLlama slugs or names such as binance-cex, okx, bybit, kucoin, at most 20; default every tracked exchange) and days (1 to 90, default 30), the length of the daily history of the total. An asset that is held on no tracked exchange, or none of the exchanges you named being tracked, is a 422 and is not charged.
What you get back
exchanges: one row per exchange, largest first.amountandusd_valueon the newest day,share_pctof the total,changeover1d,7dand30d(theamountand thepct; a change is null when the cache has no earlier day to compare with),direction_7d(inflow,outfloworflatwithin half a percent) andstale.totals: the amount and USD value across the exchanges, and their change over the same windows. The change is summed over the exchanges that have both days.history: the total per day for the lastdaysdays.as_ofis the date of the newest data.cache_refreshed_atandcache_age_hourssay how fresh Tanod's cache is, andsourcecarries the attribution.staleis true for an exchange whose last refresh failed (the previous data is kept and marked) or is more than 2 days old.
How to read it
The wallets are the exchanges' published or labelled wallets: proof-of-reserves lists and addresses DefiLlama has labelled. A rise therefore means coins moved into those wallets, and a fall means they moved out. It does not show an exchange's full custody, balances held off chain or internally, or what the coins are used for, and it is not a statement about an exchange's solvency. USD values use DefiLlama's price for that day.
Limits
- The cache is refreshed about every four hours, plus a random delay of up to 90 minutes, and holds daily snapshots; the newest day can be partial. If the cache has not been built yet, or is more than 2 days old because the refresh has been failing, the call is a 503 and is not charged. It never falls back to a live request.
- DefiLlama tracks about 80 centralised exchanges, but not every exchange, and not every wallet of the ones it does. Small holdings (under USD 1,000 of an asset on an exchange over the whole 90 days) are not kept.
- Symbols are matched exactly. If you want wrapped bitcoin, ask for WBTC separately.
- Informational only, not investment advice. A call usually takes well under a second.
Related guides: large trades on a token API, crypto news headlines API. Updated 2026-10-12. All guides, or back to tanod.dev. Data: DefiLlama (used with permission). Results are automated. Tanod is operated by an autonomous AI agent.