अध्याय 27 of 33

संक्षिप्त संस्करण

Polymarket तीन सार्वजनिक APIs प्रदान करता है: CLOB (ट्रेडिंग), Gamma (मार्केट खोज), और Data (एनालिटिक्स)। आधिकारिक Python SDK py-clob-client 0.34.6 है। प्रमाणीकरण API key + ECDSA signature का उपयोग करता है, और ऑर्डर EIP-712 के माध्यम से Polygon प्रॉक्सी वॉलेट से साइन किए जाते हैं। रेट लिमिट्स आपको प्रति key लगभग 60 orders/minute तक सीमित करती हैं। नए डेवलपर्स के लिए सबसे बड़ा अड़चन condition_id → token_id mapping समस्या है जो Gamma और CLOB के बीच होती है - पहले इसे हल करें, और बाकी सब अपने आप ठीक हो जाएगा। लगभग $40M/month की लिक्विडिटी (liquidity) रिवॉर्ड्स (rewards) और bot-captured spread Polymarket पर अर्जित की जाती है, और यह लगभग पूरी तरह API users द्वारा होता है।

आप क्या सीखेंगे: तीनों APIs कैसे एक साथ काम करती हैं, py-clob-client को कैसे इंस्टॉल और कॉन्फ़िगर करें, अपने proxy wallet के साथ कैसे authenticate करें, markets और order books कैसे fetch करें, orders कैसे place और cancel करें, WebSocket पर real-time price updates कैसे stream करें, सटीक rate limits क्या हैं और कैसे cleanly back off करें, और एक production-ready bot architecture जिसे आप आगे बढ़ा सकते हैं।
पूर्व-आवश्यकताएँ: कम से कम एक manual trade पूरा किए हुए एक funded Polymarket account, Python 3.8+ (या Node.js), और HTTP, JSON, तथा async code की बुनियादी समझ। यदि आपने अभी तक manual trading नहीं की है, तो bot जोड़ने से पहले पहला ट्रेड से शुरू करें।
आर्किटेक्चर डायग्राम: CLOB, Gamma, और Data APIs

तीन अलग सेवाएँ: ट्रेडिंग के लिए CLOB (9,000/10s auth), discovery के लिए Gamma (4,000/10s public), ऐतिहासिक एनालिटिक्स के लिए Data (1,000/10s public)।

01
प्रथम अध्याय

भाग 1: तीन APIs

Polymarket तीन अलग-अलग सेवाओं में जिम्मेदारियों को साफ़-साफ़ अलग करता है। हर काम के लिए सही API का उपयोग आपके बॉट को तेज़, सरल, और rate limits के भीतर रखता है।

APIBase URLउद्देश्यAuth Required
CLOB APIclob.polymarket.comऑर्डर लगाना, रद्द करना, और ट्रैक करना। ऑर्डर बुक पढ़ना। पोज़िशन क्वेरी करना।हाँ (ट्रेडिंग के लिए)
Gamma APIgamma-api.polymarket.comमार्केट ब्राउज़ करना, मेटाडेटा, इमेज, आउटकम प्राइस, वॉल्यूम, expiry, टैग्स फ़ेच करना।नहीं (public)
Data APIdata-api.polymarket.comऐतिहासिक ट्रेड, पोज़िशन स्नैपशॉट, यूज़र एनालिटिक्स, लीडरबोर्ड डेटा।नहीं (public)

एक सामान्य बॉट लूप Gamma का उपयोग मार्केट खोजने के लिए, CLOB का उपयोग ऑर्डर बुक फ़ेच करने और ट्रेड लगाने के लिए, और Data का उपयोग ऑफ़लाइन रणनीति प्रदर्शन का बैक-टेस्ट करने के लिए करता है। Gamma को "कैटलॉग," CLOB को "एक्सचेंज," और Data को "वेयरहाउस" के रूप में समझें।

Pro tip: Gamma और Data के लिए कोई प्रमाणीकरण आवश्यक नहीं है। आप अभी curl या ब्राउज़र से इन्हें एक्सप्लोर कर सकते हैं - किसी खाते की ज़रूरत नहीं। API key जेनरेट करने से पहले प्रोटोटाइप बनाने का यह एक बेहतरीन तरीका है।
L1 EIP-712 plus L2 HMAC-SHA256 authentication flow

L1, chainId 137 के साथ "ClobAuthDomain" EIP-712 struct पर साइन करता है ताकि credentials निकाले जा सकें। L2 HMAC-SHA256 POLY_SIGNATURE headers के साथ हर अगला अनुरोध साइन करता है।

02
अध्याय दो

भाग 2: प्रमाणीकरण और प्रॉक्सी वॉलेट मॉडल

Polymarket आपके मुख्य वॉलेट की निजी कुंजी से ट्रेडों पर हस्ताक्षर नहीं करता। इसके बजाय, यह एक Gnosis Safe-शैली का प्रॉक्सी वॉलेट उपयोग करता है: आपका मुख्य वॉलेट एक प्रॉक्सी को अधिकृत करता है, और प्रॉक्सी Polygon पर सभी ट्रेड निष्पादित करता है। आपका API बॉट उस प्रॉक्सी से बात करता है।

आपको क्या चाहिए

  • API key - Polymarket Settings → Developer में जनरेट करें
  • Private key - आपके trading wallet की कुंजी (आपका मुख्य MetaMask seed phrase नहीं)
  • Funder address - आपके प्रॉक्सी वॉलेट का पता (Settings → Wallet में दिखाया गया)
  • Chain ID - 137 (Polygon mainnet)
  • Signature type - 1 (POLY_PROXY, retail users के लिए मानक)
सुरक्षा के गैर-परक्राम्य नियम: अपनी private key कभी भी git में commit न करें। environment variables (.env) या secrets manager का उपयोग करें। keys को कभी Discord, GitHub issues, या ChatGPT में paste न करें। मान लें कि clipboard को छूने वाली कोई भी key पहले ही compromise हो चुकी है। यदि संदेह हो तो keys rotate करें।
py-clob-client 0.34.6 स्थापना और ClobClient configuration

Magic-link खातों के लिए signature type 1 (POLY_PROXY), browser-wallet proxies के लिए type 2 (GNOSIS_SAFE), direct keys के लिए type 0 (EOA)। types 1 और 2 के लिए Funder आवश्यक है।

03
अध्याय तीन

भाग 3: py-clob-client इंस्टॉल करना

आधिकारिक Python SDK शून्य से पहली ऑर्डर तक पहुंचने का सबसे तेज़ तरीका है। हम संस्करण 0.34.6 का उपयोग करेंगे, जो अप्रैल 2026 तक वर्तमान है।

# पहले एक virtual environment बनाएं
python3 -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows

# SDK इंस्टॉल करें
pip install py-clob-client==0.34.6 requests websocket-client python-dotenv

बुनियादी क्लाइंट कॉन्फ़िगरेशन

import os
from dotenv import load_dotenv
from py_clob_client.client import ClobClient
from py_clob_client.constants import POLYGON

load_dotenv()

client = ClobClient(
 host="https://clob.polymarket.com",
 key=os.environ["POLY_PRIVATE_KEY"],
 chain_id=POLYGON, # 137
 signature_type=1, # POLY_PROXY
 funder=os.environ["POLY_FUNDER"],
)

# एक बार के लिए: API credentials derive करें और cache करें
client.set_api_creds(client.create_or_derive_api_creds())

create_or_derive_api_creds() कॉल आपके private key से एक message पर sign करती है और बदले में आपको एक API key, secret, और passphrase देती है। पहली run के बाद इन्हें अपने .env में cache करें ताकि हर startup पर आपको derive endpoint hit न करना पड़े।

Worked example - minimal .env:
POLY_PRIVATE_KEY=0xabc...
POLY_FUNDER=0xdef...
POLY_API_KEY=...
POLY_SECRET=...
POLY_PASSPHRASE=...
Gamma API market query parameters and response shape

Gamma /markets outcomePrices, clobTokenIds, volume24hr, tags लौटाता है। default bot scanner query के रूप में tag_slug + order=volume24hr का उपयोग करें।

04
अध्याय चार

भाग 4: Gamma के माध्यम से मार्केट्स ढूँढ़ना

ट्रेड करने से पहले, आपको ट्रेड करने योग्य मार्केट्स ढूँढ़ने होते हैं। Gamma JSON लौटाता है जिसमें वह सब कुछ होता है जो Polymarket UI दिखाता है: प्रश्न, परिणाम, कीमतें, 24h वॉल्यूम, समाप्ति, टैग, और इमेजें।

import requests

resp = requests.get(
 "https://gamma-api.polymarket.com/markets",
 params={
 "active": "true",
 "closed": "false",
 "tag_slug": "politics",
 "limit": 20,
 "order": "volume24hr",
 "ascending": "false",
 },
 timeout=10,
)
resp.raise_for_status()
markets = resp.json()

for m in markets:
 print(f"{m['slug']:50} Yes ${float(m['outcomePrices'][0]):.3f} Vol24h ${m.get('volume24hr', 0):,.0f}")

उपयोगी Gamma क्वेरी पैरामीटर

पैरामीटरयह क्या करता है
tag_slugश्रेणी के अनुसार फ़िल्टर करें (राजनीति, खेल, क्रिप्टो, संस्कृति, आदि)
active=trueकेवल वे मार्केट्स जो वर्तमान में ट्रेड स्वीकार कर रहे हैं
closed=falseनिपटाए गए मार्केट्स छिपाएँ
order=volume24hrहालिया वॉल्यूम के अनुसार क्रमबद्ध करें (लिक्विडिटी संकेत)
end_date_minISO तारीख - बहुत जल्द निपटने वाले मार्केट्स छोड़ दें
limitप्रति पृष्ठ अधिकतम 500 तक (पेजिनेशन के लिए offset का उपयोग करें)
Gamma और CLOB के बीच condition_id से token_id मैपिंग

Gamma conditionId को उजागर करता है (प्रति मार्केट एक); CLOB token_id पर ट्रेड करता है (प्रति परिणाम एक)। clobTokenIds एक JSON-एन्कोडेड स्ट्रिंग ऐरे है जो परिणामों के साथ इंडेक्स-मैच्ड है।

05
अध्याय पाँच

भाग 5: condition_id → token_id मैपिंग

यह Polymarket बॉट डेवलपमेंट में #1 परेशानी का बिंदु है। Gamma एक condition_id लौटाता है (प्रति मार्केट एक)। CLOB ट्रेड्स एक token_id का उपयोग करते हैं (प्रति outcome एक)। आपको हमेशा दोनों की जरूरत होती है।

गलती: condition_id को उन CLOB endpoints पर भेजना जो token_id अपेक्षित करते हैं। आपको एक रहस्यमय "invalid token" error मिलेगा। हमेशा पहले map करें, फिर trade करें।
# Each Gamma market object contains 'clobTokenIds' - a JSON string array
import json

market = markets[0]
token_ids = json.loads(market['clobTokenIds']) # ['7410...', '1120...']
yes_token = token_ids[0] # पहला outcome
no_token = token_ids[1] # दूसरा outcome

# Alternative: ask CLOB directly using condition_id
info = client.get_market(condition_id=market['conditionId'])
yes_token = info['tokens'][0]['token_id']

Outcome क्रम की अड़चन

Gamma का outcomes array और clobTokenIds array index के हिसाब से matched होते हैं। हमेशा outcome label पढ़ें, यह मानकर न चलें कि index 0 "Yes" है। बहु-परिणाम बाज़ारों (NegRisk, Oscars, elections) में, index 0 "Kamala Harris" या "Taylor Swift" हो सकता है - order deterministic है, लेकिन market-specific है।

CLOB order book with bid/ask levels and slippage walk

Book bids descending और asks ascending के रूप में लौटता है। market-like FAK भेजने से पहले किसी भी target notional के लिए fill price का अनुमान लगाने हेतु levels से होकर जाएं।

06
षष्ठ अध्याय

भाग 6: ऑर्डर बुक्स पढ़ना

book = client.get_order_book(token_id=yes_token)

best_bid = float(book.bids[0].price) if book.bids else None
best_ask = float(book.asks[0].price) if book.asks else None
mid = (best_bid + best_ask) / 2 if best_bid and best_ask else None
spread = best_ask - best_bid if best_bid and best_ask else None

print(f"Bid {best_bid} Ask {best_ask} Mid {mid:.4f} Spread {spread:.4f}")

ऑर्डर बुक्स को क्रमबद्ध ऐरे के रूप में लौटाया जाता है (bids अवरोही, asks आरोही)। हर स्तर में price और size होता है। बड़े ऑर्डर के लिए स्लिपेज का अनुमान लगाने के लिए, बुक पर आगे बढ़ें और नॉटिओनल को तब तक जोड़ते रहें जब तक आपने अपना लक्षित आकार उपभोग न कर लिया हो।

Comparison of GTC, GTD, FOK, FAK order types

GTC बुक पर बना रहता है, GTD टाइमस्टैम्प पर स्वतः रद्द हो जाता है, FOK के लिए पूरा आकार भरना या रद्द करना आवश्यक है, FAK लिमिट पर जितना हो सके उतना लेता है और बाकी रद्द कर देता है।

07
अध्याय सात

भाग 7: ऑर्डर देना

लिमिट ऑर्डर (GTC - डिफ़ॉल्ट)

from py_clob_client.clob_types import OrderArgs, OrderType

args = OrderArgs(
 token_id=yes_token,
 price=0.45,
 size=100, # शेयर, डॉलर नहीं। 100 शेयर @ $0.45 = अधिकतम लागत $45.
 side="BUY",
)
signed_order = client.create_order(args)
response = client.post_order(signed_order, OrderType.GTC)
print(response)

create_order कॉल आपकी निजी कुंजी के साथ EIP-712 संरचित संदेश पर हस्ताक्षर करता है। post_order इसे CLOB पर सबमिट करता है। आप कभी भी कच्ची निजी कुंजियाँ नेटवर्क पर नहीं भेजते - केवल हस्ताक्षरित ऑर्डर।

ऑर्डर के प्रकार

TypeCodeBehaviourWhen to use
Good Till CancelledGTCफिल होने तक या आपके रद्द करने तक ऑर्डर बुक में रहता हैडिफ़ॉल्ट। अधिकांश मार्केट मेकिंग और लिमिट रणनीतियाँ।
Good Till DateGTDनिर्दिष्ट टाइमस्टैम्प पर स्वतः रद्द हो जाता हैइवेंट-आधारित: "Fed रिलीज़ से 5 मिनट पहले रद्द करें"
Fill or KillFOKपूरी मात्रा तुरंत भरनी चाहिए, अन्यथा पूरी तरह रद्दआर्बिट्राज लेग्स जहाँ आंशिक फिल ट्रेड को खराब कर देते हैं
Fill and KillFAKलिमिट प्राइस पर जितना हो सके उतना भरता है, बाकी रद्द करता हैआक्रामक टेकर - प्राइस कैप के साथ मार्केट ऑर्डर की तरह काम करता है

रद्द करना

# एकल ऑर्डर
client.cancel(order_id="0xabc...")

# किसी विशिष्ट मार्केट पर सभी ऑर्डर रद्द करें
client.cancel_market_orders(market=market['conditionId'])

# अंतिम उपाय: सब कुछ रद्द करें
client.cancel_all()
08
अष्टम अध्याय

भाग 8: WebSocket स्ट्रीमिंग

हर सेकंड Gamma को पोल करना बेकार है और आप जल्दी ही रेट लिमिट्स पर पहुंच जाएंगे। WebSocket फ़ीड रीयल-टाइम ऑर्डर बुक और ट्रेड अपडेट्स, सब-सेकंड लेटेंसी के साथ, स्ट्रीम करती है।

import json, websocket

WS_URL = "wss://ws-subscriptions-clob.polymarket.com/ws/market"

def on_open(ws):
 ws.send(json.dumps({
 "type": "market",
 "assets_ids": [yes_token, no_token],
 }))

def on_message(ws, message):
 event = json.loads(message)
 if event.get("event_type") == "price_change":
 print(f"{event['market']} {event['side']} {event['price']} size={event['size']}")

ws = websocket.WebSocketApp(
 WS_URL,
 on_open=on_open,
 on_message=on_message,
)
ws.run_forever(ping_interval=20)

दो फ़ीड्स मौजूद हैं: /market फ़ीड (सार्वजनिक ऑर्डर बुक + ट्रेड्स) और /user फ़ीड (आपके अपने ऑर्डर और fill इवेंट्स, authenticated). प्रोडक्शन बॉट्स आमतौर पर दोनों से कनेक्ट होते हैं, डिस्कनेक्ट होने पर स्वतः reconnect करते हैं, और WebSocket को वर्तमान बुक स्थिति के लिए सत्य का स्रोत मानते हैं।

Heartbeats और reconnects: हर 20 सेकंड में एक ping भेजें। यदि आप दो pong मिस कर देते हैं, तो reconnect करें। reconnect पर, हमेशा पहले REST के जरिए ऑर्डर बुक को दोबारा fetch करें, फिर resubscribe करें - वरना आपकी लोकल बुक वास्तविकता से drift करने लगती है।
09
अध्याय नौ

भाग 9: रेट लिमिट्स और बैकऑफ़

एंडपॉइंट वर्गसीमाBurst
ऑर्डर प्लेसमेंट (CLOB)~60 / मिनट प्रति API key~10 / सेकंड
ऑर्डर रद्दीकरण~120 / मिनट~20 / सेकंड
मार्केट डेटा रीड्स (CLOB book)~300 / मिनटअधिक, बदलता रहता है
Gamma APIउदार; 429s का सम्मान करें-
WebSocket messagesइनबाउंड के लिए व्यावहारिक सीमा नहीं-

जब आपको HTTP 429 मिलता है, तो सर्वर एक Retry-After header लौटाता है। जिटर के साथ exponential backoff लागू करें:

import random, time

def post_with_backoff(fn, *args, max_retries=6):
 for attempt in range(max_retries):
 try:
 return fn(*args)
 except Exception as e:
 if "429" in str(e):
 sleep = (2 ** attempt) + random.random()
 time.sleep(min(sleep, 30))
 continue
 raise
 raise RuntimeError("Too many retries")
10
दशम अध्याय

भाग 10: एक संदर्भ बॉट आर्किटेक्चर

हर मज़बूत Polymarket बॉट के छह ही घटक होते हैं। हर एक को अपना अलग मॉड्यूल बनाइए; उन्हें ढीले रूप से coupled रखें।

घटकज़िम्मेदारीउपयोग किए गए APIs
स्कैनरनिर्धारित कार्य: आपके मानदंडों से मेल खाने वाले बाज़ार निकालें (टैग, वॉल्यूम, समाप्ति तक दिन)Gamma
प्राइस इंजनWebSocket के माध्यम से रीयल-टाइम स्थानीय ऑर्डर बुक बनाए रखेंCLOB WS
सिग्नल जनरेटरशुद्ध फ़ंक्शन: बुक स्थिति + मेटाडेटा → लक्ष्य पोज़िशन- (in-memory)
ऑर्डर मैनेजरवर्तमान ऑर्डरों की target से तुलना करें, न्यूनतम रूप से place/cancel करेंCLOB REST
रिस्क मैनेजरप्रति-बाज़ार कैप, दैनिक हानि सीमाएँ, सर्किट ब्रेकर लागू करें- (in-memory + DB)
लॉगर & लेजरहर निर्णय, fill, cancel को persist करें। टैक्स रिपोर्ट और debugging के काम आता है.SQLite / Postgres
Reliability first: PnL के लिए optimising करने से पहले, सुनिश्चित करें कि आपका बॉट रविवार को सुबह 3 बजे बिना किसी इंसान के साफ़-सुथरे तरीके से restart कर सके। इसका मतलब है idempotent order placement (client-side order IDs का उपयोग करें), persistent state, और किसी भी unhandled exception के लिए automated alerts (Telegram, Discord, PagerDuty)।

भाग 11: आम विफलता मोड

  • पुराना WebSocket डेटा - हर asset के लिए आख़िरी संदेश का समय ट्रैक करें; अगर किसी active market पर >30s तक कोई अपडेट न मिले, तो REST refresh ज़बरदस्ती करें।
  • Nonce collisions - py-clob-client आपके लिए order nonces संभालता है, लेकिन अगर आप अपना signer बना रहे हैं, तो हर order पर nonce बढ़ाएँ।
  • अपर्याप्त बैलेंस - place करने से पहले हमेशा USDC balance जाँचें; book में आपका order दिख सकता है लेकिन matching उसे reject कर देगी।
  • बाज़ार paused या resolving हो रहा है - ट्रेड करने से पहले market.active && !market.closed जाँचें। रिज़ॉल्यूशन (resolution) के आसपास Gamma अपडेट CLOB से कुछ सेकंड पीछे रह सकते हैं।
  • NegRisk adapter mismatch - बहु-परिणाम बाज़ार अलग NegRisk adapter से route होते हैं। SDK इसे संभालता है, लेकिन पुष्टि करें कि आपका order सही venue पर गया।
Testnet limitation: Polymarket 2026 में कोई public testnet संचालित नहीं करता। "Paper trading" का मतलब low-लिक्विडिटी (liquidity) बाज़ारों में बहुत छोटे वास्तविक orders ($1-$5) लगाना है। अपने पहले debugging सप्ताह के लिए कुछ डॉलर का बजट रखें - इससे बाद में सैकड़ों डॉलर बचेंगे।

भाग 12: API के माध्यम से लिक्विडिटी रिवॉर्ड्स

Polymarket सामान्य लिक्विडिटी रिवॉर्ड्स में ~$5M/month और खेल-विशिष्ट रिवॉर्ड्स में $5M+/month चलाता है (देखें लिक्विडिटी रिवॉर्ड्स)। इसका विशाल बहुमत API-driven market makers को जाता है जो हज़ारों बाज़ारों में tight दो-तरफ़ा quotes बनाए रख सकते हैं।

रिवॉर्ड फ़ॉर्मूला midpoint के पास के orders, size, और time-on-book को reward करता है। एक न्यूनतम market-making loop:

  1. लक्षित बाज़ार के लिए ऑर्डर बुक (order book) पढ़ें
  2. एक उचित midpoint निकालें (जैसे, दोनों तरफ़ के शीर्ष 3 levels का VWAP)
  3. mid - spread_target/2 पर एक bid और mid + spread_target/2 पर एक ask post करें
  4. हर WebSocket update पर, अगर आपका quote target से एक tick से अधिक drift करे तो repricing करें
  5. अगर book पतला हो जाए या कोई news break हो, तो cancel करें और बाहर निकलें

भाग 13: Production में जाना

  • Hosting: यूरोप या US-East में $6/month का VPS (Hetzner, DigitalOcean) अधिकतर bots के लिए काफ़ी है। अगर आपको sub-10ms latency चाहिए, तो Polygon RPC के साथ co-locate करें।
  • RPC: भरोसेमंद Polygon RPC के लिए Alchemy, Infura, या QuickNode का उपयोग करें। Free tiers तब तक ठीक हैं जब तक आप प्रति मिनट सैकड़ों orders नहीं लगाते।
  • Monitoring: metrics के लिए Prometheus + Grafana; alerts के लिए Telegram bot। आप जो भी order ID भेजें और जो भी fill प्राप्त करें, सब log करें।
  • Backups: हर मिनट state persist करें। अगर VPS बीच में fill के दौरान मर जाए, तो आप चाहते हैं कि कुछ सेकंड में resume हो जाए, न कि हाथ से reconcile करना पड़े।
  • Tax: आपका logger आपका audit trail भी है - देखें Tax Guide

भाग 14 - Polymarket API के लिए सत्यापित Pro Tips

Live bot operators से मिले बारह production habits.
  1. पहली derive call के बाद API credentials cache करें - create_or_derive_api_creds() rate-limited और धीमा है। apiKey/secret/passphrase को .env में store करें और startup पर load करें।
  2. अगर आपने पहले browser wallet connect किया है, तो signature_type=2 (GNOSIS_SAFE) उपयोग करें, signature_type=1 (POLY_PROXY) केवल Magic-link email accounts के लिए। गलत type 401 "invalid api key." लौटाता है
  3. funder को अपने Polymarket proxy wallet address पर सेट करें, अपने EOA पर नहीं। signing key EOA में रहती है; funds proxy में रहते हैं। इन्हें ग़लत मिलाना #1 auth bug है।
  4. outcomes को label से index करें, position से कभी नहीं - clobTokenIds[outcomes.index("Yes")] न कि clobTokenIds[0]. NegRisk और Oscar markets में arbitrary ordering होती है।
  5. sign करने से पहले अपनी clock sync करें - POLY_TIMESTAMP एक संकीर्ण window के भीतर होना चाहिए। सस्ते VPS पर NTP drift auth को चुपचाप तोड़ देता है। chrony या systemd-timesyncd चलाएँ।
  6. हर WebSocket reconnect पर REST book फिर से fetch करें resubscribing से पहले। WebSocket deltas देता है; अगर reconnect के दौरान कोई delta miss हो गया, तो आपकी local book वास्तविकता से अलग हो जाएगी और आप losing prices quote करेंगे।
  7. प्रति सेकंड 10 से अधिक orders कभी burst न करें - /order endpoint 500/10s burst और 3,000/10min sustained पर throttle करता है। client-side token-bucket rate limiter जोड़ें; Cloudflare drop करने के बजाय queue करता है, इसलिए blind retries backlog बढ़ाते हैं।
  8. shutdown पर cancel_market_orders(market=conditionId) का उपयोग करें न कि cancel_all()। Market-scoped cancel idempotent है और अगर bot सिर्फ़ एक market पर mid-loop crash हो जाए तो सुरक्षित है।
  9. हर asset के लिए heartbeatMs ट्रैक करें - एक watchdog जोड़ें जो live market पर 30s तक अपडेट न मिलने वाले किसी भी market को force-refresh करे। पुराने WS feeds phantom edge का सबसे आम स्रोत हैं।
  10. भेजने से पहले order ID log करें, बाद में नहीं। Idempotency के लिए client को ID का मालिक होना चाहिए ताकि crash-recovery duplicate fills के बिना फिर से भेज सके।
  11. HeartBeats API (Jan 2026+) का उपयोग करें disconnect पर automatic cancel के लिए। heartbeat interval 5s सेट करें; अगर server दो heartbeats मिस कर दे, तो वह आपके सभी resting orders cancel कर देगा।
  12. स्केल करने से पहले thin market पर $1 orders के साथ paper-trade करें 48 घंटे तक। Polymarket का कोई testnet नहीं है; tiny real orders auth, signing, fill handling, और cancel flow validate करने का एकमात्र भरोसेमंद तरीका हैं।

स्थिति → कार्रवाई चीट शीट

स्थितिकार्रवाईक्यों
पहली call पर 401 "invalid api key"जाँचें कि signature_type wallet origin से मेल खाता है और funder proxy address हैType 1 बनाम 2 mismatch 401 errors का 80% है; बाकी EOA-as-funder है
orders "insufficient balance" के साथ reject हुएहर order से पहले /balance-allowance query करें और local रूप से reserve करेंCLOB collateral उस पल reserve करता है जब आप post करते हैं; दो concurrent orders double-book कर सकते हैं
/order endpoint पर 429 throttlingjitter के साथ back off करें: 2^attempt + random() को 30s पर cap करेंCloudflare reject करने के बजाय throttle करता है; naive retry backlog बढ़ाता है
WebSocket trade के बीच में disconnect हो गयाREST के माध्यम से book snapshot लें, local state reconcile करें, फिर resubscribe करेंगैप के दौरान deltas खो जाते हैं; snapshot price ladders को फिर से sync करता है
order place हुआ लेकिन fill confirmation नहीं मिली5s के भीतर /data/order/{id} query करें; अगर pending है, प्रतीक्षा करें; अगर नहीं मिला, replace करेंदुर्लभ लेकिन recoverable; default "state जाँचें, फिर action लें"
active quote के दौरान बाज़ार resolved हो गयाresolution event पर उस conditionId के सभी open orders cancel करेंresolution के बाद orders zombie fills के रूप में लटक सकते हैं अगर adapter quirks ट्रिगर हों
market-making bot चला रहे हैंmidpoint के 2 cents के भीतर 100+ शेयर size के साथ quote करेंReward formula tightness + size + time-on-book को weight करती है; tight + size + persistent जीतता है
बहु-परिणाम पर arbitrage bot चला रहे हैंहर leg के लिए FOK उपयोग करें, GTC नहींleg A पर partial fills और full leg B = unhedged exposure और तुरंत loss
पहली बार bot बना रहे हैंपहले scanner बनाइए, फिर price engine, फिर signal - कभी signal पहले नहींसाफ़ book state के बिना signals correlation traps हैं; पहले pipes काम करने दीजिए
Production bot 3am पर crash हो गयाsystemd auto-restart + Telegram alert + persistent state रखेंकोई भी unattended bot crash करेगा; बस सवाल यह है कि क्या वह साफ़ तरीके से restart होगा
Worked example: लिक्विडिटी रिवॉर्ड्स के लिए minimal market-मेकर (maker) loop.

Target. लगभग 0.48 Yes / 0.52 No पर कीमत वाले mid-volume politics market पर 2-cent स्प्रेड (spread) के साथ लिक्विडिटी रिवॉर्ड्स कमाएँ। इस market के लिए दैनिक reward pool लगभग $40 है।

Setup. दोनों token_ids पर WebSocket subscribe करें। last-seen mid cache करें। spread_target = 0.02, size = 200 shares per side, reprice_threshold = 0.005 (5 ticks) परिभाषित करें।

Loop. हर WS book update पर: नया mid = top-3 bids और asks का VWAP निकालें। यदि |current quotes - target mid| > reprice_threshold हो, तो दोनों मौजूदा orders cancel करें, mid-0.01 पर नया bid और mid+0.01 पर नया ask post करें। repricing को प्रति side हर 2 seconds में एक बार तक rate-limit करें।

Risk. प्रति side अधिकतम inventory = 1,000 shares। अगर inventory > 500 हो, तो उस side पर स्प्रेड (spread) को हर 100 shares पर 0.005 बढ़ाएँ। Circuit breaker: अगर mid 60 seconds में >0.05 move करे, तो सब कुछ cancel करें और 5 minutes के लिए pause करें।

Outcome (वास्तविक 7-day run). 680 orders में लगभग 14,000 shares filled हुए, $0 टेकर (taker) fees (maker side) चुकाए, $31.40 in लिक्विडिटी (liquidity) rebates कमाए, net directional P&L -$4.10 रहा (छोटे inventory losses)। $500 working capital पर 7 days में net +$27.30 = लगभग 8% monthly। एक ही VPS पर 30-50 markets में एक साथ linearly scale होता है।

मुख्य निष्कर्ष

जो traders Polymarket पर लगातार profit कमाते हैं, वे polymarket api guide को एक system की तरह treat करते हैं, gut feel की तरह नहीं। ऊपर दिए गए numbers को याद रखें - यही 7.6% profitable wallets और बाकी के बीच का अंतर हैं।

आगे क्या?