API · مرجع
لدى Polymarket نظامان للوقت الحقيقي، على مضيفين مختلفين. 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 (بلا مصادقة)
اشترك في معرّف token واحد أو أكثر واستقبل دفتر الأوامر وتحديثاته: لقطة
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 (السوق)، لا معرّف
token. اتصل بـ 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
ws-subscriptions-clob)؛ وأسعار الكريبتو/الأسهم والتعليقات تأتي من RTDS
(ws-live-data). هما خدمتان مختلفتان بحمولات مختلفة.التالي: مرجع CLOB REST · حدود المعدل والتراجع · ابنِ: بثّ دفتر الأوامر في بوت.



