Polymarket Bot Tutorial · Hoofdstuk 3 van 32
Kies je Polymarket bot-stack: Python (py-clob-client 0.34.6), Node.js (@polymarket/clob-client-v2 v1.0.2) of Rust (geen officiële SDK, bouw op ethers-rs). Pros, cons, latency, code samples.
Wat dit hoofdstuk behandelt
De taal-keuze is veel minder consequentieel dan de meeste builders behandelen. Polymarket exposeert dezelfde REST en WebSocket endpoints aan elke taal; de SDK-keuze bepaalt meestal hoeveel glue-code je zelf schrijft. Python en Node hebben beide officieel onderhouden SDK's; Rust niet, maar is haalbaar voor de hot path. Dit hoofdstuk wandelt door de trade-offs, toont dezelfde "fetch order book" taak in elke taal zodat de diff concreet is en eindigt met een mixed-stack patroon dat de meeste productie-bots uiteindelijk adopteren.
- Beslis-framework
- Python (default keuze)
- Node.js (full-stack devs)
- Rust (latency-critical hot path)
- Setup-commando's per stack
- Code skeleton: fetch order book in 3 talen
- Wanneer stacks te mixen (Python control plane + Rust hot path)
Beslis-framework
Drie vragen lossen 90% van de stack-keuze op.
- Heb je een sterke bestaande skill? Als je dagelijks Python schrijft, schrijf de bot in Python. Als je dagelijks TypeScript schrijft, schrijf de bot in Node. De SDK-kwaliteitsverschillen hieronder zijn echt maar kleiner dan de kost van het vechten met een ongebruikelijke taal.
- Is de strategie latency-critical? Als je edge afhangt van reageren onder 50ms (5-minuten crypto markten, market-making tijdens news), profiteert de hot path van Rust of Go. De meeste strategieën hebben dit niet nodig.
- Ga je meer dan één strategie draaien? Een enkel Python-proces kan comfortabel 10-20 markten beheren. Boven dat schaalt async Node of split-process Python beter.
De eerlijke default voor een eerste bot is Python. Switch alleen wanneer een gemeten constraint het forceert.
Python (default keuze)
Python is de default omdat de SDK het meest compleet is en de iteratie-loop het snelst. py-clob-client op versie 0.34.6 (mei 2026) dekt elk CLOB v2 endpoint dat telt: market en limit orders, FOK/FAK/GTC varianten, order book reads, balance/allowance reads en directe chain-operaties via web3.py.
Pros: matuur SDK, makkelijke data-analyse met pandas, grote community, web3.py voor on-chain reads. Cons: async-ergonomie is onhandig vergeleken met JavaScript, GIL beperkt multi-core speedups (zelden telt voor een I/O-bound bot), startup-tijd op cold containers is traag.
Aanbevolen voor: 80% van builders. Vooral iedereen wiens strategie backtesting, statistische analyse of welk data-werk dan ook naast executie omvat.
Node.js (full-stack devs)
Node.js is de op-één-na-best-ondersteunde stack. @polymarket/clob-client-v2 op versie 1.0.2 dekt dezelfde endpoints als de Python SDK met TypeScript types overal. Async is native en snel; WebSocket-handling is uitstekend.
Pros: beste async-story, native TypeScript types, groot ecosysteem voor HTTP + WS, makkelijk deploy op dezelfde Node-runtime als een web dashboard. Cons: getallenprecisie vereist BigInt of string-handling voor grote token IDs (ERC-1155 IDs zijn 256-bit), pandas-equivalente data tools zijn zwakker.
Aanbevolen voor: builders die al een JavaScript-stack onderhouden en één runtime willen. Ook: iedereen die een dashboard naast de bot bouwt — types delen tussen de bot-core en een Next.js dashboard verwijdert een klasse bugs.
Rust (latency-critical hot path)
Rust heeft geen officiële Polymarket SDK. Je bouwt tegen de V2 REST en WebSocket API's direct met reqwest (HTTP), tokio-tungstenite (WebSocket) en ethers-rs of alloy voor signing. Ruwweg twee dagen setup-werk vs 30 minuten in Python.
Pros: native EIP-712 signing zonder een JS subprocess, sub-millisecond order-constructie, deterministisch geheugen-profiel onder load, geen GC-pauzes. Cons: geen SDK betekent dat je her-implementeert wat Python-gebruikers gratis krijgen (clobToken ID parsing, response schema-validatie, salt/nonce-management). De winst in latency is 20-100ms vs getuned Python, wat alleen telt voor sub-seconde strategieën.
Aanbevolen voor: de hot path van een market-making bot of de trade-firing leg van een news-arb bot. Bijna nooit de hele bot.
Setup-commando's per stack
Minimum commando's tot een werkende signed order tegen mainnet (single CLOB v2 endpoint).
Python:
python -m venv venv && source venv/bin/activate
pip install py-clob-client==0.34.6 web3 python-dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Node:
npm init -y
npm install @polymarket/[email protected] ethers dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Rust:
cargo new --bin pmt
cd pmt
cargo add tokio reqwest serde serde_json ethers alloy tungstenite tokio-tungstenite
# Hand-write signer + endpoint client; no SDK shortcut.
Time-to-first-order: ~10 min Python, ~15 min Node, ~4-8 uur Rust.
Code skeleton: fetch order book in 3 talen
Dezelfde taak — fetch het order book voor een Polymarket token — in elke stack. Alle drie raken hetzelfde CLOB v2 REST endpoint.
Python (py-clob-client):
from py_clob_client.client import ClobClient
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("<token_id>")
print(book.bids[:3], book.asks[:3])
Node (@polymarket/clob-client-v2):
import { ClobClient } from "@polymarket/clob-client-v2";
const c = new ClobClient({ host: "https://clob.polymarket.com", chain: 137 });
const book = await c.getOrderBook("<token_id>");
console.log(book.bids.slice(0,3), book.asks.slice(0,3));
Rust (directe HTTP):
let url = format!("https://clob.polymarket.com/book?token_id={}", token);
let book: serde_json::Value = reqwest::get(&url).await?.json().await?;
println!("{:?} {:?}", &book["bids"][..3], &book["asks"][..3]);
Dezelfde response-vorm in alle drie. De kost van Rust is overal anders — signing, order-constructie, error handling — niet in het read-pad.
Wanneer stacks te mixen (Python control plane + Rust hot path)
Het patroon waar veel productie-bots op convergeren: Python voor alles wat beslissingen omvat, Rust voor de milliseconde-executie leg.
Architectuur: een Python-proces leest market state, draait de strategie-logica en schrijft een klein commando-bestand (bijv. {"action":"buy","token":"...","size":10,"price":0.45}) naar een Unix socket. Een Rust-daemon luistert op die socket, tekent de order en post hem naar de CLOB. Het Python-proces kan traag en handig zijn; de Rust-daemon is snel en minimaal.
De handoff is de sleutel: door de signed-order stap te isoleren wordt het crash-budget van Python hersteld zonder latency op te offeren. We gebruiken precies dit patroon in onze productie-bots — Python emit intenties, een Node-daemon op /tmp/clob.sock handelt signing af. De Node-versie van de daemon is prima voor sub-100ms; Rust verdient zijn aandeel alleen onder 50ms.











