接入指南

pumpapi 信号流

pumpapi 的 WebSocket 实时推送 pump.fun 信号与行情——埋伏、毕业、巨鲸动向、成交与 K 线——检测完成后毫秒级送达。 没有匿名或免费层 ——每个连接都必须持有由有效付费订阅支撑的 API key。

接入点 wss://pumpws.bubudev.win/connection/websocket · 鉴权 必需——在 connect 请求中传入 data.apikey · 协议 Centrifugo (WebSocket, RFC 6455)

快速上手

不到 10 行代码即可连接并收到事件 (npm i centrifuge):

JavaScript
import { Centrifuge } from "centrifuge";

const client = new Centrifuge("wss://pumpws.bubudev.win/connection/websocket", {
  data: { apikey: "<YOUR_PUMP_API_KEY>" }, // pump_… from the dashboard
});

client.connect();
client.subscribe("marketdata", ({ data }) => {
  console.log(data.kind, data.mint, data.payload);
});

不想用 SDK?直接说原始协议——例如用 websocat:

原始 WebSocket JSON
websocat "wss://pumpws.bubudev.win/connection/websocket?format=json"
# then send (one JSON frame per line):
{"id":1,"connect":{"data":{"apikey":"pump_…"}}}
{"id":2,"subscribe":{"channel":"marketdata"}}

鉴权

  1. 打开控制台,登录、选套餐并按支付——你会拿到一个一次性 SOL 收款地址(24 小时有效)。
  2. 按精确金额支付(0.5 / 1.5 / 4 SOL)。监控程序约 30 秒内完成链上确认并签发你的 key。
  3. key 会出现在控制台的 Centrifugo API key 一栏——连接时作为 data.apikey 传入(参考上面的代码)。
校验在服务端完成:匿名连接一律拒绝,每次订阅都会复查你的订阅状态。周付 key 只能拿到 signals——行情需要月付及以上。订阅过期(超过 24 小时宽限)后,服务端会自动断开在线会话。请像对待密码一样对待这个 key;金额不对的付款只会被记录,不会入账。续费和兑换券都不会更换 key——如果 key 泄露,在控制台使用「轮换 key」:旧 key 立即失效、在线会话被断开,而你签发过的每个 key 都会保留在 key 历史里。

通道

通道内容档位
signals全部信号:埋伏、毕业、迁移、巨鲸动向、里程碑任意档位
signals:mint:<mint>单个代币 mint(base58)的信号任意档位
marketdata成交、迁移、实时/收盘 K 线月付及以上
marketdata:mint:<mint>单个代币的行情数据月付及以上

任意档位 = 周付、月付或季付——没有订阅就没有访问。 订阅整条消防栓,或用 :mint:<mint> 通道只接收单个代币。

消息信封

每条发布都是一个带版本号的 JSON 信封。 payload 原样携带信号元数据——每种 kind 的完整示例见下。

信封 v1
{
  "v": 1,                    // envelope schema version
  "id": "0f5c9a3e-…",        // unique id — dedupe / trace across consumers
  "kind": "arm",             // signal type — switch on this
  "ts": 1756915200000,       // event time (ms since epoch)
  "wallTs": 1756915200123,   // server receive time (ms)
  "mint": "5hBz…",           // token mint address (when known)
  "payload": { … }           // full signal metadata — see examples below
}

Payload · marketdata

marketdata 通道发布以下 3 种类型。 成交、迁移与 K 线——月付及以上。所有金额以 SOL 计价。 没有值的字段会被省略——代码要能容忍 undefined

market.trade

消防栓里的每笔 pump 与 pump-amm 成交,附带池子与定价上下文。K 线就是由这份原始数据合成。

事件示例
{
  "v": 1,
  "id": "8b9c0d1e-2f3a-4b5c-6d7e-8f9a0b1c2d3e",
  "kind": "market.trade",
  "ts": 1756915700000,       // trade time (payload.timestamp) or server time
  "wallTs": 1756915700123,
  "mint": "5hBzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvW",
  "payload": {
    "kind": "market.trade",
    "mint": "5hBzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvW",
    "symbol": "BUBU",
    "action": "buy",         // "buy" | "sell"
    "marketCapQuote": 142.6, // market cap in QUOTE-TOKEN units — SOL while the
                             // quote is WSOL; USDC/USDT/USD1/stock pairs report
                             // raw quote units (#321). The OHLC basis for candles.
    "quoteAmount": 3.2,      // this trade's volume in quote-token units (absolute)
    "timestamp": 1756915700000, // trade time (ms)
    "pool": "6Pq8mYcVdRnZ2wXjKfTgH4sLbAeNu7QrYcUvWxZ1p2o", // AMM pool address (post-migration)
    "poolCreatedBy": "Gk2mNvBx7QrYcUdAeBsFgHjKlMnOpQrStUvWz3", // pool creator pubkey
    "signature": "5XyzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvWz", // tx signature — dedupe key
    "txSigner": "Gk2mNvBx7QrYcUdAeBsFgHjKlMnOpQrStUvWz3", // tx signer pubkey
    "mayhemMode": false,     // pump.fun mayhem-mode flag on the trade
    "price": 0.00000021,     // trade price
    "tokenAmount": 15200000, // token amount moved in this trade
    "tokensInPool": 793400000, // token side of pool reserves
    "quoteInPool": 167.1,    // quote side of pool reserves (quote-token units)
    "vTokensInBondingCurve": 0, // virtual tokens on the curve (pre-migration only)
    "uri": "https://ipfs.io/ipfs/QmTokenMetadata7xK9",
    "breakdown": [           // sub-legs when one tx bundles multiple fills
      { "action": "buy", "trader": "Gk2m…", "tokenAmount": 10000000, "quoteAmount": 2.1 },
      { "action": "buy", "trader": "Gk2m…", "tokenAmount": 5200000,  "quoteAmount": 1.1 }
    ]
  }
}

market.migrate

行情通道的迁移事件——标记曲线→AMM 的切换,并给出发生时的市值。

事件示例
{
  "v": 1,
  "id": "9c0d1e2f-3a4b-5c6d-7e8f-9a0b1c2d3e4f",
  "kind": "market.migrate",
  "ts": 1756915750000,
  "wallTs": 1756915750123,
  "mint": "5hBzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvW",
  "payload": {
    "kind": "market.migrate",
    "mint": "5hBzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvW",
    "symbol": "BUBU",
    "timestamp": 1756915750000, // migration time (ms)
    "marketCapQuote": 168.4,    // market cap in quote-token units at migration
    "mayhemMode": false
  }
}

market.candle.live / market.candle.closed

由成交流聚合的 4 个周期 OHLCV K 线。`live` 在每次 tick 重发进行中的桶;`closed` 在桶结束时发一次。所有价格均为以 SOL 计的市值。

事件示例
{
  "v": 1,
  "id": "0d1e2f3a-4b5c-6d7e-8f9a-0b1c2d3e4f5a",
  "kind": "market.candle.closed", // "market.candle.live" | "market.candle.closed"
  "ts": 1756915680000,            // = payload.tsOpen (bucket start), NOT wall time
  "wallTs": 1756915740123,
  "mint": "5hBzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvW",
  "payload": {
    "kind": "market.candle.closed",
    "mint": "5hBzKpR3vNqXw7TjLmYc8UdAeBsFgHjKlMnOpQrStUvW",
    "symbol": "BUBU",
    "tf": "1m",            // "1m" | "5m" | "15m" | "1h"
    "open": 140.2,         // bucket-open market cap (quote-token units)
    "high": 152.8,         // max market cap (quote-token units) in bucket
    "low": 138.9,          // min market cap (quote-token units) in bucket
    "close": 149.1,        // latest market cap (quote-token units) in bucket
    "vSol": 22.4,          // volume in quote-token units inside the bucket
    "trades": 61,          // trade count
    "buys": 40,            // buy count
    "sells": 21,           // sell count
    "tsOpen": 1756915680000,  // epoch-aligned bucket start (ms)
    "tsClose": 1756915740000  // bucket end (ms) = tsOpen + tf
  }
}

订阅生命周期

  • 开通 付款链上确认(每 30 秒轮询)后自动生效。
  • 宽限 过期后仍可继续接收 24 小时,等待续费到账。
  • 续费 新档位从当前到期日顺延;一天不浪费。
  • 限速 每个 IP 每秒最多 10 个新连接;复用一条连接、订阅多个通道即可。

常见问题

打错了金额?
付款必须与档位价格在 0.001 SOL 误差内一致。金额不对只记录、不入账——重新生成地址并按精确金额支付。
连接被拒绝,报 4004
订阅已过期且超过 24 小时宽限期。到控制台续费即可——同一个 key 会重新可用。
可以在客户端按类型过滤吗?
可以——按 envelope.kind分支处理即可。未来可能新增类型,遇到不认识的 value 请忽略而不是抛错。
测试用的 devnet SOL?
faucet.solana.com (选择 Devnet)或用 solana airdrop 5 <WALLET> --url devnet.