API · مرجع

پلی‌مارکت دو سیستم بلادرنگ روی دو host متفاوت دارد. CLOB WebSocket دفتر سفارشات و به‌روزرسانی سفارش‌های خودتان را استریم می‌کند؛ فید RTDS دادهٔ قیمت زنده (کریپتو، سهام) و کامنت‌ها را استریم می‌کند. قاطی کردن این دو رایج‌ترین اشتباه است - این صفحه آن‌ها را از هم جدا نگه می‌دارد، همراه با endpointهای دقیق، heartbeat، و یک reconnect درست.

دو host
  • CLOB — wss://ws-subscriptions-clob.polymarket.com/ws/ · کانال‌های market (عمومی، دفتر سفارشات)، user (احراز هویت‌شده، سفارش‌ها/پرشدن‌های شما)، sports (وضعیت زندهٔ بازی برای بازارهای ورزشی)، و یک gateway به نام rfq (وضعیت زندهٔ Request-for-Quote - بخش RFQ را ببینید).
  • RTDS — wss://ws-live-data.polymarket.com · topicهای crypto_prices، crypto_prices_chainlink، equity_prices، comments.

کانال market در CLOB (بدون احراز هویت)

به یک یا چند token ID subscribe کنید و دفتر سفارشات و به‌روزرسانی‌ها را دریافت کنید: یک اسنپ‌شات اولیهٔ 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 key/secret/passphrase شما نیاز دارد و با condition_id (بازار) subscribe می‌کنید، نه با token ID. به wss://ws-subscriptions-clob.polymarket.com/ws/user وصل شوید و auth خود را در payloadِ subscribe بگنجانید:

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

یک host جداگانه — wss://ws-live-data.polymarket.com — برای دادهٔ قیمت زنده، نه دفتر سفارشات. به یک topic subscribe کنید: crypto_prices (Binance)، crypto_prices_chainlink (اوراکل Chainlink)، equity_prices، یا comments. برای سیگنال زیربنایی در بات‌های بازار پیش‌بینی کریپتو/سهام مفید است.

Heartbeat و reconnect

  • Heartbeat — تقریباً هر ۱۰ ثانیه یک PING بفرستید؛ سرور با PONG پاسخ می‌دهد. اگر جا بیفتد، اتصال قطع می‌شود.
  • تغییر زنده — می‌توانید روی یک اتصال باز، topicها یا assetها را اضافه/حذف کنید؛ برای تغییر subscription خود نیازی به reconnect ندارید.
  • reconnect درست — پس از هر قطعی، پیش از اعتماد دوباره به به‌روزرسانی‌های افزایشی، اسنپ‌شات دفتر سفارشات را دوباره از REST بگیرید (GET /book). deltaهایی که هنگام قطع بودن جا انداختید از دست رفته‌اند؛ اسنپ‌شات REST دفتر محلی شما را دوباره sync می‌کند.

کل الگو در یک حلقهٔ تاب‌آور - heartbeat، reconnect با backoff، و یک resync از REST در هر (re)connect:

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
hostها را قاطی نکنید. دفتر سفارشات و سفارش‌های شما از host مربوط به CLOB می‌آیند (ws-subscriptions-clob)؛ قیمت‌های کریپتو/سهام و کامنت‌ها از RTDS (ws-live-data) می‌آیند. این‌ها سرویس‌های متفاوتی با payloadهای متفاوت‌اند.

بعدی: مرجع REST مربوط به CLOB · محدودیت‌های نرخ و backoff · ساخت: استریم دفتر سفارشات در یک بات.