Arbitrage is the most predictable strategy in prediction markets. When the same event is priced differently on two platforms, or when YES and NO contracts on the same market do not sum to $1.00, there is a risk-free (or near risk-free) profit opportunity. An arbitrage bot finds and executes these trades faster than you can manually.
This guide covers everything you need to buy, set up, and run an arbitrage bot for Polymarket. You will know exactly what to evaluate, what to pay, and what to avoid.
What You Will Learn
- The three types of arbitrage bots and which one fits your situation
- How to evaluate an arbitrage bot before purchasing
- How to set up wallets and infrastructure for the bot
- How to configure spread thresholds and risk controls
- Red flags that indicate a scam or low-quality bot
Prerequisites
- A funded Polymarket wallet. You need USDC on Polygon. Minimum $500 recommended, $2,000+ for meaningful arbitrage returns. See the Polymarket bots platform guide for wallet setup.
- Basic understanding of arbitrage. Read our cross-market arbitrage guide if you are new to the concept.
- Python 3.10+ and a VPS. Most arbitrage bots run 24/7 on a server. A $10-20/month VPS (DigitalOcean, Hetzner, AWS Lightsail) is sufficient.
- API access to at least one platform. For cross-platform arbitrage, you also need a Kalshi account with API keys.
Step-by-Step Instructions
Step 1: Understand the Three Types of Arbitrage Bots
Not all arb bots work the same way. Know what you need before you shop:
Intra-market arbitrage finds mispriced contracts within Polymarket itself. For example, if a market has YES at $0.55 and NO at $0.42, the combined cost is $0.97 for a guaranteed $1.00 payout — a 3% risk-free return. These opportunities are small and fleeting but require only one platform.
Cross-platform arbitrage compares prices between Polymarket and Kalshi (or other platforms). If “Will X happen?” is priced at $0.60 on Polymarket but the equivalent contract is $0.65 on Kalshi, you buy on Polymarket and sell on Kalshi for a guaranteed spread. These opportunities are larger but require capital and accounts on multiple platforms.
Temporal arbitrage exploits price movements that lag behind news events. When breaking news shifts a market’s fair value, the bot buys or sells before the market fully adjusts. This is less “pure” arbitrage and more statistical edge — returns are not guaranteed per trade.
For most buyers, intra-market is the simplest starting point. Cross-platform has the best risk-adjusted returns but is more complex to operate.
Step 2: Evaluate the Bot Before Purchasing
Request or verify the following from the seller:
- Live trading history. At least 60 days of real trade logs showing entry price, exit price, spread captured, and fees paid. On-chain transaction history is ideal for Polymarket since trades are verifiable on Polygon.
- Fill rate. What percentage of identified opportunities actually get executed? Good arb bots achieve 40-70% fill rates. Below 30% suggests the bot is too slow.
- Average spread captured. After fees, what is the net profit per trade? Expect 0.5-3% per opportunity after Polymarket’s fees.
- Latency benchmarks. Time from opportunity detection to order submission. Sub-500ms is good. Above 1 second means the bot will miss most opportunities.
- Source code vs. binary. Source code is always preferable — you can audit it, modify it, and ensure it does not contain malicious code (like sending your private key to a remote server).
Use the bot verification framework for a complete checklist.
Step 3: Set Up Your Wallet and Infrastructure
For Polymarket, you need a wallet with USDC on Polygon. Set up a dedicated wallet for the bot — do not use your personal wallet:
# Install py-clob-client
pip install py-clob-client python-dotenv
# Create a .env file for your bot
cat > .env << 'EOF'
POLYMARKET_PRIVATE_KEY=your_dedicated_wallet_private_key
POLYMARKET_API_KEY=your_clob_api_key
POLYMARKET_API_SECRET=your_clob_api_secret
POLYMARKET_API_PASSPHRASE=your_clob_passphrase
EOF
For cross-platform bots, also configure Kalshi credentials:
# Add to .env
KALSHI_API_KEY_ID=your_kalshi_api_key
KALSHI_API_SECRET=your_kalshi_api_secret
Set up a VPS for 24/7 operation. Arbitrage opportunities appear around the clock and the bot must be running to capture them:
# On your VPS
sudo apt update && sudo apt install python3.11 python3-pip screen -y
pip install -r requirements.txt # from the bot package
# Run the bot in a screen session
screen -S arbbot
python run_bot.py --config config.yaml
# Detach: Ctrl+A then D
Step 4: Configure Spread Thresholds
The most critical configuration parameter is the minimum spread threshold — the smallest spread the bot will trade. Setting this too low means you lose money on fees. Setting it too high means you miss opportunities.
A typical configuration file looks like:
# config.yaml
strategy:
type: intra_market # or cross_platform
min_spread_pct: 2.0 # minimum 2% spread after fees
max_position_usd: 200 # max $200 per trade
max_concurrent_positions: 5
fees:
polymarket_maker: 0.0 # Polymarket maker fee (currently 0%)
polymarket_taker: 0.02 # 2% taker fee
kalshi_per_contract: 0.07 # $0.07 per Kalshi contract (max)
risk:
max_daily_loss_usd: 100
max_capital_deployed_usd: 2000
min_market_volume_24h: 50000 # skip illiquid markets
monitoring:
log_level: INFO
alert_email: [email protected]
heartbeat_interval_sec: 60
Start with conservative thresholds (2%+ spread, small position sizes) and tighten as you observe the bot’s performance over 2-4 weeks.
Step 5: Run a Dry-Run Period
Every reputable arb bot should support a dry-run or paper-trading mode. Enable it:
python run_bot.py --config config.yaml --dry-run
In dry-run mode, the bot scans for opportunities and logs what trades it would make without submitting real orders. Run this for 3-7 days and analyze:
- How many opportunities per day does it find?
- What is the average spread of detected opportunities?
- Do the opportunities look legitimate, or are they artifacts of stale data?
- Are the detected markets liquid enough to actually fill?
If the dry-run results match the seller’s advertised performance within a reasonable margin (expect 20-30% lower due to latency differences between your infrastructure and theirs), proceed to live trading.
Step 6: Go Live with Small Capital
Start with 25-50% of your intended capital allocation. Monitor closely for the first week:
# Quick P&L check script
import json
from datetime import datetime, timedelta
with open("trade_log.json") as f:
trades = json.load(f)
week_ago = datetime.now() - timedelta(days=7)
recent = [t for t in trades if datetime.fromisoformat(t["timestamp"]) > week_ago]
total_pnl = sum(t["net_pnl_usd"] for t in recent)
fill_rate = len([t for t in recent if t["status"] == "filled"]) / max(len(recent), 1)
avg_spread = sum(t["spread_pct"] for t in recent if t["status"] == "filled") / max(
len([t for t in recent if t["status"] == "filled"]), 1
)
print(f"Trades attempted: {len(recent)}")
print(f"Fill rate: {fill_rate:.1%}")
print(f"Avg spread captured: {avg_spread:.2%}")
print(f"Net P&L: ${total_pnl:.2f}")
If the first week is profitable and fill rates are acceptable, scale up to your full capital allocation.
Common Mistakes and How to Avoid Them
Buying a bot without source code. Binary-only bots are black boxes. They could contain malicious code that exfiltrates your private key. Always request source code or buy from verified sellers with strong reputations.
Ignoring fees in spread calculations. A 3% gross spread becomes 1% or less after Polymarket taker fees and Kalshi per-contract fees. Make sure the bot’s spread threshold accounts for all fees on both sides.
Running on slow infrastructure. Arbitrage is a speed game. Running the bot on your home laptop over WiFi instead of a VPS near exchange servers costs you significant fill rate. Spend $10-20/month on a proper VPS.
Deploying full capital immediately. Start with 25-50% of your intended allocation. Scale up only after a week of confirmed live performance.
Trusting backtested returns. Backtested arbitrage results are almost always overstated because they assume instant execution with no slippage. Only trust live trading results.
Cost Breakdown
| Cost Category | Typical Range | Notes |
|---|---|---|
| Bot purchase (source code) | $500-2,500 | One-time, includes documentation |
| Bot purchase (binary) | $200-800 | One-time, no code inspection |
| Revenue-share model | 15-30% of profits | No upfront cost |
| VPS hosting | $10-20/month | Required for 24/7 operation |
| Polymarket trading fees | 0-2% per trade | Maker: 0%, Taker: up to 2% |
| Kalshi trading fees | $0.01-0.07/contract | For cross-platform arbs |
| Minimum recommended capital | $2,000 | For meaningful returns |
| Expected monthly cost (ownership) | $10-20 | Just hosting after purchase |
The math: if you deploy $5,000, capture an average 1.5% net spread per trade, and execute 3-5 trades per day, gross monthly returns of $300-600 are realistic. Your bot purchase pays for itself within 1-3 months in a typical market environment.
Next Steps and Related Guides
- Cross-Market Arbitrage Guide — Deep dive into arbitrage strategies and the math behind them.
- How to Set Up a Trading Bot on Polymarket — General setup guide if this is your first Polymarket bot.
- Prediction Market Bot Verification — Full verification checklist before you buy any bot.
- Prediction Market Bot Pricing — Compare pricing models across the ecosystem.
- Best Prediction Market Bots — Rankings and reviews of available bots including arbitrage tools.
- Prediction Market API Reference — API documentation for building or extending arbitrage bots.