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

# Pulse Pools Stream

> A live launchpad column with one row per pool: the full list on subscribe, then every pool that enters, changes or leaves, as it happens. Same parameters, filters and messages as the Pulse Stream.

`WS channel: pulse-pools`

Enabled on your key on request: contact us.

A live launchpad column with one row per pool: the full list on subscribe, then every pool that enters, changes or leaves, as it happens. Same parameters, filters and messages as the [Pulse Stream](/streams/pulse-stream), which gives one row per token.

Use it when the pool is what you track: a pool-level terminal, liquidity tooling, or a view where the same token can appear once per pool.

## What differs from the Pulse Stream

| | `pulse` | `pulse-pools` |
| - | - | - |
| One row | per token | per pool |
| Row `key` | `<chain>:<token address>` | `<chain>:<pool address>` |
| `pool` | the pool displayed for the token | the pool of the row |
| `pools` | every known pool of the token | not present |
| Counters and windows (`txns`, `volumeUsd`, `windows`…) | of the token | of the pool |
| Wallet counts per window (`windows.<w>.uniqueBuyers`, `uniqueSellers`, `traders`, `snipers`, `proTraders`) | across the token's pools | of the pool |
| Holders (`holdersCount`, `top10HoldersPct`, `devHoldingsPct`) | of the token | of the token: every pool row of a token carries the same `holdersCount` and `top10HoldersPct`; `devHoldingsPct` is the share of the row's own `creator.address` (`null` on a pool whose creator is not the token's) |

Everything else is identical: the columns (`new`, `bonding`, `graduated`), mixing chains, `limit`, `sortBy`, `sortOrder`, `updatePeriod`, `windows`, the filter tree and the flat REST filters, the `snapshot` then `delta` delivery, `rank` and `order`, the free `snapshot` every 60 s, `since`, errors and close codes. The [Pulse Stream](/streams/pulse-stream) page is the reference for each of them.

## Parameters

<ParamField body="model" type="string" required>
  The column: `new`, `bonding` or `graduated` (`migrated` is accepted as an alias of `graduated`). Example: `bonding`
</ParamField>

<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. Example: `["evm:8453"]`
</ParamField>

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

<ParamField body="sortBy" type="string">
  Any numeric card field. Default: the date of the column, most recent first (`bondingProgress` on `bonding`).
</ParamField>

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

<ParamField body="filters" type="object">
  A filter tree, same grammar and same fields as the [Pulse Stream](/streams/pulse-stream#filters).
</ParamField>

<ParamField body="updatePeriod" type="integer">
  Milliseconds, 0 to 60000, default `100`: at most one `delta` per period. Same rules as the [Pulse Stream](/streams/pulse-stream#parameters); the ack carries the value applied.
</ParamField>

<ParamField body="windows" type="string[]">
  The rolling windows to include in each row, among `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `6h`, `12h`, `24h`. Default: none. Same rules as the [Pulse Stream](/streams/pulse-stream#parameters).
</ParamField>

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

## 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. The connection is free. A longer `updatePeriod` means fewer messages, and fewer credits.

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

<RequestExample>
  ```json Subscribe theme={null}
  {
    "op": "subscribe",
    "channel": "pulse-pools",
    "id": "bonding-base",
    "params": {
      "model": "bonding",
      "chains": ["evm:8453"],
      "limit": 25,
      "sortBy": "bondingProgress",
      "sortOrder": "desc",
      "filters": {
        "liquidityUsd": { "gte": 5000 }
      }
    }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json Ack theme={null}
  {
    "op": "subscribed",
    "id": "bonding-base",
    "channel": "pulse-pools",
    "updatePeriod": 100
  }
  ```

  ```json Snapshot theme={null}
  {
    "op": "event",
    "id": "bonding-base",
    "channel": "pulse-pools",
    "data": {
      "type": "snapshot",
      "seq": 0,
      "epoch": "mun6v2l5lbes",
      "rows": [
        {
          "chain": "evm:8453",
          "address": "0x6d15ea268ec2345455c087465bd336adffffca26",
          "symbol": "CHIANG",
          "pool": {
            "address": "0x9a1f2c6e0b4d48f0a3b7c5d2e8f1a6b4c3d2e1f0",
            "type": "VIRTUALS",
            "factory": "virtuals",
            "quoteAddress": "0x0b3e328455c4059eeb9e3f84b5543f74e24e7e1b",
            "quoteSymbol": "VIRTUAL"
          },
          "bondingProgress": 71.2,
          "migrated": false,
          "liquidityUsd": 18420.5,
          "holdersCount": 412,
          "top10HoldersPct": 38.6,
          "devHoldingsPct": 2.1,
          "…": "…"
        }
      ]
    },
    "asOf": 1790539767146,
    "cursor": "v1.amun6v2l5lbes.3.mfq3c2y2"
  }
  ```

  ```json Delta theme={null}
  {
    "op": "event",
    "id": "bonding-base",
    "channel": "pulse-pools",
    "data": {
      "type": "delta",
      "seq": 1,
      "prev": 0,
      "epoch": "mun6v2l5lbes",
      "enter": [],
      "update": [
        { "key": "evm:8453:0x9a1f2c6e0b4d48f0a3b7c5d2e8f1a6b4c3d2e1f0", "bondingProgress": 72.9, "liquidityUsd": 18910.1, "txns": 412, "holdersCount": 415 }
      ],
      "leave": [],
      "order": ["evm:8453:0x9a1f2c6e0b4d48f0a3b7c5d2e8f1a6b4c3d2e1f0", "evm:8453:0x3c5d7e9f1a2b4c6d8e0f1a3b5c7d9e1f2a4b6c8d"]
    },
    "asOf": 1790539768020,
    "cursor": "v1.amun6v2l5lbes.8.mfq3c5k7"
  }
  ```
</ResponseExample>


## AsyncAPI

````yaml asyncapi.json pulse-pools
id: pulse-pools
title: Pulse Pools Stream
description: >-
  The same launchpad column with one row per pool: row `key` is `<chain>:<pool
  address>`, counters and windows are the pool's. Same parameters, filters and
  messages as `pulse`. Enabled on your key on request.
servers:
  - id: production
    protocol: wss
    host: ws.serialized.xyz
    bindings: []
    variables: []
address: pulse-pools
parameters: []
bindings: []
operations:
  - &ref_2
    id: subscribe-pulse-pools
    title: Subscribe Pulse Pools 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: pulse-pools
                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: model
                    type: string
                    description: >-
                      The launchpad column; `migrated` is accepted as an alias
                      of `graduated`.
                    enumValues:
                      - new
                      - bonding
                      - graduated
                    required: true
                  - 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: >-
                      Any numeric card field (`marketCapUsd`, `volumeUsd`,
                      `bondingProgress`, `windows.1h.volumeUsd`, …). Default:
                      the date of the column, most recent first
                      (`bondingProgress` on `bonding`).
                    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-67>
            channel:
              type: string
              const: pulse-pools
              x-parser-schema-id: <anonymous-schema-68>
            id:
              type: string
              description: >-
                Client-chosen subscription id, echoed on every frame of this
                subscription.
              x-parser-schema-id: <anonymous-schema-69>
            params:
              type: object
              properties:
                model:
                  type: string
                  enum:
                    - new
                    - bonding
                    - graduated
                  description: >-
                    The launchpad column; `migrated` is accepted as an alias of
                    `graduated`.
                  x-parser-schema-id: <anonymous-schema-71>
                chains:
                  type: array
                  minItems: 1
                  maxItems: 8
                  items:
                    type: string
                    x-parser-schema-id: <anonymous-schema-73>
                  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-72>
                limit:
                  type: integer
                  minimum: 1
                  maximum: 100
                  default: 50
                  description: View size.
                  x-parser-schema-id: <anonymous-schema-74>
                sortBy:
                  type: string
                  description: >-
                    Any numeric card field (`marketCapUsd`, `volumeUsd`,
                    `bondingProgress`, `windows.1h.volumeUsd`, …). Default: the
                    date of the column, most recent first (`bondingProgress` on
                    `bonding`).
                  x-parser-schema-id: <anonymous-schema-75>
                sortOrder:
                  type: string
                  enum:
                    - asc
                    - desc
                  default: desc
                  x-parser-schema-id: <anonymous-schema-76>
                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-77>
                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-78>
                windows:
                  type: array
                  items:
                    type: string
                    enum:
                      - 1m
                      - 5m
                      - 15m
                      - 30m
                      - 1h
                      - 4h
                      - 6h
                      - 12h
                      - 24h
                    x-parser-schema-id: <anonymous-schema-80>
                  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-79>
              required:
                - model
                - chains
              x-parser-schema-id: <anonymous-schema-70>
            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-81>
          required:
            - op
            - channel
            - id
            - params
          x-parser-schema-id: <anonymous-schema-66>
        title: Subscribe
        description: Client frame opening the subscription (additive, ack is explicit).
        example: |-
          {
            "op": "subscribe",
            "channel": "pulse-pools",
            "id": "bonding-base",
            "params": {
              "model": "bonding",
              "chains": [
                "evm:8453"
              ],
              "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: pulse-pools
  - &ref_1
    id: receive-pulse-pools
    title: Pulse Pools 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-82>
        title: Ack
        description: 'Server acknowledgement: the subscription is live.'
        example: |-
          {
            "op": "subscribed",
            "id": "bonding-base",
            "channel": "pulse-pools",
            "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-83>
        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": "bonding-base",
            "channel": "pulse-pools",
            "data": {
              "type": "snapshot",
              "seq": 0,
              "epoch": "mun6v2l5lbes",
              "rows": [
                {
                  "chain": "evm:8453",
                  "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
                }
              ]
            },
            "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-84>
        title: Delta
        description: >-
          Each change of the view, at most one per `updatePeriod`: 1 credit per
          message.
        example: |-
          {
            "op": "event",
            "id": "bonding-base",
            "channel": "pulse-pools",
            "data": {
              "type": "delta",
              "seq": 1,
              "prev": 0,
              "epoch": "mun6v2l5lbes",
              "enter": [
                {
                  "chain": "solana",
                  "address": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
                  "rank": 0,
                  "...": "..."
                }
              ],
              "update": [
                {
                  "key": "solana:CBZq5ycLcr6mnYvjFTPuYSuhgS3ujsiTrT4sqatBpump",
                  "txns": 13,
                  "buys": 10,
                  "priceUsd": 0.0000049,
                  "marketCapUsd": 4912.8
                }
              ],
              "leave": []
            },
            "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: pulse-pools
securitySchemes: []

````

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