Todos los artículos
Referencia de la APIWebSocketsAPI de PolymarketMigración

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.

10 min de lectura

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
URLwss://ws-live-data.polymarket.comwss://ws-live-v2.polymarket.com/ws
AutenticaciónPúblicaRequiere credenciales de la API CLOB
HeartbeatEl cliente envía PING cada 5sNo 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 criptoBinance / ChainlinkPyth
Símbolosbtcusdt, btc/usdbtcusd: 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 RTDSCanal de PolyBoltFiltroNota
crypto_pricesprice.crypto{"symbol":"btcusd"}Fuente Binance → Pyth; USDT → USD
crypto_prices_chainlinkprice.crypto{"symbol":"btcusd"}Fuente Chainlink → Pyth
crypto_prices_twap_sixtyprice.crypto.twap{"symbol":"btcusd","window_seconds":60}TWAP de Chainlink de 60s
crypto_prices_twap_thirtyNinguno—No existe reemplazo
equity_pricesprice.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 seq denso y un contador dropped. Por fin puedes detectar huecos. RTDS no tenía secuencia, así que un mensaje perdido era invisible. Sigue seq por canal y trata cualquier salto como motivo para resincronizar.
  • Códigos de cierre tipados en lugar del 1006 sin más: 4001 autenticación, 4002 consumidor lento, 4003 drenando, 4008 política. Un 4002 significa 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ímiteValor
Suscripciones por conexión64
Frames de suscripción por segundo20
Tamaño máximo de frame64 KB
Frames de autenticación8

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

  1. 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.
  2. Cambia la URL a wss://ws-live-v2.polymarket.com/ws.
  3. Elimina el heartbeat del cliente. El bucle de PING cada 5 segundos no solo es innecesario: ahora es ruido. El servidor te hace ping cada 25 segundos.
  4. Reescribe los frames de suscripción: action → op, topic → channel, y filter pasa a ser un objeto JSON en lugar de un string.
  5. Corrige todos los símbolos: btcusdt y btc/usd pasan a ser btcusd. En minúsculas, USD.
  6. Gestiona el frame de snapshot para no tratar dos minutos de relleno histórico como ticks en vivo.
  7. Añade detección de huecos con seq y resincroniza cuando haya un salto.
  8. 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