Polymarket & Kalshi Prediction Market Scanner (Arbitrage Gaps) avatar

Polymarket & Kalshi Prediction Market Scanner (Arbitrage Gaps)

Pricing

from $5.00 / 1,000 matched pair with price gaps

Go to Apify Store
Polymarket & Kalshi Prediction Market Scanner (Arbitrage 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.

Pricing

from $5.00 / 1,000 matched pair with price gaps

Rating

0.0

(0)

Developer

FENG JIE

FENG JIE

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share

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

FieldTypeDefaultDescription
categoriesstring[][]Keep markets whose category/tags contain any of these words (e.g. Politics, Sports, Crypto, Elections). Empty = all.
minVolume24hinteger1000Minimum 24h volume (Polymarket: USD; Kalshi: contracts, $1 notional each).
maxItemsPerPlatforminteger500Max markets kept per platform (highest 24h volume first).
onlyMatchedPairsbooleanfalseOutput only matched pairs (one row per pair, sorted by largest gap).
matchThresholdstring (0–1)0.6Minimum match confidence.
maxEndDateDiffDaysinteger7Max 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 Gamma outcomePrices (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; liquidity holds 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)

EventWhenSuggested price
market_rowa normalized market row without a match$0.001
matched_gapa 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

  1. Normalize text (accents, “U.S.” → “us”), drop stop-words, index Kalshi markets by keywords.
  2. Candidates must share ≥2 distinctive keywords and have end dates within maxEndDateDiffDays.
  3. 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…).
  4. Greedy one-to-one assignment by best score.

Run locally

pip install -r requirements.txt
mkdir -p storage/key_value_stores/default
echo '{"onlyMatchedPairs": true, "maxItemsPerPlatform": 1500}' > storage/key_value_stores/default/INPUT.json
python -m src # or: apify run
./test_ppe_local.sh # simulate pay-per-event with a $0.05 spend limit

Data sources

Not affiliated with Polymarket or Kalshi.