Tutti gli articoli
Riferimento APIWebSocketAPI di PolymarketMigrazione

Polymarket ha sostituito RTDS: la migrazione a PolyBolt

Il 15 settembre Polymarket ha reso RTDS legacy per i prezzi di riferimento, senza troppo clamore. Se invii lo spot in streaming a un bot, sono cambiate sei cose insieme, compresi la fonte di prezzo e il formato dei simboli, e la maggior parte fallisce in silenzio invece che in modo evidente.

10 min di lettura

Cosa è cambiato e quando

Il 15 settembre 2026 Polymarket ha rilasciato PolyBolt su wss://ws-live-v2.polymarket.com/ws e ha reso RTDS legacy per i prezzi di riferimento. crypto_prices, crypto_prices_chainlink ed equity_prices corrispondono tutti a nuovi canali. Il topic comments resta su RTDS per ora.

Se il tuo bot riceve in streaming i prezzi spot per decidere qualcosa (e sui mercati crypto Up/Down quasi tutti lo fanno), la cosa ti riguarda. Sono cambiate sei cose insieme, e il problema è che diverse falliscono in silenzio: resti connesso, semplicemente smetti di ricevere i prezzi che credi di ricevere.

Le sei breaking change

RTDS (legacy)PolyBolt
URLwss://ws-live-data.polymarket.comwss://ws-live-v2.polymarket.com/ws
AutenticazionePubblicaCredenziali API del CLOB obbligatorie
HeartbeatIl client invia PING ogni 5sNiente da inviare: il server fa ping ogni 25s
Frame di subscribe{action, subscriptions:[{topic,type,filters}]}{op, subscriptions:[{channel,filter}]}: filter è un oggetto, non una stringa
Fonte cryptoBinance / ChainlinkPyth
Simbolibtcusdt, btc/usdbtcusd: minuscolo, USD e non USDT

Le due che ti faranno perdere più tempo

La fonte del prezzo è passata a Pyth. Il tuo prezzo di riferimento ora arriva da un oracolo diverso da quello del 14 settembre. Se hai calibrato le soglie sui tick di Binance, ricalibrale. E il formato dei simboli è cambiato: btcusdt e btc/usd ora sono entrambi sbagliati. Un simbolo errato non genera un’eccezione; ottieni una sottoscrizione che non consegna mai nulla.

Mappatura dei canali

Topic RTDSCanale PolyBoltFiltroNota
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 Chainlink a 60s
crypto_prices_twap_thirtyNessuno—Non esiste un sostituto
equity_pricesprice.equity{"symbol":"aapl"}Stesso catalogo, in minuscolo

Il TWAP a 30 secondi è semplicemente sparito

crypto_prices_twap_thirty non ha un equivalente in PolyBolt. Conta più di quanto sembri: dopo il 7 agosto i mercati crypto a 5 minuti si sono risolti per breve tempo su un TWAP a 30 secondi, poi il 14 agosto sono passati a 60 secondi. Se qualcosa nel tuo stack usa ancora la finestra di 30s, non ha un percorso di migrazione: ti servono il canale a 60s e un modello ricalibrato.

Connessione

Prima autenticati sulla connessione aperta, attendi la conferma, poi fai subscribe. I canali dei prezzi di riferimento rifiutano le sottoscrizioni non autenticate.

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

Sono le stesse credenziali che derivi per il trading sul CLOB: chiave, secret e passphrase insieme. Se non le hai mai create, la guida agli endpoint spiega il flusso L1/L2.

Tre cose che PolyBolt ti dà e RTDS no

  • Uno snapshot a ogni subscribe. Ogni sottoscrizione restituisce i prezzi dei due minuti precedenti con snapshot: true, eventualmente vuoti. Inizializza lo stato locale da lì, poi applica gli aggiornamenti live. Con RTDS un simbolo poco attivo ti dava solo silenzio, e non avevi idea se fossi connesso o semplicemente tra un tick e l’altro.
  • Un seq denso e un contatore dropped. Finalmente puoi rilevare i buchi. RTDS non aveva alcuna sequenza, quindi un messaggio perso era invisibile. Tieni traccia di seq per canale e tratta ogni salto come un segnale per risincronizzarti.
  • Codici di chiusura tipizzati invece del semplice 1006: 4001 autenticazione, 4002 consumer lento, 4003 draining, 4008 policy. Un 4002 significa che sei tu troppo lento a svuotare il socket: è un bug del consumer, non un problema di rete, e riconnettersi non lo risolverà.

Usa full_accuracy_value, non value

value è un float; full_accuracy_value è una stringa decimale esatta. Su un mercato che si regola con un confronto di TWAP, non vuoi che sia l’arrotondamento di un float all’ottava cifra decimale a decidere un’operazione. Inoltre: i frame TWAP legacy usavano window_s e un prezzo in virgola fissa E18. PolyBolt invia una stringa decimale: non applicare la conversione E18, o i tuoi prezzi saranno sbagliati di diciotto ordini di grandezza.

Limiti di connessione

RTDS non ne pubblicava nessuno. PolyBolt sì, e superarne uno qualsiasi chiude il socket con 4008:

LimiteValore
Sottoscrizioni per connessione64
Frame di subscribe al secondo20
Dimensione massima del frame64 KB
Frame di autenticazione8

Il limite di 64 sottoscrizioni è quello su cui pianificare. Se segui BTC, ETH e SOL su spot e TWAP sono sei, quindi c’è ampio margine per un bot crypto, ma un sistema che si estende a tutto il catalogo equity lo raggiungerà.

Migrare un bot, in ordine

  1. Deriva le credenziali API del CLOB se non le hai. RTDS era pubblico; PolyBolt no. È il passo che blocca tutto il resto.
  2. Cambia l’URL in wss://ws-live-v2.polymarket.com/ws.
  3. Elimina l’heartbeat del client. Il loop di PING ogni 5 secondi non è solo inutile, ora è rumore. Il server ti manda un ping ogni 25 secondi.
  4. Riscrivi i frame di subscribe: action → op, topic → channel, e filter diventa un oggetto JSON invece di una stringa.
  5. Correggi ogni simbolo: btcusdt e btc/usd diventano entrambi btcusd. Minuscolo, USD.
  6. Gestisci il frame di snapshot, così non tratti due minuti di backfill come tick live.
  7. Aggiungi il rilevamento dei buchi su seq e risincronizzati in caso di salto.
  8. Ricalibra tutto ciò che era tarato sui prezzi di Binance. Ora la fonte è Pyth.

Se usi l’SDK TypeScript

@polymarket/client dalla 0.11.0 in poi gestisce tutto questo: client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }]) su un SecureClient autenticato, e iteri eventi tipizzati con i tipi subscribe e update. Si occupa per te di autenticazione, framing e heartbeat: vedi la guida all’SDK per il quadro più ampio della migrazione.

Cosa non cambia

Vale la pena essere precisi, perché è facile migrare più del necessario. I canali market e user del CLOB non sono stati toccati. wss://ws-subscriptions-clob.polymarket.com/ws/market trasporta ancora gli aggiornamenti dell’order book e dei prezzi, vuole ancora un PING dal client ogni 10 secondi e nasconde ancora best_bid_ask, new_market e market_resolved dietro custom_feature_enabled. Si sono spostati solo i prezzi di riferimento. I dettagli sono nella guida ai WebSocket.

E anche il limite più profondo resta invariato: uno stream ti dà i prezzi dal momento in cui ti connetti. Non può dirti com’era il book martedì scorso. Polymarket restituisce 404 per il book di un mercato risolto e conserva solo circa un punto al minuto di storico dei prezzi, ed è per questo che il backtesting richiede un archivio registrato mentre i mercati erano attivi. Vedi come funzionano i mercati Up/Down o cerca un mercato specifico nella ricerca mercati.

Domande frequenti

Che cos’è PolyBolt e quando ha sostituito RTDS?
PolyBolt è il WebSocket di Polymarket per i prezzi di riferimento di crypto, equity e TWAP, lanciato il 15 settembre 2026 su wss://ws-live-v2.polymarket.com/ws. Rende RTDS legacy per i prezzi di riferimento: crypto_prices, crypto_prices_chainlink ed equity_prices corrispondono tutti a nuovi canali PolyBolt. Il topic comments resta su RTDS per ora.
Serve l’autenticazione per PolyBolt?
Sì. I canali dei prezzi di riferimento richiedono le credenziali API del CLOB (chiave, secret e passphrase), inviate come frame di autenticazione sulla connessione aperta prima della sottoscrizione. È la principale differenza operativa rispetto a RTDS, che era pubblico. Aspetta che il server confermi l’autenticazione prima di inviare i frame di subscribe.
Cosa ha sostituito crypto_prices_chainlink?
Il canale price.crypto con filtro {"symbol":"btcusd"}. Oltre al nome cambiano due cose: la fonte passa da Chainlink a Pyth e il formato dei simboli passa da btc/usd a btcusd in minuscolo. Per il TWAP Chainlink a 60 secondi usa price.crypto.twap con window_seconds impostato a 60. Il topic del TWAP a 30 secondi non ha un sostituto in PolyBolt.
PolyBolt richiede ancora un PING dal client?
No. Con RTDS il client inviava un PING testuale ogni 5 secondi. Su PolyBolt è il server a fare ping ogni 25 secondi e il client non invia nulla, anche se viene accettato un {"op":"ping"} facoltativo. Nota che è diverso dal canale market del CLOB, che non è cambiato e richiede ancora un PING dal client ogni 10 secondi.
Perché sono connesso a PolyBolt ma non ricevo prezzi?
Quasi sempre è un problema di formato del simbolo. PolyBolt usa simboli minuscoli che terminano in usd, quindi btcusdt e btc/usd non sono validi: usa btcusd. Un simbolo errato non genera un errore; la sottoscrizione semplicemente non consegna mai nulla. Verifica anche che l’autenticazione sia stata confermata prima di inviare il frame di subscribe, e di non trattare il frame di snapshot iniziale come gli unici dati.
Cosa significano i codici di chiusura di PolyBolt?
4001 è un errore di autenticazione, 4002 significa che sei un consumer lento e non svuoti il socket abbastanza in fretta, 4003 significa che il server è in draining e 4008 è una violazione di policy, come superare 64 sottoscrizioni, 20 frame di subscribe al secondo, un frame da 64 KB o 8 frame di autenticazione. Un 4002 è un bug del tuo consumer e non un guasto di rete, quindi riconnettersi senza sistemare il throughput lo farà solo ripetere.

Ottieni i dati storici che Polymarket non conserva

PolyTest registra i mercati crypto Up/Down di Polymarket mentre sono attivi: 240M+ snapshot con 8 livelli di profondità dell’order book, timestamp sotto il secondo e mercati risolti conservati. Inizia con una prova gratuita di 3 giorni.

Continua a leggere