Skip to main content

What you’ll build

A list of every liquidity pool on one network that contains a given token, busiest first, with paging that walks the whole list. That list is the input for three common jobs:
  • Picking the pool to read a token’s price or OHLCV history from
  • Watching where a token’s volume moves between DEXes
  • Building a per-token dashboard that shows every venue at once
One call does it: GET /networks/{network}/pools/search with a token_address parameter.
This call replaces GET /networks/{network}/tokens/{token_address}/pools, which was removed and now returns 410 Gone. If you are migrating, the before and after section maps the old parameters to the new ones.

The call

Every Solana pool that contains wrapped SOL, three busiest first:
Four parameters do the work: The network is part of the path, so the address is looked up on that chain only. Every other search filter combines with token_address using AND: add liquidity_usd_min to skip thin pools, dex_name with the dex_id slug from a response to stay on one DEX, created_after to see only new venues. The pool filtering tutorial lists them all.
order_by accepts volume_usd_24h, volume_usd_7d, volume_usd_30d, liquidity_usd, txns_24h, created_at, price_usd, price_change_percentage_24h, price_change_percentage_6h, price_change_percentage_1h and price_change_percentage_5m.

The response

The call above returned three rows. Here is one of them, with the other two cut for length; they have the same shape:
Field names as they come off the wire:
  • id is the pool address. dex_id is the DEX slug and dex_name its label.
  • tokens lists the pool’s tokens by id only. A search row carries no symbol or name. When you need SOL/USDC rather than two addresses, call pool details for that id; its tokens array carries symbol, name and decimals.
  • query echoes what the API applied. Read it after every call. It is how you know token_address was honoured and which order_by ran.
  • transactions_24h is the trade count and liquidity_usd the pool’s depth. Both are per pool, not per token.

Rules that are easy to miss

Network-scoped only. The cross-network GET /pools/search accepts token_address and ignores it. The call returns 200, its query echo drops the parameter, and the rows come from every chain. To cover several networks, loop over them and make one per-network call each.
One token per query. Repeating the parameter, as in token_address=A&token_address=B, is not a pair filter. The API keeps one of the values, and which one is not guaranteed by order. To find pools for a pair, filter on one token and check the tokens array for the other in your own code.
An unknown address is not an error. A wrong or mistyped address returns 200 with "results": [], "has_next_page": false and an empty next_cursor, and query still echoes the address you sent. An empty list usually means the address is wrong for that network, so check both before concluding the token has no pools. The same token has a different address on every chain.
Volume and depth are different lists. The busiest pool by volume_usd_24h can be a day-old pool with almost no liquidity. When you want the pool to price against, add a floor:

Paging with the cursor

The response above ended with "has_next_page": true and a next_cursor. Pass that value back as cursor, with every other parameter unchanged:
Page two picks up below the last volume of page one, repeats no pool, still carries has_next_page and a fresh next_cursor, and every row still contains the token. Keep going until has_next_page is false. There are no page numbers. Each page is one request and one credit, however many pools it returns. A base asset like SOL sits in millions of pools by the count token details reports under summary.pools, so raise limit for fewer pages, add liquidity_usd_min to cut the tail, and stop at a page count you chose rather than at the end of the list. A free API key from console.dexpaprika.com raises the limits on these calls; pricing has the current quotas and the rate limits page explains how they are counted.

Moving off the removed endpoint

Before:
That path now answers 410 Gone with a body that names the replacement:
After:
What moved where: The removed endpoint’s reference page keeps the same table next to the old spec.

Full example

The single call in curl, and a paged walk in Python and JavaScript that collects the busiest pools and prints what each one is paired with:

Next steps

Pool filtering

Every search filter, and how to combine them into a screener

Pool details

Symbols, reserves and price stats for one pool id

Pool search reference

Every parameter and the full response schema

Historical data

OHLCV history for the pool you picked

FAQs

No. The token_address filter works on GET /networks/{network}/pools/search only. The cross-network GET /pools/search accepts the parameter and ignores it. Fetch the network list and make one per-network call for each chain the token lives on.
Search rows carry each token’s id and chain only. Call pool details with the pool id to get symbol, name and decimals for both tokens.
Filter on one token and check the tokens array for the other in your own code. Repeating token_address does not narrow the list to a pair. The API keeps one value, and which one is not guaranteed by order.
An unknown address returns 200 with an empty results array rather than a 404, so an empty list usually means the address does not exist on that network. Check that the address belongs to the chain in the path; the same token has a different address on each chain.
It was removed and returns 410 Gone. Use GET /networks/{network}/pools/search?token_address={address}. The page parameter became cursor, order_by=volume_usd became order_by=volume_usd_24h, and the address pair filter and reorder flag have no equivalent.