Polymarket & Kalshi Prediction Market Scanner (Arbitrage Gaps)
Pricing
from $5.00 / 1,000 matched pair with price gaps
Polymarket & Kalshi Prediction Market Scanner (Arbitrage Gaps)
Scrape active Polymarket and Kalshi prediction markets into one schema and match the same event across both platforms to surface YES-price gaps.
Polymarket & Kalshi Prediction Market Scanner – Cross-Platform Arbitrage Gaps
Scrape active Polymarket and Kalshi prediction markets into one clean, unified dataset and automatically match the same event across both platforms to surface YES-price gaps – a starting point for prediction market arbitrage, odds comparison, research dashboards and alerts.
- ✅ Polymarket (Gamma API) + Kalshi (official Trade API v2) – public market data only, no login, no API keys
- ✅ One schema for both platforms: price, 24h volume, liquidity, end date, URL
- ✅ Cross-platform matching (keywords + end-date rules + fuzzy similarity) with
match_confidence - ✅
price_gap= Polymarket YES − Kalshi YES for every matched pair - ✅ Filters: category, minimum 24h volume, max markets, matched-pairs-only mode
- ✅ Pay-per-event pricing, respects your maximum spend limit
What can I use it for?
- Find Polymarket vs Kalshi price differences on the same question (elections, sports, esports, awards, politics…)
- Build a prediction-market odds comparison table or Google Sheet
- Monitor the most active prediction markets by 24h volume
- Feed research / quant models with normalized market probabilities
⚠️ A price gap is not guaranteed arbitrage. Resolution rules, end dates, fees, spreads, liquidity and platform/jurisdiction access differ. Always read both markets' rules before trading. This Actor is a data tool, not financial advice.
Input
| Field | Type | Default | Description |
|---|---|---|---|
categories | string[] | [] | Keep markets whose category/tags contain any of these words (e.g. Politics, Sports, Crypto, Elections). Empty = all. |
minVolume24h | integer | 1000 | Minimum 24h volume (Polymarket: USD; Kalshi: contracts, $1 notional each). |
maxItemsPerPlatform | integer | 500 | Max markets kept per platform (highest 24h volume first). |
onlyMatchedPairs | boolean | false | Output only matched pairs (one row per pair, sorted by largest gap). |
matchThreshold | string (0–1) | 0.6 | Minimum match confidence. |
maxEndDateDiffDays | integer | 7 | Max end-date difference allowed for a match. |
Output fields
platform, market_id, question, category, yes_price, no_price, volume_24h, liquidity, end_date, url, fetched_at, matched_market_id, matched_platform, price_gap, match_confidence (+ matched_question, matched_url on matched rows).
Notes:
- Polymarket
yes_price= first outcome price from GammaoutcomePrices(for head-to-head sports markets the first outcome is the first-named team). - Kalshi
yes_price= mid of best YES bid/ask (falls back to last trade);no_price= 1 − yes. - Kalshi has no liquidity field;
liquidityholds open interest (contracts) for Kalshi rows.
Example output (real row from a test run on 2026-10-16)
{"platform": "polymarket","market_id": "559653","question": "Will Alexandria Ocasio-Cortez win the 2028 Democratic presidential nomination?","category": "United States","yes_price": 0.166,"no_price": 0.834,"volume_24h": 10385.92,"liquidity": 367883.6745,"end_date": "2028-11-08T04:59:00Z","url": "https://polymarket.com/event/democratic-presidential-nominee-2028","fetched_at": "2026-10-16T03:20:49Z","matched_market_id": "KXPRESNOMD-28-AOC","matched_platform": "kalshi","price_gap": 0.031,"match_confidence": 0.807,"matched_question": "Will Alexandria Ocasio-Cortez be the Democratic Presidential nominee in 2028?","matched_url": "https://kalshi.com/markets/kxpresnomd"}
More real examples: sample_output_matched.json.
Pricing (pay per event)
| Event | When | Suggested price |
|---|---|---|
market_row | a normalized market row without a match | $0.001 |
matched_gap | a row/pair matched across Polymarket and Kalshi | $0.005 |
The Actor stops pushing results as soon as your maximum total charge would be exceeded.
How matching works
- Normalize text (accents, “U.S.” → “us”), drop stop-words, index Kalshi markets by keywords.
- Candidates must share ≥2 distinctive keywords and have end dates within
maxEndDateDiffDays. - Score = 0.6·keyword Jaccard + 0.25·rapidfuzz token-set ratio + 0.15·date proximity; penalized when numbers/strikes differ or when market types conflict (spread vs moneyline, nomination vs election…).
- Greedy one-to-one assignment by best score.
Run locally
pip install -r requirements.txtmkdir -p storage/key_value_stores/defaultecho '{"onlyMatchedPairs": true, "maxItemsPerPlatform": 1500}' > storage/key_value_stores/default/INPUT.jsonpython -m src # or: apify run./test_ppe_local.sh # simulate pay-per-event with a $0.05 spend limit
Data sources
- Polymarket Gamma API: https://docs.polymarket.com
- Kalshi Trade API v2: https://docs.kalshi.com
Not affiliated with Polymarket or Kalshi.