Polymarket and Kalshi are the two dominant prediction market platforms, and both support automated trading through official APIs. But they differ in almost every technical dimension: authentication, price formats, SDKs, order book structure, regulatory status, and settlement mechanics. Choosing the right platform for your bot depends on your strategy, jurisdiction, and technical preferences.
This guide compares every aspect that matters for bot developers.
For platform-specific bot rankings, see Best Polymarket Bots 2026 and Best Kalshi Trading Bots 2026.
Platform Overview
| Dimension | Polymarket | Kalshi |
|---|---|---|
| Type | Decentralized (Polygon) | Centralized (CFTC-regulated) |
| Currency | USDC on Polygon | USD (cents) |
| Price format | 0.00–1.00 | 1–99 cents |
| Regulation | Unregulated (non-US) | CFTC-regulated (US-legal) |
| Daily volume | $50M-500M+ | $5M-50M+ |
| Market count | 1,000+ active | 200-500 active |
| Python SDK | py-clob-client | kalshi-python |
| CLI tool | Yes (polymarket via Homebrew) | No |
| Demo sandbox | No | Yes (demo-api.kalshi.co) |
| Settlement | On-chain (USDC → wallet) | USD (bank account) |
API & Authentication
Authentication
| Aspect | Polymarket | Kalshi |
|---|---|---|
| Method | HMAC signature (API key + secret + passphrase) | RSA-PSS signature (API key + private RSA key) |
| Key creation | Derived from wallet signature | Generated in account settings |
| Read-only access | No auth needed | No auth needed |
| Trading access | L2 HMAC headers on every request | RSA-signed headers on every request |
| Key storage | API key + secret + passphrase (3 values) | API key ID + RSA PEM file (2 values) |
Polymarket auth setup:
from py_clob_client.client import ClobClient
client = ClobClient(
"https://clob.polymarket.com",
key="<private-key>",
chain_id=137
)
client.set_api_creds(client.create_or_derive_api_creds())
Kalshi auth setup:
import kalshi_python
config = kalshi_python.Configuration(
host="https://api.elections.kalshi.com/trade-api/v2"
)
config.api_key_id = "your-api-key-id"
with open('private_key.pem', 'r') as f:
config.private_key_pem = f.read()
client = kalshi_python.KalshiClient(config)
Winner for bots: Polymarket — simpler key management, deterministic credential derivation.
Order Placement
| Feature | Polymarket | Kalshi |
|---|---|---|
| Limit orders | OrderArgs → create_order() → post_order() | create_order(type="limit") |
| Market orders | MarketOrderArgs → create_market_order() | create_order(type="market") |
| Order amendment | Not supported (cancel + replace) | Supported (amend_order()) |
| Post-only | post_order(signed, GTC, post_only=True) | post_only: true in request body |
| Batch orders | post_orders() — up to 15 at once | batch_create_orders() |
| Order types | GTC, FOK, FAK | limit, market |
| Tick size | 0.01 or 0.001 (varies by market) | 1 cent (always) |
Winner for bots: Kalshi — native order amendment reduces cancel-replace latency. Polymarket wins on batch order support.
Order Book Structure
This is the most impactful technical difference for bot developers:
Polymarket returns both bids and asks:
book = client.get_order_book("TOKEN_ID")
# book.bids = [{"price": "0.55", "size": "1200"}, ...]
# book.asks = [{"price": "0.57", "size": "800"}, ...]
Kalshi returns bids only — you must compute asks:
book = client.get_market_orderbook("TICKER")
# book.yes = [[price, size], ...] # YES bids only
# book.no = [[price, size], ...] # NO bids only
# YES ask at price X = NO bid at (100 - X)
Winner for bots: Polymarket — explicit bids and asks are simpler to work with. Kalshi’s bid-only structure adds computation and potential for bugs.
Price Format Comparison
| Concept | Polymarket | Kalshi | Conversion |
|---|---|---|---|
| “50% chance” | 0.50 | 50 | × 100 |
| “1% chance” | 0.01 | 1 | × 100 |
| “99% chance” | 0.99 | 99 | × 100 |
| Balance units | Wei (÷ 1e6 → USDC) | Cents (÷ 100 → USD) | Different |
Cross-platform normalization:
def normalize(polymarket_price=None, kalshi_cents=None):
if polymarket_price is not None:
return polymarket_price
if kalshi_cents is not None:
return kalshi_cents / 100
WebSocket Streaming
| Feature | Polymarket | Kalshi |
|---|---|---|
| URL | wss://ws-subscriptions-clob.polymarket.com/ws/ | wss://api.elections.kalshi.com/trade-api/ws/v2 |
| Public channels | market (book updates) | orderbook, ticker, trades, market_lifecycle |
| Private channels | user (order fills) | fills, positions |
| Update type | Incremental | Snapshots |
| Subscription | By assets_ids | By market_tickers |
Winner for bots: Kalshi — more granular channel separation and richer event types. Polymarket’s incremental updates are more efficient but harder to implement correctly.
Rate Limits & Performance
| Aspect | Polymarket | Kalshi |
|---|---|---|
| Rate limit style | Per-endpoint tiers | Per-endpoint |
| 429 handling | X-RateLimit-* headers | Retry-After header |
| Demo environment | No | Yes (more generous limits) |
| FIX protocol | No | Yes (FIX 4.4 for institutional) |
Winner for bots: Kalshi — demo environment for testing, FIX protocol for institutional use, and Retry-After header for simpler rate limit handling.
Fees
| Polymarket | Kalshi | |
|---|---|---|
| Trading fee | ~2% (varies by market) | 2-7% (varies by contract) |
| Deposit | USDC on Polygon (gas fees apply) | USD (bank transfer, free) |
| Withdrawal | USDC on Polygon (gas fees) | USD (bank transfer, free) |
Winner for bots: Polymarket — lower trading fees on most markets. Kalshi wins on deposit/withdrawal simplicity (no gas fees).
Developer Experience
| Aspect | Polymarket | Kalshi |
|---|---|---|
| CLI tool | Yes — polymarket (Rust) | No |
| Interactive REPL | polymarket shell | No |
| JSON output | polymarket -o json COMMAND | All responses are JSON |
| Official docs | GitHub + community | docs.kalshi.com |
| Community | Discord, GitHub, Twitter | Discord, docs portal |
| Third-party tools | AgentBets, pmxt, OddsPapi | AgentBets, pmxt |
Winner for bots: Polymarket — the CLI is uniquely powerful for rapid prototyping and debugging.
Decision Framework
Choose Polymarket If:
- You’re not US-based and can trade freely
- You want maximum volume and liquidity
- You’re building copy-trading bots (on-chain transparency)
- You want a CLI tool for rapid prototyping
- You prefer lower trading fees
- Your strategy benefits from more active markets (1,000+ vs 200-500)
Choose Kalshi If:
- You’re US-based and need regulatory clarity
- You want USD settlement (no crypto wallet management)
- You need a demo sandbox for risk-free testing
- Your strategy uses order amendment (modify in-place)
- You need FIX protocol for institutional integration
- You prefer traditional API documentation
Choose Both If:
- You’re building cross-platform arbitrage bots
- You want maximum opportunity set
- You’re using pmxt or a unified abstraction layer
See Also
- Prediction Market API Reference — Side-by-side API documentation
- Best Polymarket Bots 2026 — Polymarket bot rankings
- Best Kalshi Trading Bots 2026 — Kalshi bot rankings
- Best Prediction Market Arbitrage Bots — Cross-platform arb
- py_clob_client Reference — Polymarket Python SDK
- Kalshi API Guide — Complete Kalshi documentation
- Agent Betting Glossary — 130+ prediction market terms defined
Comparison updated March 2026. Not financial advice. Built for builders.