전체 글
API 레퍼런스WebSocketPolymarket API마이그레이션

Polymarket이 RTDS를 대체했습니다: PolyBolt로 마이그레이션하기

9월 15일, Polymarket은 기준 가격에 대해 RTDS를 조용히 레거시로 전환했습니다. 봇에 현물 가격을 스트리밍한다면 가격 소스와 심볼 형식을 포함해 여섯 가지가 한꺼번에 바뀌었고, 대부분은 요란하게가 아니라 조용히 실패합니다.

10분 분량

무엇이 언제 바뀌었나

2026년 9월 15일 Polymarket은 wss://ws-live-v2.polymarket.com/ws에 PolyBolt를 출시하고 기준 가격에 대해 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 자격 증명 필요
하트비트클라이언트가 5초마다 PING 전송보낼 것 없음. 서버가 25초마다 ping
구독 프레임{action, subscriptions:[{topic,type,filters}]}{op, subscriptions:[{channel,filter}]}. filter는 문자열이 아니라 객체
암호화폐 소스Binance / ChainlinkPyth
심볼btcusdt, btc/usdbtcusd. 소문자, USDT가 아니라 USD

가장 많은 시간을 잡아먹을 두 가지

가격 소스가 Pyth로 바뀌었습니다. 기준 가격이 이제 9월 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초 Chainlink TWAP
crypto_prices_twap_thirty없음—대체 채널 없음
equity_pricesprice.equity{"symbol":"aapl"}같은 목록, 소문자

30초 TWAP은 그냥 사라졌습니다

crypto_prices_twap_thirty에는 PolyBolt 대응 채널이 없습니다. 보기보다 중요한 문제입니다. 5분 암호화폐 마켓은 8월 7일 이후 잠시 30초 TWAP으로 결과가 확정되다가 8월 14일에 60초로 바뀌었습니다. 스택 어딘가에서 아직 30초 구간을 사용한다면 마이그레이션 경로가 없습니다. 60초 채널과 다시 보정한 모델이 필요합니다.

연결하기

연결을 연 뒤 먼저 인증하고, 확인을 기다린 다음 구독하세요. 기준 가격 채널은 인증되지 않은 구독을 거부합니다.

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

이 자격 증명은 CLOB 거래를 위해 파생하는 것과 같으며, 키, 시크릿, 패스프레이즈를 함께 사용합니다. 만든 적이 없다면 엔드포인트 가이드에서 L1/L2 흐름을 다룹니다.

RTDS에는 없던 PolyBolt의 세 가지

  • 구독할 때마다 스냅샷 제공. 각 구독은 직전 2분간의 가격을 snapshot: true와 함께 반환하며, 비어 있을 수도 있습니다. 이것으로 로컬 상태를 초기화한 뒤 실시간 업데이트를 적용하세요. RTDS에서는 거래가 뜸한 심볼이면 그냥 아무 응답이 없어서, 연결되어 있는 건지 틱 사이에 있는 건지 알 수 없었습니다.
  • 빈틈없는 seq와 dropped 카운터. 드디어 누락을 감지할 수 있습니다. RTDS에는 시퀀스가 전혀 없어서 놓친 메시지가 보이지 않았습니다. 채널별로 seq를 추적하고 건너뛰는 값이 있으면 재동기화 신호로 취급하세요.
  • 원시 1006 대신 유형별 종료 코드: 4001 인증, 4002 느린 소비자, 4003 서버 드레이닝, 4008 정책 위반. 4002는 여러분이 소켓을 비우는 속도가 너무 느리다는 뜻입니다. 네트워크 문제가 아니라 소비자 버그이며, 재연결로는 고쳐지지 않습니다.

value가 아니라 full_accuracy_value를 사용하세요

value는 float이고, full_accuracy_value는 정확한 소수 문자열입니다. TWAP 비교로 정산되는 마켓에서 소수점 여덟째 자리의 float 반올림이 거래를 좌우하게 두고 싶지는 않을 겁니다. 또한 레거시 TWAP 프레임은 window_s와 E18 고정소수점 가격을 사용했습니다. PolyBolt는 소수 문자열을 보내므로 E18 변환을 적용하지 마세요. 적용하면 가격이 18자릿수만큼 어긋납니다.

연결 한도

RTDS는 한도를 공개하지 않았습니다. PolyBolt는 공개하며, 어느 하나라도 넘으면 4008로 소켓이 닫힙니다:

한도값
연결당 구독 수64
초당 구독 프레임20
최대 프레임 크기64 KB
인증 프레임8

계획할 때 고려해야 할 것은 64개 구독 한도입니다. BTC, ETH, SOL을 현물과 TWAP으로 추적하면 6개이므로 암호화폐 봇에는 여유가 충분하지만, 주식 목록 전체로 확장하는 시스템은 한도에 걸릴 것입니다.

봇 마이그레이션 순서

  1. CLOB API 자격 증명이 없다면 파생하세요. RTDS는 공개였지만 PolyBolt는 그렇지 않습니다. 다른 모든 단계를 막는 단계입니다.
  2. URL을 wss://ws-live-v2.polymarket.com/ws로 바꾸세요.
  3. 클라이언트 하트비트를 삭제하세요. 5초 PING 루프는 불필요할 뿐 아니라 이제 잡음입니다. 서버가 25초마다 ping을 보냅니다.
  4. 구독 프레임을 다시 작성하세요. action → op, topic → channel, 그리고 filter는 문자열이 아니라 JSON 객체가 됩니다.
  5. 모든 심볼을 고치세요: btcusdt와 btc/usd는 모두 btcusd가 됩니다. 소문자, USD.
  6. 스냅샷 프레임을 처리해 2분치 백필을 실시간 틱으로 착각하지 않도록 하세요.
  7. seq 누락 감지를 추가하고 건너뛰면 재동기화하세요.
  8. Binance 가격에 맞춰 튜닝한 모든 것을 다시 보정하세요. 이제 소스는 Pyth입니다.

TypeScript SDK를 쓴다면

@polymarket/client 0.11.0 이상이 이를 감싸 줍니다. 인증된 SecureClient에서 client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }])를 호출하고, subscribe 및 update 타입의 이벤트를 순회하면 됩니다. 인증, 프레이밍, 하트비트를 대신 처리해 줍니다. 더 넓은 마이그레이션 내용은 SDK 가이드를 참고하세요.

바뀌지 않는 것

과도하게 마이그레이션하기 쉬우므로 정확히 짚어 두겠습니다. CLOB market 및 user 채널은 바뀌지 않았습니다. wss://ws-subscriptions-clob.polymarket.com/ws/market은 여전히 오더북과 가격 업데이트를 전달하고, 여전히 10초마다 클라이언트 PING을 요구하며, 여전히 best_bid_ask, new_market, market_resolved를 custom_feature_enabled 뒤에 숨겨 둡니다. 옮겨진 것은 기준 가격뿐입니다. 자세한 내용은 WebSocket 가이드에 있습니다.

더 근본적인 한계도 그대로입니다. 스트림은 연결한 순간부터의 가격만 줍니다. 지난 화요일의 오더북 모습은 알려줄 수 없습니다. Polymarket은 결과가 확정된 마켓의 오더북에 대해 404를 반환하고 가격 기록은 약 1분에 한 포인트만 보관하므로, 백테스팅에는 마켓이 진행되는 동안 기록된 아카이브가 필요합니다. Up/Down 마켓의 작동 방식을 보거나 마켓 조회에서 특정 마켓을 찾아보세요.

자주 묻는 질문

PolyBolt는 무엇이며 언제 RTDS를 대체했나요?
PolyBolt는 암호화폐, 주식, TWAP 기준 가격을 위한 Polymarket의 WebSocket으로, 2026년 9월 15일 wss://ws-live-v2.polymarket.com/ws에 출시되었습니다. 기준 가격에 대해 RTDS를 레거시로 전환하며, crypto_prices, crypto_prices_chainlink, equity_prices는 모두 새 PolyBolt 채널로 대응됩니다. comments 토픽은 당분간 RTDS에 남습니다.
PolyBolt에 인증이 필요한가요?
네. 기준 가격 채널에는 CLOB API 자격 증명(키, 시크릿, 패스프레이즈)이 필요하며, 구독하기 전에 열린 연결에 인증 프레임으로 보내야 합니다. 공개였던 RTDS와의 주요 운영상 차이입니다. 구독 프레임을 보내기 전에 서버가 인증을 확인할 때까지 기다리세요.
crypto_prices_chainlink는 무엇으로 대체되었나요?
필터 {"symbol":"btcusd"}를 사용하는 price.crypto 채널입니다. 이름 외에 두 가지가 바뀝니다. 소스가 Chainlink에서 Pyth로 바뀌고, 심볼 형식이 btc/usd에서 소문자 btcusd로 바뀝니다. 60초 Chainlink TWAP에는 window_seconds를 60으로 설정한 price.crypto.twap을 사용하세요. 30초 TWAP 토픽에는 PolyBolt 대체 채널이 없습니다.
PolyBolt에도 클라이언트 PING이 필요한가요?
아니요. RTDS에서는 클라이언트가 5초마다 텍스트 PING을 보냈습니다. PolyBolt에서는 서버가 25초마다 ping을 보내고 클라이언트는 아무것도 보내지 않지만, 선택적인 {"op":"ping"}은 받아들여집니다. 바뀌지 않은 CLOB market 채널은 여전히 10초마다 클라이언트 PING이 필요하다는 점과 다르니 유의하세요.
PolyBolt에 연결되었는데 가격이 오지 않는 이유는 무엇인가요?
거의 항상 심볼 형식 문제입니다. PolyBolt는 usd로 끝나는 소문자 심볼을 사용하므로 btcusdt와 btc/usd는 둘 다 유효하지 않습니다. btcusd를 사용하세요. 잘못된 심볼은 오류를 발생시키지 않고, 구독이 아무것도 전달하지 않을 뿐입니다. 구독 프레임을 보내기 전에 인증이 확인되었는지, 초기 스냅샷 프레임을 유일한 데이터로 착각하고 있지 않은지도 확인하세요.
PolyBolt 종료 코드는 무엇을 뜻하나요?
4001은 인증 실패, 4002는 소켓을 충분히 빨리 비우지 못하는 느린 소비자, 4003은 서버 드레이닝, 4008은 구독 64개, 초당 구독 프레임 20개, 64 KB 프레임, 인증 프레임 8개 초과 같은 정책 위반입니다. 4002는 네트워크 장애가 아니라 소비자의 버그이므로, 처리량을 고치지 않고 재연결하면 같은 일이 반복될 뿐입니다.

Polymarket이 보관하지 않는 과거 데이터를 확보하세요

PolyTest는 Polymarket 암호화폐 Up/Down 마켓을 실시간으로 기록합니다. 8단계 오더북 깊이와 1초 미만 단위 타임스탬프를 갖춘 240M+개의 스냅샷을 제공하며, 결과가 확정된 마켓도 보존합니다. 3일 무료 체험으로 시작하세요.

더 읽어보기