Polymarket Bot Tutorial · অধ্যায় ৭ of ৩২
Polymarket Gamma API deep dive: /events এবং /markets endpoints, pagination, tag IDs (864 Tennis, 745 NBA, ইত্যাদি), 24h volume অনুযায়ী filtering, rate limits, এবং Python ও Node code samples।
এই অধ্যায়ে কী আছে
Gamma হলো Polymarket-এর catalog API - এটি front-end-এ দেখানো প্রতিটি event, প্রতিটি market, tag, image, এবং resolved outcome তালিকাভুক্ত করে। CLOB API trade করে; Gamma বলে কী tradeable। discovery layer-এ বেশিরভাগ bot bug আসে এই দুটোকে গুলিয়ে ফেলা থেকে, অথবা pagination contract মিস করার কারণে। এই অধ্যায়টি Gamma-এর main endpoints-এর field reference, যেখানে আমাদের production fetchers নির্ভর করে এমন exact parameter behavior দেখানো হয়েছে।
এটি Polymarket trading bot তৈরি নিয়ে আমাদের ৩২-অধ্যায়ের সিরিজের ৭ম অধ্যায়। নিচের sectionগুলোতে আমরা বিষয়টি গভীরভাবে কভার করেছি। প্রতিটি section-এর body content chapter-by-chapter লেখা ও প্রকাশ করা হচ্ছে; FAQ answers এবং references ইতিমধ্যেই সম্পূর্ণ এবং আমাদের own trader চালানোর production experience প্রতিফলিত করে।
- Gamma vs CLOB: কখন কোনটি ব্যবহার করবেন
- /events endpoint anatomy
- /markets endpoint anatomy
- Tags এবং tag IDs (verified list)
- Filtering: active, closed, volume24hr ordering
- Pagination এবং limits
- Rate limits এবং caching
- Code: top 24h-volume markets fetch করা
Gamma vs CLOB: কখন কোনটি ব্যবহার করবেন
দুটি ভিন্ন কাজের জন্য দুটি ভিন্ন service।
Gamma (gamma-api.polymarket.com): catalog। এটি events, markets, tags, descriptions, images, resolved outcomes, 24-hour volume, total volume, end dates তালিকাভুক্ত করে। Read-only HTTP। বেশিরভাগ read-এর জন্য authentication লাগে না। Continuousভাবে update হয়, তবে eventually consistent - সদ্য closed হওয়া কোনো market কয়েক সেকেন্ডের জন্যও closed: false দেখাতে পারে।
CLOB (clob.polymarket.com): trading + order book। এটি current best bid/ask, top-N book depth, recent trades তালিকাভুক্ত করে। write endpoints-এর জন্য authenticated (order placement, cancellation)। Book updates-এর জন্য real-time WebSocket channels পাওয়া যায়।
Thumb rule: কী trade করবেন তা খুঁজতে Gamma ব্যবহার করুন; trade করতে CLOB ব্যবহার করুন। Gamma থেকে price পড়া bot পুরনো data ব্যবহার করছে - Gamma-এর price field, CLOB-এর order book-এর চেয়ে কম ঘন ঘন update হয়। CLOB থেকে market metadata পড়া মানে অপ্রয়োজনীয় বেশি request করা।
/events endpoint anatomy
GET /events event-level data ফেরত দেয়। একটি "event" হলো একটি Polymarket page; একটি event-এর মধ্যে একাধিক market থাকতে পারে (যেমন 2024 Presidential Election event-এ প্রতিটি candidate-এর জন্য একেকটি market আছে)।
Key fields:
slug: URL-safe identifier, event-এর জীবনকাল জুড়ে stable.title,description: human display-এর জন্য।endDate(ISO 8601): কখন event close হবে।active,closed: boolean; live events-এর জন্য query-তে?active=true&closed=falseএকসাথে ব্যবহার করুন।volume,volume24hr: USD totals।tags: tag object-এর array (নিচের tags section দেখুন)।markets: child market object-এর array (/marketsanatomy দেখুন)।
সবচেয়ে সাধারণ discovery pattern: GET /events?active=true&closed=false&order=volume24hr&ascending=false&limit=100. এটি বর্তমানে live থাকা সর্বোচ্চ volume-এর ১০০টি event ফেরত দেয়।
/markets endpoint anatomy
GET /markets market-level data ফেরত দেয়। একটি market হলো একটি Y/N বা multi-outcome contract; এটি একটি event-এর ভিতরে থাকে।
Key fields:
slug: URL-safe identifier.question: trading page-এ দেখানো title (যেমন "Will Trump be president on January 1, 2027?").outcomes: outcome name-এর JSON string, যেমন'["Yes","No"]'. Binary-এর জন্য সবসময় দুইটি element; NegRisk-এর জন্য আরও বেশি।outcomePrices: decimal আকারে current price-এর JSON string, যেমন'["0.62","0.38"]'. উভয় side-এর যোগফল spread বাদে প্রায় 1.0।clobTokenIds: outcomes-এর সাথে aligned ERC-1155 token ID-এর JSON string। এগুলোই আপনি আসলে buy/sell করেন।negRisk: boolean; multi-outcome sum-to-1 market-এর জন্য true। Order placement-এর ক্ষেত্রে গুরুত্বপূর্ণ (chapter 11)।
outcomes / outcomePrices / clobTokenIds field-গুলো parsed array হিসেবে নয়, JSON string হিসেবে আসে - ব্যবহার করার আগে JSON-decode করুন।
Tags এবং tag IDs (verified list)
Tags হলো categorical label (Sports, Crypto, Tennis, NBA, ইত্যাদি)। সবচেয়ে বেশি ব্যবহৃত category-গুলোর verified production tag ID:
| Tag | ID | Tag | ID |
|---|---|---|---|
| Sports | 1 | NBA | 745 |
| Crypto | 21 | NFL | 450 |
| Politics | 2 | Tennis | 864 |
| Bitcoin | 100196 | Esports | 702 |
| Ethereum | 100383 | Soccer | 1059 |
| Election | 3 | EPL | 739 |
| Middle East | 1432 | UCL | 2186 |
?tag_id=745 ব্যবহার করে নির্দিষ্ট tag-এ filter করুন, অথবা slug ব্যবহার করে ?tag_slug=nba দিন। Slug-based filtering code-এ বেশি readable, কিন্তু একটু ধীর; production default হলো ID-based।
Filtering: active, closed, volume24hr ordering
যে চারটি filter dimension আপনি 95% সময় ব্যবহার করবেন।
active=true|false:trueদিলে Polymarket team UI থেকে hide করা market বাদ পড়ে।closed=true|false:falseদিলে resolved market বাদ পড়ে।active=true&closed=falsecombination-টি live filter-এর মধ্যে সবচেয়ে সাধারণ।order=volume24hr,order=volume,order=endDate: sort key। বর্তমানে active market খুঁজতে সবচেয়ে উপযোগী হলোvolume24hr।ascending=true|false: বেশিরভাগ endpoint-এ default হলো true; volume ordering-এ প্রায় সবসময়falseচাইবেন।
Caveat: tag_id দিয়ে filter করার সঙ্গে order=volume24hr এবং ascending=false একত্রে দিলে, tag-এ live market খুব কম থাকলে কখনও কখনও empty page ফেরত আসতে পারে। এ ক্ষেত্রে সবসময় over-fetch করুন (যা দেখাবেন তার চেয়ে বেশি request করুন) এবং post-filter করুন।
Pagination এবং limits
limit param প্রতি call-এ 1-500 পর্যন্ত গ্রহণ করে। উল্লেখ না করলে default হলো 100। 500-এর বেশি দিলে server নীরবে cap করে - আপনি 500 পাবেন, কিন্তু response-এ আর বেশি আছে কি না তার কোনো ইঙ্গিত থাকবে না।
Pagination offset-based: দ্বিতীয় page-এর জন্য ?limit=500&offset=500। এখানে cursor-based pagination নেই, তাই concurrent insert-এর ফলে call-এর মধ্যে page boundary সরে যেতে পারে। অধিকাংশ bot discovery-এর জন্য এটি গ্রহণযোগ্য; archive scrape-এর জন্য stable field (endDate বা createdAt) দিয়ে sort করুন এবং slug দিয়ে overlap detect করুন।
"all live markets" পাওয়ার ব্যবহারিক pattern: limit=500&order=volume24hr&ascending=false fetch করুন। এতে volume অনুযায়ী top 500 cover হয়, যা মূলত non-trivial activity থাকা প্রায় সব market। Page 1-এর বাইরে যাওয়া খুব কমই দরকার - volume distribution-এর tail-এ থাকা market-গুলো সংজ্ঞাগতভাবেই action-এর জায়গা নয়।
Rate limits এবং caching
Gamma-এর সামনে Cloudflare আছে এবং IP অনুযায়ী soft rate limit প্রয়োগ করে। production load-এ দেখা empirical threshold:
- একটি IP থেকে ~30 req/sec পর্যন্ত sustained: ঠিক আছে।
- 100+ req/sec burst: মাঝে মাঝে 429 আসে, retry সফল হয়।
- ~500 req/sec sustained: rate-limit page বা temporary block (10-60s)।
Published response header-এ বেশিরভাগ endpoint-এর জন্য Cache-Control value 30-60 seconds থাকে। এটি মানুন - একই event এক মিনিটে 10 বার re-fetch করার কোনো লাভ নেই। Production caching pattern: full URL key করে in-process LRU + TTL, 30s TTL। এতে request count বাঁচে এবং latency কমে।
High-frequency strategy-এর জন্য, Gamma data-কে একটি local store-এ mirror করুন যা একটি single fetcher process দ্বারা update হবে; একাধিক consumer সেই store থেকে পড়বে। One fetcher × many consumers > many fetchers × Gamma।
Code: top 24h-volume markets fetch করুন
তিনটি ভাষায় reference fetcher, যা 24-hour volume অনুযায়ী top 50 live market ফেরত দেয়।
Python:
import requests
r = requests.get("https://gamma-api.polymarket.com/events",
params={"active":"true","closed":"false",
"order":"volume24hr","ascending":"false","limit":50},
timeout=10)
for ev in r.json()[:50]:
print(ev["slug"], ev.get("volume24hr"))
Node:
const url = "https://gamma-api.polymarket.com/events?active=true&closed=false" +
"&order=volume24hr&ascending=false&limit=50";
const events = await fetch(url).then(r => r.json());
for (const ev of events) console.log(ev.slug, ev.volume24hr);
Curl:
curl -s "https://gamma-api.polymarket.com/events?active=true&closed=false&order=volume24hr&ascending=false&limit=50" \
| jq '.[].slug'
Polymarket gamma /events endpoint free-text search parameter সমর্থন করে না - ?q=foo বা ?search=foo যোগ করলে নীরবে default ordering ফেরত আসে। Slug বা tag দিয়ে filter করুন।










