API · Довідник

У Полімаркет дві системи реального часу, на двох різних хостах. WebSocket CLOB транслює книгу замовлень і оновлення ваших власних ордерів; стрічка RTDS транслює живі цінові дані (крипто, акції) і коментарі. Плутанина між ними - найпоширеніша помилка - ця сторінка тримає їх окремо, з точними ендпоінтами, серцебиттям і коректним перепідключенням.

Два хости
  • CLOB - wss://ws-subscriptions-clob.polymarket.com/ws/ · канали market (публічний, книга замовлень), user (авторизовано, ваші ордери/виконання), sports (живий стан гри для спортивних ринків) та шлюз rfq (живий стан запиту котирувань - див. розділ RFQ).
  • RTDS - wss://ws-live-data.polymarket.com · теми crypto_prices, crypto_prices_chainlink, equity_prices, comments.

Канал market CLOB (без авторизації)

Підпишіться на один або більше ID токенів і отримуйте книгу замовлень та оновлення: початковий знімок book, потім події price_change, tick_size_change і last_trade_price. Облікові дані не потрібні.

import asyncio, json, websockets

async def stream(token_ids):
    url = "wss://ws-subscriptions-clob.polymarket.com/ws/market"
    async with websockets.connect(url, ping_interval=10) as ws:
        await ws.send(json.dumps({"assets_ids": token_ids, "type": "market"}))
        async for msg in ws:
            evt = json.loads(msg)
            print(evt.get("event_type"), evt)

asyncio.run(stream([TOKEN_ID]))
import WebSocket from "ws";
const ws = new WebSocket("wss://ws-subscriptions-clob.polymarket.com/ws/market");
ws.on("open", () => ws.send(JSON.stringify({ assets_ids: [TOKEN_ID], type: "market" })));
ws.on("message", (d) => console.log(JSON.parse(d)));

Канал user CLOB (авторизація)

Канал user повідомляє про життєвий цикл ваших ордерів (виставлення, зведення, скасування). Він потребує вашого ключа/секрету/парольної фрази API, і ви підписуєтеся за condition_id (ринок), а не за ID токена. Підключіться до wss://ws-subscriptions-clob.polymarket.com/ws/user і включіть авторизацію в навантаження підписки:

await ws.send(json.dumps({
    "type": "user",
    "markets": [CONDITION_ID],          # subscribe by condition_id, not token_id
    "auth": {"apiKey": API_KEY, "secret": SECRET, "passphrase": PASSPHRASE},
}))
# events: "order" (placed/cancelled) and "trade" (your fills)

Цінові стрічки RTDS

Окремий хост - wss://ws-live-data.polymarket.com - для живих цінових даних, а не книг замовлень. Підпишіться на тему: crypto_prices (Binance), crypto_prices_chainlink (оракул Chainlink), equity_prices або comments. Корисно для базового сигналу в крипто/фондових ботах ринків прогнозів.

Серцебиття та перепідключення

  • Серцебиття - надсилайте PING приблизно кожні 10 секунд; сервер відповідає PONG. Пропустите - з'єднання розірветься.
  • Зміна наживо - ви можете додавати/видаляти теми чи активи на відкритому з'єднанні; не потрібно перепідключатися, щоб змінити підписку.
  • Правильне перепідключення - після будь-якого розриву повторно отримайте REST-знімок книги замовлень (GET /book), перш ніж знову довіряти інкрементним оновленням. Транслювані дельти, які ви пропустили під час відключення, зникли; REST-знімок повторно синхронізує вашу локальну книгу.

Увесь патерн в одному стійкому циклі - серцебиття, перепідключення із затримкою і повторна REST-синхронізація на кожному (пере)підключенні:

import asyncio, json, time, requests, websockets

async def resilient_stream(token_id, on_event):
    url = "wss://ws-subscriptions-clob.polymarket.com/ws/market"
    backoff = 1
    while True:
        try:
            async with websockets.connect(url, ping_interval=10) as ws:
                # 1) REST snapshot first so the local book is correct before deltas
                book = requests.get("https://clob.polymarket.com/book",
                                    params={"token_id": token_id}).json()
                on_event({"event_type": "snapshot", "book": book})
                # 2) subscribe and stream
                await ws.send(json.dumps({"assets_ids": [token_id], "type": "market"}))
                backoff = 1                       # reset after a clean connect
                async for msg in ws:
                    on_event(json.loads(msg))
        except Exception as e:
            print("ws drop, resync in", backoff, "s:", e)
            await asyncio.sleep(backoff)
            backoff = min(backoff * 2, 30)        # exponential backoff, capped
Не плутайте хости. Книги замовлень і ваші ордери надходять із хоста CLOB (ws-subscriptions-clob); крипто/фондові ціни й коментарі - з RTDS (ws-live-data). Це різні сервіси з різними навантаженнями.

Далі: Довідник REST CLOB · Ліміти частоти та затримка · Побудова: транслювати книгу в боті.