---
title: "Callout events"
canonical_url: "https://tweetstream.io/docs/callouts"
last_updated: 2026-09-24
---

# Callout events

Follow pump.fun callouts, author updates, replies, and reposts on your WebSocket. Render initial content, then merge optional enrichment.

Canonical URL: https://tweetstream.io/docs/callouts

## Select callout accounts

In the Callouts tab, add a pump.fun username, Solana wallet, or profile URL. Labels are optional.

- Use a Solana wallet for the account, regardless of the token's chain.
- Minimum: 10 accounts. Pro, Scale, and Ultra Speed: 100. Pending additions count toward the limit.

## account/callout

Show content immediately. `d.platform` is `pump_fun`; caller username and token address are required.

Optional `d.token.chainId` uses CAIP-2: `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` for Solana mainnet; `eip155:56`, `eip155:999`, `eip155:4663`, or `eip155:8453` for EVM chains. When absent, the chain is unspecified.

Text, media, positions, and token/price details are optional. Optional images: `d.caller.image` (avatar), `d.token.image` (token artwork).

- Optional `d.kind`: `callout`, `author_update`, `reply`, or `repost`. Author updates are new posts, not enrichment.
- `d.caller` is the tracked actor. `d.reference` holds the original author, text, and media; `d.reference.reply` holds a reposted reply and its author, not the reposter.
- `replyId` identifies a reply or author update. Optional `parentReplyId` and `rootReplyId` link the thread; `calloutId` identifies the original callout.
- Exact decimal prices: `calloutPrice` / `maxPriceSol` (SOL), `calloutPriceUsd` / `maxPriceUsd` (USD). Keep strings or use a decimal library. USD prices do not imply SOL prices.
- `marketCapUsd` and `multiple` are optional numbers. Position values are exact decimal strings: `amountHeld` is a token amount, `pnlPercentage` a percentage, and `*Usd` fields USD amounts.

### Callout event type

```typescript
type CalloutCaller = {
  username: string;
  image?: string;
};

type CalloutReply = {
  caller: CalloutCaller;
  replyId: string;
  parentReplyId?: string;
  rootReplyId?: string;
  text?: string;
  mediaUrl?: string;
};

type CalloutEvent = {
  platform: 'pump_fun';
  caller: CalloutCaller;
  kind?: 'callout' | 'author_update' | 'reply' | 'repost';
  text?: string;
  mediaUrl?: string;
  // Required for replies and author updates.
  replyId?: string;
  parentReplyId?: string;
  rootReplyId?: string;
  reference?: {
    caller: CalloutCaller;
    text?: string;
    mediaUrl?: string;
    reply?: CalloutReply;
  };
  position?: {
    amountHeld?: string;
    valueUsd?: string;
    costBasisUsd?: string;
    pnlUsd?: string;
    pnlPercentage?: string;
    realizedPnlUsd?: string;
  };
  token: {
    address: string;
    chainId?: string;
    symbol?: string;
    name?: string;
    image?: string;
  };
  url?: string;
  marketCapUsd?: number;
  // SOL, exact decimal.
  calloutPrice?: string;
  // USD, exact decimal.
  calloutPriceUsd?: string;
  multiple?: number;
  // SOL peak, exact decimal.
  maxPriceSol?: string;
  // USD peak, exact decimal.
  maxPriceUsd?: string;
  calloutId: string;
  createdAt: number;
  receivedAt?: number;
};

type CalloutUpdateEvent = CalloutEvent & {
  // Original envelope id, not calloutId.
  updateOf: string;
};
```

### Callout event

```json
{
  "v": 1,
  "t": "account",
  "op": "callout",
  "id": "callout.0123456789abcdef0123",
  "ts": 1772000001060,
  "d": {
    "platform": "pump_fun",
    "caller": {
      "username": "CryptoCalls",
      "image": "https://cdn.example/avatar.png"
    },
    "kind": "callout",
    "text": "Watching this token.",
    "mediaUrl": "https://cdn.example/chart.png",
    "token": {
      "address": "So11111111111111111111111111111111111111112",
      "chainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
    },
    "url": "https://pump.fun/callouts/So11111111111111111111111111111111111111112/9ab3177c-7b35-4d99-9cca-8b426f74a270",
    "marketCapUsd": 156230.75,
    "calloutPriceUsd": "0.00018750",
    "multiple": 2.5,
    "calloutId": "9ab3177c-7b35-4d99-9cca-8b426f74a270",
    "createdAt": 1772000001000,
    "receivedAt": 1772000001050
  }
}
```

### Repost of another author's reply

```json
{
  "v": 1,
  "t": "account",
  "op": "callout",
  "id": "callout.repost-example",
  "ts": 1772000003060,
  "d": {
    "platform": "pump_fun",
    "kind": "repost",
    "caller": { "username": "MarketReader" },
    "token": { "address": "So11111111111111111111111111111111111111112" },
    "calloutId": "9ab3177c-7b35-4d99-9cca-8b426f74a270",
    "createdAt": 1772000003000,
    "reference": {
      "caller": { "username": "CryptoCalls" },
      "text": "Watching this token.",
      "reply": {
        "caller": { "username": "ReplyAuthor" },
        "replyId": "reply-example",
        "text": "Watching the volume too."
      }
    }
  }
}
```

## account/callout_update

Merge optional details into the original event. Do not send another alert.

- Deduplicate by this envelope's `id`. `d.updateOf` points to the original envelope `id`, not `calloutId`.
- Merge supplied fields, including nested `caller`, `token`, `position`, and `reference` fields. Omitted fields do not erase earlier values.
- If the original is missing, store or ignore the update; do not treat it as a new callout.
- Updates are optional. Show initial content even if no update arrives.

### Callout enrichment

```json
{
  "v": 1,
  "t": "account",
  "op": "callout_update",
  "id": "callout_update.556abf0021a7ff937a1a804ec0a0c245d497bcc6090af66179e74ce03c0970e0",
  "ts": 1772000002060,
  "d": {
    "platform": "pump_fun",
    "updateOf": "callout.0123456789abcdef0123",
    "caller": { "username": "CryptoCalls" },
    "kind": "callout",
    "token": {
      "address": "So11111111111111111111111111111111111111112",
      "symbol": "ABC",
      "name": "Alpha Beta",
      "image": "https://cdn.example/token.png"
    },
    "calloutPriceUsd": "0.00018750",
    "calloutPrice": "0.00000125",
    "maxPriceSol": "0.00000450",
    "maxPriceUsd": "0.00067500",
    "calloutId": "9ab3177c-7b35-4d99-9cca-8b426f74a270",
    "createdAt": 1772000001000
  }
}
```

## Use identifiers and timestamps

Deduplicate by envelope `id`. Replies and reposts share the original `calloutId`, not the envelope ID.

- `d.createdAt`: occurrence creation time.
- `d.receivedAt`: optional TweetStream receipt time.
- Envelope `ts`: preparation time.
