API · עיון

ה-CLOB (Central Limit Order Book) בכתובת clob.polymarket.com הוא המקום שבו פקודות ממתינות ומתמזגות. אתם קוראים את ספר הפקודות, המחירים וגודל הטיק ללא אימות, וסוחרים (ביצוע / ביטול פקודות, קריאת היתרה שלכם) עם פרטי הזדהות של API וחתימה. זהו עיון ב-CLOB V2 - הבטוחה היא pUSD, העמלות הן און-צ׳יין, ועושי שוק משלמים אפס.

קריאת ספר הפקודות (ללא אימות)

from py_clob_client_v2 import ClobClient   # pip install py-clob-client-v2
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)   # read-only: no key
book = client.get_order_book(token_id)
mid  = client.get_midpoint(token_id)
print(book.bids[0].price, book.asks[0].price, mid)
// polymarket_client_sdk_v2 (official, repo rs-clob-client-v2)
use polymarket_client_sdk_v2::clob::{Client, Config};
use polymarket_client_sdk_v2::clob::types::request::OrderBookSummaryRequest;
let client = Client::new("https://clob.polymarket.com", Config::default())?;
let book = client.order_book(&OrderBookSummaryRequest::builder().token_id(token_id).build()).await?;
curl -s "https://clob.polymarket.com/book?token_id=$TOKEN_ID"

תגובה לדוגמה

{
  "market": "0x...",
  "bids": [ { "price": "0.62", "size": "1400" }, { "price": "0.61", "size": "900" } ],
  "asks": [ { "price": "0.64", "size": "1100" }, { "price": "0.65", "size": "2000" } ]
}

endpoints לקריאה

Endpointמחזיר
GET /book?token_id=ספר פקודות מלא (bids / asks).
GET /price?token_id=&side=ה-bid או ה-ask הטוב ביותר.
GET /midpoint?token_id=אמצע = (best bid + best ask) / 2.
GET /spread?token_id=best ask − best bid.
GET /tick-size?token_id=תוספת המחיר המינימלית (עגלו אליה את המחיר שלכם).

המגבלות גבוהות: CLOB כ-9,000 בקשות / 10 שניות, /book ו-/price 1,500 / 10 שניות, ובקשות מעבר למגבלה נחנקות, לא נדחות. עוד על 429.

ביצוע וביטול פקודה (אימות)

קריאה אחת בונה, חותמת (על מבנה הפקודה של V2) ומפרסמת את הפקודה שלכם. אתם בוחרים סוג פקודה:

סוגהתנהגות
GTCGood-Till-Cancelled - ממתינה בספר הפקודות עד שתתמלא או תבוטל.
GTDGood-Till-Date - ממתינה עד חותמת זמן של פקיעה.
FOKFill-Or-Kill - למלא את כל הפקודה מיד או לבטל אותה.
FAKFill-And-Kill - למלא את מה שאפשר מיד, לבטל את השאר.
from py_clob_client_v2 import (ClobClient, OrderArgs, OrderType,
                               PartialCreateOrderOptions, Side, OrderPayload)

# authenticated client (creds from create_or_derive_api_key - see Authentication)
client = ClobClient(host="https://clob.polymarket.com", chain_id=137, key=PK, creds=creds)

resp = client.create_and_post_order(
    order_args=OrderArgs(token_id=token_id, price=0.62, side=Side.BUY, size=10),
    options=PartialCreateOrderOptions(tick_size="0.01", neg_risk=False),  # read both off the market
    order_type=OrderType.GTC,            # GTC, GTD, FOK or FAK
)
# resp -> {"success": true, "orderID": "0x...", "status": "live"}
client.cancel_order(OrderPayload(orderID=resp["orderID"]))   # cancel
שתי הגדרות לכל שוק. העבירו את ה-tick_size האמיתי של השוק ("0.01" או "0.001") והגדירו neg_risk=True לשווקי "סיכון שלילי" רב-תוצאתיים - קראו את שניהם מ-Gamma (orderPriceMinTickSize, negRisk) לפני החתימה. כמו כן: גודל הפקודה המינימלי הוא 5 מניות, והמחיר שלכם חייב להיות כבר מעוגל לטיק אחרת הפקודה נדחית.
עובדות על פקודת V2. המבנה החתום השמיט את nonce, feeRateBps, taker ו-expiration והוסיף timestamp, metadata ו-builder; גרסת דומיין ה-Exchange ב-EIP-712 היא "2". העמלות נגבות און-צ׳יין בזמן ההתאמה - עושי שוק משלמים 0, רק לוקחים משלמים. לפני מסחר עליכם לאשר pUSD + טוקנים מותנים לשלושת חוזי ה-V2 (ראו את תיקון ההרשאה).

עמלות: רק לוקחים משלמים, והשיעור מתעקל

עושי שוק לעולם אינם מחויבים. לוקחים משלמים עמלה שאינה קבועה - היא מתכווננת עם אי-הוודאות של השוק ומשתנה לפי קטגוריה. הנוסחה:

fee = shares × feeRate × p × (1 - p)      # p = share price, 0..1

האיבר p·(1-p) אומר שהעמלה שיאה ב-50/50 ומצטמצמת לקראת קצוות ה-1 סנט וה-99 סנט - כך שתוצאה כמעט-ודאית זולה לקחת, והטלת מטבע יקרה. feeRate של לוקח לפי קטגוריה:

קטגוריהfeeRate של לוקח
קריפטו0.07 (7 bps) - הגבוה ביותר
כלכלה / תרבות / מזג אוויר0.05
פיננסים / פוליטיקה / טכנולוגיה / אזכורים0.04
ספורט0.03
גיאופוליטיקה ואירועי עולם0 - ללא עמלה

קראו את השיעור החי לכל טוקן עם GET /fee-rate-bps?token_id= במקום לקבוע אותו בקוד קשיח; העמלות מעוגלות ל-5 ספרות עשרוניות (מינימום 0.00001 pUSD). העובדה שעושי שוק משלמים אפס היא הסיבה שרוב הבוטים חסרי-היתרון מצטטים במקום לקחת.

שווקי סיכון-שלילי (רב-תוצאתיים)

אירועים רב-מועמדים ("מי ינצח בבחירות?") הם שווקי neg-risk: התוצאות שלהם מקושרות, כך שמניית No בתוצאה אחת מומרת למניית Yes בכל תוצאה אחרת דרך ה-Neg Risk Adapter - יעיל-הון, אך שונה מכנית. הם רצים על חוזים שונים משווקים בינאריים, ולכן חובה להעביר neg_risk=True באפשרויות הפקודה (קראו את דגל ה-negRisk של השוק מ-Gamma). השמיטו אותו והפקודה תיחתם מול הבורסה השגויה ותידחה.

טוקנים מותנים: split, merge, redeem (מעבר לספר הפקודות)

מתחת לכל שוק נמצא ה-Conditional Token Framework (CTF). טוקני התוצאה הם טוקני ERC-1155, וכל זוג Yes/No מגובה בדיוק ב-1.00$ של pUSD הנעול בחוזה ה-CTF. זה נותן לכם שלושה פרימיטיבים שספר הפקודות לבדו אינו נותן:

פעולהמה היא עושהמדוע בוט משתמש בה
Splitלנעול 1$ pUSD ← לטבוע 1 Yes + 1 Noליצור מלאי בלי לחצות את המרווח; לצטט את שני הצדדים.
Mergeלשרוף 1 Yes + 1 No ← לשחזר 1$ pUSDלצאת מזוג מגודר מיד - ללא המתנה להכרעה, ללא עמלת לוקח.
Redeemאחרי הכרעה, טוקן מנצח ← 1.00$ pUSDלפדות פוזיציה מוכרעת (redeemPositions).

Split ו-merge הם הבסיס ל-ארביטראז' CTF: אם Yes + No נסחרים מתחת ל-1.00$ בספר הפקודות, קנו את שניהם ו-merge חזרה ל-1.00$; אם הם נסחרים מעל 1.00$, split של 1$ לזוג חדש ומכרו את שניהם. הפדיון מתיישב דרך חוזה ה- ConditionalTokens ברגע שהאורקל מפרסם את התוצאה און-צ׳יין - פוזיציה מציגה redeemable: true ב-Data API כשהיא ניתנת לתביעה. מזהי פוזיציה נגזרים דרך getConditionId → getCollectionId → getPositionId.

מתקדם: RFQ ושווקי קומבו (לעושי שוק רציניים)

מעבר לספר הפקודות, פולימרקט מפעילה מערכת Request-for-Quote (RFQ), בשימוש במיוחד עבור שווקי קומבו - שווקים קיימים המקובצים לפוזיציות מורכבות רב-רגליות. לזרימה שלושה שלבים: לוקח מבקש ציטוט, עושי שוק מתחרים בציטוטים, ועושה השוק הנבחר מקבל מבט אחרון לאשר או לסרב לפני הביצוע.

  • גילוי קומבואים: GET /v1/rfq/combo-markets (ציבורי; limit 1-100, cursor, exclude). כל קומבו חושף שני מזהי פוזיציה (Yes = אינדקס 0, No = אינדקס 1).
  • ציטוט כעושה שוק: POST combos-rfq-api.polymarket.com/v1/maker/quotes (אימות L2). אתם מייצרים בעצמכם את ה-quote_id, ושולחים rfq_id, maker_address, signature_type, פקודת Exchange חתומה, ו-price_e6 / size_e6 כ- מחרוזות נקודה-קבועה של שש ספרות עשרוניות (מוסכמת ה-*_e6 מונעת אובדן דיוק float).
  • מבט אחרון: בזמן שה-RFQ הוא AWAITING_MAKER_CONFIRMATION, השיבו CONFIRM, DECLINE, או תנו לו TIMED_OUT.

מכונת המצבים של RFQ: CREATED → COLLECTING_QUOTES → AWAITING_REQUESTER_ACCEPTANCE → AWAITING_MAKER_CONFIRMATION → EXECUTING → FILLED (אחרת FAILED / EXPIRED / CANCELED / REJECTED). הירשמו לשער ה-WebSocket של RFQ למצב חי. זה נישתי - רוב הבוטים צריכים רק את ספר הפקודות של CLOB למעלה - אך כך נזילות רב-רגלית וקומבו מתומחרת.

בדיקת יתרה והרשאה

client.get_balance_allowance(...)   # collateral (pUSD) and conditional-token allowances

אם זה מציג הרשאה אפס, אשרו pUSD/CTF לחוזי בורסת ה-V2 לפני ביצוע פקודות.

מזהי טוקן Yes / No. לכל שוק בינארי שני מזהי טוקן. אל תקבעו בקוד קשיח איזה הוא Yes - קראו את מערך ה-outcomes המפוענח (Gamma מחזיר אותו, ואת clobTokenIds, כמחרוזות מקודדות-JSON שיש לפענח) ומפו לפי שם.

הבא: אימות וארנקים · WebSocket: שידור ספר הפקודות · תיקון שגיאת CLOB.