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.

POST/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"
Parameters
ParameterDescription
chain

path · string · required

The chain every pool in the batch lives on. All seven chains are served. CELO, ARB, OP and SCROLL return 400 here.
subjects

body · 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.

Response fields of Many pools by their addresses
FieldTypeDescription
resultsobject[]One entry per requested subject, in the order they were sent.
results[].subjectstringThe subject exactly as it was sent.
results[].resultobject | nullWhat the single-subject endpoint answers for this subject. null only when error is set.
results[].result.poolstringThe 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.dexIdstring | nullThe venue this pool lives on, e.g. raydium, pancakeswap, uniswap.
results[].result.dexLabelstring | nullThe 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.baseTokenAddressstring | nullThe 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.baseTokenNamestring | nullThe base token's name.
results[].result.baseTokenSymbolstring | nullThe base token's symbol.
results[].result.quoteTokenAddressstring | nullThe 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.quoteTokenNamestring | nullThe quote token's name.
results[].result.quoteTokenSymbolstring | nullThe quote token's symbol.
results[].result.priceUsdnumber | nullWhat 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.priceNativenumber | nullWhat 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.liquidityUsdnumber | nullTotal 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.liquidityBasenumber | nullHow 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.liquidityQuotenumber | nullHow 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.volume24hUsdnumber | nullUSD 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.buys24hnumber | nullBuy count in this pool over 24 hours. A real 0 is common and is not null.
results[].result.sells24hnumber | nullSell count in this pool over 24 hours. A real 0 is common and is not null.
results[].result.priceChange24hPctnumber | nullPercentage 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.fdvUsdnumber | nullFully diluted valuation of the BASE token in USD, as this pool prices it.
results[].result.marketCapUsdnumber | nullMarket cap of the BASE token in USD, as this pool prices it.
results[].result.createdAtinteger | nullWhen 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.lockedLiquidityPctnumber | nullPercent (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.burnedLiquidityPctnumber | nullPercent (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[].errorstring | nullnull, 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