Skip to main content

What you’ll build

A pool screener that finds liquidity pools matching specific criteria: volume thresholds, liquidity, transaction counts, and creation dates. This is useful for:
  • Finding high-activity pools on any network
  • Discovering newly created pools (early token launches)
  • Building automated pool monitoring pipelines
  • Filtering noise from low-activity pools
This tutorial uses GET /networks/{network}/pools/search. It replaces the old /networks/{network}/pools/filter, /networks/{network}/pools, and /pools endpoints, which were removed and now return 410 Gone. If you used the old endpoints, see the parameter changes below.

The search endpoint

Combine multiple filters with AND logic. Results are returned in a results array with cursor-based pagination. To search across several networks at once, use the global GET /pools/search with a chains parameter.

Available parameters

Parameter names migrated from the old filter endpoint: volume_24h_min is now volume_usd_24h_min, sort_by is now order_by, sort_dir is now sort, and page is replaced by cursor. The volume_7d, volume_30d, and liquidity_usd filters are now functional.
The token_address filter works on the per-network GET /networks/{network}/pools/search only. The cross-network GET /pools/search accepts the parameter but silently ignores it, so a token filter without a network returns unfiltered results.

Price change windows

Pool search covers four windows: 24h, 6h, 1h and 5m. Each one is both a filter pair and a sort field, so you can screen over the horizon you actually trade on instead of reading a 24h number and guessing what happened in the last few minutes. A percentage filter is a plain numeric bound, so the minus sign carries the direction. price_change_percentage_1h_max=-20 means “down by at least 20 percent in the last hour”, and price_change_percentage_1h_min=50 means “up by at least 50 percent”. There is no separate direction parameter.
Verify a percentage filter against an unfiltered baseline the first time you use one. An unknown parameter name is dropped silently rather than rejected, so a typo like price_change_1h_max still returns 200 with a full, unfiltered page of results. Compare the price_change_percentage_1h values you get back against a plain ?limit=5 call: unfiltered rows sit near zero, filtered rows respect the bound.
Only the three short windows are pool-only. GET /networks/{network}/tokens/search rejects order_by=price_change_percentage_6h, price_change_percentage_1h and price_change_percentage_5m with a 400, and token rows carry none of those three fields, with or without detailed=true. The 24h window works on both: token search sorts by price_change_percentage_24h and filters on price_change_percentage_24h_min / _max.The short-window filters behave worse than the sort fields on the token side. price_change_percentage_6h_min is not rejected there, it is dropped, so token search answers 200 with the same unfiltered page you would get without it.

Example 1: High-volume pools on Ethereum

Find Ethereum pools with over $500,000 in daily volume:

Response format

Response field names: pool address is id, transaction count is transactions_24h, DEX is dex_id (slug) plus dex_name (label). Results are in a results array, and you page with next_cursor rather than page numbers.

Example 2: Recently created pools with activity

Find pools created in the last 7 days that have at least 50 transactions:

Example 3: Paginating through all results

Page with the cursor returned in each response:

Example 4: Combining with pool details

Search returns summary data. To get full pool details (token pair info, reserves, fees), make a follow-up request:

Tips

  • Start broad, then narrow: Begin with just volume_usd_24h_min to see what matches, then add more filters.
  • Use created_after for new token discovery: Combine with txns_24h_min to find new pools that actually have trading activity.
  • Different networks, different thresholds: A $10k volume pool on Ethereum is tiny; on a smaller chain it might be significant. Adjust thresholds per network.
  • Search across networks: Use GET /pools/search?chains=ethereum,base,solana to screen multiple networks in one call.
  • Filter by token: Pass token_address on the per-network search to list only pools containing that token. This replaces the removed /networks/{network}/tokens/{token_address}/pools endpoint.

Next steps

Find New Pools

More techniques for discovering new pools using the search endpoint

Pool Details

Get full details for any pool including token pairs and reserves

Common Patterns

Standard API workflows including search, pricing, and historical data

Pool Details API

Full pool details endpoint documentation

FAQs

It was removed and now returns 410 Gone, along with /networks/{network}/pools and the global /pools. Use /networks/{network}/pools/search (single network) or /pools/search (multiple networks) instead.
Yes. Use the global GET /pools/search with a chains parameter, for example chains=ethereum,base. The per-network GET /networks/{network}/pools/search covers a single network.
Set limit and read has_next_page and next_cursor from the response. Pass next_cursor back as cursor to fetch the next page. There are no page numbers.
Pass token_address on the per-network search: GET /networks/{network}/pools/search?token_address={address}. This replaces the removed /networks/{network}/tokens/{token_address}/pools endpoint, which now returns 410 Gone. The filter is per-network only; the cross-network /pools/search silently ignores it. One token per query: repeating the parameter does not act as a pair filter (the API uses only one of the values, not guaranteed by order), and the old second-token pair filter has no equivalent.