---
title: "喊单事件"
canonical_url: "https://tweetstream.io/zh-cn/docs/callouts"
last_updated: 2026-09-24
---

# 喊单事件

通过 WebSocket 接收 pump.fun 喊单、作者更新、回复和转发。先展示初始内容，再合并可选的补充数据。

Canonical URL: https://tweetstream.io/zh-cn/docs/callouts

## 选择喊单账号

在喊单标签页中使用 pump.fun 用户名、Solana 钱包或个人主页链接添加账号。标签可选。

- 账号使用 Solana 钱包，与代币所在链无关。
- Minimum：10 个账号。Pro、Scale 和 Ultra Speed：100 个。等待添加的账号也计入上限。

## account/callout

收到内容即可展示，不必等待补充数据。`d.platform` 为 `pump_fun`，喊单者用户名和代币地址必有。

可选的 `d.token.chainId` 使用 CAIP-2：Solana 主网为 `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`；EVM 链如 `eip155:56`、`eip155:999`、`eip155:4663` 或 `eip155:8453`。缺失时表示未指定链。

文本、媒体、头像、持仓、代币详情和价格均可选。`d.caller.image` 是账号头像，`d.token.image` 是代币图片。

- 可选的 `d.kind`：`callout`、`author_update`、`reply` 或 `repost`。作者更新是原作者的新帖子，不是元数据补充。
- `d.caller` 是被跟踪的行为发起者。`d.reference` 保留原作者、文本和媒体；`d.reference.reply` 保留被转发的回复及其作者。两者都不是转发者。
- `replyId` 标识回复或作者更新。可选的 `parentReplyId` 和 `rootReplyId` 保留回复关系；`calloutId` 标识原始喊单。
- 价格使用精确十进制字符串：`calloutPrice` 和 `maxPriceSol` 以 SOL 计价，`calloutPriceUsd` 和 `maxPriceUsd` 以 USD 计价。请保留字符串或使用十进制库。USD 价格存在不代表 SOL 价格也存在。
- `marketCapUsd` 和 `multiple` 是可选数值。持仓值使用精确十进制字符串：`amountHeld` 为代币数量，`pnlPercentage` 为百分比，`*Usd` 字段为 USD 金额。

### 喊单事件类型

```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;
};
```

### 喊单事件

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

### 转发其他作者的回复

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

将可选详情合并到原事件，不再触发提醒。

- 按本次信封的 `id` 去重。`d.updateOf` 指向原始信封 `id`，不是 `calloutId`。
- 仅合并本次提供的字段，包括嵌套的 `caller`、`token`、`position` 和 `reference` 字段。缺失字段不删除旧值。
- 找不到原事件时，存储或忽略更新，不要把它当作新喊单。
- 更新可选，即使没有更新也应展示初始内容。

### 喊单补充数据

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

## 使用标识符和时间戳

回复和转发有各自的信封 ID，但共享原始 `calloutId`。按信封 `id` 去重。

- `d.createdAt`：动态创建时间。
- `d.receivedAt`：可选的 TweetStream 接收时间。
- 信封 `ts`：准备发送的时间。
