> ## Documentation Index
> Fetch the complete documentation index at: https://docs.serialized.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Screener

> The most active markets of each chain (quality-filtered), filtered and sorted your way: any field as sort key, a filter tree, a timeframe, per-window stats on every row, cursor pagination. The discovery primitive - poll it to detect new markets.

`GET /v1/screener` · **1 credit**

<Tip>One row per market (pool); [`GET /v1/screener/pools`](/endpoints/screener-pools) serves the same list under its explicit name. **Live**: the [`screener-pools`](/streams/screener-pools-stream) stream channel keeps the same rows up to date, one per pool, and [`screener`](/streams/screener-stream) 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).</Tip>

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](/streams/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.

<Note>`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.</Note>

<Note>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.</Note>

## 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.

| You write | The view does |
| - | - |
| `sortBy=volume&timeframe=1h` | sorts on `stats.1h.volumeUsd` |
| `sortBy=priceChangePct&timeframe=5m` | sorts on `stats.5m.priceChangePct` |
| `volumeMin=10000&timeframe=1h` | keeps the markets with `stats.1h.volumeUsd` at or above 10,000 |
| `sortBy=windows.5m.volumeUsd` | sorts on that window, whatever the timeframe |

`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.

```json A filter tree theme={null}
{
  "ageSeconds": { "lte": 28800 },
  "marketCapUsd": { "gt": 5000 },
  "windows.5m.volumeUsd": { "gt": 2000 },
  "OR": [{ "pool.type": { "in": ["PUMP_SWAP", "UNISWAP_V3"] } }, { "liquidityUsd": { "gte": 50000 } }]
}
```

| Operators | Applies to |
| - | - |
| `equals`, `not`, `in` | every field |
| `gt`, `gte`, `lt`, `lte` | numbers |
| `contains`, `startsWith`, `endsWith` | text |

| Fields | |
| - | - |
| Identity | `chain`, `address` (the token), `name`, `symbol` |
| Market | `priceNative`, `priceUsd`, `marketCapUsd`, `liquidityUsd` |
| Age | `createdAt` (ms), `ageSeconds` |
| Activity | `volumeUsd`, `feesUsd`, `buys`, `sells`, `txns`, `priceChangePct` over the timeframe, and each window as `windows.<window>.<field>` with `<window>` among `5m`, `1h`, `6h`, `24h` |
| Pool | `pool.address`, `pool.type`, `pool.quoteAddress`, `pool.quoteSymbol` |

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](/streams/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`.

<Note>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.</Note>

<RequestExample>
  ```bash cURL (trending, two chains) theme={null}
  curl 'https://api.serialized.xyz/v1/screener?chains=evm:8453,solana&limit=2' \
    -H 'Authorization: YOUR_API_KEY'
  ```

  ```bash cURL (most traded over the last hour on Monad) theme={null}
  curl 'https://api.serialized.xyz/v1/screener?chains=evm:143&sortBy=volume&timeframe=1h&limit=20' \
    -H 'Authorization: YOUR_API_KEY'
  ```

  ```bash cURL (top gainers of the day above a liquidity floor) theme={null}
  curl 'https://api.serialized.xyz/v1/screener?chains=solana,evm:8453&sortBy=priceChangePct&timeframe=24h&liquidityMin=10000&volumeMin=50000' \
    -H 'Authorization: YOUR_API_KEY'
  ```

  ```bash cURL (young markets with volume over the last 5 minutes) theme={null}
  curl -G 'https://api.serialized.xyz/v1/screener' \
    -H 'Authorization: YOUR_API_KEY' \
    --data-urlencode 'chains=solana,evm:1,evm:56' \
    --data-urlencode 'sortBy=ageSeconds' \
    --data-urlencode 'sortOrder=asc' \
    --data-urlencode 'filters={"ageSeconds":{"lte":28800},"marketCapUsd":{"gt":5000},"windows.5m.volumeUsd":{"gt":2000}}'
  ```

  ```bash cURL (newest markets on Base) theme={null}
  curl 'https://api.serialized.xyz/v1/screener?chains=evm:8453&sortBy=createdAt&limit=20' \
    -H 'Authorization: YOUR_API_KEY'
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={null}
  {
    "data": [
      {
        "chain": "evm:8453",
        "address": "0x0ca6485b7e9cf814a3fd09d81672b07323535b64",
        "type": "UNISWAP_V3",
        "token": {
          "address": "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
          "name": "Degen",
          "symbol": "DEGEN"
        },
        "quote": {
          "address": "0x4200000000000000000000000000000000000006",
          "symbol": "WETH"
        },
        "priceNative": "0.000000547821",
        "priceUsd": 0.0010305242898887457,
        "marketCapUsd": 37436168.14123417,
        "liquidityUsd": 239687.07091684965,
        "volume24hUsd": 1284561.72,
        "priceChange24hPct": 3.747121113042337,
        "txns": 4821,
        "buys": 2610,
        "sells": 2211,
        "createdAt": 1705088299000,
        "stats": {
          "5m": {
            "volumeNative": 1.204518,
            "volumeUsd": 4213.44,
            "buys": 14,
            "sells": 9,
            "txns": 23,
            "feesNative": 0.000612,
            "feesUsd": 2.14,
            "priceChangePct": 0.31
          },
          "1h": {
            "volumeNative": 19.84211,
            "volumeUsd": 69416.03,
            "buys": 221,
            "sells": 184,
            "txns": 405,
            "feesNative": 0.010774,
            "feesUsd": 37.69,
            "priceChangePct": 1.12
          },
          "6h": {
            "volumeNative": 96.11803,
            "volumeUsd": 336268.9,
            "buys": 1036,
            "sells": 870,
            "txns": 1906,
            "feesNative": 0.050688,
            "feesUsd": 177.33,
            "priceChangePct": 2.05
          },
          "24h": {
            "volumeNative": 367.19334,
            "volumeUsd": 1284561.72,
            "buys": 2610,
            "sells": 2211,
            "txns": 4821,
            "feesNative": 0.128261,
            "feesUsd": 448.7,
            "priceChangePct": 3.747121113042337
          }
        }
      },
      {
        "chain": "solana",
        "address": "48WkwrpuxrjunUiWPjKE6mwt72L8Jt44ZKDzeoxfpJFq",
        "type": "PUMP_FUN",
        "token": {
          "address": "Gy5norvZpbgv69cxuLnLg27FBj7f13yXr9g5oLEQpump",
          "name": "Abdul El-Sayed",
          "symbol": "SAYED"
        },
        "quote": {
          "address": "So11111111111111111111111111111111111111112",
          "symbol": "SOL"
        },
        "priceNative": "0.000000004137723910209546",
        "priceUsd": 3.108043618992381e-7,
        "marketCapUsd": 432.6024893944764,
        "liquidityUsd": 2330.4088733171225,
        "volume24hUsd": 918342.11,
        "priceChange24hPct": -12.63,
        "txns": 3140,
        "buys": 1702,
        "sells": 1438,
        "createdAt": 1786046774000,
        "stats": {
          "5m": {
            "volumeNative": 21.0452,
            "volumeUsd": 4209.04,
            "buys": 18,
            "sells": 11,
            "txns": 26,
            "feesNative": 0.00145,
            "feesUsd": 0.29,
            "priceChangePct": -0.84
          },
          "1h": {
            "volumeNative": 402.118,
            "volumeUsd": 80423.6,
            "buys": 244,
            "sells": 197,
            "txns": 398,
            "feesNative": 0.02205,
            "feesUsd": 4.41,
            "priceChangePct": -3.9
          },
          "6h": {
            "volumeNative": 1611.77,
            "volumeUsd": 322354,
            "buys": 802,
            "sells": 689,
            "txns": 1341,
            "feesNative": 0.07455,
            "feesUsd": 14.91,
            "priceChangePct": -7.41
          },
          "24h": {
            "volumeNative": 4591.71,
            "volumeUsd": 918342.11,
            "buys": 1702,
            "sells": 1438,
            "txns": 3140,
            "feesNative": 0.157,
            "feesUsd": 31.4,
            "priceChangePct": -12.63
          }
        }
      }
    ],
    "meta": {
      "asOf": 1787163135004,
      "sortBy": "trending",
      "hasMore": true,
      "nextCursor": "eyJ2Ijo0LCJzIjoidHJlbmRpbmciLCJ3IjoiMjRoIiwiYyI6eyJldm06ODQ1MyI6eyJrIjo4LjcxLCJhIjoiMHgwY2E2NDg1YjdlOWNmODE0YTNmZDA5ZDgxNjcyYjA3MzIzNTM1YjY0IiwidCI6MTc4NzE2MzEzNTAwNH0sInNvbGFuYSI6eyJrIjo2Ljk0LCJhIjoiNDhXa3dycHV4cmp1blVpV1BqS0U2bXd0NzJMOEp0NDRaS0R6ZW94ZnBKRnEiLCJ0IjoxNzg3MTYzMTM3MjEwfX19",
      "universe": "perChain:top500ByVolume24hUsd+top100ByVolume1hUsd",
      "chains": {
        "evm:8453": { "markets": 500, "asOf": 1787163135004 },
        "solana": { "markets": 523, "asOf": 1787163137210 }
      }
    }
  }
  ```
</ResponseExample>


## OpenAPI

````yaml openapi.json GET /v1/screener
openapi: 3.1.0
info:
  title: Serialized Data API
  description: >-
    On-chain data for trading apps - tokens, candles, token filters. Built on
    our own indexers. 18 EVM chains + Solana, live.
  version: 0.1.0
servers:
  - url: https://demo.serialized.xyz
    description: 'Demo: no key needed, read endpoints, rate-limited per IP'
  - url: https://api.serialized.xyz
    description: 'Production: your API key in the Authorization header'
security:
  - apiKey: []
  - {}
paths:
  /v1/screener:
    get:
      summary: Screener
      description: >-
        The most active markets of each chain (quality-filtered), filtered and
        sorted your way: any field as sort key, a filter tree, a timeframe,
        per-window stats on every row, cursor pagination. The discovery
        primitive - poll it to detect new markets.
      operationId: market-screener
      parameters:
        - schema:
            type: string
            x-default: evm:8453,solana
          in: query
          name: chains
          required: true
          description: >-
            CSV of public chain ids (1-8). sortBy=createdAt serves ONE chain per
            call (indexed walk) - fan out per chain.
          example: evm:8453,solana
        - schema:
            default: trending
            type: string
            x-default: trending
          in: query
          name: sortBy
          required: false
          description: >-
            `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`.
          example: trending
        - schema:
            type: string
            x-default: desc
          in: query
          name: sortOrder
          required: false
          description: >-
            `desc` (default) or `asc`. A market whose sort value is unknown is
            served last in both orders.
          example: desc
        - schema:
            type: string
            x-default: 1h
          in: query
          name: timeframe
          required: false
          description: >-
            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.
          example: 1h
        - schema:
            type: string
            x-default: 1h
          in: query
          name: window
          required: false
          description: >-
            Previous name of `timeframe`, on `sortBy=volume` only: `5m`, `1h`,
            `6h` or `24h`. Give one or the other, never both.
          example: 1h
        - schema:
            type: string
            x-default: '{"marketCapUsd":{"gt":5000},"windows.5m.volumeUsd":{"gt":2000}}'
          in: query
          name: filters
          required: false
          description: >-
            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.
          example: '{"marketCapUsd":{"gt":5000},"windows.5m.volumeUsd":{"gt":2000}}'
        - schema:
            type: string
            x-default: 5m,1h
          in: query
          name: windows
          required: false
          description: >-
            CSV of the windows each row carries in `stats`, among `5m`, `1h`,
            `6h`, `24h`. Default: all four.
          example: 5m,1h
        - schema:
            minimum: 0
            type: number
          in: query
          name: ageMin
          required: false
          description: Keep the markets created at least this many minutes ago.
        - schema:
            minimum: 0
            type: number
            x-default: 480
          in: query
          name: ageMax
          required: false
          description: Keep the markets created at most this many minutes ago.
          example: 480
        - schema:
            minimum: 0
            type: number
            x-default: 10000
          in: query
          name: liquidityMin
          required: false
          description: Keep the markets with `liquidityUsd` at or above this (USD).
          example: 10000
        - schema:
            minimum: 0
            type: number
          in: query
          name: liquidityMax
          required: false
          description: Keep the markets with `liquidityUsd` at or below this (USD).
        - schema:
            minimum: 0
            type: number
            x-default: 5000
          in: query
          name: marketCapMin
          required: false
          description: Keep the markets with `marketCapUsd` at or above this (USD).
          example: 5000
        - schema:
            minimum: 0
            type: number
          in: query
          name: marketCapMax
          required: false
          description: Keep the markets with `marketCapUsd` at or below this (USD).
        - schema:
            minimum: 0
            type: number
            x-default: 2000
          in: query
          name: volumeMin
          required: false
          description: >-
            Keep the markets with a USD volume over the timeframe at or above
            this.
          example: 2000
        - schema:
            minimum: 0
            type: number
          in: query
          name: volumeMax
          required: false
          description: >-
            Keep the markets with a USD volume over the timeframe at or below
            this.
        - schema:
            minimum: 0
            type: number
          in: query
          name: txnsMin
          required: false
          description: >-
            Keep the markets with at least this many transactions over the
            timeframe.
        - schema:
            minimum: 0
            type: number
          in: query
          name: txnsMax
          required: false
          description: >-
            Keep the markets with at most this many transactions over the
            timeframe.
        - schema:
            minimum: 0
            type: number
          in: query
          name: feesMin
          required: false
          description: >-
            Keep the markets whose transaction fees over the timeframe are at or
            above this (USD).
        - schema:
            minimum: 0
            type: number
          in: query
          name: feesMax
          required: false
          description: >-
            Keep the markets whose transaction fees over the timeframe are at or
            below this (USD).
        - schema:
            minimum: 1
            maximum: 100
            default: 30
            type: integer
            x-default: 50
          in: query
          name: limit
          required: false
          description: Rows per page (default 30, max 100).
          example: 50
        - schema:
            type: string
          in: query
          name: cursor
          required: false
          description: >-
            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.
      responses:
        '200':
          description: Standard `{ data, meta }` envelope.
components:
  securitySchemes:
    apiKey:
      type: apiKey
      name: Authorization
      in: header
      description: Your raw API key (not needed on the demo server).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.