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

> A live market screener: every token trading above the quality floor, filtered and sorted for you on the timeframe you pick. The full list on subscribe, then every token that enters, changes or leaves, as it happens. Rows carry the same fields as the Pulse Stream.

`WS channel: screener`

Enabled on your key on request: contact us.

A live market screener, filtered and sorted for you: the full list on subscribe, then every token that enters, changes or leaves, as it happens. The list is the active market of REST [`/v1/screener`](/endpoints/market-screener), with no top-300 cut: every token that traded in the last 24 hours above the quality floor is in it, on every chain you ask for.

One subscription is one view: one or more chains, a timeframe, a sort, your filters and a size. Rows are the cards of the [Pulse Stream](/streams/pulse-stream), with the same fields and the same `null` rules. For one row per pool instead of one row per token, use the [Screener Pools Stream](/streams/screener-pools-stream): same parameters, same messages.

## Delivery model

* **Snapshot, then deltas.** Right after the ack you receive a `snapshot`: the complete view, in order. From then on you receive a `delta` each time the view changes.
* **At your pace.** A change is pushed as soon as it happens. Changes that follow within your `updatePeriod` (100 ms by default) are grouped into the next message, so a busy view sends at most one message per period.
* **A fresh copy every minute.** Every 60 s, if the view moved, you receive its complete `snapshot` again (`"reason": "periodic"`), free: replace your view with it, like any snapshot. A view sorted or filtered on the `1m` window gets it every 10 s.
* **Filters run on our side.** You receive only the rows of your view, already ranked. You never sort and never filter.
* **Always consistent.** Messages of a view are numbered (`seq`, `prev`). Whenever the exact sequence cannot be delivered, you receive a fresh `snapshot` instead: replace your view with it.

## The active market

A token is in the list while one of its pools passes the quality floor on its last 24 hours: not a stable, wrapped or blocked asset; a minimum of volume, trades and distinct traders; a real liquidity that its volume does not turn over more than a thousand times; and, on EVM chains, a fees-to-volume ratio in line with the chain. A token enters at the trade that takes it over the floor, and leaves when it no longer passes, or 24 hours after its last trade. The row shows the token's most active pool.

## Parameters

<ParamField body="chains" type="string[]" required>
  1 to 8 public chain ids, `evm:<id>` or `solana`. EVM chains and Solana can be mixed in one view. A comma-separated string is accepted too. Example: `["solana", "evm:8453"]`
</ParamField>

<ParamField body="timeframe" type="string">
  The window the view works on, one of `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `6h`, `12h`, `24h`. Default `24h`. It sets the window behind `sortBy: "volume"`, behind the bare counters in `sortBy` and `filters` (`volumeUsd`, `feesUsd`, `buys`, `sells`, `txns`, `priceChangePct`), and the window the rows carry by default. See [Timeframe](#timeframe).
</ParamField>

<ParamField body="sortBy" type="string">
  `trending` (default: our 24 h relevance ranking, wash-penalized), `volume` (USD volume of the timeframe; `top` is an alias), `marketCap`, `createdAt`, or any numeric card field, for example `liquidityUsd`, `txns`, `windows.5m.volumeUsd`. A bare counter reads the timeframe window.
</ParamField>

<ParamField body="sortOrder" type="string">
  `asc` or `desc`. Default `desc`.
</ParamField>

<ParamField body="limit" type="number">
  View size, 1 to 100. Default `50`.
</ParamField>

<ParamField body="filters" type="object">
  A filter tree: `{ "<field>": { "<operator>": <value> } }`, combined with `AND`, `OR` and `NOT` at any depth. Same grammar and same fields as the [Pulse Stream](/streams/pulse-stream#filters). A bare counter (`txns`, `volumeUsd`, `feesUsd`, `buys`, `sells`, `priceChangePct`) and the flat REST parameters `volumeMin`, `volumeMax`, `txnsMin`, `txnsMax`, `feesMin`, `feesMax` read the timeframe window.
</ParamField>

<ParamField body="updatePeriod" type="integer">
  Milliseconds, 0 to 60000, default `100`: at most one `delta` per period, carrying every change of the period. The ack carries the value applied (snapped up to `0, 100, 250, 500, 1000, 2000, 5000, 10000, 30000, 60000`); `maxUpdatesPerMinute` is accepted as an alias. See [Choosing your pace](/streams/overview#choosing-your-pace-updateperiod).
</ParamField>

<ParamField body="windows" type="string[]">
  The rolling windows to include in each row, among `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `6h`, `12h`, `24h` (a comma-separated string is accepted too). Default: the timeframe. Filters and `sortBy` accept `windows.<window>.<field>` whether or not the window is in the rows. Example: `["5m", "1h", "24h"]`
</ParamField>

There is no `model` parameter: the list is the active market.

## Timeframe

`timeframe` is a shorthand. It never changes the view's identity: two subscriptions that spell the same view differently share one view.

| You write | The view does |
| - | - |
| `"sortBy": "volume"` with `"timeframe": "1h"` | sorts on `windows.1h.volumeUsd` |
| `"sortBy": "txns"` with `"timeframe": "5m"` | sorts on `windows.5m.txns` |
| `"filters": { "volumeUsd": { "gte": 10000 } }` with `"timeframe": "1h"` | filters on `windows.1h.volumeUsd` |
| `"volumeMin": 10000` (flat REST parameter) with `"timeframe": "1h"` | same |
| `"sortBy": "windows.5m.volumeUsd"` | sorts on that window, whatever the timeframe |
| no `windows` with `"timeframe": "1h"` | rows carry `windows.1h` |

Read your figures in `windows.<timeframe>` of each row: that is what the view sorts and filters on. The top-level counters of a row (`txns`, `volumeUsd`, …) are the token's 24 h figures, or the figures of its launchpad column when the token is also in a Pulse column.

## Messages

Every message is the `data` of an `event` frame.

| `data.type` | Fields | Sent |
| - | - | - |
| `snapshot` | `seq`, `epoch`, `rows`: the complete view, in order | right after the ack, and whenever the view has to be replaced |
| `delta` | `seq`, `prev`, `epoch`, `enter`, `update`, `leave`, and `order` when needed | each time the view changes |

* **`enter`**: full cards entering the view. Each carries `rank`, its position in the view (0 is the top) once the message is applied. Entries are listed by increasing `rank`.
* **`update`**: `{ "key": "<chain>:<address>", … }` with only the fields that changed. A field that became `null` is sent as `null`.
* **`leave`**: the keys of the rows leaving the view.
* **`order`**: every key of the view, in order. Present only when rows you already hold changed place.

### Applying a delta

1. Remove every key listed in `leave`.
2. Apply every `update`: the fields present replace those of the row.
3. Insert every row of `enter` at its `rank`, in the order given.
4. If `order` is present, arrange your rows in that order.

A `snapshot` replaces everything you hold for the view.

### The row

The card of the [Pulse Stream](/streams/pulse-stream#the-card), field for field: identity, price, market cap, liquidity, `pool` (the token's most active pool), lifecycle, the top-level counters, `metadata`, `creator`, the holders (`holdersCount`, `top10HoldersPct`, `devHoldingsPct`: EVM chains, `null` on Solana rows; filtering or sorting on them in a Solana-only view is refused with `UNAVAILABLE_FIELD`), `pools`, and `windows` with the windows requested (the timeframe by default), each with `volumeUsd`, `feesUsd`, `buys`, `sells`, `txns`, `uniqueBuyers`, `uniqueSellers`, `traders`, `snipers`, `proTraders` and `priceChangePct`.

The `trending` rank is a ranking score, not a field: it is never in a row and cannot be filtered on. Rows arrive in order; you never sort.

### From REST `/v1/screener` to the stream

| REST `/v1/screener` row | Stream row |
| - | - |
| one row per pool, `address` is the pool, `token.address` | one row per token, `address` is the token, `pool.address` is its pool |
| `volume24hUsd` | `windows.24h.volumeUsd` |
| `priceChange24hPct` | `windows.24h.priceChangePct` |
| `stats.<5m, 1h, 6h, 24h>` | `windows.<window>` for the windows requested, nine available |
| `window` (on `sortBy=volume`) | `timeframe` (on every sort and filter) |
| `limit` default 30 | `limit` default 50 |

## Resume

Events carry a `cursor`. After a reconnect, send the same `subscribe` with `"since": "<cursor>"`: you receive the deltas you missed, or a `snapshot` of the current view followed by what comes next. Either way, applying what you receive is all there is to do. See Reconnect & resume in the [Streams overview](/streams/overview).

When a client reads too slowly for its view, the pending messages of that view are replaced by one `snapshot` as soon as the connection catches up.

## Billing

**1 credit per message delivered.** The `snapshot` of a subscription (`"reason": "subscribe"`) costs 1, whatever its size; every `delta` costs 1, whatever it carries. Snapshots sent on our own after that first one (`"reason": "periodic"` every 60 s, `"reason": "resync"` after a hiccup) and deltas flagged `"replay": true` are free; the `snapshot` sent when you resume with `since` costs 1, like the one of a new subscription. A view where nothing happens costs nothing, and the connection is free. A longer `updatePeriod` means fewer messages, and fewer credits.

`GET /v1/usage/breakdown` reports this channel under `WS screener`, where `requests` is the number of messages delivered.

## Errors

| Code | Meaning | What to do |
| - | - | - |
| `INVALID_PARAM` | A parameter or a filter was refused. `details.param` names the parameter (`timeframe`, `sortBy`, `chains`, …; `model`, which this channel does not take); for a filter, `details.field` names the field and `details.reason` says why | Fix the subscription |
| `INVALID_CHAIN` | Unknown chain id | Fix the subscription |
| `RATE_LIMITED` | The subscription limit of your account is reached | Close a subscription, or ask us to raise the limit |
| `UPSTREAM_ERROR` with `details.retryAfterMs` | The view is warming up | Send the same `subscribe` again after `details.retryAfterMs` |
| `UPSTREAM_ERROR` with `details.resumes: true` | Live data is temporarily unavailable | Nothing: the subscription resumes by itself |

## Close codes

| Code | Meaning |
| - | - |
| `4401` | Auth - key missing, invalid, or revoked. Live connections are dropped the moment a key is revoked. |
| `4402` | Monthly credit quota exhausted (the WebSocket mirror of REST `402`). |
| `1012` | Server restart - reconnect after the `retryAfterMs` of the JSON reason, then subscribe again with `since`. |
| `1013` | Server at capacity - reconnect after the `retryAfterMs` of the JSON reason. |
| `1008` | Policy - subscription limits, flooding, or a blocked socket. Fix the cause before reconnecting. |
| `1001` | Idle timeout - no `ping` within the keepalive window. |

<RequestExample>
  ```json Subscribe theme={null}
  {
    "op": "subscribe",
    "channel": "screener",
    "id": "vol-1h-sol",
    "params": {
      "chains": ["solana"],
      "timeframe": "1h",
      "sortBy": "volume",
      "limit": 50,
      "filters": {
        "marketCapUsd": { "gte": 50000 },
        "txns": { "gte": 100 }
      }
    }
  }
  ```

  ```json Subscribe (trending, default) theme={null}
  {
    "op": "subscribe",
    "channel": "screener",
    "id": "trend-base",
    "params": {
      "chains": ["evm:8453"],
      "limit": 25
    }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json Ack theme={null}
  {
    "op": "subscribed",
    "id": "vol-1h-sol",
    "channel": "screener",
    "updatePeriod": 100
  }
  ```

  ```json Snapshot theme={null}
  {
    "op": "event",
    "id": "vol-1h-sol",
    "channel": "screener",
    "data": {
      "type": "snapshot",
      "seq": 0,
      "epoch": "mun6v2l5lbes",
      "rows": [
        {
          "chain": "solana",
          "address": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
          "name": "Bonk",
          "symbol": "BONK",
          "nameRank": 1,
          "totalSupply": "88752941638.47",
          "priceNative": "0.000000098210",
          "priceUsd": 0.0000147,
          "marketCapUsd": 1304668.2,
          "liquidityNative": "6120.25",
          "liquidityUsd": 918037.5,
          "pool": {
            "address": "3ne4mWqdYuNiYrYZC9TrA3FcfuFdErghH97vNPbjicr1",
            "type": "RAYDIUM_AMM",
            "factory": null,
            "quoteAddress": "So11111111111111111111111111111111111111112",
            "quoteSymbol": "SOL"
          },
          "bondingProgress": null,
          "migrated": false,
          "createdAt": 1672444800000,
          "graduatedAt": null,
          "ageSeconds": 118094967,
          "txns": 18422,
          "buys": 9811,
          "sells": 8611,
          "volumeUsd": 2140512.7,
          "feesUsd": 5351.2,
          "priceChangePct": -3.1,
          "metadata": {
            "iconUrl": "https://serialized.cloud/token/0190a2f4-1b2c-7d3e-8f4a-5b6c7d8e9f0a/icon",
            "websiteUrl": "https://bonkcoin.com",
            "twitterUrl": "https://x.com/bonk_inu",
            "telegramUrl": null,
            "dexPaid": true
          },
          "creator": {
            "address": null,
            "displayName": null,
            "avatarUrl": null,
            "ensName": null,
            "labeled": false,
            "launchedCount": null,
            "migratedCount": null
          },
          "holdersCount": null,
          "top10HoldersPct": null,
          "devHoldingsPct": null,
          "pools": [
            {
              "address": "3ne4mWqdYuNiYrYZC9TrA3FcfuFdErghH97vNPbjicr1",
              "type": "RAYDIUM_AMM",
              "factory": null,
              "quoteAddress": "So11111111111111111111111111111111111111112",
              "quoteSymbol": "SOL"
            }
          ],
          "windows": {
            "1h": { "volumeUsd": 96210.4, "feesUsd": 240.5, "buys": 412, "sells": 377, "txns": 789, "uniqueBuyers": 301, "uniqueSellers": 262, "traders": 498, "snipers": 3, "proTraders": 41, "priceChangePct": 0.8 }
          }
        }
      ]
    },
    "asOf": 1790539767146,
    "cursor": "v1.amun6v2l5lbes.2.mfq3c2y2"
  }
  ```

  ```json Delta theme={null}
  {
    "op": "event",
    "id": "vol-1h-sol",
    "channel": "screener",
    "data": {
      "type": "delta",
      "seq": 1,
      "prev": 0,
      "epoch": "mun6v2l5lbes",
      "enter": [
        { "chain": "solana", "address": "CBZq5ycLcr6mnYvjFTPuYSuhgS3ujsiTrT4sqatBpump", "rank": 17, "…": "…" }
      ],
      "update": [
        { "key": "solana:DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", "priceUsd": 0.0000148, "marketCapUsd": 1313543.5, "windows": { "1h": { "volumeUsd": 96402.1, "buys": 413, "txns": 790, "uniqueBuyers": 302, "traders": 499 } } }
      ],
      "leave": ["solana:7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"]
    },
    "asOf": 1790539767301,
    "cursor": "v1.amun6v2l5lbes.5.mfq3c4a1"
  }
  ```
</ResponseExample>


## AsyncAPI

````yaml asyncapi.json screener
id: screener
title: Screener Stream
description: >-
  A live market screener: every token trading above the quality floor on the
  chains you ask for, filtered and sorted on the timeframe you pick. The full
  list on subscribe, then every token that enters, changes or leaves. One row
  per token; rows are the cards of `pulse`, with `windows.<timeframe>` by
  default. Enabled on your key on request.
servers:
  - id: production
    protocol: wss
    host: ws.serialized.xyz
    bindings: []
    variables: []
address: screener
parameters: []
bindings: []
operations:
  - &ref_2
    id: subscribe-screener
    title: Subscribe Screener Stream
    type: send
    messages:
      - &ref_6
        id: subscribe
        payload:
          - name: Subscribe
            description: Client frame opening the subscription (additive, ack is explicit).
            type: object
            properties:
              - name: op
                type: string
                description: subscribe
                required: true
              - name: channel
                type: string
                description: screener
                required: true
              - name: id
                type: string
                description: >-
                  Client-chosen subscription id, echoed on every frame of this
                  subscription.
                required: true
              - name: params
                type: object
                required: true
                properties:
                  - name: timeframe
                    type: string
                    description: >-
                      The window the view works on: behind `sortBy: "volume"`,
                      behind the bare counters in `sortBy` and `filters`, and
                      the window the rows carry by default.
                    enumValues:
                      - 1m
                      - 5m
                      - 15m
                      - 30m
                      - 1h
                      - 4h
                      - 6h
                      - 12h
                      - 24h
                    required: false
                  - name: chains
                    type: array
                    description: >-
                      1 to 8 public chain ids, `evm:<id>` or `solana`, mixed
                      freely (a comma-separated string is accepted too).
                    required: true
                    properties:
                      - name: item
                        type: string
                        required: false
                  - name: limit
                    type: integer
                    description: View size.
                    required: false
                  - name: sortBy
                    type: string
                    description: >-
                      `trending` (default), `volume` (alias `top`), `marketCap`,
                      `createdAt`, or any numeric card field.
                    required: false
                  - name: sortOrder
                    type: string
                    enumValues:
                      - asc
                      - desc
                    required: false
                  - name: filters
                    type: object
                    description: >-
                      A filter tree `{ "<field>": { "<operator>": <value> } }`
                      combined with `AND`, `OR` and `NOT`; the flat REST filters
                      are accepted next to it.
                    required: false
                  - name: updatePeriod
                    type: integer
                    description: >-
                      Milliseconds, 0 to 60000, default 100: how often, at most,
                      this subscription receives a message (snapped up to 0,
                      100, 250, 500, 1000, 2000, 5000, 10000, 30000, 60000; the
                      ack carries the value applied).
                    required: false
                  - name: windows
                    type: array
                    description: >-
                      Rolling windows to include in each row. Filters and
                      `sortBy` accept `windows.<window>.<field>` whether or not
                      the window is in the rows.
                    required: false
                    properties:
                      - name: item
                        type: string
                        enumValues:
                          - 1m
                          - 5m
                          - 15m
                          - 30m
                          - 1h
                          - 4h
                          - 6h
                          - 12h
                          - 24h
                        required: false
              - name: since
                type: string
                description: >-
                  Optional, next to `params`: the `cursor` of the last event you
                  received. You get the deltas you missed, or a snapshot of the
                  current view.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            op:
              type: string
              const: subscribe
              x-parser-schema-id: <anonymous-schema-86>
            channel:
              type: string
              const: screener
              x-parser-schema-id: <anonymous-schema-87>
            id:
              type: string
              description: >-
                Client-chosen subscription id, echoed on every frame of this
                subscription.
              x-parser-schema-id: <anonymous-schema-88>
            params:
              type: object
              properties:
                timeframe:
                  type: string
                  enum:
                    - 1m
                    - 5m
                    - 15m
                    - 30m
                    - 1h
                    - 4h
                    - 6h
                    - 12h
                    - 24h
                  default: 24h
                  description: >-
                    The window the view works on: behind `sortBy: "volume"`,
                    behind the bare counters in `sortBy` and `filters`, and the
                    window the rows carry by default.
                  x-parser-schema-id: <anonymous-schema-90>
                chains:
                  type: array
                  minItems: 1
                  maxItems: 8
                  items:
                    type: string
                    x-parser-schema-id: <anonymous-schema-92>
                  description: >-
                    1 to 8 public chain ids, `evm:<id>` or `solana`, mixed
                    freely (a comma-separated string is accepted too).
                  x-parser-schema-id: <anonymous-schema-91>
                limit:
                  type: integer
                  minimum: 1
                  maximum: 100
                  default: 50
                  description: View size.
                  x-parser-schema-id: <anonymous-schema-93>
                sortBy:
                  type: string
                  description: >-
                    `trending` (default), `volume` (alias `top`), `marketCap`,
                    `createdAt`, or any numeric card field.
                  x-parser-schema-id: <anonymous-schema-94>
                sortOrder:
                  type: string
                  enum:
                    - asc
                    - desc
                  default: desc
                  x-parser-schema-id: <anonymous-schema-95>
                filters:
                  type: object
                  description: >-
                    A filter tree `{ "<field>": { "<operator>": <value> } }`
                    combined with `AND`, `OR` and `NOT`; the flat REST filters
                    are accepted next to it.
                  x-parser-schema-id: <anonymous-schema-96>
                updatePeriod:
                  type: integer
                  minimum: 0
                  maximum: 60000
                  default: 100
                  description: >-
                    Milliseconds, 0 to 60000, default 100: how often, at most,
                    this subscription receives a message (snapped up to 0, 100,
                    250, 500, 1000, 2000, 5000, 10000, 30000, 60000; the ack
                    carries the value applied).
                  x-parser-schema-id: <anonymous-schema-97>
                windows:
                  type: array
                  items:
                    type: string
                    enum:
                      - 1m
                      - 5m
                      - 15m
                      - 30m
                      - 1h
                      - 4h
                      - 6h
                      - 12h
                      - 24h
                    x-parser-schema-id: <anonymous-schema-99>
                  description: >-
                    Rolling windows to include in each row. Filters and `sortBy`
                    accept `windows.<window>.<field>` whether or not the window
                    is in the rows.
                  x-parser-schema-id: <anonymous-schema-98>
              required:
                - chains
              x-parser-schema-id: <anonymous-schema-89>
            since:
              type: string
              description: >-
                Optional, next to `params`: the `cursor` of the last event you
                received. You get the deltas you missed, or a snapshot of the
                current view.
              x-parser-schema-id: <anonymous-schema-100>
          required:
            - op
            - channel
            - id
            - params
          x-parser-schema-id: <anonymous-schema-85>
        title: Subscribe
        description: Client frame opening the subscription (additive, ack is explicit).
        example: |-
          {
            "op": "subscribe",
            "channel": "screener",
            "id": "vol-1h-sol",
            "params": {
              "chains": [
                "solana"
              ],
              "timeframe": "1h",
              "sortBy": "volume",
              "limit": 50
            }
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: subscribe
          - id: x-parser-message-name
            value: subscribe
    bindings: []
    extensions: &ref_0
      - id: x-parser-unique-object-id
        value: screener
  - &ref_1
    id: receive-screener
    title: Screener Stream frames
    type: receive
    messages:
      - &ref_3
        id: ack
        payload:
          - name: Ack
            description: 'Server acknowledgement: the subscription is live.'
            type: object
            properties:
              - name: type
                type: string
                description: object
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          x-parser-schema-id: <anonymous-schema-101>
        title: Ack
        description: 'Server acknowledgement: the subscription is live.'
        example: |-
          {
            "op": "subscribed",
            "id": "vol-1h-sol",
            "channel": "screener",
            "updatePeriod": 100
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: ack
          - id: x-parser-message-name
            value: ack
      - &ref_4
        id: snapshot
        payload:
          - name: Snapshot
            description: >-
              The complete view, in order: right after the ack (`"reason":
              "subscribe"`, 1 credit), every 60 s if the view moved (`periodic`,
              free) and whenever the view has to be replaced (`resync`, free).
            type: object
            properties:
              - name: type
                type: string
                description: object
                required: false
              - name: description
                type: string
                description: >-
                  `data.type` is `snapshot`; `data.rows` is the complete view in
                  order; `seq` and `epoch` number the messages. `cursor` resumes
                  the subscription.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          description: >-
            `data.type` is `snapshot`; `data.rows` is the complete view in
            order; `seq` and `epoch` number the messages. `cursor` resumes the
            subscription.
          x-parser-schema-id: <anonymous-schema-102>
        title: Snapshot
        description: >-
          The complete view, in order: right after the ack (`"reason":
          "subscribe"`, 1 credit), every 60 s if the view moved (`periodic`,
          free) and whenever the view has to be replaced (`resync`, free).
        example: |-
          {
            "op": "event",
            "id": "vol-1h-sol",
            "channel": "screener",
            "data": {
              "type": "snapshot",
              "seq": 0,
              "epoch": "mun6v2l5lbes",
              "rows": [
                {
                  "chain": "solana",
                  "address": "CBZq5ycLcr6mnYvjFTPuYSuhgS3ujsiTrT4sqatBpump",
                  "name": "Pump Kitten",
                  "symbol": "PKIT",
                  "priceUsd": 0.0000047,
                  "marketCapUsd": 4712.25,
                  "liquidityUsd": 12637.5,
                  "pool": {
                    "address": "Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS",
                    "type": "PUMP_FUN",
                    "factory": "pumpfun",
                    "quoteAddress": "So11111111111111111111111111111111111111112",
                    "quoteSymbol": "SOL"
                  },
                  "bondingProgress": 3.5,
                  "migrated": false,
                  "createdAt": 1790539700000,
                  "txns": 12,
                  "buys": 9,
                  "sells": 3,
                  "volumeUsd": 1840.2,
                  "feesUsd": 23.1,
                  "priceChangePct": 12.4,
                  "...": "...",
                  "rank": 0,
                  "windows": {
                    "1h": {
                      "volumeUsd": 96210.4,
                      "feesUsd": 240.5,
                      "buys": 412,
                      "sells": 377,
                      "txns": 789,
                      "uniqueBuyers": 301,
                      "uniqueSellers": 262,
                      "traders": 498,
                      "snipers": 3,
                      "proTraders": 41,
                      "priceChangePct": 0.8
                    }
                  }
                }
              ]
            },
            "asOf": 1790539767146,
            "cursor": "v1.amun6v2l5lbes.2.mfq3c2y2",
            "reason": "subscribe"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: snapshot
          - id: x-parser-message-name
            value: snapshot
      - &ref_5
        id: delta
        payload:
          - name: Delta
            description: >-
              Each change of the view, at most one per `updatePeriod`: 1 credit
              per message.
            type: object
            properties:
              - name: type
                type: string
                description: object
                required: false
              - name: description
                type: string
                description: >-
                  `data.type` is `delta`: `enter` (full rows, with `rank` on
                  views), `update` (`key` plus the fields that changed), `leave`
                  (keys), and `order` on views when rows you hold changed place.
                  Apply: remove `leave`, apply `update`, insert `enter`, then
                  `order`.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          description: >-
            `data.type` is `delta`: `enter` (full rows, with `rank` on views),
            `update` (`key` plus the fields that changed), `leave` (keys), and
            `order` on views when rows you hold changed place. Apply: remove
            `leave`, apply `update`, insert `enter`, then `order`.
          x-parser-schema-id: <anonymous-schema-103>
        title: Delta
        description: >-
          Each change of the view, at most one per `updatePeriod`: 1 credit per
          message.
        example: |-
          {
            "op": "event",
            "id": "vol-1h-sol",
            "channel": "screener",
            "data": {
              "type": "delta",
              "seq": 1,
              "prev": 0,
              "epoch": "mun6v2l5lbes",
              "enter": [
                {
                  "chain": "solana",
                  "address": "CBZq5ycLcr6mnYvjFTPuYSuhgS3ujsiTrT4sqatBpump",
                  "rank": 17,
                  "...": "..."
                }
              ],
              "update": [
                {
                  "key": "solana:DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
                  "priceUsd": 0.0000148,
                  "windows": {
                    "1h": {
                      "volumeUsd": 96402.1,
                      "txns": 790
                    }
                  }
                }
              ],
              "leave": [
                "solana:7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"
              ]
            },
            "asOf": 1790539767301,
            "cursor": "v1.amun6v2l5lbes.5.mfq3c4a1"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: delta
          - id: x-parser-message-name
            value: delta
    bindings: []
    extensions: *ref_0
sendOperations:
  - *ref_1
receiveOperations:
  - *ref_2
sendMessages:
  - *ref_3
  - *ref_4
  - *ref_5
receiveMessages:
  - *ref_6
extensions:
  - id: x-parser-unique-object-id
    value: screener
securitySchemes: []

````

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