Skip to main content
GET
GET /v1/screener · 1 credit
One row per market (pool); GET /v1/screener/pools serves the same list under its explicit name. Live: the screener-pools stream channel keeps the same rows up to date, one per pool, and screener gives one row per token: the full list on subscribe, then every row that enters, changes or leaves (restricted access: enabled per API key on request).
The most active markets of each chain (quality-filtered), filtered and sorted your way, with cursor pagination. Each row is a market (chain + pool) with its identity, price, liquidity, market cap and windowed stats (5m, 1h, 6h, 24h). The discovery primitive - poll it to detect new markets. A view is written like a subscription to the Screener Stream: same parameter names (sortBy, sortOrder, timeframe, filters, windows), same filter tree, same field names. A view written for the stream works here unchanged.
sortBy=trending (default) ranks by relevance: 24h activity weighted by real participation, so a wash-traded market ranks below an organically traded one with the same figures. sortBy=volume (alias top) is strictly ordered by the gross USD volume of timeframe (default 24h, that is volume24hUsd descending). sortBy=marketCap ranks on marketCapUsd. sortBy also takes any numeric field of the table below, for example liquidityUsd, priceChangePct, ageSeconds or windows.5m.volumeUsd; sortOrder is desc (default) or asc. A market whose sort value is unknown is served last.
Each row carries priceNative/priceUsd, marketCapUsd, liquidityUsd, createdAt, the 24h headline figures (volume24hUsd, priceChange24hPct, txns, buys, sells) and stats, one object per window (5m, 1h, 6h, 24h) with volumeNative, volumeUsd, buys, sells, txns, feesNative, feesUsd and priceChangePct (the price change over the window, in percent). feesNative and feesUsd are the transaction fees paid by traders over the window. volume24hUsd, txns, buys and sells equal their stats.24h counterparts. windows=5m,1h keeps only those windows in stats. sortBy=createdAt rows carry identity, price and market cap; windowed stats belong to the ranked listings. priceNative, priceUsd and marketCapUsd are null on a market that has not traded yet.

Timeframe

timeframe is the window the view works on: 5m, 1h, 6h or 24h (default 24h). It sets the window behind sortBy=volume, and behind the bare counters volumeUsd, feesUsd, buys, sells, txns and priceChangePct wherever you write them: in sortBy, in filters and in the flat filters. window is the previous name of timeframe on sortBy=volume and keeps working there.

Filters

filters is a filter tree, sent as URL-encoded JSON: { "<field>": { "<operator>": <value> } }, combined with AND, OR and NOT at any depth.
A filter tree
Field names are those of the stream row: address is the token address and pool.address the pool. The names of the row you receive here work too: token.address, token.name, token.symbol, type, quote.address, quote.symbol, stats.<window>.<field>, volume24hUsd, priceChange24hPct. The flat filters are shorthands for the most common bounds, inclusive: liquidityMin, liquidityMax, marketCapMin, marketCapMax (USD), volumeMin, volumeMax, feesMin, feesMax (USD, over the timeframe), txnsMin, txnsMax (over the timeframe), ageMin, ageMax (minutes since the market was created). They combine with filters. Filters run on the whole universe before the page is cut: every page holds limit matching markets as long as enough remain, hasMore is exact, and nextCursor walks the filtered list exactly once. A market whose value is unknown never passes a numeric bound. A filter on an unknown field, a malformed value or an unknown parameter is refused with INVALID_PARAM: details.param names the parameter and, for a filter, details.field names the field and details.reason says why. You never get an empty list because of a typo. The launchpad, creator and holder fields, the wallet counts per window and the 1m, 15m, 30m, 4h and 12h windows are served by the Screener Stream. sortBy=createdAt lists the newest markets of one chain as they are created and takes no filter. To rank the screener by age, use sortBy=ageSeconds&sortOrder=asc.
Except for sortBy=createdAt, the universe is selected PER CHAIN: the top 500 markets by 24h USD volume plus the top 100 by 1h USD volume of that chain, among the markets that pass our quality filters (stablecoin, wrapped and native pairs, drained pools and wash-traded markets are left out), refreshed every few seconds and named in meta.universe. The two tops overlap, so a large chain lists between 500 and 600 markets; a smaller chain lists every eligible market among its most active ones. meta.chains lists every requested chain with markets (the size of its universe) and asOf (the time its figures were computed). Pages merge the chains on the rank key. The cursor pins, for each chain, the computation the page was cut from and resumes right after the last market it served: every page of a walk started within the last minute comes from the same figures, so a market is served exactly once whatever the ranks did since. meta.chains[*].asOf tells you which computation a page reflects.

Authorizations

Authorization
string
header
required

Your raw API key (not needed on the demo server).

Query Parameters

chains
string
required

CSV of public chain ids (1-8). sortBy=createdAt serves ONE chain per call (indexed walk) - fan out per chain.

sortBy
string
default:trending

trending (default), volume (alias top), marketCap, createdAt, or any numeric field: liquidityUsd, marketCapUsd, priceUsd, ageSeconds, priceChangePct, volumeUsd, feesUsd, txns, buys, sells, windows.<window>.<field>. trending is the relevance ranking: 24h activity weighted by real participation, so wash-traded markets rank below organically traded ones with the same figures. volume is strictly ordered by the gross USD volume of timeframe. A bare counter (volumeUsd, feesUsd, buys, sells, txns, priceChangePct) reads the timeframe. Every sort but createdAt ranks within each chain's own universe (top 500 by 24h volume plus top 100 by 1h volume, named in meta.universe). createdAt lists the newest markets of one chain and takes no filter: to rank the screener by age, use ageSeconds with sortOrder=asc.

sortOrder
string

desc (default) or asc. A market whose sort value is unknown is served last in both orders.

timeframe
string

Window the view works on: 5m, 1h, 6h or 24h (default 24h). Sets the window behind sortBy=volume and behind the bare counters (volumeUsd, feesUsd, buys, sells, txns, priceChangePct) in sortBy, filters and the flat filters.

window
string

Previous name of timeframe, on sortBy=volume only: 5m, 1h, 6h or 24h. Give one or the other, never both.

filters
string

Filter tree as URL-encoded JSON: {"<field>":{"<operator>":<value>}}, combined with AND, OR and NOT at any depth. Same grammar and field names as the Screener Stream. Operators: equals, not, in (every field), gt, gte, lt, lte (numbers), contains, startsWith, endsWith (text). Fields: chain, address (the token), name, symbol, priceNative, priceUsd, marketCapUsd, liquidityUsd, createdAt, ageSeconds, pool.address, pool.type, pool.quoteAddress, pool.quoteSymbol, the bare counters over the timeframe and windows.<5m|1h|6h|24h>.<volumeUsd|feesUsd|buys|sells|txns|priceChangePct>. Applied on the whole universe before the page is cut.

windows
string

CSV of the windows each row carries in stats, among 5m, 1h, 6h, 24h. Default: all four.

ageMin
number

Keep the markets created at least this many minutes ago.

Required range: x >= 0
ageMax
number

Keep the markets created at most this many minutes ago.

Required range: x >= 0
liquidityMin
number

Keep the markets with liquidityUsd at or above this (USD).

Required range: x >= 0
liquidityMax
number

Keep the markets with liquidityUsd at or below this (USD).

Required range: x >= 0
marketCapMin
number

Keep the markets with marketCapUsd at or above this (USD).

Required range: x >= 0
marketCapMax
number

Keep the markets with marketCapUsd at or below this (USD).

Required range: x >= 0
volumeMin
number

Keep the markets with a USD volume over the timeframe at or above this.

Required range: x >= 0
volumeMax
number

Keep the markets with a USD volume over the timeframe at or below this.

Required range: x >= 0
txnsMin
number

Keep the markets with at least this many transactions over the timeframe.

Required range: x >= 0
txnsMax
number

Keep the markets with at most this many transactions over the timeframe.

Required range: x >= 0
feesMin
number

Keep the markets whose transaction fees over the timeframe are at or above this (USD).

Required range: x >= 0
feesMax
number

Keep the markets whose transaction fees over the timeframe are at or below this (USD).

Required range: x >= 0
limit
integer
default:30

Rows per page (default 30, max 100).

Required range: 1 <= x <= 100
cursor
string

Opaque cursor from meta.nextCursor. Pins the computation each page was cut from, so a walk started within the last minute never skips or repeats a market. A cursor belongs to its view: same sortBy, sortOrder, timeframe and filters.

Response

200

Standard { data, meta } envelope.