Polymarket & Kalshi Odds - Matched Markets & Price Gaps
Pricing
from $1.00 / 1,000 market checkeds
Polymarket & Kalshi Odds - Matched Markets & Price Gaps
See where Polymarket and Kalshi disagree. Pulls live odds, volume and liquidity from both, matches the same question with a confidence score, and shows the price gap and movers since your last run. Not financial advice. $0.001 per market, $0.003 per gap.
Pricing
from $1.00 / 1,000 market checkeds
Rating
0.0
(0)
Developer
mohamed alaya
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Share
See where the two biggest prediction markets disagree. Pulls live odds from Polymarket and Kalshi, pairs up markets that ask the same question, and shows the price gap, plus which markets moved since your last run. Click Start, get results in about a minute. No API key.
Not financial advice. This Actor reports public prices. A gap is not a guaranteed profit (see "Limits").
What you get
The dataset has three row types, set in the type field.
| type | What it is | Charged |
|---|---|---|
pair | The same question on both venues, with both prices and the gap | $0.003 (gap-found) |
market | One market on one venue: price, bid/ask, volume, liquidity, end date | $0.001 (market-checked) |
mover | A market that moved since your last run and is not already a market row | $0.001 (market-checked) |
Pair fields
| Field | Meaning |
|---|---|
| question, polymarketQuestion, kalshiQuestion | The question as each venue words it |
| matchConfidence (0-100) | How sure the matcher is that both ask the same thing, with matchReasons explaining why |
| polymarketYesPct, kalshiYesPct | Probability of YES on each venue, in percent (bid/ask midpoint, else last trade) |
| gapPts | Absolute difference in percentage points |
| higherOn | Which venue prices YES higher |
| spreadAdjustedEdgePts, edgeDirection | The gap after crossing the bid/ask spread (buy YES on one venue, NO on the other). Before fees. Can be negative or empty |
| polymarketVolumeUsd, kalshiVolumeContracts, *Liquidity | Size of each market (Polymarket in USD, Kalshi in contracts) |
| closesAt, *Url | Earliest end date and links to both markets |
| *ChangeSinceLastRunPts | How far each side moved since your previous run |
Market and mover fields: venue, question, yesPct, yesBidPct, yesAskPct, priceBasis, volume, volumeUnit, volume24h, liquidity, closesAt, change24hPts (Polymarket only), changeSinceLastRunPts, isMover, hasMatchOnOtherVenue, url.
3 ways to use it
- Where do they disagree today? (the default run: about 25 biggest markets per venue plus every gap of 3+ points)
{} - Only one topic, wider net:
{"keywords": ["fed", "rate cut", "cpi"], "minGapPts": 2, "minMatchConfidence": 75, "includeMarkets": false} - Scheduled alerts to Slack or Discord (run every 15 minutes, state remembers prices):
{"keywords": ["bitcoin"], "moverMinPts": 4, "webhookUrl": "https://hooks.slack.com/services/..."}
Input guide
| Field | What to enter | Default | Tip |
|---|---|---|---|
| keywords | Words to look for in market titles | empty (all) | Match is on question, event title and category |
| categories | Kalshi categories, e.g. Politics, Economics | empty | Polymarket has no category field |
| minVolume | Skip thin markets | 1000 | Polymarket in USD, Kalshi in contracts |
| minGapPts | Smallest gap to report, in points | 3 | 2 finds more, noisier gaps |
| minMatchConfidence | How sure a match must be | 80 | Below 70 expect false matches |
| minProbabilityPct | Ignore long shots near 0% or 100% | 3 | Removes 0.1% vs 0.4% noise |
| includeMarkets / maxMarketsPerVenue | Deliver market rows | on / 25 | Off = only gaps and movers |
| scanDepth | Markets read per venue for matching | 1000 | More = more matches, slower |
| trackMovers, moverMinPts, maxMovers | Movers since last run | on / 5 / 20 | First run has no previous prices |
| stateStoreName | Where prices are remembered | polymarket-kalshi-odds-state | Use one name per watchlist |
| webhookUrl | Slack, Discord, Make or Zapier URL | empty | One message per run when something is found |
Output example
{"type": "pair","question": "Will Alexandria Ocasio-Cortez win the 2028 Democratic presidential nomination?","matchConfidence": 89,"matchReasons": ["question words 85% alike", "close the same day of each other"],"polymarketYesPct": 17,"kalshiYesPct": 13.5,"gapPts": 3.5,"higherOn": "polymarket","spreadAdjustedEdgePts": 2.7,"edgeDirection": "Buy YES on Kalshi + buy NO on Polymarket","closesAt": "2028-11-07T15:00:00.000Z","polymarketUrl": "https://polymarket.com/event/democratic-presidential-nominee-2028","kalshiUrl": "https://kalshi.com/markets/kxpresnomd"}
Pricing (pay per event)
| Event | Price |
|---|---|
| Market checked (one market or mover row delivered) | $0.001 |
| Gap found (one matched pair at or above your minimum gap) | $0.003 |
- Default run (about 50 market rows and a few gaps): about $0.06
- Gaps only (
includeMarkets: false), 10 gaps: $0.03 - Every 15 minutes for a day, gaps only, about 10 gaps each: about $2.90
Competing Actors charge $0.01 to $0.05 per result. You pay only for rows that are delivered.
Use it with
- Before: nothing needed. Then: Google Sheets, a Slack or Discord channel, or a newsletter.
- Make, Zapier, n8n: trigger on "run succeeded", or set
webhookUrlfor a direct alert. - AI agents / MCP: call
that_red_bird/polymarket-kalshi-oddswith{"keywords": ["election"]}and let the agent summarize disagreements between venues. - Schedule it every 5 to 60 minutes with the same
stateStoreNameto catch movers.
FAQ
- Is this financial advice? No. It reports public prices and a heuristic match. You decide what to do with it.
- Is a gap an arbitrage? Not by itself. The two markets can resolve on different rules, close at different times, charge different fees, and have thin order books.
spreadAdjustedEdgePtsshows the gap after the bid/ask spread, but before fees, deposit costs and slippage. - How reliable is the matching? It compares wording, numbers and end dates. High scores (85+) with "same numbers" and a close end date are usually right. Always open both links and compare the resolution rules.
- Why are there no movers on my first run? There is nothing to compare with yet. Run it again with the same
stateStoreName. - Why are some markets missing? Only binary Yes/No markets that are open are included. Multi-leg combos are skipped. Markets past their end date are skipped.
- Does it need an account or API key? No. It uses the public Polymarket Gamma API and Kalshi's public market data.
Limits
Prices are snapshots at run time. Volume units differ (USD vs contracts). Kalshi does not give a 24h change, so only Polymarket rows have change24hPts. Some pairs are false matches. No trading, no order placement, no personal data.
Support
Open an issue on the Issues tab. If this saved you time, a short review helps other people find it.