Polymarket reemplazó RTDS: migrar a PolyBolt
El 15 de septiembre Polymarket convirtió RTDS, sin hacer ruido, en legado para los precios de referencia. Si envías precios spot por streaming a un bot, cambiaron seis cosas a la vez, incluidas la fuente de precios y el formato de los símbolos, y la mayoría fallan en silencio en lugar de dar un error.
Qué cambió y cuándo
El 15 de septiembre de 2026 Polymarket lanzó PolyBolt en wss://ws-live-v2.polymarket.com/ws y convirtió RTDS en legado para los precios de referencia. crypto_prices, crypto_prices_chainlink y equity_prices pasan a canales nuevos. El topic comments sigue en RTDS por ahora.
Si tu bot recibe precios spot por streaming para decidir algo (y en los mercados cripto Up/Down la mayoría lo hacen), esto te afecta. Cambiaron seis cosas a la vez, y lo incómodo es que varias fallan en silencio: sigues conectado, solo que dejas de recibir los precios que crees estar recibiendo.
Los seis cambios incompatibles
| RTDS (legado) | PolyBolt | |
|---|---|---|
| URL | wss://ws-live-data.polymarket.com | wss://ws-live-v2.polymarket.com/ws |
| Autenticación | Pública | Requiere credenciales de la API CLOB |
| Heartbeat | El cliente envía PING cada 5s | No hay que enviar nada: el servidor hace ping cada 25s |
| Frame de suscripción | {action, subscriptions:[{topic,type,filters}]} | {op, subscriptions:[{channel,filter}]}: filter es un objeto, no un string |
| Fuente cripto | Binance / Chainlink | Pyth |
| Símbolos | btcusdt, btc/usd | btcusd: en minúsculas, USD y no USDT |
Los dos que más tiempo te van a costar
La fuente de precios pasó a ser Pyth. Tu precio de referencia ahora viene de un oráculo distinto al del 14 de septiembre. Si calibraste umbrales con los ticks de Binance, vuelve a calibrarlos. Y el formato de los símbolos cambió: btcusdt y btc/usd ahora son incorrectos. Un símbolo erróneo no lanza ninguna excepción; obtienes una suscripción que nunca entrega nada.
Mapeo de canales
| Topic de RTDS | Canal de PolyBolt | Filtro | Nota |
|---|---|---|---|
crypto_prices | price.crypto | {"symbol":"btcusd"} | Fuente Binance → Pyth; USDT → USD |
crypto_prices_chainlink | price.crypto | {"symbol":"btcusd"} | Fuente Chainlink → Pyth |
crypto_prices_twap_sixty | price.crypto.twap | {"symbol":"btcusd","window_seconds":60} | TWAP de Chainlink de 60s |
crypto_prices_twap_thirty | Ninguno | — | No existe reemplazo |
equity_prices | price.equity | {"symbol":"aapl"} | Mismo catálogo, en minúsculas |
El TWAP de 30 segundos simplemente desapareció
crypto_prices_twap_thirty no tiene equivalente en PolyBolt. Eso importa más de lo que parece: los mercados cripto de 5 minutos se resolvieron brevemente con un TWAP de 30 segundos después del 7 de agosto y pasaron a 60 segundos el 14 de agosto. Si algo en tu stack sigue consumiendo la ventana de 30s, no tiene ruta de migración: necesitas el canal de 60s y un modelo recalibrado.
Conexión
Primero autentícate en la conexión abierta, espera la confirmación y después suscríbete. Los canales de precios de referencia rechazan las suscripciones sin autenticar.
{
"op": "auth",
"rid": "a1",
"auth": {
"apiKey": "<api key>",
"secret": "<api secret>",
"passphrase": "<api passphrase>"
}
}Esas credenciales son las mismas que derivas para operar en el CLOB: key, secret y passphrase juntos. Si nunca las has creado, la guía de endpoints explica el flujo L1/L2.
Tres cosas que PolyBolt te da y RTDS no
- Un snapshot en cada suscripción. Cada suscripción devuelve los dos minutos anteriores de precios con
snapshot: true, posiblemente vacío. Inicializa tu estado local con él y luego aplica las actualizaciones en vivo. Con RTDS, un símbolo sin actividad solo te daba silencio y no tenías forma de saber si estabas conectado o simplemente entre ticks. - Un
seqdenso y un contadordropped. Por fin puedes detectar huecos. RTDS no tenía secuencia, así que un mensaje perdido era invisible. Sigueseqpor canal y trata cualquier salto como motivo para resincronizar. - Códigos de cierre tipados en lugar del
1006sin más:4001autenticación,4002consumidor lento,4003drenando,4008política. Un4002significa que tú eres demasiado lento vaciando el socket: es un bug del consumidor, no un problema de red, y reconectar no lo arreglará.
Usa full_accuracy_value, no value
value es un float; full_accuracy_value es un string decimal exacto. En un mercado que se liquida con una comparación de TWAP, no quieres que el redondeo de un float en el octavo decimal decida una operación. Además: los frames TWAP heredados usaban window_s y un precio en punto fijo E18. PolyBolt envía un string decimal: no apliques la conversión E18, o tus precios estarán desviados dieciocho órdenes de magnitud.
Límites de conexión
RTDS no publicaba ninguno. PolyBolt sí, y superar cualquiera de ellos cierra el socket con 4008:
| Límite | Valor |
|---|---|
| Suscripciones por conexión | 64 |
| Frames de suscripción por segundo | 20 |
| Tamaño máximo de frame | 64 KB |
| Frames de autenticación | 8 |
Las 64 suscripciones son el límite con el que hay que planificar. Si sigues BTC, ETH y SOL en spot y TWAP, son seis, así que hay margen de sobra para un bot cripto; pero un sistema que se abra a todo el catálogo de acciones lo alcanzará.
Migrar un bot, en orden
- Deriva credenciales de la API CLOB si no las tienes. RTDS era público; PolyBolt no. Este es el paso que bloquea todo lo demás.
- Cambia la URL a
wss://ws-live-v2.polymarket.com/ws. - Elimina el heartbeat del cliente. El bucle de
PINGcada 5 segundos no solo es innecesario: ahora es ruido. El servidor te hace ping cada 25 segundos. - Reescribe los frames de suscripción:
action→op,topic→channel, yfilterpasa a ser un objeto JSON en lugar de un string. - Corrige todos los símbolos:
btcusdtybtc/usdpasan a serbtcusd. En minúsculas, USD. - Gestiona el frame de snapshot para no tratar dos minutos de relleno histórico como ticks en vivo.
- Añade detección de huecos con
seqy resincroniza cuando haya un salto. - Recalibra todo lo ajustado a los precios de Binance. Ahora la fuente es Pyth.
Si usas el SDK de TypeScript
@polymarket/client 0.11.0 y posteriores encapsulan todo esto: client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }]) sobre un SecureClient autenticado, y recorres eventos tipados de los tipos subscribe y update. Eso se encarga por ti de la autenticación, el framing y los heartbeats; consulta la guía del SDK para ver la migración en conjunto.
Lo que esto no cambia
Conviene ser preciso, porque es fácil migrar de más. Los canales market y user del CLOB no se tocan. wss://ws-subscriptions-clob.polymarket.com/ws/market sigue transmitiendo las actualizaciones del libro de órdenes y de precios, sigue pidiendo un PING del cliente cada 10 segundos y sigue ocultando best_bid_ask, new_market y market_resolved tras custom_feature_enabled. Solo se movieron los precios de referencia. Detalles en la guía de WebSocket.
Y la limitación de fondo tampoco cambia: un stream te da precios desde el momento en que te conectas. No puede decirte cómo estaba el libro el martes pasado. Polymarket devuelve 404 para el libro de un mercado resuelto y solo conserva aproximadamente un punto por minuto del historial de precios, por eso el backtesting necesita un archivo grabado mientras los mercados estaban activos. Consulta cómo funcionan los mercados Up/Down o busca un mercado concreto en la búsqueda de mercados.
Preguntas frecuentes
- ¿Qué es PolyBolt y cuándo reemplazó a RTDS?
- PolyBolt es el WebSocket de Polymarket para los precios de referencia cripto, de acciones y TWAP, lanzado el 15 de septiembre de 2026 en wss://ws-live-v2.polymarket.com/ws. Convierte RTDS en legado para los precios de referencia: crypto_prices, crypto_prices_chainlink y equity_prices pasan a nuevos canales de PolyBolt. El topic comments sigue en RTDS por ahora.
- ¿Necesito autenticación para PolyBolt?
- Sí. Los canales de precios de referencia requieren credenciales de la API CLOB (key, secret y passphrase), enviadas como un frame de autenticación en la conexión abierta antes de suscribirte. Es la principal diferencia operativa con RTDS, que era público. Espera a que el servidor confirme la autenticación antes de enviar frames de suscripción.
- ¿Qué reemplazó a crypto_prices_chainlink?
- El canal price.crypto con el filtro {"symbol":"btcusd"}. Cambian dos cosas además del nombre: la fuente pasa de Chainlink a Pyth y el formato del símbolo pasa de btc/usd a btcusd en minúsculas. Para el TWAP de Chainlink de 60 segundos, usa price.crypto.twap con window_seconds en 60. El topic del TWAP de 30 segundos no tiene reemplazo en PolyBolt.
- ¿PolyBolt sigue necesitando un PING del cliente?
- No. Con RTDS el cliente enviaba un PING de texto cada 5 segundos. En PolyBolt el servidor hace ping cada 25 segundos y el cliente no envía nada, aunque se acepta un {"op":"ping"} opcional. Ten en cuenta que esto es distinto del canal market del CLOB, que no cambia y sigue requiriendo un PING del cliente cada 10 segundos.
- ¿Por qué estoy conectado a PolyBolt pero no recibo precios?
- Casi siempre es un problema con el formato del símbolo. PolyBolt usa símbolos en minúsculas que terminan en usd, así que btcusdt y btc/usd no son válidos: usa btcusd. Un símbolo erróneo no genera un error; la suscripción simplemente nunca entrega nada. Comprueba también que la autenticación se confirmó antes de enviar el frame de suscripción y que no estás tratando el frame inicial de snapshot como los únicos datos.
- ¿Qué significan los códigos de cierre de PolyBolt?
- 4001 es un fallo de autenticación, 4002 significa que eres un consumidor lento y no vacías el socket lo bastante rápido, 4003 significa que el servidor está drenando y 4008 es una infracción de política, como superar 64 suscripciones, 20 frames de suscripción por segundo, un frame de 64 KB u 8 frames de autenticación. Un 4002 es un bug de tu consumidor y no un fallo de red, así que reconectar sin arreglar el rendimiento solo hará que se repita.
Obtén los datos históricos que Polymarket no guarda
PolyTest registra los mercados cripto Up/Down de Polymarket mientras están activos: 240M+ snapshots con 8 niveles de profundidad del libro de órdenes, marcas de tiempo por debajo del segundo y mercados resueltos conservados. Empieza con una prueba gratuita de 3 días.
Sigue leyendo
WebSockets de Polymarket: datos en tiempo real que no se caen
Hacer polling del libro de órdenes es la forma más común de quemar presupuesto de límite de tasa sin ningún beneficio. Aquí están los cuatro streams, las opciones de suscripción que nadie documenta y el modo de fallo en el que tu bot recibe silencio y lo interpreta como calma.
Cómo crear un bot de trading para Polymarket
La mayoría de los tutoriales de bots para Polymarket se basan en SDK que ya no existen. Este es el camino actual de principio a fin: qué instalar en 2026, cómo funciona realmente la autenticación, dónde están los huecos de datos y los modos de fallo que matan a los bots en la primera semana.
El SDK de Python de Polymarket en 2026 (y cómo dejar py-clob-client)
Si tu código todavía importa ClobClient desde py_clob_client, está construido sobre un paquete sustituido, igual que la mayor parte del código de Polymarket que te escribirá un asistente de IA. Este es el SDK actual y cómo pasarte a él.