Pools API

One pool by its address

One liquidity pool by its own address: which two tokens it holds and which way round, how deep it is, the price there, and how old it is.

GET/api/external/pool-analysis/pool-detail/{chain}/{pool}

What it returns

One liquidity pool, addressed by the POOL rather than by a token in it. Answers which two tokens it holds and which way round, how deep it is, what the base token costs there, how much has traded through it in 24 hours, and when it was created. Served on all seven chains, each measured live against a populated pool. THE POOL IDENTIFIER IS NOT ALWAYS AN ADDRESS: on Uniswap v4 venues it is a 32-byte pool ID, so do not validate it as a 20-byte contract address. A well-formed identifier this surface has no pool for returns 404, never a body of nulls — "no such pool here" and "this pool is empty" are different answers and a pool-keyed resource keeps them apart. EVERY FIGURE DESCRIBES THIS POOL ALONE: nothing is summed across the token's other pools, so liquidityUsd here is smaller than the token-wide liquidity resource and that is not a disagreement. A 0 is a real measurement everywhere it appears — a liquidityUsd of 0 means DRAINED, and only null means no data. THE SWAP FEE IS NOT PUBLISHED HERE: it costs a second upstream call and the token-keyed pool resource already carries it, so the field is absent rather than always null. On SOL a pool the first source cannot resolve is answered by a second one that does not carry the quote token's name and symbol, 24-hour volume, 24-hour buy and sell counts, the 24-hour price change or FDV: those are null in that answer, never zero. includeTokens=true adds tokens, the project profile of both tokens (links, categories, holder count), for one more upstream call.

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 -H "x-dex-data-key: $DEXDATA_API_KEY" \
  "https://api.dexdata.io/api/external/pool-analysis/pool-detail/SOL/<pool>"
Parameters
ParameterDescription
includeTokens

query · boolean · optional

Whether to add tokens: each token's name, symbol, decimals, website, X/Twitter, Telegram, categories and holder count. Off by default: it is one more upstream call.
chain

path · string · required

The chain the pool lives on. CELO, ARB, OP and SCROLL return 400 here.
pool

path · string · required

The pool identifier — a pool/pair address on most venues, or a 32-byte pool ID where the venue uses one (Uniswap v4). It identifies the POOL, not a token traded in it.

Response fields

A JSON response. Every field is always present; null means the value could not be established, never zero.

Response fields of One pool by its address
FieldTypeDescription
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.
dexIdstring | nullThe venue this pool lives on, e.g. raydium, pancakeswap, uniswap.
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.
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.
baseTokenNamestring | nullThe base token's name.
baseTokenSymbolstring | nullThe base token's symbol.
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.
quoteTokenNamestring | nullThe quote token's name.
quoteTokenSymbolstring | nullThe quote token's symbol.
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.
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.
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.
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.
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.
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.
buys24hnumber | nullBuy count in this pool over 24 hours. A real 0 is common and is not null.
sells24hnumber | nullSell count in this pool over 24 hours. A real 0 is common and is not null.
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.
fdvUsdnumber | nullFully diluted valuation of the BASE token in USD, as this pool prices it.
marketCapUsdnumber | nullMarket cap of the BASE token in USD, as this pool prices it.
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.
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.
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.
tokensobject | nullOnly with includeTokens=true, absent otherwise. The project profile of the base and quote token. null when no profile of this pool is known; a side is null when that token has no profile.
tokens.baseobject | null
tokens.base.addressstringThe token address, as the pool lists it.
tokens.base.namestring | null
tokens.base.symbolstring | null
tokens.base.decimalsinteger | null
tokens.base.websitestring | nullThe project's website URL.
tokens.base.twitterstring | nullThe project's X/Twitter URL.
tokens.base.telegramstring | nullThe project's Telegram URL.
tokens.base.categoriesstring[]Categories the token is listed under, e.g. Meme; empty when none.
tokens.base.holderCountinteger | nullWallets holding the token when last counted. A count, refreshed every few hours.
tokens.base.holderCountAtstring | nullWhen holderCount was counted (ISO 8601).
tokens.quoteobject | null
tokens.quote.addressstringThe token address, as the pool lists it.
tokens.quote.namestring | null
tokens.quote.symbolstring | null
tokens.quote.decimalsinteger | null
tokens.quote.websitestring | nullThe project's website URL.
tokens.quote.twitterstring | nullThe project's X/Twitter URL.
tokens.quote.telegramstring | nullThe project's Telegram URL.
tokens.quote.categoriesstring[]Categories the token is listed under, e.g. Meme; empty when none.
tokens.quote.holderCountinteger | nullWallets holding the token when last counted. A count, refreshed every few hours.
tokens.quote.holderCountAtstring | nullWhen holderCount was counted (ISO 8601).

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