Все статьи
Справочник APIWebSocketsAPI PolymarketМиграция

Polymarket заменил RTDS: миграция на PolyBolt

15 сентября Polymarket тихо перевёл RTDS в разряд устаревших для референсных цен. Если ваш бот получает поток спот-цен, одновременно изменились шесть вещей — включая источник цен и формат символов, — и большинство из них ломается молча, а не громко.

10 мин чтения

Что изменилось и когда

15 сентября 2026 года Polymarket запустил PolyBolt по адресу wss://ws-live-v2.polymarket.com/ws и перевёл RTDS в устаревшие для референсных цен. crypto_prices, crypto_prices_chainlink и equity_prices переходят на новые каналы. Тема comments пока остаётся на RTDS.

Если ваш бот получает поток спот-цен, чтобы принимать какие-либо решения, — а на крипторынках Up/Down так делает большинство, — это касается вас. Одновременно изменились шесть вещей, и неприятно то, что некоторые из них ломаются тихо: вы остаётесь подключены, просто перестаёте получать те цены, которые, как вам кажется, получаете.

Шесть несовместимых изменений

RTDS (устаревший)PolyBolt
URLwss://ws-live-data.polymarket.comwss://ws-live-v2.polymarket.com/ws
АутентификацияПубличныйНужны учётные данные CLOB API
HeartbeatКлиент отправляет PING каждые 5 сНичего отправлять не нужно — сервер пингует каждые 25 с
Кадр подписки{action, subscriptions:[{topic,type,filters}]}{op, subscriptions:[{channel,filter}]} — filter — это объект, а не строка
Источник криптоценBinance / ChainlinkPyth
Символыbtcusdt, btc/usdbtcusd — нижний регистр, USD, а не USDT

Два изменения, которые отнимут больше всего времени

Источник цен сменился на Pyth. Ваша референсная цена теперь приходит от другого оракула, чем 14 сентября. Если вы калибровали пороги по тикам Binance, откалибруйте заново. И формат символов изменился — btcusdt и btc/usd теперь оба неверны. Неверный символ не вызывает ошибку; вы получаете подписку, которая никогда ничего не присылает.

Соответствие каналов

Тема RTDSКанал PolyBoltФильтрПримечание
crypto_pricesprice.crypto{"symbol":"btcusd"}Источник Binance → Pyth; USDT → USD
crypto_prices_chainlinkprice.crypto{"symbol":"btcusd"}Источник Chainlink → Pyth
crypto_prices_twap_sixtyprice.crypto.twap{"symbol":"btcusd","window_seconds":60}60-секундный TWAP Chainlink
crypto_prices_twap_thirtyНет—Замены не существует
equity_pricesprice.equity{"symbol":"aapl"}Тот же каталог, нижний регистр

30-секундного TWAP просто больше нет

У crypto_prices_twap_thirty нет эквивалента в PolyBolt. Это важнее, чем кажется: 5-минутные крипторынки после 7 августа недолго разрешались по 30-секундному TWAP, а 14 августа перешли на 60 секунд. Если что-то в вашем стеке всё ещё использует 30-секундное окно, пути миграции у этого нет — нужен 60-секундный канал и заново откалиброванная модель.

Подключение

Сначала пройдите аутентификацию на открытом соединении, дождитесь подтверждения, затем подписывайтесь. Каналы референсных цен отклоняют подписки без аутентификации.

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

Это те же учётные данные, которые вы получаете для торговли в CLOB, — ключ, секрет и passphrase вместе. Если вы их ещё не создавали, процесс L1/L2 описан в руководстве по эндпоинтам.

Три вещи, которые PolyBolt даёт, а RTDS не давал

  • Снимок при каждой подписке. Каждая подписка возвращает цены за предыдущие две минуты с snapshot: true (возможно, пустые). Инициализируйте локальное состояние по нему, затем применяйте живые обновления. В RTDS по тихому символу вы получали просто тишину и не знали, подключены ли вы или просто между тиками.
  • Плотный seq и счётчик dropped. Наконец можно обнаруживать пропуски. В RTDS последовательности не было вовсе, так что пропущенное сообщение было невидимо. Отслеживайте seq для каждого канала и считайте любой скачок поводом для ресинхронизации.
  • Типизированные коды закрытия вместо сырого 1006: 4001 — аутентификация, 4002 — медленный потребитель, 4003 — сервер освобождается, 4008 — нарушение политики. 4002 означает, что вы слишком медленно вычитываете сокет, — это ошибка потребителя, а не сети, и переподключение её не исправит.

Используйте full_accuracy_value, а не value

value — это float; full_accuracy_value — точная десятичная строка. На рынке, который разрешается по сравнению TWAP, вы не захотите, чтобы сделку решало округление float в восьмом знаке. Кроме того: устаревшие кадры TWAP использовали window_s и цену в формате с фиксированной точкой E18. PolyBolt присылает десятичную строку — не применяйте преобразование E18, иначе ваши цены разойдутся на восемнадцать порядков.

Лимиты соединения

RTDS их не публиковал. PolyBolt публикует, и нарушение любого из них закрывает сокет с кодом 4008:

ЛимитЗначение
Подписок на соединение64
Кадров подписки в секунду20
Максимальный размер кадра64 KB
Кадров аутентификации8

Планировать стоит вокруг 64 подписок. Если вы отслеживаете BTC, ETH и SOL по споту и TWAP, это шесть, так что для криптобота запаса много, — но система, которая разворачивается на весь каталог акций, в него упрётся.

Миграция бота по шагам

  1. Получите учётные данные CLOB API, если у вас их нет. RTDS был публичным, PolyBolt — нет. Этот шаг блокирует всё остальное.
  2. Смените URL на wss://ws-live-v2.polymarket.com/ws.
  3. Удалите клиентский heartbeat. Цикл PING каждые 5 секунд не просто не нужен — теперь это шум. Сервер пингует вас каждые 25 секунд.
  4. Перепишите кадры подписки — action → op, topic → channel, а filter становится JSON-объектом, а не строкой.
  5. Исправьте все символы: btcusdt и btc/usd оба становятся btcusd. Нижний регистр, USD.
  6. Обрабатывайте кадр снимка, чтобы не принять две минуты исторических данных за живые тики.
  7. Добавьте обнаружение пропусков по seq и ресинхронизацию при скачке.
  8. Перекалибруйте всё, что настроено на цены Binance. Теперь источник — Pyth.

Если вы используете TypeScript SDK

@polymarket/client версии 0.11.0 и новее оборачивает это: client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }]) на аутентифицированном SecureClient, и вы перебираете типизированные события типов subscribe и update. Аутентификация, кадрирование и heartbeat берутся на себя — общую картину миграции см. в руководстве по SDK.

Что это не меняет

Стоит быть точным, потому что легко мигрировать лишнее. Рыночный и пользовательский каналы CLOB не затронуты. wss://ws-subscriptions-clob.polymarket.com/ws/market по-прежнему передаёт обновления стакана и цен, по-прежнему требует клиентский PING каждые 10 секунд и по-прежнему скрывает best_bid_ask, new_market и market_resolved за custom_feature_enabled. Переехали только референсные цены. Подробности — в руководстве по WebSocket.

И более глубокое ограничение тоже не изменилось: поток даёт цены с момента подключения. Он не скажет, как выглядел стакан в прошлый вторник. Polymarket возвращает 404 для стакана разрешившегося рынка и хранит историю цен лишь примерно с одной точкой в минуту — поэтому для бэктестинга нужен архив, записанный, пока рынки работали. См. как устроены рынки Up/Down или найдите конкретный рынок через поиск рынка.

Часто задаваемые вопросы

Что такое PolyBolt и когда он заменил RTDS?
PolyBolt — это WebSocket Polymarket для референсных цен криптовалют, акций и TWAP, запущенный 15 сентября 2026 года по адресу wss://ws-live-v2.polymarket.com/ws. Он делает RTDS устаревшим для референсных цен: crypto_prices, crypto_prices_chainlink и equity_prices переходят на новые каналы PolyBolt. Тема comments пока остаётся на RTDS.
Нужна ли аутентификация для PolyBolt?
Да. Каналы референсных цен требуют учётных данных CLOB API — ключа, секрета и passphrase, — отправленных кадром аутентификации на открытом соединении до подписки. Это главное эксплуатационное отличие от RTDS, который был публичным. Дождитесь подтверждения аутентификации от сервера, прежде чем отправлять кадры подписки.
Что заменило crypto_prices_chainlink?
Канал price.crypto с фильтром {"symbol":"btcusd"}. Помимо названия меняются две вещи: источник переходит с Chainlink на Pyth, а формат символа меняется с btc/usd на btcusd в нижнем регистре. Для 60-секундного TWAP Chainlink используйте price.crypto.twap с window_seconds, равным 60. У темы 30-секундного TWAP замены в PolyBolt нет.
Нужен ли в PolyBolt клиентский PING?
Нет. В RTDS клиент отправлял текстовый PING каждые 5 секунд. В PolyBolt сервер пингует каждые 25 секунд, а клиент ничего не отправляет, хотя необязательный {"op":"ping"} принимается. Учтите, что рыночный канал CLOB не изменился и по-прежнему требует клиентский PING каждые 10 секунд.
Почему я подключён к PolyBolt, но не получаю цены?
Почти всегда это проблема формата символа. PolyBolt использует символы в нижнем регистре, оканчивающиеся на usd, поэтому btcusdt и btc/usd оба недопустимы — используйте btcusd. Неверный символ не вызывает ошибку; подписка просто ничего не присылает. Проверьте также, что аутентификация была подтверждена до отправки кадра подписки и что вы не принимаете начальный кадр снимка за единственные данные.
Что означают коды закрытия PolyBolt?
4001 — ошибка аутентификации, 4002 — вы медленный потребитель и недостаточно быстро вычитываете сокет, 4003 — сервер освобождается, 4008 — нарушение политики, например превышение 64 подписок, 20 кадров подписки в секунду, кадр больше 64 KB или 8 кадров аутентификации. 4002 — это ошибка в вашем потребителе, а не сбой сети, так что переподключение без исправления пропускной способности просто повторит её.

Получите исторические данные, которые Polymarket не хранит

PolyTest записывает крипторынки Polymarket Up/Down в процессе их работы — 240M+ снимков с 8 уровнями глубины стакана, метками времени с точностью до долей секунды и сохранёнными разрешившимися рынками. Начните с 3-дневного бесплатного пробного периода.

Читать дальше