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

# Call Stream

> Live WebSocket stream of the curated CabalSpy calls (Gambles, Moderate Gamble, Good Token, Big Token, Whales) the moment they are posted.

Our curated calls, live. Every call that goes to the CabalSpy Discord arrives on this stream at the same moment, with the token, the market cap at the call, the wallets that triggered it and trading links.

Calls follow fixed rules per tier, so you do not configure thresholds, you only pick chains and tiers. If you want your own cluster rules, use the [Signal Stream](https://docs.cabalspy.xyz/signal.md). For past calls and their performance, use [Calls](https://docs.cabalspy.xyz/calls.md) and [Call Stats](https://docs.cabalspy.xyz/calls-stats.md).

## Endpoint

Connect to `wss://stream.cabalspy.xyz`.

```javascript JavaScript theme={null}
const ws = new WebSocket("wss://stream.cabalspy.xyz?apiKey=YOUR_KEY");

ws.onopen = () => {
  ws.send(JSON.stringify({ op: "subscribe", channel: "call.solana", tiers: ["good", "moderate"] }));
};

ws.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  if (msg.event === "call") {
    const c = msg.data;
    console.log(c.tier_label, c.token.symbol, "MC", c.market_cap_at_call, c.links.terminal);
  }
};
```

```python Python theme={null}
import json, websocket

def on_open(ws):
    ws.send(json.dumps({"op": "subscribe", "channel": "call.*"}))

def on_message(ws, message):
    msg = json.loads(message)
    if msg.get("event") == "call":
        c = msg["data"]
        print(c["blockchain"], c["tier_label"], c["token"]["symbol"], c["market_cap_at_call"])

ws = websocket.WebSocketApp(
    "wss://stream.cabalspy.xyz?apiKey=YOUR_KEY",
    on_open=on_open, on_message=on_message,
)
ws.run_forever()
```

## Authentication

Provide your API key as a query parameter, wss\://stream.cabalspy.xyz?apiKey=YOUR\_KEY, or as a header, Authorization: Bearer YOUR\_KEY. Invalid keys are closed with code 1008. With the public demo key, calls arrive 15 minutes late.

## Chains and tiers

| tier | Label | Chains |
| - | - | - |
| gamble | Gambles | solana, bnb, eth, rh |
| moderate | Moderate Gamble | solana, bnb, eth, rh |
| good | Good Token | solana, bnb, eth, rh |
| big | Big Token | solana |
| whale | Whales Call | solana |

## Subscribe

Send a subscribe message after the connection opens. The channel is call. followed by a chain, or call.\* for every chain. tiers is optional, without it you get every tier.

```json One chain, two tiers theme={null}
{ "op": "subscribe", "channel": "call.solana", "tiers": ["good", "moderate"] }
```

```json Every chain, every tier theme={null}
{ "op": "subscribe", "channel": "call.*" }
```

```json The same with separate fields theme={null}
{ "op": "subscribe", "stream": "call", "blockchain": "bnb", "tiers": ["gamble"] }
```

**op** `string` *required*

subscribe, unsubscribe or subscriptions.

**channel** `string`

call.solana, call.bnb, call.eth, call.rh or call.\*. Alternatively send stream call with a blockchain field.

**tiers** `array`

Any of gamble, moderate, good, big, whale. Omit for every tier.

One subscription per channel: subscribing to the same channel again replaces its tiers. The reply confirms the channel and the tiers it parsed.

```json Reply theme={null}
{ "success": true, "type": "subscribed", "stream": "call", "channel": "call.solana", "tiers": ["good", "moderate"] }
```

## Unsubscribe and other operations

```json Unsubscribe theme={null}
{ "op": "unsubscribe", "channel": "call.solana" }
```

```json List your call subscriptions theme={null}
{ "op": "subscriptions", "stream": "call" }
```

The call stream runs next to every other stream on the same connection, so you can combine it with tx, count or signal subscriptions.

## Event

Each call delivers a call event. The data object is the same call object that [Calls](https://docs.cabalspy.xyz/calls.md) returns, without the performance block, because performance is only known 24 hours later.

**event** `string`

call.

**channel** `string`

call. followed by the chain of the call, for example call.solana.

**data** `object`

**data**

**call\_id** `string`

Stable id of the call. Look it up later in Calls to see its performance.

**blockchain** `string`

solana, bnb, eth or rh.

**tier** `string`

gamble, moderate, good, big or whale.

**tier\_label** `string`

The tier as shown in Discord.

**called\_at** `string`

When the call was made, ISO 8601 UTC.

**token** `object`

mint, symbol, name and logo.

**market\_cap\_at\_call** `number`

Market cap in USD at the time of the call.

**trigger** `object`

kol\_count, smart\_count, native\_symbol, total\_native and wallets. Each wallet has address, type (kol or smart), name, amount\_native and bought\_at. Big Token calls carry counts only, without wallets.

**links** `object`

Trading and chart links for the token. Solana calls include terminal, the token page in the CabalSpy Terminal.

```json call theme={null}
{
  "success": true,
  "channel": "call.solana",
  "event": "call",
  "data": {
    "call_id": "c_0123456789ab",
    "blockchain": "solana",
    "tier": "gamble",
    "tier_label": "Gambles",
    "called_at": "2026-10-01T12:00:00Z",
    "token": {
      "mint": "ExampLeTokenMint1111111111111111111111pump",
      "symbol": "EXAMPLE",
      "name": "Example Token",
      "logo": "https://example.com/token-logo.webp"
    },
    "market_cap_at_call": 25000.0,
    "trigger": {
      "kol_count": 3,
      "smart_count": 1,
      "native_symbol": "SOL",
      "total_native": 12.5,
      "wallets": [
        {
          "address": "ExampLeKoLWa11et111111111111111111111111111",
          "type": "kol",
          "name": "Example KOL",
          "amount_native": 6.0,
          "bought_at": "2026-10-01T11:59:40Z"
        },
        {
          "address": "ExampLeSmartWa11et11111111111111111111111111",
          "type": "smart",
          "name": "",
          "amount_native": 3.5,
          "bought_at": "2026-10-01T12:00:00Z"
        }
      ]
    },
    "links": {
      "axiom": "https://axiom.trade/t/ExampLeTokenMint1111111111111111111111pump/@cabalspy1",
      "gmgn": "https://gmgn.ai/sol/token/ExampLeTokenMint1111111111111111111111pump",
      "dexscreener": "https://dexscreener.com/solana/ExampLeTokenMint1111111111111111111111pump",
      "terminal": "https://app.cabalspy.xyz/token/ExampLeTokenMint1111111111111111111111pump"
    }
  }
}
```

## Billing

Like signals, every delivered call deducts a fixed number of credits and is logged. Subscribing is free.

## Heartbeat

The server sends WebSocket pings and expects pong, which standard clients answer automatically. You can also send op ping at any time.


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