跳到文档正文

喊单事件

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

打开 AsyncAPI 规范
在聊天中打开
按产品代码校对:2026年9月24日

选择喊单账号

在喊单标签页中使用 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
  }
}
{
  "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 字段。缺失字段不删除旧值。
  • 找不到原事件时,存储或忽略更新,不要把它当作新喊单。
  • 更新可选,即使没有更新也应展示初始内容。
{
  "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:准备发送的时间。