Kalshi & Polymarket Odds Scraper (No Login, No API Key) avatar

Kalshi & Polymarket Odds Scraper (No Login, No API Key)

Pricing

from $0.55 / 1,000 markets

Go to Apify Store
Kalshi & Polymarket Odds Scraper (No Login, No API Key)

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

locaihost data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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:

GroupFields
The questionplatform, question, title, eventTitle, outcomeLabel, category, tags, rules, url
Priceprobability, outcomes (each outcome's price), bid, ask, spread, bidSize, askSize, lastPrice, change24h
Sizevolume24h, volume, volumeUnit (contracts or usd), liquidity (Polymarket), openInterest
Time and resultopenTime, closeTime, status (open, closed, resolved, upcoming), resolution, resolvedAt
Same question on both venuesmatchKey, matchConfidence, matchedWith (the other venue's market and probability), probabilityGap
Extrashistory ([{t, p}] with priceHistory), orderBook (best 5 levels with includeOrderBook), previous and changeSinceLast (with onlyChanged)
IdsmarketId, eventId, seriesId, and on Polymarket rows slug, eventSlug, conditionId, tokenIds (the order-book token per outcome)
RunsourceType (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 matchKey only 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.

RowFree and StarterScaleBusiness
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. volumeUnit says which.
  • Kalshi publishes no liquidity figure, so liquidity is empty on Kalshi rows and minLiquidity only 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: 0 with 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; use minVolume24h to 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, ask and volume24h. 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):

  • onlyNew returns only markets this setup has never returned, for example new listings on a topic.
  • onlyChanged returns only markets whose probability moved by at least minChangePoints, whose status or result changed, or that are new to the setup. Each row then carries previous (the last probability and when) and changeSinceLast.

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.

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.

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

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.