Pools API
Many pools by their addresses
Up to 30 liquidity pools by their own addresses in one request: which two tokens each holds, how deep it is, the price there, and how old it is.
/api/external/pool-analysis/pool-detail-batch/{chain}What it returns
The pool-detail answer — which two tokens a pool holds and which way round, how deep it is, the base token's price there, 24-hour volume and trade counts, when it was created and how much of its liquidity is locked or burned — for many pools on one chain in one request. Each result is exactly what pool-detail answers for that pool, with the same caveats on every field. A pool identifier nothing is known about on this chain is not_found, where pool-detail answers 404. 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
- BNB Chain BNB
- Ethereum ETH
- Stable STABLE
- Base BASE
- Robinhood Chain RHC
- Arc ARC
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/pool-analysis/pool-detail-batch/SOL"| Parameter | Description |
|---|---|
chainpath · string · required | The chain every pool in the batch lives on. All seven chains are served. CELO, ARB, OP and SCROLL return 400 here. |
subjectsbody · string[] · optional | Pool addresses, or pool IDs where the venue keys its pools by an ID (a Uniswap v4 pool ID is 32 bytes, not a 20-byte address). Between 1 and 30, 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.pool | string | The pool this response describes, in the canonical casing the data source uses — not an echo of what was sent. EVM identifiers are case-insensitive, so compare them case-insensitively rather than against the string you supplied. Never null: a pool that could not be resolved is a 404. |
results[].result.dexId | string | null | The venue this pool lives on, e.g. raydium, pancakeswap, uniswap. |
results[].result.dexLabel | string | null | The AMM version label, e.g. v2, v3, v4, CPMM. null means UNLABELLED, which is NOT the same as v2 — measured absent on 19 of 67 pools sampled. The version decides whether a pool even has a burnable LP token, so treating a missing label as v2 would turn "unknown" into a safety claim. |
results[].result.baseTokenAddress | string | null | The BASE token — the one priceUsd, marketCapUsd, fdvUsd, priceChange24hPct and liquidityBase are all about. Read this before reading any of them: the pool does not care which of its two tokens you were interested in. |
results[].result.baseTokenName | string | null | The base token's name. |
results[].result.baseTokenSymbol | string | null | The base token's symbol. |
results[].result.quoteTokenAddress | string | null | The QUOTE token — what the base is priced against, and the unit of liquidityQuote. The ZERO ADDRESS is a REAL value here, not a gap: it is how a pool quoted in the chain's native coin is reported. |
results[].result.quoteTokenName | string | null | The quote token's name. |
results[].result.quoteTokenSymbol | string | null | The quote token's symbol. |
results[].result.priceUsd | number | null | What the BASE token costs in USD, in this pool alone. A thin pool can price a token far from the rest of the market; that is a fact about the pool, not an error. |
results[].result.priceNative | number | null | What the BASE token costs in units of the QUOTE token, in this pool alone. Equal to priceUsd when the quote is a dollar stablecoin, which is not a bug. |
results[].result.liquidityUsd | number | null | Total depth of this pool in USD — BOTH sides. A real 0 means the pool has been DRAINED and is published as 0; only null means no figure was reported. This is one pool, so it is smaller than the token-wide liquidity resource by construction. |
results[].result.liquidityBase | number | null | How much of the BASE token sits in the pool, in that token's own units. Can be null while the pool's USD depth is present: not every answer carries the token amounts. |
results[].result.liquidityQuote | number | null | How much of the QUOTE token sits in the pool, in the QUOTE token's units — not USD. Never compare or sum this across pools: two pools can quote against different assets. Can be null while the pool's USD depth is present, like liquidityBase. |
results[].result.volume24hUsd | number | null | USD traded through THIS pool in the last 24 hours. A real 0 is common (5 of 67 pools sampled) and means nothing traded — it is not null. |
results[].result.buys24h | number | null | Buy count in this pool over 24 hours. A real 0 is common and is not null. |
results[].result.sells24h | number | null | Sell count in this pool over 24 hours. A real 0 is common and is not null. |
results[].result.priceChange24hPct | number | null | Percentage change in the BASE token's price over 24 hours, in this pool. Legitimately NEGATIVE — -54.04 was a real reading in the sample — and a 0 means unchanged, not unknown. |
results[].result.fdvUsd | number | null | Fully diluted valuation of the BASE token in USD, as this pool prices it. |
results[].result.marketCapUsd | number | null | Market cap of the BASE token in USD, as this pool prices it. |
results[].result.createdAt | integer | null | When the pool was created, in Unix SECONDS (not milliseconds). Pool age is the cheapest rug signal there is: a pool minutes old with deep liquidity is a different proposition from the same numbers on a year-old pool. |
results[].result.lockedLiquidityPct | number | null | Percent (0-100) of this pool's total liquidity under a KNOWN lock protocol, EXCLUDING burned LP (see burnedLiquidityPct). From a SECOND, best-effort source, independent of every other field on this response: null far more often means "not measured" than "confirmed zero" — measured sparse on a small sample, only 1 of 4 pools sampled across 4 chains answered at all. |
results[].result.burnedLiquidityPct | number | null | Percent (0-100) of this pool's total liquidity sent to a burn address specifically — a permanent commitment, reported separately from lockedLiquidityPct because a burn and a revocable third-party lock are different guarantees. Same sparse-source caveat as lockedLiquidityPct. |
results[].error | string | null | null, or unavailable when no source could be reached for this subject — retry it. not_found when The identifier is well-formed but no pool matching it is known on this chain — where pool-detail answers 404. Never a result of nulls: a pool that exists and has been drained is a result with liquidityUsd: 0. 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