Kalshi & Polymarket Odds Scraper (No Login, No API Key)
Pricing
from $0.55 / 1,000 markets
Kalshi & Polymarket Odds Scraper (No Login, No API Key)
Scrape Kalshi and Polymarket odds by keyword, topic or link: implied probability, 24-hour volume, liquidity, open interest, bid and ask, close time and result, plus price history and order book. The same question is matched across both venues with the gap. No login or API key. $1 per 1,000 markets.
Pricing
from $0.55 / 1,000 markets
Rating
0.0
(0)
Developer
locaihost data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
31 minutes ago
Last modified
Categories
Share
Get market data from Kalshi and Polymarket in one table: the question, implied probability, volume, liquidity, open interest, best bid and ask, close time and result, with the same question matched across both venues, one row per market. No login, no API key, no wallet.
- Compare the two venues: see where Kalshi and Polymarket disagree on the same question, with the gap in points.
- Track a topic over time: schedule an hourly run that returns only the markets that moved, with the previous probability beside the new one.
- Build a dataset for research: pull every open market on a topic, or past results, with daily or hourly price history.
- Feed dashboards and newsletters: current probabilities for elections, Fed decisions, crypto prices or sports, refreshed on a schedule.
- Watch new listings: get only the markets on a topic that weren't there last time.
Quick start
Paste this into the JSON tab of the input and click Start:
{"searchTerms": ["fed decision"], "platforms": ["kalshi", "polymarket"], "maxItemsPerQuery": 10}
You get 20 rows (the 10 most traded Fed decision markets on each venue), usually in about 10 seconds, and the next meeting's options usually come back matched across venues ("Hike 0bps" on Kalshi next to "no change" on Polymarket).
An hourly watch that only returns markets that moved by 2 points or more:
{"searchTerms": ["presidential nominee 2028"], "maxItemsPerQuery": 0, "onlyChanged": true, "minChangePoints": 2}
Every open market on a topic, with 30 days of daily prices:
{"categories": ["Crypto"], "minVolume24h": 1000, "priceHistory": "day", "historyDays": 30}
What data can I get?
Kalshi and Polymarket rows share the same columns:
| Group | Fields |
|---|---|
| The question | platform, question, title, eventTitle, outcomeLabel, category, tags, rules, url |
| Price | probability, outcomes (each outcome's price), bid, ask, spread, bidSize, askSize, lastPrice, change24h |
| Size | volume24h, volume, volumeUnit (contracts or usd), liquidity (Polymarket), openInterest |
| Time and result | openTime, closeTime, status (open, closed, resolved, upcoming), resolution, resolvedAt |
| Same question on both venues | matchKey, matchConfidence, matchedWith (the other venue's market and probability), probabilityGap |
| Extras | history ([{t, p}] with priceHistory), orderBook (best 5 levels with includeOrderBook), previous and changeSinceLast (with onlyChanged) |
| Ids | marketId, eventId, seriesId, and on Polymarket rows slug, eventSlug, conditionId, tokenIds (the order-book token per outcome) |
| Run | sourceType (search, category, top or link), source, scrapedAt |
One real row (run on 2026-10-18, shortened):
{"platform": "kalshi","question": "Will the Federal Reserve Hike rates by 0bps at their October 2026 meeting?","probability": 0.865,"outcomes": [{"name": "Yes", "price": 0.865}, {"name": "No", "price": 0.135}],"eventTitle": "Fed decision in Oct 2026?","outcomeLabel": "Fed maintains rate","category": "Economics","volume24h": 31504.63,"volume": 5664930.77,"volumeUnit": "contracts","liquidity": null,"openInterest": 1810294.89,"bid": 0.86,"ask": 0.87,"spread": 0.01,"lastPrice": 0.87,"change24h": 0.01,"closeTime": "2026-10-28T17:59:00.000Z","status": "open","resolution": null,"matchKey": "m_1320560288f2","matchConfidence": 1,"matchedWith": {"platform": "polymarket","marketId": "2589812","question": "Will there be no change in Fed interest rates after the October 2026 meeting?","probability": 0.865},"probabilityGap": 0,"marketId": "KXFEDDECISION-26OCT-H0","eventId": "KXFEDDECISION-26OCT","seriesId": "KXFEDDECISION","sourceType": "search","source": "fed decision"}
The dataset has five views (Markets, Same question on both venues, Results, Moves since last run, Price history) and exports to JSON, CSV, Excel or HTML. The run's SUMMARY record shows rows per venue, what each search found and anything skipped.
How the numbers are read:
- Implied probability uses one rule for both venues: the bid/ask midpoint while the spread is 10 points or less, otherwise the last trade. Resolved markets read 1 or 0.
- Matching is strict on purpose. Two markets share a
matchKeyonly when they have the same subject, the same numbers, the same option and close dates within 3 days of each other. A wrong pair is worse than none, so near misses stay unmatched. Head-to-head games are lined up team by team. - Market-level data only. Everything comes from each venue's public market-data endpoints, read logged out. No trader names, wallets, positions or comments are collected.
How much does it cost?
You pay per market returned. There is no charge for Apify platform usage on top.
| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Market | $1 per 1,000 | $0.75 per 1,000 | $0.55 per 1,000 |
Plus $0.00005 per run start. Apify's free $5 monthly credit covers about 5,000 markets. Free-plan runs stop at 1,000 markets each; any paid Apify plan removes the cap. Price history and order books are included at no extra charge.
What's free: runs that find nothing, input mistakes, links that can't be found, markets skipped by onlyNew or onlyChanged, the same market found by two searches (charged once per run), markets your filters leave out, and markets found but not delivered before the run's time limit. To cap a run's spend, set Maximum cost per run in the run options, or use maxResults.
Limits, stated up front
- Units differ by venue. Kalshi reports volume and open interest in contracts (each pays $1 if right), Polymarket in US dollars.
volumeUnitsays which. - Kalshi publishes no liquidity figure, so
liquidityis empty on Kalshi rows andminLiquidityonly filters Polymarket. - Kalshi has no keyword search of its own. The Actor searches Kalshi's series names, tags and categories, then keeps the markets whose wording contains every word. Short, specific words work best ("fed decision", "bitcoin", "nominee").
- Matching covers what this run read. Run both venues with the same search terms, or a big pull, to get matches. A pull of about 59,000 open markets matched 120 questions.
- "Upcoming" markets exist on Kalshi only. Resolved Kalshi markets older than its live window come from Kalshi's archive when you search, pick a category or give a series.
- Price history: hourly up to 31 days, daily up to 365.
- Big pulls:
maxItemsPerQuery: 0with no search returns every open market on both venues, well over 50,000 rows. Keep the default 2 GB memory and set the run's maximum cost high enough. Kalshi lists many strike and parlay-style markets with no trading; useminVolume24hto keep only active ones. If the time limit is reached, the run stops cleanly and keeps what it found. - Probabilities are market prices, not forecasts. Thin markets can show stale or wide prices; check
bid,askandvolume24h. Nothing here is investment or betting advice.
Only new since last run, and schedules
Two switches for scheduled runs, remembered per saved task (or per set of inputs):
onlyNewreturns only markets this setup has never returned, for example new listings on a topic.onlyChangedreturns only markets whose probability moved by at leastminChangePoints, whose status or result changed, or that are new to the setup. Each row then carriesprevious(the last probability and when) andchangeSinceLast.
Skipped markets cost nothing. Set up a schedule under Schedules in Apify Console; hourly or daily works well with onlyChanged.
Integrations: API, n8n, Make and AI agents
API. Run it and get the rows back in one call:
curl -X POST "https://api.apify.com/v2/acts/locaihost~prediction-markets/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms": ["fed decision"], "maxItemsPerQuery": 10}'
Apify's API clients for Python and JavaScript work the same way.
n8n, Make, Zapier, Google Sheets, Slack, webhooks. Apify's built-in integrations send each run's dataset wherever you need it, for example a Slack message whenever an onlyChanged run returns rows.
AI agents (MCP). Add this Actor to Claude, Cursor or any MCP client with https://mcp.apify.com/?tools=locaihost/prediction-markets, then ask something like "What do Kalshi and Polymarket give for each option at the next Fed meeting, and where do they differ?"
FAQ
How much does it cost to scrape Kalshi and Polymarket?
$1 per 1,000 markets on the Free and Starter plans, $0.75 on Scale and $0.55 on Business, with price history and order books included. Apify's free $5 monthly credit covers about 5,000 markets.
Can I use it through the API or from Python?
Yes. Use the run-sync-get-dataset-items call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.
Can I use it from an AI agent?
Yes. Through the Apify MCP server (https://mcp.apify.com/?tools=locaihost/prediction-markets) any MCP client can call it with search terms, categories or links and read the rows back.
Is it legal to scrape Kalshi and Polymarket?
The Actor reads public market data that both venues serve to logged-out visitors, and only market-level fields: no trader names, wallets, positions or comments. Both venues' terms restrict redistribution of their data, so check them before you republish anything. You are responsible for how you use the data and for the laws that apply to you. If you are a venue and want something changed, open an issue and we will act on it promptly.
What can I put in "Market or event links / IDs"?
Links copied from kalshi.com or polymarket.com (a market, an event or a Kalshi series page), Kalshi tickers such as KXFEDDECISION-26OCT, Polymarket slugs, condition ids (0x...) or market ids. Links always return their markets whatever the filters, a series link lists every market in the series, and a link that can't be found is named in the status message and costs nothing.
Why are some fields empty?
liquidity is Polymarket-only, the order-book ids (slug, conditionId, tokenIds) exist only on Polymarket rows, resolution stays empty until a market settles, and probability is empty when a market has neither a two-sided quote nor a trade. Match fields are empty when the other venue has no market on the same question in this run.
More from locaihost data
- Google Trends Scraper: search interest over time for the same topics people are trading on.
- SEC EDGAR Scraper: company financials, filings and insider trades.
- YouTube Transcript Scraper: transcripts of press conferences, speeches and debates behind the markets.
Did it help?
If this saved you time, a quick rating on the Store helps other people find it.
Support
Something not working, a missing field or a market that reads wrong? Open an issue on the Issues tab: we answer issues within 24 hours.