অধ্যায় 27 এর 33

সংক্ষিপ্ত সংস্করণ

Polymarket তিনটি পাবলিক API উন্মুক্ত করে: CLOB (ট্রেডিং), Gamma (মার্কেট ডিসকভারি), এবং Data (অ্যানালিটিক্স)। অফিসিয়াল Python SDK হলো py-clob-client 0.34.6। অথেনটিকেশন ব্যবহার করে API key + ECDSA signature, যেখানে অর্ডারগুলো সাইন করা হয় একটি Polygon proxy wallet-এর মাধ্যমে EIP-712 দিয়ে। Rate limits আপনাকে প্রতি কী-এ আনুমানিক 60 orders/minute-এ সীমাবদ্ধ রাখে। নতুন ডেভেলপারদের জন্য সবচেয়ে বড় সমস্যা হলো Gamma এবং CLOB-এর মধ্যে condition_id → token_id ম্যাপিং সমস্যা - আগে এটা সমাধান করুন, তারপর বাকি সব সহজ হয়ে যাবে। আনুমানিক $40M/month লিকুইডিটি রিওয়ার্ড এবং বট-ক্যাপচারড স্প্রেড Polymarket-এ আয় করা হয়, প্রায় পুরোটা API ব্যবহারকারীদের মাধ্যমে।

আপনি কী শিখবেন: তিনটি API কীভাবে একসাথে কাজ করে, py-clob-client কীভাবে ইনস্টল ও কনফিগার করতে হয়, আপনার proxy wallet দিয়ে কীভাবে অথেনটিকেট করতে হয়, কীভাবে মার্কেট এবং অর্ডার বুক ফেচ করতে হয়, কীভাবে অর্ডার প্লেস ও ক্যানসেল করতে হয়, কীভাবে WebSocket-এর মাধ্যমে রিয়েল-টাইম প্রাইস আপডেট স্ট্রিম করতে হয়, সুনির্দিষ্ট rate limits কী, এবং কীভাবে ঠিকভাবে ব্যাক অফ করতে হয়, আর এমন একটি production-ready bot architecture যেটা আপনি প্রসারিত করতে পারবেন।
পূর্বশর্ত: অন্তত একটি ম্যানুয়াল ট্রেড সম্পন্ন করা আছে এমন একটি ফান্ডেড Polymarket অ্যাকাউন্ট, Python 3.8+ (অথবা Node.js), এবং HTTP, JSON, ও async কোড সম্পর্কে মৌলিক ধারণা। আপনি যদি এখনও ম্যানুয়ালি ট্রেড না করে থাকেন, তাহলে bot সংযোগ করার আগে প্রথম ট্রেড দিয়ে শুরু করুন।
Architecture diagram: CLOB, Gamma, and Data APIs

তিনটি পৃথক সার্ভিস: ট্রেডিংয়ের জন্য CLOB (9,000/10s auth), ডিসকভারির জন্য Gamma (4,000/10s public), ঐতিহাসিক অ্যানালিটিক্সের জন্য Data (1,000/10s public)।

01
প্রথম অধ্যায়

পর্ব ১: তিনটি API

Polymarket তিনটি পৃথক সার্ভিসের মধ্যে কাজগুলো পরিষ্কারভাবে ভাগ করে দেয়। প্রতিটি কাজের জন্য সঠিক API ব্যবহার করলে আপনার বট দ্রুত, সহজ, এবং রেট লিমিটের মধ্যে থাকে।

APIBase URLউদ্দেশ্যAuth Required
CLOB APIclob.polymarket.comঅর্ডার দেওয়া, বাতিল করা, এবং ট্র্যাক করা। অর্ডার বুক পড়া। পজিশন কুয়েরি করা।Yes (for trading)
Gamma APIgamma-api.polymarket.comমার্কেট ব্রাউজ করা, মেটাডাটা, ছবি, আউটকাম প্রাইস, ভলিউম, expiry, ট্যাগ ফেচ করা।No (public)
Data APIdata-api.polymarket.comঐতিহাসিক ট্রেড, পজিশন স্ন্যাপশট, ইউজার অ্যানালিটিক্স, লিডারবোর্ড ডেটা।No (public)

একটি সাধারণ বট লুপে Gamma ব্যবহার করা হয় মার্কেট খুঁজতে, CLOB ব্যবহার করা হয় অর্ডার বুক ফেচ করতে এবং ট্রেড দিতে, আর Data ব্যবহার করা হয় অফলাইনে স্ট্র্যাটেজির পারফরম্যান্স ব্যাক-টেস্ট করতে। Gamma-কে ভাবুন "catalog," CLOB-কে "exchange," আর Data-কে "warehouse."

Pro tip: Gamma এবং Data-এর জন্য কোনো authentication লাগে না। আপনি এখনই curl বা ব্রাউজার দিয়ে এগুলো দেখতে পারেন - কোনো অ্যাকাউন্ট দরকার নেই। API key তৈরি করার আগেই প্রোটোটাইপ বানানোর এটি দারুণ একটি উপায়।
L1 EIP-712 plus L2 HMAC-SHA256 authentication flow

L1 chainId 137 দিয়ে "ClobAuthDomain" EIP-712 struct সাইন করে credentials ডেরাইভ করে। L2 HMAC-SHA256 প্রতিটি পরবর্তী request-এ POLY_SIGNATURE headers দিয়ে সাইন করে।

02
দ্বিতীয় অধ্যায়

পর্ব 2: প্রমাণীকরণ & প্রক্সি ওয়ালেট মডেল

Polymarket আপনার মূল ওয়ালেটের প্রাইভেট কী দিয়ে ট্রেডে সাইন করে না। বরং, এটি একটি Gnosis Safe-স্টাইলের প্রক্সি ওয়ালেট ব্যবহার করে: আপনার মূল ওয়ালেট একটি প্রক্সিকে অনুমোদন করে, আর সেই প্রক্সি Polygon-এ সব ট্রেড এক্সিকিউট করে। আপনার API বট সেই প্রক্সির সাথে যোগাযোগ করে।

আপনার যা লাগবে

  • API key - Polymarket Settings → Developer-এ জেনারেট করুন
  • Private key - আপনার ট্রেডিং ওয়ালেটের কী (আপনার মূল MetaMask seed phrase নয়)
  • Funder address - আপনার প্রক্সি ওয়ালেটের ঠিকানা (Settings → Wallet-এ দেখানো)
  • Chain ID - 137 (Polygon mainnet)
  • Signature type - 1 (POLY_PROXY, খুচরা ব্যবহারকারীদের জন্য স্ট্যান্ডার্ড)
অপরিহার্য নিরাপত্তা নিয়ম: কখনও আপনার প্রাইভেট কী git-এ commit করবেন না। environment variables (.env) বা secrets manager ব্যবহার করুন। কখনও Discord, GitHub issues, বা ChatGPT-তে কী paste করবেন না। আপনার clipboard-এ স্পর্শ করা যেকোনো কী ইতিমধ্যেই compromise হয়েছে ধরে নিন। সন্দেহ হলে কী rotate করুন।
py-clob-client 0.34.6 installation and ClobClient configuration

Magic-link অ্যাকাউন্টের জন্য Signature type 1 (POLY_PROXY), browser-wallet proxy-এর জন্য type 2 (GNOSIS_SAFE), direct key-এর জন্য type 0 (EOA)। type 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-এর সঙ্গে exchange করে। প্রথম 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 query parameters

Parameterএটি কী করে
tag_slugশ্রেণি অনুযায়ী ফিল্টার করে (politics, sports, crypto, culture, ইত্যাদি)
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-এনকোড করা string array, যা outcomes-এর সঙ্গে index-matched।

05
পঞ্চম অধ্যায়

পর্ব ৫: condition_id → token_id ম্যাপিং

Polymarket বট ডেভেলপমেন্টে এটি #১ বড় সমস্যা। Gamma একটি condition_id ফেরত দেয় (প্রতি মার্কেটে একটী)। CLOB ট্রেডে ব্যবহৃত হয় token_id (প্রতি outcome-এ একটী)। আপনার সবসময়ই দুটোই দরকার।

ভুলটি: condition_id এমন CLOB endpoint-এ পাঠানো, যা token_id আশা করে। তাহলে আপনি একটি বিভ্রান্তিকর "invalid token" error পাবেন। সবসময় আগে ম্যাপ করুন, তারপর ট্রেড করুন।
# প্রতিটি Gamma market object-এ 'clobTokenIds' থাকে - এটি একটি 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

# বিকল্প: condition_id ব্যবহার করে সরাসরি CLOB-কে জিজ্ঞাসা করুন
info = client.get_market(condition_id=market['conditionId'])
yes_token = info['tokens'][0]['token_id']

Outcome ordering gotcha

Gamma-এর outcomes array এবং clobTokenIds array-এর index একে অন্যের সঙ্গে মিলে যায়। সবসময় index 0 কে "Yes" ধরে না নিয়ে outcome label পড়ুন। multi-outcome market-এ (NegRisk, Oscars, নির্বাচন), index 0 হতে পারে "Kamala Harris" বা "Taylor Swift" - order নির্ধারিত, কিন্তু market-specific।

CLOB order book with bid/ask levels and slippage walk

Book bids descending এবং asks ascending হিসেবে ফেরত আসে। market-like FAK পাঠানোর আগে যেকোনো target notional-এর fill price অনুমান করতে level গুলো ধরে এগোন।

06
ষষ্ঠ অধ্যায়

অংশ ৬: অর্ডার বুক পড়া

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 থাকে। বড় অর্ডারের জন্য স্লিপেজ অনুমান করতে, বুক বরাবর এগিয়ে যান এবং আপনার লক্ষ্যমাত্রা সাইজ পূরণ না হওয়া পর্যন্ত notional জমা করুন।

GTC, GTD, FOK, FAK order types-এর তুলনা

GTC বুকের ওপর থাকে, GTD timestamp-এ স্বয়ংক্রিয়ভাবে বাতিল হয়, 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, # শেয়ার, ডলার নয়। 0.45 ডলারে 100 শেয়ার = সর্বোচ্চ 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নির্দিষ্ট timestamp-এ স্বয়ংক্রিয়ভাবে ক্যানসেল হয়ইভেন্ট-চালিত: "Fed release-এর 5 মিনিট আগে ক্যানসেল করুন"
Fill or KillFOKসম্পূর্ণ সাইজ সঙ্গে সঙ্গে ফিল হতে হবে, নইলে পুরোপুরি ক্যানসেল হবেআরবিট্রাজ লেগ, যেখানে আংশিক ফিল ট্রেড নষ্ট করে দেয়
Fill and KillFAKলিমিট প্রাইসে যতটা পারে ফিল করে, বাকি অংশ ক্যানসেল করেআক্রমণাত্মক টেকিং - প্রাইস ক্যাপসহ মার্কেট অর্ডারের মতো কাজ করে

ক্যানসেল করা

# Single order
client.cancel(order_id="0xabc...")

# নির্দিষ্ট একটি মার্কেটে সব অর্ডার ক্যানসেল করুন
client.cancel_market_orders(market=market['conditionId'])

# Nuclear option: সবকিছু ক্যানসেল করুন
client.cancel_all()
08
অধ্যায় আট

অংশ 8: WebSocket স্ট্রিমিং

প্রতি সেকেন্ডে Gamma পোল করা অপচয়, আর এতে দ্রুতই আপনি rate limit-এ পৌঁছে যাবেন। WebSocket feed সাব-সেকেন্ড লেটেন্সিতে রিয়েল-টাইম অর্ডার বুক (order book) এবং ট্রেড আপডেট স্ট্রিম করে।

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)

দুটি feed আছে: /market feedটি (পাবলিক order book + trades) এবং /user feedটি (আপনার নিজের order এবং fill ইভেন্ট, authenticated)। Production bot-গুলো সাধারণত দুটিতেই connect করে, disconnect হলে স্বয়ংক্রিয়ভাবে reconnect করে, এবং বর্তমান book state-এর source of truth হিসেবে WebSocket-কে ধরে।

Heartbeats and reconnects: প্রতি 20 সেকেন্ডে একটি ping পাঠান। যদি আপনি দুটি pong মিস করেন, reconnect করুন। Reconnect-এর সময় সবসময় আগে REST দিয়ে order book আবার fetch করুন, তারপর resubscribe করুন - নইলে আপনার local book বাস্তবতা থেকে সরে যাবে।
09
অধ্যায় নয়

পর্ব 9: রেট লিমিট ও ব্যাকঅফ

Endpoint classLimitBurst
অর্ডার প্লেসমেন্ট (CLOB)~60 / মিনিট প্রতি API key~10 / সেকেন্ড
অর্ডার বাতিলকরণ~120 / মিনিট~20 / সেকেন্ড
মার্কেট ডেটা রিডস (CLOB book)~300 / মিনিটবেশি, ভিন্ন হয়
Gamma APIউদার; 429 মেনে চলুন-
WebSocket messagesInbound-এর জন্য বাস্তবে কোনো সীমা নেই-

আপনি যখন একটি 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
দশম অধ্যায়

Part 10: একটি রেফারেন্স বট আর্কিটেকচার

প্রতি শক্তিশালী Polymarket বটের একই ছয়টি কম্পোনেন্ট থাকে। প্রতিটিকে আলাদা মডিউল হিসেবে তৈরি করুন; সেগুলোকে ঢিলেঢালা ভাবে যুক্ত রাখুন।

কম্পোনেন্টদায়িত্বব্যবহৃত API
Scannerশিডিউলড জব: আপনার মানদণ্ডের সাথে মেলে এমন মার্কেট টেনে আনা (tags, volume, expiry পর্যন্ত দিন)Gamma
Price engineWebSocket-এর মাধ্যমে রিয়েল-টাইম লোকাল অর্ডার বুক বজায় রাখাCLOB WS
Signal generatorPure function: বুকের অবস্থা + metadata → target position- (in-memory)
Order managerবর্তমান অর্ডার বনাম target-এর পার্থক্য নির্ণয়, ন্যূনতম পরিমাণে place/cancel করাCLOB REST
Risk managerপ্রতি মার্কেটের cap, দৈনিক ক্ষতির সীমা, circuit breaker প্রয়োগ- (in-memory + DB)
Logger & ledgerপ্রতিটি সিদ্ধান্ত, fill, cancel সংরক্ষণ করা। করের রিপোর্ট এবং ডিবাগিং-এ সহায়তা করে।SQLite / Postgres
নির্ভরযোগ্যতা আগে: PnL অপ্টিমাইজ করার আগে, নিশ্চিত করুন যে আপনার বট রবিবার ভোর ৩টায় কোনো মানুষের সাহায্য ছাড়াই পরিষ্কারভাবে restart করতে পারে। এর মানে হলো idempotent order placement (client-side order IDs ব্যবহার করুন), persistent state, এবং যেকোনো unhandled exception-এর জন্য automated alerts (Telegram, Discord, PagerDuty)।

Part 11: সাধারণ ব্যর্থতার ধরন

  • Stale WebSocket data - প্রতিটি asset-এর শেষ message-এর সময় ট্র্যাক করুন; active market-এ যদি 30s-এর বেশি কোনো update না আসে, তাহলে REST refresh বাধ্যতামূলক করুন।
  • Nonce collisions - py-clob-client আপনার জন্য order nonce সামলায়, কিন্তু আপনি যদি নিজে signer বানান, তাহলে প্রতিটি order-এ nonce বাড়ান।
  • Insufficient balance - place করার আগে সবসময় USDC balance পরীক্ষা করুন; book-এ আপনার order দেখালেও matching সেটি reject করবে।
  • Market paused or resolving - trading-এর আগে market.active && !market.closed পরীক্ষা করুন। রেজল্যুশন (resolution)-এর আশেপাশে Gamma update, CLOB-এর তুলনায় কয়েক সেকেন্ড পিছিয়ে থাকে।
  • NegRisk adapter mismatch - multi-outcome market আলাদা NegRisk adapter-এর মাধ্যমে route হয়। SDK এটি সামলায়, কিন্তু আপনার order সঠিক venue-তে গেছে কি না নিশ্চিত করুন।
Testnet limitation: Polymarket 2026 সালে কোনো public testnet চালায় না। "Paper trading" মানে low-তারল্য (liquidity) market-এ ছোট real order ($1-$5) দেওয়া। আপনার প্রথম সপ্তাহের debugging-এর জন্য কয়েক ডলার বাজেট রাখুন - পরে এটি আপনাকে শত শত ডলার বাঁচাবে।

Part 12: API-এর মাধ্যমে Liquidity পুরস্কার (rewards)

Polymarket সাধারণ liquidity rewards-এ মাসে ~$5M এবং sports-specific rewards-এ মাসে $5M+ চালায় (দেখুন Liquidity Rewards)। এর বিশাল অংশই API-চালিত market মেকার (maker)-দের কাছে যায়, যারা হাজার হাজার market জুড়ে tight দুই-দিকের quote বজায় রাখতে পারে।

reward formula midpoint-এর কাছাকাছি order, size, এবং time-on-book-কে পুরস্কৃত করে। একটি ন্যূনতম market-making loop:

  1. target market-এর অর্ডার বুক (order book) পড়ুন
  2. একটি fair midpoint হিসাব করুন (যেমন, প্রতিটি পাশে top 3 level-এর VWAP)
  3. mid − spread_target/2-এ একটি bid এবং mid + spread_target/2-এ একটি ask দিন
  4. প্রতিটি WebSocket update-এ, আপনার quote target থেকে এক tick-এর বেশি সরে গেলে repricing করুন
  5. book পাতলা হয়ে গেলে বা news প্রকাশ পেলে cancel করে বেরিয়ে যান

Part 13: Production-এ যাওয়া

  • Hosting: ইউরোপ বা US-East-এ $6/month VPS (Hetzner, DigitalOcean) বেশিরভাগ bot-এর জন্য যথেষ্ট। sub-10ms latency দরকার হলে Polygon RPC-এর সাথে co-locate করুন।
  • RPC: নির্ভরযোগ্য Polygon RPC-এর জন্য Alchemy, Infura, বা QuickNode ব্যবহার করুন। প্রতি মিনিটে শত শত order না দেওয়া পর্যন্ত free tier যথেষ্ট।
  • Monitoring: metrics-এর জন্য Prometheus + Grafana; alert-এর জন্য একটি Telegram bot। আপনি যে প্রতিটি order ID পাঠান এবং যে প্রতিটি fill পান, সব log করুন।
  • Backups: প্রতি মিনিটে state সংরক্ষণ করুন। VPS মাঝপথে die করলে, আপনি কয়েক সেকেন্ডে resume করতে চাইবেন, হাতে reconcile করতে নয়।
  • Tax: আপনার logger-ই আপনার audit trail - দেখুন Tax Guide

Part 14 - Polymarket API-এর জন্য যাচাইকৃত Pro Tips

লাইভ bot operator-দের কাছ থেকে production-এর বারোটি habit।
  1. প্রথম derive call-এর পরে API credentials cache করুন - create_or_derive_api_creds() rate-limited এবং ধীর। apiKey/secret/passphrase .env-এ সংরক্ষণ করুন এবং startup-এ load করুন।
  2. আপনি যদি প্রথমে browser wallet connect করে থাকেন, তাহলে signature_type=2 (GNOSIS_SAFE) ব্যবহার করুন, আর Magic-link email account-এর জন্য কেবল signature_type=1 (POLY_PROXY) ব্যবহার করুন। mismatched type 401 "invalid api key." ফেরত দেয়।
  3. funder-কে আপনার Polymarket proxy wallet address-এ সেট করুন, EOA-তে নয়। signing key থাকে EOA-তে; funds থাকে proxy-তে। এগুলো গুলিয়ে ফেলা #1 auth bug।
  4. outcome-গুলোকে label দিয়ে index করুন, position দিয়ে নয় - clobTokenIds[outcomes.index("Yes")], clobTokenIds[0] নয়। NegRisk এবং Oscar market-এ arbitrary ordering থাকে।
  5. sign করার আগে আপনার clock sync করুন - POLY_TIMESTAMP সংকীর্ণ window-এর মধ্যে থাকতে হবে। সস্তা VPS-এ NTP drift নীরবে auth ভেঙে দেয়। chrony বা systemd-timesyncd চালান।
  6. প্রতিটি WebSocket reconnect-এ REST book পুনরায় fetch করুন resubscribe করার আগে। WebSocket delta দেয়; reconnect-এর সময় যদি আপনি কোনো delta মিস করেন, local book বাস্তবতার সাথে বিচ্যুত হবে এবং আপনি ক্ষতিকর price quote করবেন।
  7. প্রতি সেকেন্ডে 10-এর বেশি order burst কখনও করবেন না - /order endpoint 500/10s burst এবং 3,000/10min sustained-এ throttle করে। client-side token-bucket rate limiter যোগ করুন; Cloudflare drop করার বদলে queue করে, তাই blind retry backlog বাড়ায়।
  8. shutdown-এ cancel_all() না করে cancel_market_orders(market=conditionId) ব্যবহার করুন। market-scoped cancel idempotent এবং bot যদি কেবল এক market-এ loop-এর মাঝখানে crash করে, তাহলে বেশি নিরাপদ।
  9. asset প্রতি heartbeatMs ট্র্যাক করুন - live market-এ 30s কোনো update না পেলে জোর করে refresh করে এমন watchdog যোগ করুন। stale WS feed phantom edge-এর সবচেয়ে সাধারণ উৎস।
  10. পাঠানোর আগে order ID log করুন, পরে নয়। idempotency-এর জন্য client-কে ID-এর মালিক হতে হবে, যাতে crash-recovery duplicate fill ছাড়াই resend করতে পারে।
  11. HeartBeats API (Jan 2026+) স্বয়ংক্রিয় cancel-on-disconnect-এর জন্য ব্যবহার করুন। heartbeat interval 5s সেট করুন; server দুইটি heartbeat মিস করলে আপনার সব resting order cancel করবে।
  12. স্কেল করার আগে 48 ঘণ্টা ধরে পাতলা market-এ $1 order দিয়ে paper-trade করুন। Polymarket-এর কোনো testnet নেই; auth, signing, fill handling, এবং cancel flow যাচাই করার একমাত্র নির্ভরযোগ্য উপায় হলো ছোট real order।

Situation → Action Cheat Sheet

SituationActionকেন
প্রথম কলেই 401 "invalid api key"signature_type wallet origin-এর সাথে মেলে কিনা এবং funder proxy address কি না পরীক্ষা করুনType 1 বনাম 2 mismatch 401 error-এর 80%; বাকি অংশ EOA-as-funder
Orders rejected with "insufficient balance"প্রতিটি order-এর আগে /balance-allowance query করুন এবং locally reserve করুনCLOB পোস্ট করার মুহূর্তেই collateral reserve করে; দুইটি concurrent order double-book করতে পারে
/order endpoint-এ 429 throttlingjitter সহ back off করুন: 2^attempt + random(), সর্বোচ্চ 30sCloudflare reject না করে throttle করে; naive retry backlog বাড়ায়
WebSocket mid-trade disconnectedREST-এর মাধ্যমে book snapshot নিন, local state reconcile করুন, তারপর resubscribe করুনগ্যাপের সময় delta হারিয়ে যায়; snapshot price ladder re-synchronize করে
Order placed কিন্তু fill confirmation নেই5s-এর মধ্যে /data/order/{id} query করুন; pending হলে অপেক্ষা করুন; না পেলে replace করুনবিরল কিন্তু recoverable; ডিফল্ট হলো "state check করুন, তারপর action নিন"
Active quote-এর সময় market resolved হয়েছেresolution event-এ সেই conditionId-এর সব open order cancel করুনpost-resolution order zombie fill হিসেবে linger করতে পারে যদি adapter-এর quirk trigger হয়
market-making bot চালানোmidpoint-এর 2 সেন্টের মধ্যে 100+ share size নিয়ে quote করুনreward formula tightness + size + time-on-book ওজন করে; tight + size + persistent জেতে
multi-outcome-এ arbitrage bot চালানোপ্রতিটি leg-এর জন্য FOK ব্যবহার করুন, GTC নয়leg A-তে partial fill এবং full leg B = unhedged exposure এবং তাৎক্ষণিক ক্ষতি
প্রথমবার bot তৈরি করাআগে scanner, তারপর price engine, তারপর signal তৈরি করুন - কখনও signal দিয়ে শুরু করবেন নাclean book state ছাড়া signal correlation trap; আগে pipes চালু করুন
Production bot 3am-এ crash করেছেsystemd auto-restart + Telegram alert + persistent state রাখুনযে কোনো unattended bot crash করবে; প্রশ্ন শুধু এটি cleanly restart করে কি না
Worked example: liquidity rewards-এর জন্য minimal market-maker loop।

Target. প্রায় 0.48 Yes / 0.52 No মূল্যের মাঝারি-ভলিউম politics market-এ 2-cent স্প্রেড (spread) নিয়ে liquidity rewards উপার্জন করা। এই market-এর দৈনিক reward pool প্রায় ~$40।

Setup. উভয় token_ids-এ WebSocket subscribe করুন। last-seen mid cache করুন। spread_target = 0.02, প্রতি পাশে size = 200 shares, reprice_threshold = 0.005 (5 ticks) নির্ধারণ করুন।

Loop. প্রতিটি WS book update-এ: নতুন mid = top-3 bids এবং asks-এর VWAP হিসাব করুন। যদি |current quotes - target mid| > reprice_threshold হয়, তাহলে বিদ্যমান দুইটি order cancel করে mid-0.01-এ নতুন bid এবং mid+0.01-এ নতুন ask দিন। প্রতি পাশে প্রতি 2 সেকেন্ডে একবারের বেশি repricing না করার rate limit দিন।

Risk. প্রতি পাশে সর্বোচ্চ inventory = 1,000 shares। যদি inventory > 500 হয়, তাহলে ওই পাশে spread প্রতি 100 shares-এ 0.005 করে বাড়ান। Circuit breaker: যদি 60 সেকেন্ডে mid 0.05-এর বেশি সরে যায়, তাহলে সব cancel করে 5 মিনিট pause করুন।

Outcome (বাস্তব 7-day run). 680 order জুড়ে প্রায় 14,000 shares filled, $0 টেকার (taker) fee (maker side) দিয়েছে, liquidity rebate হিসেবে $31.40 earned করেছে, net directional P&L ছিল -$4.10 (ছোট inventory loss)। $500 working capital-এ 7 দিনে net +$27.30 = প্রায় 8% monthly। একটি single VPS-এ একসাথে 30-50 market জুড়ে linearly scale করে।

মূল takeaway

যে trader-রা ধারাবাহিকভাবে Polymarket-এ profit করেন, তারা polymarket api guide-কে gut feel নয়, একটি system হিসেবে দেখেন। উপরোক্ত সংখ্যাগুলো মনে রাখুন - 7.6% profitable wallet এবং বাকিদের মধ্যে পার্থক্য এটাই।

এর পরে কী?