Tokens API
Trade stats by trailing window, for many tokens
Buyer and seller wallet counts, transactions and volume over trailing windows from 3h to 24h, for up to 25 tokens on one chain in one request.
/api/external/token-analysis/stats-windows-batch/{chain}What it returns
The stats-windows answer for many tokens on one chain, in one request. Each result is exactly what stats-windows answers for that token, with the same window set per chain and the same caveats on every field: SOL returns 3h, 4h, 5h, 6h, 12h and 24h; ETH returns 4h, 12h and 24h, with no priceChangePct. A token no source had anything for is a result with every figure null, as stats-windows answers it. POST, because the list is the subject: it can run past what a URL comfortably holds, and a body keeps a watch list out of every proxy log between the caller and this service.
Chains
- Solana SOL
- Ethereum ETH
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -X POST -H "x-dex-data-key: $DEXDATA_API_KEY" \
-H "content-type: application/json" \
-d '{"subjects":["<subjects>"]}' \
"https://api.dexdata.io/api/external/token-analysis/stats-windows-batch/SOL"| Parameter | Description |
|---|---|
chainpath · string · required | The chain every token in the batch lives on. SOL and ETH only, as on stats-windows; BNB, BASE, STABLE, RHC and ARC return 400. CELO, ARB, OP and SCROLL return 400 here. |
subjectsbody · string[] · optional | Token mint addresses (Solana) or contract addresses (ETH). ≤ 20 tokens keep the answer under 32 KB. Between 1 and 25, each sent once. |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
results | object[] | One entry per requested subject, in the order they were sent. |
results[].subject | string | The subject exactly as it was sent. |
results[].result | object | null | What the single-subject endpoint answers for this subject. null only when error is set. |
results[].result.3h | object | |
results[].result.3h.uniqueBuyers | integer | null | Distinct wallets that bought in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.3h.uniqueSellers | integer | null | Distinct wallets that sold in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.3h.uniqueWallets | integer | null | Distinct wallets that did EITHER — not the sum of uniqueBuyers and uniqueSellers, because a wallet that both bought and sold in the window counts once here. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.3h.buys | integer | null | Buy-side transaction count in this window. |
results[].result.3h.sells | integer | null | Sell-side transaction count in this window. |
results[].result.3h.volumeUsd | object | |
results[].result.3h.volumeUsd.buys | number | null | |
results[].result.3h.volumeUsd.sells | number | null | |
results[].result.3h.volumeUsd.total | number | null | |
results[].result.3h.priceChangePct | number | null | Percent change from the price at the START of this window to now. Positive means the price ROSE. Verified 2026-09-16 by back-solving a consistent current price from 5 of the 6 windows on the same token. 3h is excluded from that check and is also the one window where this field itself is null — the same known source limitation as the wallet-count fields, not a real zero percent change. Present on `SOL` only. It is absent from every ETH window, not null: the source serving ETH has no price on these windows at all, so there is nothing it declined to answer. |
results[].result.4h | object | |
results[].result.4h.uniqueBuyers | integer | null | Distinct wallets that bought in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.4h.uniqueSellers | integer | null | Distinct wallets that sold in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.4h.uniqueWallets | integer | null | Distinct wallets that did EITHER — not the sum of uniqueBuyers and uniqueSellers, because a wallet that both bought and sold in the window counts once here. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.4h.buys | integer | null | Buy-side transaction count in this window. |
results[].result.4h.sells | integer | null | Sell-side transaction count in this window. |
results[].result.4h.volumeUsd | object | |
results[].result.4h.volumeUsd.buys | number | null | |
results[].result.4h.volumeUsd.sells | number | null | |
results[].result.4h.volumeUsd.total | number | null | |
results[].result.4h.priceChangePct | number | null | Percent change from the price at the START of this window to now. Positive means the price ROSE. Verified 2026-09-16 by back-solving a consistent current price from 5 of the 6 windows on the same token. 3h is excluded from that check and is also the one window where this field itself is null — the same known source limitation as the wallet-count fields, not a real zero percent change. Present on `SOL` only. It is absent from every ETH window, not null: the source serving ETH has no price on these windows at all, so there is nothing it declined to answer. |
results[].result.5h | object | |
results[].result.5h.uniqueBuyers | integer | null | Distinct wallets that bought in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.5h.uniqueSellers | integer | null | Distinct wallets that sold in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.5h.uniqueWallets | integer | null | Distinct wallets that did EITHER — not the sum of uniqueBuyers and uniqueSellers, because a wallet that both bought and sold in the window counts once here. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.5h.buys | integer | null | Buy-side transaction count in this window. |
results[].result.5h.sells | integer | null | Sell-side transaction count in this window. |
results[].result.5h.volumeUsd | object | |
results[].result.5h.volumeUsd.buys | number | null | |
results[].result.5h.volumeUsd.sells | number | null | |
results[].result.5h.volumeUsd.total | number | null | |
results[].result.5h.priceChangePct | number | null | Percent change from the price at the START of this window to now. Positive means the price ROSE. Verified 2026-09-16 by back-solving a consistent current price from 5 of the 6 windows on the same token. 3h is excluded from that check and is also the one window where this field itself is null — the same known source limitation as the wallet-count fields, not a real zero percent change. Present on `SOL` only. It is absent from every ETH window, not null: the source serving ETH has no price on these windows at all, so there is nothing it declined to answer. |
results[].result.6h | object | |
results[].result.6h.uniqueBuyers | integer | null | Distinct wallets that bought in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.6h.uniqueSellers | integer | null | Distinct wallets that sold in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.6h.uniqueWallets | integer | null | Distinct wallets that did EITHER — not the sum of uniqueBuyers and uniqueSellers, because a wallet that both bought and sold in the window counts once here. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.6h.buys | integer | null | Buy-side transaction count in this window. |
results[].result.6h.sells | integer | null | Sell-side transaction count in this window. |
results[].result.6h.volumeUsd | object | |
results[].result.6h.volumeUsd.buys | number | null | |
results[].result.6h.volumeUsd.sells | number | null | |
results[].result.6h.volumeUsd.total | number | null | |
results[].result.6h.priceChangePct | number | null | Percent change from the price at the START of this window to now. Positive means the price ROSE. Verified 2026-09-16 by back-solving a consistent current price from 5 of the 6 windows on the same token. 3h is excluded from that check and is also the one window where this field itself is null — the same known source limitation as the wallet-count fields, not a real zero percent change. Present on `SOL` only. It is absent from every ETH window, not null: the source serving ETH has no price on these windows at all, so there is nothing it declined to answer. |
results[].result.12h | object | |
results[].result.12h.uniqueBuyers | integer | null | Distinct wallets that bought in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.12h.uniqueSellers | integer | null | Distinct wallets that sold in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.12h.uniqueWallets | integer | null | Distinct wallets that did EITHER — not the sum of uniqueBuyers and uniqueSellers, because a wallet that both bought and sold in the window counts once here. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.12h.buys | integer | null | Buy-side transaction count in this window. |
results[].result.12h.sells | integer | null | Sell-side transaction count in this window. |
results[].result.12h.volumeUsd | object | |
results[].result.12h.volumeUsd.buys | number | null | |
results[].result.12h.volumeUsd.sells | number | null | |
results[].result.12h.volumeUsd.total | number | null | |
results[].result.12h.priceChangePct | number | null | Percent change from the price at the START of this window to now. Positive means the price ROSE. Verified 2026-09-16 by back-solving a consistent current price from 5 of the 6 windows on the same token. 3h is excluded from that check and is also the one window where this field itself is null — the same known source limitation as the wallet-count fields, not a real zero percent change. Present on `SOL` only. It is absent from every ETH window, not null: the source serving ETH has no price on these windows at all, so there is nothing it declined to answer. |
results[].result.24h | object | |
results[].result.24h.uniqueBuyers | integer | null | Distinct wallets that bought in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.24h.uniqueSellers | integer | null | Distinct wallets that sold in this window. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.24h.uniqueWallets | integer | null | Distinct wallets that did EITHER — not the sum of uniqueBuyers and uniqueSellers, because a wallet that both bought and sold in the window counts once here. null specifically on the shortest window (3h) — a known limitation of the underlying source, not a real zero. |
results[].result.24h.buys | integer | null | Buy-side transaction count in this window. |
results[].result.24h.sells | integer | null | Sell-side transaction count in this window. |
results[].result.24h.volumeUsd | object | |
results[].result.24h.volumeUsd.buys | number | null | |
results[].result.24h.volumeUsd.sells | number | null | |
results[].result.24h.volumeUsd.total | number | null | |
results[].result.24h.priceChangePct | number | null | Percent change from the price at the START of this window to now. Positive means the price ROSE. Verified 2026-09-16 by back-solving a consistent current price from 5 of the 6 windows on the same token. 3h is excluded from that check and is also the one window where this field itself is null — the same known source limitation as the wallet-count fields, not a real zero percent change. Present on `SOL` only. It is absent from every ETH window, not null: the source serving ETH has no price on these windows at all, so there is nothing it declined to answer. |
results[].error | string | null | null, or unavailable when no source could be reached for this subject — retry it. A subject nobody has data for is NOT an error: its result says so. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key