NEW: Live arbitrage across 10+ prediction markets.Arbitrage →
← Index
APIOct 15, 2026

Polymarket RTDS to PolyBolt (2026): What Changed and How to Migrate

Polymarket RTDS to PolyBolt (2026): What Changed and How to Migrate

The Short Answer

PolyBolt is Polymarket's new WebSocket for crypto, equity and TWAP reference prices, at wss://ws-live-v2.polymarket.com/ws, and it replaces the price topics on the older RTDS socket at wss://ws-live-data.polymarket.com. Every price channel now needs CLOB API credentials, frames use op, channel and a filter object, crypto symbols become lowercase USD pairs such as btcusd, and each subscription opens with a two-minute snapshot. Binance prices map to Chainlink in USD, and the 30-second TWAP has no replacement. Trade activity stays on RTDS, and the TypeScript SDK's legacy price topics are planned for removal one month after version 0.11.0.

Key Takeaways

  • PolyBolt launched on 15 September 2026, and RTDS is now legacy for reference prices.
  • RTDS prices were public, while PolyBolt price channels need CLOB API credentials sent in an auth frame.
  • Five RTDS topics map to price.crypto, price.crypto.twap and price.equity, and the 30-second TWAP has no PolyBolt channel.
  • Every subscription starts with a snapshot of the last two minutes, plus a per-channel seq and a dropped counter.
  • A connection allows 64 subscriptions, and typed close codes tell you whether to reconnect, back off or fix a bug.

What was Polymarket RTDS?

RTDS, the Real-Time Data Socket, launched on 24 September 2025 at wss://ws-live-data.polymarket.com. It streamed crypto prices from Binance and Chainlink, comment events and trade activity, with no authentication, a text PING every 5 seconds and messages shaped as topic, type, timestamp and payload. By the time PolyBolt arrived, it also carried Chainlink TWAP and equity price topics.

On 15 September 2026, Polymarket made RTDS legacy for reference prices. In our checks on 3 October 2026, the old socket still accepted connections and streamed Chainlink BTC/USD updates, but new price work belongs on PolyBolt.

What is PolyBolt?

PolyBolt streams reference prices over one connection, with one envelope shape for every channel:

ChannelDataFilter
price.cryptoCrypto prices in USD{"symbol":"btcusd"}
price.crypto.twap60-second Chainlink TWAPs{"symbol":"btcusd","window_seconds":60}
price.equityStocks, ETFs, forex, metals and commodities{"symbol":"aapl"}
price.equity.twap60-second Chainlink TWAPs for eurusd and usdjpy, added 29 September 2026{"symbol":"eurusd","window_seconds":60}

price.crypto covers btcusd, ethusd, solusd, dogeusd, xrpusd and bnbusd, and the crypto TWAP channel adds hypeusd and zecusd. Every payload names its vendor in source, which is pyth, massive or chainlink. On the equity channels you can request chainlink or pyth with a provider filter, a feature still rolling out in late September. Polymarket's machine-readable contract also defines a public price.polymarket channel with the best bid and ask for one outcome token. It answered without credentials in our checks, but the main docs did not list it yet, so treat it as subject to change.

How do RTDS topics map to PolyBolt channels?

RTDS topicPolyBolt channel and filterWhat changes
crypto_prices with btcusdtprice.crypto, {"symbol":"btcusd"}Source moves from Binance to Chainlink, and USDT to USD
crypto_prices_chainlink with btc/usdprice.crypto, {"symbol":"btcusd"}Same Chainlink source, new symbol format
crypto_prices_twap_sixtyprice.crypto.twap, {"symbol":"btcusd","window_seconds":60}Same 60-second Chainlink TWAP
crypto_prices_twap_thirtyNoneNo replacement for the 30-second window
equity_prices with AAPLprice.equity, {"symbol":"aapl"}Same catalog, lowercase symbols

SDK users rename topics instead. In @polymarket/client, prices.crypto.binance and prices.crypto.chainlink become prices.crypto, prices.crypto.chainlink.twap becomes prices.crypto.twap with no windowSeconds, and prices.equity.pyth becomes prices.equity. In the Python SDK, CryptoPricesSpec, CryptoPricesChainlinkTwapSpec and EquityPricesSpec become CryptoPriceSpec, CryptoTwapPriceSpec and EquityPriceSpec. Both reject btc/usd, btcusdt and BTCUSD with a UserInputError.

What changes in authentication?

RTDS price topics were public. Every PolyBolt price channel needs CLOB API credentials, the same key, secret and passphrase used for authenticated CLOB requests, covered in Polymarket API keys explained. Send them once the socket opens and wait for authed before subscribing:

{"op":"auth","rid":"a1","auth":{"apiKey":"YOUR_API_KEY","secret":"YOUR_SECRET","passphrase":"YOUR_PASSPHRASE"}}
{"op":"authed","rid":"a1"}
{"op":"subscribe","rid":"s1","subscriptions":[{"channel":"price.crypto","filter":{"symbol":"btcusd"}}]}

A subscription sent before auth returns auth_required, and bad credentials return auth_invalid. Both leave the connection open, which is what we saw in our checks on 3 October 2026. A connection accepts at most 8 auth frames. In the SDKs, move from a public client to an authenticated SecureClient built from your signer. We type-checked the migrated TypeScript against @polymarket/client 0.11.0:

import { createSecureClient } from "@polymarket/client";
import { privateKey } from "@polymarket/client/viem";

const signer = privateKey(process.env.POLYMARKET_PRIVATE_KEY!);
const client = await createSecureClient({
  signer,
  wallet: await signer.getAddress(),
});

const stream = await client.subscribe([
  { topic: "prices.crypto.twap", symbols: ["btcusd"] },
]);

try {
  for await (const event of stream) {
    if (event.type === "subscribe") {
      console.log("snapshot", event.payload.data.length, "points");
    } else {
      console.log(event.payload.symbol, event.payload.value, event.seq);
    }
  }
} finally {
  await stream.close();
}

The old version subscribed to prices.crypto.chainlink.twap with btc/usd and windowSeconds: 60 on a public client, and it still compiled and streamed in our checks. The new topic always uses a 60-second window, and the SDK reconnects automatically.

How do PolyBolt snapshots and sequence numbers work?

Each new subscription gets an acknowledgement and one frame flagged snapshot: true, holding the previous two minutes of prices in payload.data, or an empty array when nothing recent exists. RTDS sent nothing for a quiet symbol. Seed your state from the snapshot, then apply live updates. Repeating a channel and filter you already hold returns another acknowledgement but no new snapshot.

Data frames carry v, channel, seq, ts and payload, with symbol, value, full_accuracy_value, timestamp and source inside. seq is consecutive per connection and per channel, including snapshots, and resets on reconnect. dropped, when present, counts frames skipped because your client fell behind. Read full_accuracy_value, an exact decimal string, rather than the float value. Legacy TWAP frames used window_s and an E18 fixed-point price, and in our checks the legacy Chainlink spot topic sent E18 integers too, so delete any E18 conversion.

What are PolyBolt's connection limits and close codes?

LimitValueOn breach
Active subscriptions per connection64 channel and filter pairssub_limit, then close 4008
Subscribe or unsubscribe frames20 a second, and a batch counts oncerate_limited, then close 4008
Frame size64 KBClose 4008
Auth frames per connection8auth_attempts, then close 4008

The text PING is gone. The server pings every 25 seconds, standard clients answer automatically, and two missed pongs close the socket with 4002. You can still send {"op":"ping"} and get pong back. Close 4003 means the server is draining, so reconnect once after a random 0 to 10 seconds. 4008 is a policy violation to fix, 4001 is an authentication failure, and 1006 calls for exponential backoff with full jitter from 1 to 30 seconds. After any reconnect, authenticate again, resubscribe with any provider pins and re-read source.

This raw client authenticates, subscribes to spot and TWAP prices and handles the new envelope, in Node 22 or newer. We ran it with placeholder keys and got the expected auth_invalid:

const ws = new WebSocket('wss://ws-live-v2.polymarket.com/ws');

const subscriptions = [
  { channel: 'price.crypto', filter: { symbol: 'btcusd' } },
  { channel: 'price.crypto.twap', filter: { symbol: 'btcusd', window_seconds: 60 } },
];

ws.addEventListener('open', () => {
  ws.send(JSON.stringify({
    op: 'auth',
    rid: 'a1',
    auth: { apiKey: 'YOUR_API_KEY', secret: 'YOUR_SECRET', passphrase: 'YOUR_PASSPHRASE' },
  }));
});

ws.addEventListener('message', (event) => {
  const msg = JSON.parse(event.data);
  if (msg.op === 'authed') {
    ws.send(JSON.stringify({ op: 'subscribe', rid: 's1', subscriptions }));
  } else if (msg.op === 'error') {
    console.error('error', msg.code, msg.channel ?? '');
  } else if (msg.v === 1) {
    if (msg.dropped) console.warn(msg.dropped, 'frames dropped on', msg.channel);
    if (msg.snapshot) {
      console.log('snapshot', msg.channel, msg.payload.data.length, 'points');
    } else {
      console.log(msg.channel, msg.seq, msg.payload.full_accuracy_value, msg.payload.source);
    }
  }
});

ws.addEventListener('close', (event) => console.log('closed', event.code));

Acknowledgements carry op, while data frames carry v: 1, which is how the handler tells them apart. Two subscriptions on one frame count as a single request against the 20-a-second limit.

What is the RTDS to PolyBolt timeline?

DateChange
24 September 2025RTDS released with Binance and Chainlink prices and comment streaming
15 September 2026PolyBolt launches, and RTDS becomes legacy for reference prices
23 September 2026@polymarket/client 0.11.0 published on npm with PolyBolt topics, and the legacy price topics stay deprecated
29 September 2026price.equity.twap, the source field, provider pins and new symbols arrive
One month after 0.11.0Planned removal of the TypeScript SDK's legacy price topics

Two RTDS streams do not move. Trade activity stays on RTDS because it has no PolyBolt channel. The live comments stream stays for now but is being retired without a streaming replacement, so list comments with Gamma's GET /comments. Order book and user streams run on the separate CLOB WebSocket, which PolyBolt does not replace, covered in the Polymarket WebSocket API guide.

What is the migration checklist?

  1. Upgrade to @polymarket/client or polymarket-client 0.11.0 or later, or point raw clients at wss://ws-live-v2.polymarket.com/ws and delete the PING heartbeat.
  2. Load CLOB API credentials and send {"op":"auth"} before any price subscription.
  3. Rewrite subscribe frames to op, channel and a filter object, and batch them per connection.
  4. Rename crypto symbols to lowercase USD pairs such as btcusd, and lowercase equity symbols.
  5. Check feeds that change: Binance users get Chainlink USD prices, and 30-second TWAP users need another source.
  6. Seed state from the snapshot, read full_accuracy_value and source, and watch dropped.
  7. Stay at or below 64 subscriptions per connection.
  8. Handle 4003 with one jittered reconnect and 4008 as a bug, then re-authenticate and resubscribe after every reconnect.

If your bot leaned on RTDS's Binance feed next to market data, the Predictefy API streams Binance and Chainlink reference price feeds alongside order books from Polymarket and 15+ other venues.

Frequently Asked Questions

What is Polymarket PolyBolt?

Polymarket's WebSocket for crypto, equity and TWAP reference prices, at wss://ws-live-v2.polymarket.com/ws, launched on 15 September 2026. It replaces the price topics on RTDS and needs CLOB API credentials.

Is Polymarket RTDS shut down?

Not as of 3 October 2026. It still streamed Chainlink prices in our checks and remains the home of trade activity. It is legacy for reference prices, and the TypeScript SDK plans to remove its legacy price topics one month after version 0.11.0.

Does PolyBolt need an API key?

Yes, for the price channels. Send your CLOB API key, secret and passphrase in an auth frame and wait for authed before subscribing. A subscription sent first returns auth_required, and the connection stays open.

What replaced the Binance price feed on RTDS?

price.crypto, which defaults to Chainlink and quotes in USD, so btcusdt becomes btcusd. Polymarket notes that this changes both the source and the quote currency, so confirm the new feed fits your pricing.

Is there a 30-second TWAP on PolyBolt?

No. price.crypto.twap serves only 60-second windows, and Polymarket lists no replacement for the 30-second topic.