快速上手
不到 10 行代码即可连接并收到事件 (npm i centrifuge):
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:
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"}}鉴权
- 打开控制台,登录、选套餐并按支付——你会拿到一个一次性 SOL 收款地址(24 小时有效)。
- 按精确金额支付(0.5 / 1.5 / 4 SOL)。监控程序约 30 秒内完成链上确认并签发你的 key。
- 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 的完整示例见下。
{
"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.