Polymarket & Kalshi Scraper - Prediction Market Odds API
Pricing
Pay per event
Polymarket & Kalshi Scraper - Prediction Market Odds API
Live odds from Kalshi and Polymarket in one clean format: YES probability, bid/ask, volume, liquidity, close date, rules. Search, categories (politics, weather, crypto...), links, order books, price history, odds-change alerts. $1 per 1,000 markets.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Yukai Lin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
What does Polymarket & Kalshi Scraper do?
Search keywords or categories, or paste market links, and get one row per Kalshi or Polymarket market in the same format (YES probability, bid/ask, volume, close time, rules, link), at $1 per 1,000 markets. Optional price history is $1 per 1,000 and order books $0.50 per 1,000, charged only when the venue returned data. Markets your filters drop, unchanged markets in odds-alert mode, failed links and input mistakes are free. No start fee, no login.
It reads the live odds of prediction markets from the two biggest venues, Kalshi (the US-regulated event exchange) and Polymarket, and returns them in one clean, identical format, whichever venue they come from:
- 📈 Odds: YES probability (0-1 and percent), best bid and ask for YES and NO, last trade, spread, 24 h price change.
- 💵 Activity: total and 24 h volume, liquidity (Polymarket), open interest (Kalshi), open and close time, status.
- 🧾 Context: event title, question, outcome ("Yes — J.D. Vance"), category and tags, rules, resolution source, link to the market page.
- 🔎 Find markets by keyword (election, fed rate, bitcoin, temperature...), by category (politics, economics, crypto, weather, sports...), by closing date and minimum volume, or paste market links, tickers and slugs.
- 📊 Order book (best bids and asks with sizes) and price history (daily or hourly probability for the last N days), when you want them.
- 🔔 Odds alerts for schedules: only markets that are new or whose probability moved at least N points since the last run; unchanged markets are free.
- 📄 CSV file with the main columns for Excel or Google Sheets.
- 🧮 Exclusive-event quote sums: for complete events explicitly marked mutually exclusive by the venue, each outcome row includes the sum of YES asks and bids and flags sums below or above 1.
- 🔗 Optional cross-venue pairs: match similar Kalshi and Polymarket questions already fetched in the run, with compatible YES selections and close dates within 3 days. Unclear selections are skipped. Approximate match; check both settlement rules.
Why this Actor?
- Both venues in one schema. Most prediction-market Actors cover one venue. Here a Kalshi market and a Polymarket market have the same fields, so you can compare the same question across venues without writing two parsers.
- Official public APIs, no login. Kalshi's Trade API v2 and Polymarket's Gamma and CLOB APIs, the same data the venues' own websites use. No browser, no scraping of web pages, so runs are fast and stable.
- Honest units. Kalshi reports volume in contracts and Polymarket in dollars; every row says which (
volumeUnit). Probabilities follow the venues' own display rule (midpoint of bid and ask, or the last trade when the spread is wide). - Pay only for markets you keep. $1 per 1,000 markets. Markets your filters drop, unchanged markets in alert mode and failed links are free.
Real results (4 October 2026)
- Top 200 markets by 24 h volume, both venues, order book and 30-day history on the first 20: 1,425 candidate markets found, 200 returned (100 Kalshi, 100 Polymarket), 20 order books, history for 20 (Kalshi points for 9 of them; Polymarket's history call for the other 11 failed in that test and was not charged; fixed since), $0.219, 103 seconds (from a network where Polymarket had to go through our backend; directly it is faster).
- Weather markets closing within 7 days, both venues: 646 candidates, 17 dropped by the closing-date filter, 100 returned (50 Kalshi: highest temperature in LA, NYC rain...; 50 Polymarket: Paris, Shanghai, Chongqing temperatures...), with 10 price histories, $0.11. Kalshi alone: 346 weather markets found, 100 returned in 9.5 seconds for $0.10.
- Search "election", maximum 20: Kalshi scanned 13,908 open events, 1,818 matched; top 20 by 24 h volume returned (2028 presidential winner by candidate, party, Brazil, German state elections), 35 seconds, $0.02. Polymarket alone: 20 markets (Brazil presidential election 2026 candidates...) in 21 seconds.
- Odds alerts (politics, 100 markets, threshold 1 point): first run 100 markets (50 per venue) for $0.10; a second run a minute later: 100 unchanged, 0 returned, $0.00.
- Links: a Kalshi event link and a Polymarket event link returned 33 markets; an unknown ticker and a non-market link came back as free rows (
not_found,invalid_input).
Use cases
- Track the odds of an election, a Fed decision or a court case across both venues in one sheet, every hour.
- Odds-change alerts: schedule it and get only the markets that moved, e.g. into Slack, a webhook or Google Sheets.
- Cross-venue comparison and research: the same question on Kalshi and Polymarket side by side (spread, liquidity, probability).
- Weather, sports and economic-data markets: daily temperature, rain, CPI, jobs report markets closing this week.
- Datasets for analysis and AI agents: probability history, order book depth and volume for models, dashboards and news.
How to use it
- Keep both venues or pick one.
- Type search keywords (e.g.
election,fed rate,bitcoin) and/or categories (politics,economics,crypto,weather,sports...). Leave both empty for the most active markets right now. - Or paste market links, tickers or slugs (
https://kalshi.com/markets/...,KXPRESPERSON-28,https://polymarket.com/event/...). - Optional: closing within N days, minimum volume, sort order, order book, price history, odds alerts, or
matchAcrossVenues: truefor approximate cross-venue pairs. - Run. Results are in the dataset (views: Markets and odds, Prices and liquidity, Odds changes, Errors) and in
MARKETS.csv.
Input example
{"platforms": ["kalshi", "polymarket"],"search": ["election"],"categories": [],"status": "open","sortBy": "volume24h","maxMarkets": 200,"includeOrderBook": true,"includePriceHistory": true,"priceHistoryDays": 30,"detailsMaxMarkets": 20}
For alerts on a schedule: {"categories": ["politics"], "maxMarkets": 100, "onlyChanges": true, "minProbabilityChange": 2}.
Output example
One Kalshi market from a real run (4 October 2026; order book and history shortened):
{"platform": "kalshi","marketId": "KXNCAAFGAME-26OCT03ALAMSST-MSST","eventId": "KXNCAAFGAME-26OCT03ALAMSST","seriesId": "KXNCAAFGAME","eventTitle": "Alabama vs Mississippi St.","question": "Mississippi St. wins","outcome": "Yes — Mississippi St.","yesProbability": 0.135,"yesProbabilityPercent": 13.5,"yesBid": 0.13, "yesAsk": 0.14, "noBid": 0.86, "noAsk": 0.87,"lastPrice": 0.14,"spread": 0.01,"oneDayPriceChange": -0.2,"volume": 4444545.9,"volume24h": 4191872.56,"volumeUnit": "contracts ($1 payout each)","openInterest": 3000256.44,"closeTime": "2026-10-05T17:00:00.000Z","status": "open","category": "Sports","tags": ["Football"],"resolutionSource": "Kalshi using information originating from the NCAA; ESPN","url": "https://kalshi.com/markets/kxncaafgame/alabama-vs-mississippi-st/kxncaafgame-26oct03alamsst","orderBook": { "yesBids": [{ "price": 0.13, "size": 314889.91 }], "yesAsks": [{ "price": 0.14, "size": 632293.76 }], "sizeUnit": "contracts" },"priceHistory": [{ "time": "2026-10-03T04:00:00.000Z", "probability": 0.34, "volume": 128564.05 }],"rank": 1,"success": true,"charged": true}
And one Polymarket market from the same run:
{"platform": "polymarket","marketId": "601819","eventId": "45915","eventTitle": "Brazil Presidential Election","question": "Will Luiz Inácio Lula da Silva win the 2026 Brazilian presidential election?","outcome": "Yes — Luiz Inácio Lula da Silva","outcomes": ["Yes", "No"],"outcomePrices": [0.405, 0.595],"yesProbability": 0.405,"yesBid": 0.4, "yesAsk": 0.41,"volume": 14311721.61,"volume24h": 554268.89,"volumeUnit": "USD","liquidityUsd": 496055.02,"closeTime": "2026-10-05T03:59:00.000Z","url": "https://polymarket.com/event/brazil-presidential-election/will-luiz-incio-lula-da-silva-win-the-2026-brazilian-presidential-election","clobTokenIds": ["3063099424866789...", "7919193961010024..."]}
What the fields mean
| Field | Meaning |
|---|---|
platform, marketId, eventId, seriesId | Venue and its IDs (Kalshi tickers; Polymarket market and event IDs). |
eventTitle, question, outcome | The event, the market's question and the outcome a YES share pays on. A multi-outcome event (who wins, which temperature range) has one market per outcome. |
yesProbability, yesProbabilityPercent | Market-implied chance of YES: midpoint of best bid and ask when the spread is 10 cents or less, else the last trade (the venues' display rule). |
yesBid, yesAsk, noBid, noAsk, lastPrice, spread | Prices in dollars per $1 contract (= probability). |
eventYesAskSum, eventYesBidSum, eventYesAskBelowOne, eventYesBidAboveOne | YES quote sums and strict < 1 / > 1 flags for complete events the venue marks mutually exclusive. Missing quotes leave the corresponding sum null. A sum alone does not prove a tradable arbitrage. |
counterpart, matchScore, probabilityGap, matchNote | With matchAcrossVenues: true, the best other-venue candidate, 0–1 text overlap, and this row's YES probability minus the counterpart's. Only score ≥ 0.6 and close dates within 3 days are retained. Approximate match; check settlement rules, outcome meaning, fees and liquidity. |
volume, volume24h, volumeUnit | Traded volume. Kalshi: contracts (each pays $1 if right, so it is the notional in dollars); Polymarket: USD. |
liquidityUsd, openInterest | Polymarket order-book liquidity in USD; Kalshi open interest in contracts. |
openTime, closeTime, status | When trading opened and closes; open, closed, settled, paused. |
category, tags, rules, resolutionSource, url | Topic, the resolution rules (shortened), sources named by the venue, and the public market page. |
orderBook | With "Include order book": best bids and asks for YES and NO with sizes. |
priceHistory | With "Include price history": [{time, probability}] per day or hour (Kalshi adds volume). |
isNew, previousProbability, probabilityChange | Odds-alert mode: new market, or the probability when last reported and the move in percentage points. |
rank, success, charged, errorType | Position in the results, and the usual TidyTools status fields. |
How much does it cost?
| Event | Price | When |
|---|---|---|
| Market | $1.00 / 1,000 ($0.001 each) | one market returned after your filters |
| Price history | $1.00 / 1,000 | one market's history, only if you turn it on and points exist |
| Order book | $0.50 / 1,000 | one market's order book, only if you turn it on and it is not empty |
Free: markets dropped by your filters, unchanged markets in odds-alert mode, failed links, unknown tickers and invalid inputs. No start fee. Larger Apify plans get the usual volume discount (Silver 10%, Gold and above 20%).
Example: an hourly odds alert on 100 politics markets returns only the ones that moved; a quiet hour costs nothing. 1,000 markets with order book and 30-day history cost $2.50.
For comparison (Apify Store, 4 October 2026): bigdavidson/kalshi-weather-markets $0.001 per result (34% of runs succeeded), scrapemint/kalshi-prediction-market-scraper $0.004, scrapemint/polymarket-market-monitor $0.012, pappy-dev/kalshi-markets $0.001, memo23/kalshi-markets-api $0.001, scrapemint/polymarket-scraper $0.005, crawlerbros/polymarket-scraper $0.005, lergassy/prediction-markets-api $0.0015 (both venues), congism/polymarket-kalshi-arb-finder $0.002, nexgendata Kalshi $0.10.
Control your cost
- Maximum markets caps the run. Order book / history for the first N markets keeps the extras to the top results.
- At the start the run logs the worst case and compares it with your maximum charge per run; it stops before passing it (
SUMMARY.status: LIMIT_REACHED). - Every row has
charged: trueorfalse; free rows say "(not charged)". If Apify restarts the run, markets already returned are not charged again.
Use it from code
curl -X POST "https://api.apify.com/v2/acts/tidytools~polymarket-kalshi-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"search":["fed rate"],"maxMarkets":20}'
With AI agents (MCP): connect Apify's MCP server (https://mcp.apify.com?tools=tidytools/polymarket-kalshi-scraper) to Claude, Cursor or any MCP client and ask, for example, "What do Kalshi and Polymarket say about the next Fed decision?". Minimal input: {"search": ["fed"], "maxMarkets": 20}. Failed items are not charged and carry an errorType.
Limitations
- Not financial advice. Prices are what traders pay at that moment, not forecasts we make. Thin markets can show odd prices; use the volume and spread fields.
- Event sums require an explicit exclusive-event flag and the full event response. Individual market records, cumulative date ladders and events with missing quotes may have no usable sum. Matching compares text and dates, not full settlement terms; it is a research hint, not an executable trade signal.
- Data as published by the venues. Volumes, prices and statuses are the venues' numbers. A market whose event is over but not yet resolved still shows as open until the venue settles it.
- Browsing without keywords reads Kalshi's most traded series (by lifetime volume) and Polymarket's markets sorted by your sort key; with keywords it scans all open Kalshi events (about 14,000) and Polymarket's search. Very small markets may need keywords or links to be found.
- Kalshi volume is in contracts, Polymarket's in USD, so the two venues are ranked separately and alternated in the results.
- Polymarket does not allow trading by US persons; this Actor only reads public market data. If Polymarket is unreachable from the run's network, the Actor can read it through our Cloudflare backend (
httpVia). - Polite access: about 6 requests per second per venue, honest TidyTools User-Agent, retries with backoff on HTTP 429.
FAQ
Does the Actor collect usage data? The Actor sends one anonymous usage counter per run (input type, item count range, outcome) to improve the tool; no URLs, content or account data.
Is this data legal to use? Yes. Both venues publish this market data through public, documented APIs that need no account. The Actor reads only those APIs and identifies itself.
Why is a market "Yes — Candidate" instead of one row per event? Each outcome of a multi-outcome event is its own tradable market with its own price and volume on both venues. Group by eventId to rebuild the event.
How fresh is it? Live at the time of the run (scrapedAt). Schedule it every 5-60 minutes with odds alerts to follow moves.
What happens if I make a mistake in the input? Nothing is searched and nothing is charged: the run ends normally (not as "failed") with one free row, errorType: "invalid_input", that says what to fix (an unknown venue, status or sort order, or a filter that is not a number). A single bad link in a list becomes its own free invalid_input or not_found row and the other links are still returned.
What if nothing matches? You get one free row with errorType: "no_results" that says whether no market was found for your keywords or the filters dropped them all (with the counts), so an empty result is never a silent one.
Why does odds-alert mode report a market as "new" when it is not new on the venue? The monitor remembers the markets in your top "Maximum markets". When a market moves into that list (more volume, a closer close time), it is new to the monitor and is reported once with isNew: true. Raise "Maximum markets" if you want a stable list.
What if a venue is down or rate-limits the run? Requests are paced at about 6 per second per venue with backoff on HTTP 429. If one venue cannot be read, it gets one free error row (network, blocked or timeout) and the other venue's markets are still returned; nothing is charged for the failure.
Why did I get fewer markets than the maximum? Your filters dropped the rest; SUMMARY.filteredOutBy shows how many each filter removed. They are free.
Related Actors
- Google Trends Scraper: search interest behind the questions markets trade on.
- SEC Form D Scraper: companies that just raised money, from official SEC filings.