全部文章
API 参考WebSocketPolymarket API迁移

Polymarket 替换了 RTDS:迁移到 PolyBolt

9 月 15 日,Polymarket 悄悄地把 RTDS 的参考价格功能变成了旧版。如果你在给机器人推送现货价格,有六件事同时改变了,包括价格来源和交易对代码格式,而且其中大多数会悄无声息地失效,而不是明确报错。

阅读约 10 分钟

改了什么,什么时候改的

2026 年 9 月 15 日,Polymarket 在 wss://ws-live-v2.polymarket.com/ws 上线了 PolyBolt,并将 RTDS 的参考价格功能列为旧版。crypto_prices、crypto_prices_chainlink 和 equity_prices 都映射到了新的频道。comments 主题目前仍留在 RTDS 上。

如果你的机器人依靠流式现货价格来做任何决定(在加密货币 Up/Down 市场上,大多数机器人都是如此),这就和你有关。六件事同时改变了,麻烦的是其中好几件会悄无声息地失效:你仍然保持连接,只是不再收到你以为自己在收的价格。

六项破坏性变更

RTDS(旧版)PolyBolt
URLwss://ws-live-data.polymarket.comwss://ws-live-v2.polymarket.com/ws
认证公开需要 CLOB API 凭证
心跳客户端每 5 秒发送 PING无需发送:服务器每 25 秒 ping 一次
订阅帧{action, subscriptions:[{topic,type,filters}]}{op, subscriptions:[{channel,filter}]}:filter 是一个对象,而不是字符串
加密货币价格来源Binance / ChainlinkPyth
交易对代码btcusdt、btc/usdbtcusd:小写,USD 而不是 USDT

最耗费你时间的两项

价格来源改成了 Pyth。你的参考价格现在来自一个与 9 月 14 日不同的预言机。如果你是根据 Binance 的报价跳动校准阈值的,请重新校准。而且交易对代码格式也变了:btcusdt 和 btc/usd 现在都是错的。错误的代码不会抛出异常;你只会得到一个永远不推送数据的订阅。

频道映射

RTDS 主题PolyBolt 频道过滤条件说明
crypto_pricesprice.crypto{"symbol":"btcusd"}来源 Binance → Pyth;USDT → USD
crypto_prices_chainlinkprice.crypto{"symbol":"btcusd"}来源 Chainlink → Pyth
crypto_prices_twap_sixtyprice.crypto.twap{"symbol":"btcusd","window_seconds":60}60 秒 Chainlink TWAP
crypto_prices_twap_thirty无—没有替代方案
equity_pricesprice.equity{"symbol":"aapl"}相同目录,小写

30 秒 TWAP 直接没了

crypto_prices_twap_thirty 在 PolyBolt 中没有对应项。这比看起来更重要:5 分钟加密货币市场在 8 月 7 日之后曾短暂按 30 秒 TWAP 结算,之后在 8 月 14 日改为 60 秒。如果你的技术栈中还有任何东西在使用 30 秒窗口,它没有迁移路径:你需要改用 60 秒频道,并重新校准模型。

建立连接

先在已打开的连接上认证,等待确认,然后再订阅。参考价格频道会拒绝未认证的订阅。

{
  "op": "auth",
  "rid": "a1",
  "auth": {
    "apiKey": "<api key>",
    "secret": "<api secret>",
    "passphrase": "<api passphrase>"
  }
}

这些凭证正是你为 CLOB 交易派生的那一套:key、secret 和 passphrase 三者一起。如果你从未创建过,端点指南介绍了 L1/L2 流程。

PolyBolt 提供而 RTDS 没有的三样东西

  • 每次订阅都有一个快照。每个订阅都会返回之前两分钟的价格,带有 snapshot: true,也可能为空。用它初始化本地状态,然后再应用实时更新。在 RTDS 下,一个不活跃的交易对只会给你一片沉默,你根本不知道自己是已连接还是只是处在两次跳动之间。
  • 连续的 seq 和一个 dropped 计数器。你终于可以检测到缺口了。RTDS 完全没有序号,所以漏掉的消息是看不见的。按频道跟踪 seq,把任何跳跃都视为重新同步的触发条件。
  • 类型化的关闭码,取代原始的 1006:4001 认证失败、4002 消费者过慢、4003 服务器排空、4008 违反策略。4002 意味着你读取 socket 的速度太慢:这是消费者的 bug,不是网络问题,重连解决不了。

用 full_accuracy_value,不要用 value

value 是浮点数;full_accuracy_value 是精确的十进制字符串。在一个按 TWAP 比较结算的市场上,你不会希望由小数点后第八位的浮点舍入来决定一笔交易。另外:旧版 TWAP 帧使用 window_s 和 E18 定点数价格。PolyBolt 发送的是十进制字符串,不要应用 E18 转换,否则你的价格会差十八个数量级。

连接限制

RTDS 没有公布任何限制。PolyBolt 公布了,违反其中任何一项都会以 4008 关闭 socket:

限制值
每个连接的订阅数64
每秒订阅帧数20
最大帧大小64 KB
认证帧数8

64 个订阅是需要提前规划的那一项。如果你跟踪 BTC、ETH 和 SOL 的现货和 TWAP,那是六个,对加密货币机器人来说余量充足;但一个铺开订阅整个股票目录的系统就会撞上这个上限。

按顺序迁移一个机器人

  1. 派生 CLOB API 凭证(如果你还没有的话)。RTDS 是公开的,PolyBolt 不是。这一步会卡住其他所有步骤。
  2. 把 URL 改为 wss://ws-live-v2.polymarket.com/ws。
  3. 删除你的客户端心跳。每 5 秒一次的 PING 循环不仅没有必要,现在还成了噪音。服务器每 25 秒 ping 你一次。
  4. 重写订阅帧:action → op,topic → channel,filter 变成 JSON 对象而不是字符串。
  5. 修正每一个交易对代码:btcusdt 和 btc/usd 都变成 btcusd。小写,USD。
  6. 处理快照帧,不要把两分钟的回补数据当成实时跳动。
  7. 加入 seq 缺口检测,出现跳跃时重新同步。
  8. 重新校准任何根据 Binance 价格调优的东西。现在的来源是 Pyth。

如果你使用 TypeScript SDK

@polymarket/client 0.11.0 及更高版本封装了这些:在已认证的 SecureClient 上调用 client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }]),然后迭代带有 subscribe 和 update 类型的类型化事件。它会为你处理认证、帧和心跳。更完整的迁移情况见 SDK 指南。

这次没有改变的东西

值得说得精确一些,因为很容易迁移过头。CLOB 的 market 和 user 频道没有变化。wss://ws-subscriptions-clob.polymarket.com/ws/market 仍然推送订单簿和价格更新,仍然要求客户端每 10 秒发送一次 PING,best_bid_ask、new_market 和 market_resolved 也仍然需要通过 custom_feature_enabled 才能启用。只有参考价格迁移了。详见 WebSocket 指南。

更深层的局限也没有改变:数据流只能给你从连接那一刻起的价格。它无法告诉你上周二订单簿是什么样子。Polymarket 对已结算市场的订单簿返回 404,价格历史只保留大约每分钟一个点,这就是为什么回测需要一个在市场运行期间记录的存档。参阅 Up/Down 市场如何运作,或在市场查询中查找某个具体市场。

常见问题

PolyBolt 是什么?它什么时候取代了 RTDS?
PolyBolt 是 Polymarket 用于加密货币、股票和 TWAP 参考价格的 WebSocket,于 2026 年 9 月 15 日在 wss://ws-live-v2.polymarket.com/ws 上线。它使 RTDS 的参考价格功能成为旧版:crypto_prices、crypto_prices_chainlink 和 equity_prices 都映射到了新的 PolyBolt 频道。comments 主题目前仍留在 RTDS 上。
PolyBolt 需要认证吗?
需要。参考价格频道需要 CLOB API 凭证(key、secret 和 passphrase),在订阅之前以认证帧的形式在已打开的连接上发送。这是与公开的 RTDS 在操作上的主要区别。在发送订阅帧之前,先等待服务器确认认证。
crypto_prices_chainlink 被什么取代了?
被带有过滤条件 {"symbol":"btcusd"} 的 price.crypto 频道取代。除了名称之外还有两处变化:来源从 Chainlink 改为 Pyth,交易对代码格式从 btc/usd 改为小写的 btcusd。对于 60 秒 Chainlink TWAP,使用 price.crypto.twap 并将 window_seconds 设为 60。30 秒 TWAP 主题在 PolyBolt 中没有替代。
PolyBolt 还需要客户端 PING 吗?
不需要。在 RTDS 下,客户端每 5 秒发送一次文本 PING。在 PolyBolt 上,服务器每 25 秒 ping 一次,客户端什么都不用发送,不过也接受可选的 {"op":"ping"}。注意这与 CLOB market 频道不同,后者没有变化,仍然要求客户端每 10 秒发送一次 PING。
为什么我连上了 PolyBolt 却收不到任何价格?
几乎总是交易对代码格式的问题。PolyBolt 使用以 usd 结尾的小写代码,所以 btcusdt 和 btc/usd 都无效,要用 btcusd。错误的代码不会报错;订阅只是永远不推送数据。还要检查在发送订阅帧之前认证是否已确认,以及你是否把初始的快照帧当成了唯一的数据。
PolyBolt 的关闭码是什么意思?
4001 是认证失败,4002 表示你是慢速消费者、读取 socket 的速度不够快,4003 表示服务器正在排空,4008 是违反策略,比如超过 64 个订阅、每秒 20 个订阅帧、64 KB 的帧大小或 8 个认证帧。4002 是你的消费者的 bug 而不是网络故障,所以不解决吞吐量问题就重连只会重复出现。

获取 Polymarket 不保留的历史数据

PolyTest 在 Polymarket 加密货币 Up/Down 市场运行期间实时记录:240M+ 条快照,包含 8 档订单簿深度、亚秒级时间戳,并保留已结算的市场。从 3 天免费试用开始。

继续阅读