Find odds divergence between sportsbook consensus and Polymarket sports markets, then trade the gap.
This is a template. The default signal compares sportsbook consensus odds against Polymarket prices and trades when divergence exceeds a threshold. Remix it — adjust the sports, threshold, sizing, or add your own filters (e.g., only trade NBA, require minimum volume, weight by recency).
Scans active Polymarket sports markets and compares prices against the sportsbook consensus from The Odds API. When a market is mispriced relative to sharp bookmaker lines, it buys the underpriced side.
The edge: Sportsbook lines are set by professional oddsmakers with billions in handle — they're extremely well-calibrated. Polymarket sports markets are thinner and less efficient. When they disagree, the books are usually right.
Two parallel scanning modes run each cycle:
Game-level (h2h): Matches individual Polymarket game markets against sportsbook moneylines.
GET /api/sdk/markets?q=<sport>Futures (outrights): Matches Polymarket championship/winner markets against sportsbook futures odds.
_winner sport keys, e.g., basketball_nba_championship_winner)| Variable | Required | Default | Description |
|---|---|---|---|
SIMMER_API_KEY | Yes | — | Your Simmer API key |
THE_ODDS_API_KEY | Yes | — | Free key from the-odds-api.com (500 req/month free) |
LIVE | No | false | Set to true for real trades. Default is dry-run. |
MIN_DIVERGENCE | No | 0.08 | Minimum spread to enter a trade (8%) |
EXIT_SPREAD | No | 0.02 | Exit when spread closes below this (2%) |
TRADE_AMOUNT | No | 10.0 | Dollars per trade |
MAX_RESOLVE_DAYS | No | 30 | Skip futures markets resolving beyond this (capital lock-up) |
MIN_SHARES_TO_SELL | No | 5.0 | Polymarket minimum sell size |
API_TIMEOUT | No | 30 | HTTP timeout in seconds |
SPORTS | No | 7 sports | Comma-separated game-level Odds API sport keys |
FUTURES | No | 4 leagues | Comma-separated futures sport keys |
export THE_ODDS_API_KEY=your_key_hereWhen a user first installs this skill, walk them through these configuration choices before running:
SIMMER_API_KEY and THE_ODDS_API_KEY are set.MIN_DIVERGENCE) — Default is 8%. Lower values
(e.g., 5%) find more trades but with thinner edges. Higher values (e.g., 10%)
are more selective. Ask the user what level of aggression they prefer.EXIT_SPREAD) — Default is 2%. This is when the arb is
considered closed and the position is sold. Tighter values exit sooner.TRADE_AMOUNT) — Default $10 per trade. Ask the user what
they're comfortable risking per position.MAX_RESOLVE_DAYS) — Default 90 days. Skip futures
markets that resolve beyond this horizon. Shorter = less capital lock-up,
but may miss valid opportunities.LIVE=false (the default) and review a few cycles
of output before going live.Explain each setting and its trade-offs so the user can make an informed choice.
# Dry run (default) — logs what it would trade
python sports_edge.py
# Live trading
LIVE=true python sports_edge.py
[Sports Edge] Scanning 7 sports + 4 futures... (dry_run=True, min_divergence=8%)
[Sports Edge] NBA: Found 6 games with odds
[Sports Edge] Matched: "Will the Celtics win vs Pacers?" → Boston Celtics vs Indiana Pacers
[Sports Edge] Polymarket YES: 0.58 | Books: 0.69 | Divergence: +0.11
[Sports Edge] DRY RUN: Would buy YES at 0.58 (edge 11%) — 10.0
[Sports Edge] Futures NBA championship: Found 30 teams in outrights
[Sports Edge] Matched: "Will the Celtics win the 2026 NBA Champion" → Boston Celtics
[Sports Edge] Polymarket YES: 0.12 | Books: 0.22 | Divergence: +0.10
[Sports Edge] DRY RUN: Would buy YES at 0.12 (edge 10%) — 10.0
[Sports Edge] Done. 2 opportunities found (dry run).