Todos os posts
Referência da APIWebSocketsAPI da PolymarketMigração

A Polymarket substituiu o RTDS: migrando para o PolyBolt

Em 15 de setembro, a Polymarket transformou discretamente o RTDS em legado para preços de referência. Se você faz streaming de spot para um bot, seis coisas mudaram de uma vez — incluindo a fonte de preços e o formato dos símbolos — e a maioria delas falha em silêncio, não com alarde.

10 min de leitura

O que mudou, e quando

Em 15 de setembro de 2026, a Polymarket lançou o PolyBolt em wss://ws-live-v2.polymarket.com/ws e transformou o RTDS em legado para preços de referência. crypto_prices, crypto_prices_chainlink e equity_prices passam todos para novos canais. O tópico comments continua no RTDS por enquanto.

Se o seu bot faz streaming de preços spot para decidir qualquer coisa — e nos mercados cripto Up/Down a maioria faz —, isso afeta você. Seis coisas mudaram de uma vez, e a parte chata é que várias delas falham em silêncio: você continua conectado, só para de receber os preços que acha que está recebendo.

As seis mudanças incompatíveis

RTDS (legado)PolyBolt
URLwss://ws-live-data.polymarket.comwss://ws-live-v2.polymarket.com/ws
AutenticaçãoPúblicaCredenciais da API CLOB obrigatórias
HeartbeatO cliente envia PING a cada 5sNada a enviar — o servidor envia ping a cada 25s
Frame de assinatura{action, subscriptions:[{topic,type,filters}]}{op, subscriptions:[{channel,filter}]} — filter é um objeto, não uma string
Fonte criptoBinance / ChainlinkPyth
Símbolosbtcusdt, btc/usdbtcusd — minúsculas, USD e não USDT

As duas que vão custar mais tempo

A fonte de preços mudou para a Pyth. Seu preço de referência agora vem de um oráculo diferente do que vinha em 14 de setembro. Se você calibrou limites com ticks da Binance, recalibre. E o formato dos símbolos mudou — btcusdt e btc/usd estão os dois errados agora. Um símbolo inválido não gera erro; você recebe uma assinatura que nunca entrega nada.

Mapeamento de canais

Tópico do RTDSCanal do PolyBoltFiltroObservação
crypto_pricesprice.crypto{"symbol":"btcusd"}Fonte Binance → Pyth; USDT → USD
crypto_prices_chainlinkprice.crypto{"symbol":"btcusd"}Fonte Chainlink → Pyth
crypto_prices_twap_sixtyprice.crypto.twap{"symbol":"btcusd","window_seconds":60}TWAP da Chainlink de 60s
crypto_prices_twap_thirtyNenhum—Não existe substituto
equity_pricesprice.equity{"symbol":"aapl"}Mesmo catálogo, em minúsculas

O TWAP de 30 segundos simplesmente sumiu

crypto_prices_twap_thirty não tem equivalente no PolyBolt. Isso importa mais do que parece: os mercados cripto de 5 minutos foram resolvidos brevemente com um TWAP de 30 segundos depois de 7 de agosto e passaram para 60 segundos em 14 de agosto. Se alguma coisa na sua stack ainda consome a janela de 30s, ela não tem caminho de migração — você precisa do canal de 60s e de um modelo recalibrado.

Conectando

Autentique-se primeiro na conexão aberta, espere a confirmação e depois assine. Os canais de preços de referência rejeitam assinaturas não autenticadas.

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

Essas credenciais são as mesmas que você deriva para operar no CLOB — chave, secret e passphrase juntos. Se você nunca as criou, o guia de endpoints cobre o fluxo L1/L2.

Três coisas que o PolyBolt oferece e o RTDS não oferecia

  • Um snapshot a cada assinatura. Cada assinatura retorna os dois minutos anteriores de preços com snapshot: true, possivelmente vazio. Inicialize o estado local a partir dele e depois aplique as atualizações ao vivo. No RTDS, um símbolo parado só dava silêncio, e você não fazia ideia se estava conectado ou apenas entre dois ticks.
  • Um seq denso e um contador dropped. Finalmente dá para detectar lacunas. O RTDS não tinha sequência nenhuma, então uma mensagem perdida era invisível. Acompanhe o seq por canal e trate qualquer salto como gatilho de ressincronização.
  • Códigos de fechamento tipados em vez do 1006 cru: 4001 autenticação, 4002 consumidor lento, 4003 drenando, 4008 política. Um 4002 significa que você está lento demais para drenar o socket — é um bug no consumidor, não um problema de rede, e reconectar não vai resolver.

Use full_accuracy_value, não value

value é um float; full_accuracy_value é uma string decimal exata. Em um mercado que liquida por comparação de TWAP, arredondamento de float na oitava casa decimal não é algo que você quer decidindo uma operação. Além disso: os frames de TWAP legados usavam window_s e um preço em ponto fixo E18. O PolyBolt envia uma string decimal — não aplique a conversão E18, ou seus preços vão ficar errados em dezoito ordens de grandeza.

Limites de conexão

O RTDS não publicava nenhum. O PolyBolt publica, e violar qualquer um deles fecha o socket com 4008:

LimiteValor
Assinaturas por conexão64
Frames de assinatura por segundo20
Tamanho máximo do frame64 KB
Frames de autenticação8

As 64 assinaturas são o limite com que você precisa se planejar. Se você acompanha BTC, ETH e SOL em spot e TWAP, são seis, então sobra bastante folga para um bot cripto — mas um sistema que se espalha pelo catálogo de ações vai bater nele.

Migrando um bot, em ordem

  1. Derive as credenciais da API CLOB, se você não as tem. O RTDS era público; o PolyBolt não é. Este é o passo que bloqueia todo o resto.
  2. Troque a URL para wss://ws-live-v2.polymarket.com/ws.
  3. Apague o heartbeat do cliente. O loop de PING a cada 5 segundos não só é desnecessário como agora é ruído. O servidor envia ping para você a cada 25 segundos.
  4. Reescreva os frames de assinatura — action → op, topic → channel, e filter vira um objeto JSON em vez de uma string.
  5. Corrija todos os símbolos: btcusdt e btc/usd viram btcusd. Minúsculas, USD.
  6. Trate o frame de snapshot para não confundir dois minutos de histórico com ticks ao vivo.
  7. Adicione detecção de lacunas no seq e ressincronize quando houver um salto.
  8. Recalibre tudo o que foi ajustado com preços da Binance. A fonte agora é a Pyth.

Se você usa o SDK TypeScript

O @polymarket/client 0.11.0 e versões posteriores encapsulam isso: client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }]) em um SecureClient autenticado, e você itera sobre eventos tipados com os tipos subscribe e update. Ele cuida da autenticação, dos frames e dos heartbeats para você — veja o guia do SDK para o panorama mais amplo da migração.

O que isto não muda

Vale ser preciso, porque é fácil migrar demais. Os canais market e user do CLOB não foram alterados. wss://ws-subscriptions-clob.polymarket.com/ws/market continua transmitindo atualizações do livro de ofertas e de preços, continua exigindo um PING do cliente a cada 10 segundos e continua escondendo best_bid_ask, new_market e market_resolved atrás de custom_feature_enabled. Só os preços de referência mudaram. Detalhes no guia de WebSocket.

E a limitação mais profunda também não mudou: um stream dá a você preços a partir do momento em que você se conecta. Ele não consegue dizer como estava o livro na última terça-feira. A Polymarket retorna 404 para o livro de um mercado resolvido e guarda só cerca de um ponto por minuto de histórico de preços, e é por isso que o backtesting precisa de um arquivo gravado enquanto os mercados estavam ativos. Veja como funcionam os mercados Up/Down ou procure um mercado específico na busca de mercados.

Perguntas frequentes

O que é o PolyBolt e quando ele substituiu o RTDS?
O PolyBolt é o WebSocket da Polymarket para preços de referência de cripto, ações e TWAP, lançado em 15 de setembro de 2026 em wss://ws-live-v2.polymarket.com/ws. Ele transforma o RTDS em legado para preços de referência: crypto_prices, crypto_prices_chainlink e equity_prices passam todos para novos canais do PolyBolt. O tópico comments continua no RTDS por enquanto.
Preciso de autenticação para o PolyBolt?
Sim. Os canais de preços de referência exigem credenciais da API CLOB — chave, secret e passphrase —, enviadas como um frame de autenticação na conexão aberta antes de assinar. Essa é a principal diferença operacional em relação ao RTDS, que era público. Espere o servidor confirmar a autenticação antes de enviar frames de assinatura.
O que substituiu o crypto_prices_chainlink?
O canal price.crypto com o filtro {"symbol":"btcusd"}. Duas coisas mudam além do nome: a fonte passa da Chainlink para a Pyth, e o formato do símbolo muda de btc/usd para btcusd em minúsculas. Para o TWAP da Chainlink de 60 segundos, use price.crypto.twap com window_seconds definido como 60. O tópico de TWAP de 30 segundos não tem substituto no PolyBolt.
O PolyBolt ainda precisa de PING do cliente?
Não. No RTDS, o cliente enviava um PING de texto a cada 5 segundos. No PolyBolt, o servidor envia ping a cada 25 segundos e o cliente não envia nada, embora um {"op":"ping"} opcional seja aceito. Note que isso é diferente do canal market do CLOB, que não mudou e ainda exige um PING do cliente a cada 10 segundos.
Por que estou conectado ao PolyBolt mas não recebo preços?
Quase sempre é um problema de formato de símbolo. O PolyBolt usa símbolos em minúsculas terminados em usd, então btcusdt e btc/usd são ambos inválidos — use btcusd. Um símbolo inválido não gera erro; a assinatura simplesmente nunca entrega nada. Verifique também se a autenticação foi confirmada antes de você enviar o frame de assinatura, e se você não está tratando o frame de snapshot inicial como os únicos dados.
O que significam os códigos de fechamento do PolyBolt?
4001 é falha de autenticação, 4002 significa que você é um consumidor lento e não está drenando o socket rápido o bastante, 4003 significa que o servidor está drenando e 4008 é uma violação de política, como passar de 64 assinaturas, 20 frames de assinatura por segundo, um frame de 64 KB ou 8 frames de autenticação. Um 4002 é um bug no seu consumidor, e não uma falha de rede, então reconectar sem corrigir a vazão só vai repetir o problema.

Tenha os dados históricos que a Polymarket não guarda

A PolyTest registra os mercados cripto Up/Down da Polymarket enquanto estão ativos — mais de 240M de snapshots com 8 níveis de profundidade do livro de ofertas, timestamps abaixo de um segundo e mercados resolvidos preservados. Comece com um teste grátis de 3 dias.

Continue lendo