API · Build
Copy-Paste-Rezepte für die Dinge, die jeder Polymarket-Bot braucht. Alles CLOB V2 / pUSD, Python (die Reads brauchen keinen Schlüssel). Nimm eines, führe es aus, weiter geht's. Führe jeden Read zuerst live in der Sandbox aus:
tick_size des Marktes (meist "0.01", aber einige Märkte sind "0.001") und, für
Multi-Outcome-„Negative-Risk“-Märkte, neg_risk=True. Lies beides vom Markt ab, bevor du signierst –
eine falsche Tick-Size oder ein fehlendes neg_risk-Flag wird abgelehnt oder, schlimmer, falsch bepreist. Rezept 3 zeigt, wie.1. Die Token-IDs eines Marktes aus einem Slug holen
Jeder Trade beginnt hier: ein menschlicher Slug rein, die zwei Outcome-Token-IDs raus.
import requests, json
m = requests.get("https://gamma-api.polymarket.com/markets",
params={"slug": SLUG}).json()[0]
outcomes = json.loads(m["outcomes"]) # ["Yes","No"]
token_ids = json.loads(m["clobTokenIds"]) # aligned with outcomes
yes_token = token_ids[outcomes.index("Yes")]
tick_size = m.get("orderPriceMinTickSize", "0.01") # use this, don't hardcode
neg_risk = bool(m.get("negRisk", False)) # needed for multi-outcome markets
2. Deine API-Zugangsdaten ableiten (einmalig)
Handel braucht einen API-Key/-Secret/-Passphrase, abgeleitet aus deinem Private Key. Leite einmal ab, übergib dann
creds an jeden Client – in V2 gibt es kein set_api_creds.
import os
from py_clob_client_v2 import ClobClient
boot = ClobClient(host="https://clob.polymarket.com", chain_id=137, key=os.environ["PK"])
creds = boot.create_or_derive_api_key() # idempotent: same key -> same creds
client = ClobClient(host="https://clob.polymarket.com", chain_id=137,
key=os.environ["PK"], creds=creds)
3. Das Buch lesen & Slippage schätzen
Laufe die Asks ab, um den echten durchschnittlichen Fill-Preis für einen Kauf zu erhalten (Bids für einen Verkauf), bevor du Größe einsetzt.
book = client.get_order_book(token_id)
def cost_to_buy(book, shares):
rem, spent = shares, 0.0
for lvl in book.asks: # asks sorted best (lowest) first
take = min(rem, float(lvl.size)); spent += take*float(lvl.price); rem -= take
if rem <= 0: break
return (spent/shares, rem) # (avg fill price, unfilled shares)
4. Eine Limit-Order platzieren & stornieren (GTC)
from py_clob_client_v2 import (ClobClient, OrderArgs, OrderType,
PartialCreateOrderOptions, Side, OrderPayload)
resp = client.create_and_post_order(
order_args=OrderArgs(token_id=token_id, price=0.45, side=Side.BUY, size=100),
options=PartialCreateOrderOptions(tick_size=tick_size, neg_risk=neg_risk),
order_type=OrderType.GTC, # rests on the book until filled/cancelled
)
client.cancel_order(OrderPayload(orderID=resp["orderID"]))
5. Jetzt Liquidität nehmen – eine Market-Order (FOK)
Eine Market-Order wird in USDC dimensioniert, nicht in Anteilen, und wird sofort ausgeführt oder storniert. Nutze FOK, wenn du vollständig ausgeführt werden musst, FAK, um zu füllen, was geht.
from py_clob_client_v2 import MarketOrderArgs
client.create_and_post_market_order(
order_args=MarketOrderArgs(token_id=token_id, amount=25.0, side=Side.BUY), # $25
options=PartialCreateOrderOptions(tick_size=tick_size, neg_risk=neg_risk),
order_type=OrderType.FOK,
)
6. Orders auflisten, im Batch posten und stornieren
orders = client.get_orders() # your resting orders
client.cancel_orders([o["orderID"] for o in orders]) # cancel a batch
client.cancel_all() # or wipe everything (panic button)
# Post several quotes in ONE request (POST /orders, max 15 per batch).
# post_only=True makes each strictly a maker order - it's rejected rather than
# allowed to cross the book, so you never accidentally pay the taker fee.
client.create_and_post_orders([
OrderArgs(token_id=token_id, price=0.44, side=Side.BUY, size=50),
OrderArgs(token_id=token_id, price=0.48, side=Side.SELL, size=50),
], options=PartialCreateOrderOptions(tick_size=tick_size, neg_risk=neg_risk, post_only=True))
7. Positionen & PnL jeder Wallet verfolgen (kein Schlüssel)
import requests
for p in requests.get("https://data-api.polymarket.com/positions",
params={"user": PROXY_ADDRESS}).json():
print(p["title"], p["outcome"], "PnL", p["cashPnl"], p["percentPnl"])
8. Deine Fills über WebSocket beobachten
# wss://ws-subscriptions-clob.polymarket.com/ws/user (auth: api key/secret/passphrase)
# subscribe by condition_id; you get fills/cancels for your orders in real time.
# Send a PING every ~10s or the server drops you. Full reconnect+heartbeat pattern:
# /de/api/polymarket-websocket/
9. Ein minimaler Market-Maker-Tick
mid = float(client.get_midpoint(token_id)["mid"])
spread = 0.02 # quote 1 cent each side of mid
bid = round(mid - spread/2, 2); ask = round(mid + spread/2, 2) # round to tick
for price, side in [(bid, Side.BUY), (ask, Side.SELL)]:
client.create_and_post_order(
order_args=OrderArgs(token_id=token_id, price=price, side=side, size=50),
options=PartialCreateOrderOptions(tick_size=tick_size, neg_risk=neg_risk),
order_type=OrderType.GTC)
# reprice on every book update; makers pay 0 fees and can earn liquidity rewards.
Neues Projekt? Polymarket liefert jetzt ein vereinheitlichtes SDK (py-sdk / @polymarket/sdk),
das die REST-APIs und WebSockets in ein Paket faltet – einen Blick wert, sobald du diesen Snippets entwachsen bist.
Siehe den SDK-Chooser.
Weiter: CLOB-Referenz · Data API · Spar dir die Verkabelung – die Boilerplates.



