Polymarket & Kalshi Prediction Markets Scraper avatar

Polymarket & Kalshi Prediction Markets Scraper

Pricing

$1.00 / 1,000 results

Go to Apify Store
Polymarket & Kalshi Prediction Markets Scraper

Polymarket & Kalshi Prediction Markets Scraper

Export Polymarket and Kalshi prediction markets in one schema: live odds, implied probability, volume, liquidity, open interest, resolved outcomes, events with nested markets, price history and trades. Filter by keyword, category, volume or expiry. No API key, no login. $1 per 1,000 rows.

Pricing

$1.00 / 1,000 results

Rating

0.0

(0)

Developer

Crikit

Crikit

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

What is Polymarket & Kalshi Prediction Markets Scraper?

Polymarket & Kalshi Prediction Markets Scraper lets you export live odds, resolved outcomes, price history and trades from the two largest prediction markets in one shared column layout, helping you track event probabilities, backtest strategies, spot cross-exchange price gaps and feed dashboards without stitching five APIs together yourself.

  • 📊 Track any question as a probability: every row carries the yes price, implied probability, 24h move, volume, liquidity and close date, from a Fed decision to a World Cup match.
  • 🔁 One schema for both exchanges: a Kalshi row lines up column for column with a Polymarket row, so a spreadsheet, a BI tool or an agent reads them the same way.
  • 🧪 Backtest with real history: pull hourly, daily or minute-level price series and executed trades per market, plus resolved markets with their final outcome, which is the data paid vendors charge for.
  • 🔎 Find markets by keyword, category, tag or link: search "fed rate" across both exchanges, pull every crypto market, or paste a Polymarket or Kalshi link and get exactly that market.
  • 🏷 Events with their markets nested: multi-outcome events (who wins the tournament, how many rate cuts) come back as one row with every sub-market inside.
  • 💸 Flat $1 per 1,000 rows: twelve times cheaper than the closest single-exchange actor, with no API key, no wallet and no login.

Polymarket's and Kalshi's official APIs are free but fragmented: markets, events, price history and trades live on five different hosts with different pagination, Kalshi has no server-side sort or search across its 100,000 open markets, and prices arrive as JSON strings in three different units. This Actor does the stitching, sorting and normalising, and hands you clean rows on a schedule, through the API, or into any integration.

What data does Polymarket & Kalshi Prediction Markets Scraper extract?

Market rows (resultsType: markets):

  • 🏛 Exchange (exchange), market id, event id and the parent event title
  • ❓ Market question and the outcome it prices (question, outcome, outcomes)
  • 💲 Yes price, no price and implied probability in percent (yesPrice, noPrice, impliedProbability)
  • 📉 Best bid, best ask, spread and last trade price
  • 📈 24-hour and 7-day price change (priceChange24h, priceChange1w)
  • 💰 24-hour volume, lifetime volume, liquidity and open interest
  • ⏱ Status, resolved flag and the resolved outcome on closed markets (status, resolved, resolvedOutcome)
  • 📅 Start date, end date and minutes until close
  • 🗂 Category, tags, group title, negative-risk flag, description and Kalshi settlement rules
  • 🔗 Market URL, slug, Polymarket condition id and CLOB token ids, Kalshi ticker, event ticker and series ticker
  • 🕒 Scrape timestamp on every row

Event rows (resultsType: events) add the market count and a nested markets array with each sub-market's question, price, volume and link. Price history rows (priceHistory) carry timestamp, price and, for Kalshi, open, high, low, close, volume and openInterest per candle. Trade rows (trades) carry timestamp, side, outcome, price, size, sizeUsd and, on Polymarket, the trader's wallet and transaction hash.

Every field is present on every row; a value the exchange does not publish is null, never missing or "N/A". Guaranteed on every market row: exchange, question, yes price, status, end date and URL. Best effort: liquidity (Kalshi reports 0 for most markets), 7-day change (Polymarket only), trader identity (Polymarket only).

How to use Polymarket & Kalshi Prediction Markets Scraper

  1. Open the Actor and pick the exchanges and what to export: markets, events, price history or trades.
  2. Narrow the set with keywords, categories, tags or specific market links, or leave everything empty for the highest-volume open markets on both exchanges.
  3. Set Max results. You pay per row, so this is your budget.
  4. Click Start. A default run finishes in about a minute.
  5. Download JSON, CSV or Excel from the Output tab, or read the dataset through the API.

Input

Top 200 open markets by 24-hour volume across both exchanges (the default):

{
"exchanges": ["polymarket", "kalshi"],
"resultsType": "markets",
"status": "active",
"sortBy": "volume24h",
"kalshiHorizonDays": 120,
"maxItems": 200
}

Every politics market on both exchanges with at least $1,000 traded in the last day:

{
"exchanges": ["polymarket", "kalshi"],
"categories": ["politics"],
"minVolume24h": 1000,
"maxItems": 500
}

Hourly price history for one Polymarket market and one Kalshi market over the last 30 days:

{
"markets": [
"https://polymarket.com/event/fed-decision-in-september-762",
"KXFED"
],
"resultsType": "priceHistory",
"historyRange": "1m",
"historyResolution": "1h",
"maxItems": 0
}

markets accepts Polymarket event or market links, market slugs, condition ids, Kalshi market tickers and Kalshi series tickers, in any mix. maxItems: 0 means no cap.

Output

One market row, trimmed:

{
"type": "market",
"exchange": "kalshi",
"marketId": "KXNCAAFGAME-26SEP04INSTPUR-INST",
"question": "Indiana St. wins",
"eventTitle": "Indiana St. vs Purdue",
"outcome": "Indiana St.",
"yesPrice": 0.02,
"noPrice": 0.98,
"impliedProbability": 2,
"bestBid": 0.01,
"bestAsk": 0.02,
"priceChange24h": 0,
"volume24h": 1812734.54,
"volumeTotal": 1900580.58,
"openInterest": 1872729.38,
"status": "active",
"resolved": false,
"endDate": "2026-09-06T23:00:00.000Z",
"minutesUntilEnd": 3302,
"category": "sports",
"tags": ["Sports", "KXNCAAFGAME"],
"url": "https://kalshi.com/markets/kxncaafgame/college-football-game/kxncaafgame-26sep04instpur",
"ticker": "KXNCAAFGAME-26SEP04INSTPUR-INST",
"seriesTicker": "KXNCAAFGAME",
"scrapedAt": "2026-09-04T16:03:11.482Z",
"...": "..."
}

The Output tab shows four table views over the same rows: Overview (markets), Events, Price history and Trades, each with the columns that matter for that row type in a sensible order. Exports include every field.

How much does it cost to scrape Polymarket and Kalshi?

A flat $1.00 per 1,000 rows, charged as rows are written. One market, one event, one price point or one trade is one row. There is no start fee and no charge for platform compute on top.

RowsCost
1,000$1.00
10,000$10.00
100,000$100.00

The closest Polymarket-only actor on the Store charges $12.00 per 1,000 rows for a five-field snapshot of one exchange. The Apify free plan's monthly credit covers about 5,000 rows here.

Two habits keep bills small: set Max results to what you will actually use, and for price history use Max markets and Max rows per market so a wide selection does not multiply into hundreds of thousands of points.

Measured coverage

From 15 cloud QA runs on 2026-09-04 through the Apify proxy (4,397 market rows, 4,047 price points, 200 trades, 40 events), audited row by row in qa/results/integrity_audit.txt: zero type drift, zero duplicates, every sort honoured, every URL absolute.

FieldPolymarketKalshi
exchange, question, yesPrice, impliedProbability, status, url, category, eventTitle100%100%
endDate on active markets93% (Gamma leaves it empty on some open-ended markets)100%
bestBid / bestAsk on active markets91% on top-volume runs, 77% across long-tail tag scans100%
priceChange24h on active markets71% on top-volume runs, 41% across long-tail tag scans (Gamma omits it on thin markets)100%
priceChange1w47%not published by Kalshi
volume24h on active markets100% on top-volume runs, 56% across long-tail tag scans100%
liquidity100%100%, published as 0 on most markets
openInterest90% (event level)100%
resolvedOutcome on resolved markets100%100%
Price history points, hourly over 7 daysabout 165 per market95 to 168 per market, thin hours are skipped by Kalshi

Run time in the cloud at 512 MB: Polymarket-only runs finish in 3 to 35 seconds; anything that ranks or searches Kalshi runs 2 to 3 minutes because Kalshi has to be scanned (see Limits); explicit tickers and history or trade runs finish in under 10 seconds.

Limits

  • Kalshi has no server-side sort or search. A Kalshi run scans its open markets (about 120,000 today, in close-time lanes through the Apify proxy) to rank or match them. With the Console default of a 120-day Kalshi close horizon that is about 90 pages and two minutes in the cloud; with the horizon at 0 it is every open market, about 135 pages and two to three minutes. Explicit tickers and series skip the scan. Kalshi rate-limits each IP, so with the proxy switched off the scan runs two lanes at a time and takes several minutes.
  • Kalshi keyword matching is on market and outcome titles. "Purdue" matches the "Purdue wins" market but not a sibling "Indiana St. wins" market in the same game.
  • Uncapped Kalshi runs (maxItems: 0) keep the series title as the event title, because reading every event would not scale. Capped runs get the exact event title. Uncapped events runs return the top 1,000 Kalshi events by the sort key.
  • Resolved markets are bounded by the Resolved lookback (default the last 24 hours, up to one year) because both exchanges settle tens of thousands of markets a day; Kalshi alone settled 74,000 on the day before launch and 434,000 in the prior 30 days. A week or more is practical only with a category, series or keyword. Older resolved markets need a series ticker, a tag or an explicit link.
  • Polymarket listings stop at 20,000 markets per query (200 pages of 100). Narrow by tag to reach the rest of the resolved archive.
  • Price history on Polymarket is for the first outcome token (the yes side of a binary market); the no side is one minus that price. Long ranges are fetched in 14-day chunks, so a lifetime minute-level series on an old market is many calls and many rows: cap it with Max rows per market.
  • Trades are capped at 40 pages per market (20,000 Polymarket trades, 40,000 Kalshi trades) per run.
  • Parlay and combo markets on Kalshi (multivariate collections) are excluded; they are not tradable as standalone questions.

FAQ

Both exchanges publish this data through public, unauthenticated APIs intended for programmatic access, and this Actor reads only that public data. It does not log in, does not use cookies and does not collect personal data beyond the pseudonymous wallet addresses Polymarket itself publishes on every trade. You are responsible for how you use the data and for complying with each exchange's terms and your local law.

Can I use Polymarket & Kalshi Prediction Markets Scraper as an API?

Yes. Every run can be started and read through the Apify API: start the Actor with a JSON input, poll or wait for the run, then read the dataset as JSON, CSV or Excel. The run-sync-get-dataset-items endpoint does all three in one call for small runs.

Can I use this in Python?

Yes, with the apify-client package:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cirkit/polymarket-kalshi-scraper").call(run_input={"searchTerms": ["fed rate"], "maxItems": 100})
rows = client.dataset(run["defaultDatasetId"]).list_items().items

How do I get price history for a market?

Set What to export to price history, paste the market links or tickers into Specific markets or events, then choose a range (24 hours to the whole lifetime) and a resolution (1 minute, 1 hour or 1 day). One row is written per time point. Leave the market list empty to pull history for the top markets by your sort key instead, capped by Max markets.

How do I get resolved markets for a backtest?

Set Market status to resolved and pick a Resolved lookback (default the last 24 hours). Rows carry resolvedOutcome ("Yes" or "No", or the winning outcome name) and the final prices. Combine with price history or trades on the same markets to reconstruct what the market believed before it resolved.

Can I compare the same question on Polymarket and Kalshi?

Yes. Search both exchanges with the same keyword and both come back in one dataset with identical columns, so a spreadsheet can line up "Fed cuts in September" on each side and show the gap in implied probability.

Can I integrate it with other apps?

Yes. Apify integrations connect a finished run to Google Sheets, Slack, Make, Zapier, Airtable, webhooks and more, and the Actor is MCP-ready for AI agents. A common setup is a scheduled run that appends the day's top markets to a sheet.

How do I schedule it to run automatically?

Save your input as a Task, then add a Schedule to it in the Apify Console: hourly for live odds, daily for a market census, weekly for history refreshes. Each run writes a fresh dataset.

Why did I get fewer results than expected?

Usually one of four things. A keyword that only appears in a Kalshi event title and not in its market titles. A volume, liquidity or price-move threshold that most markets fail (Kalshi reports liquidity as 0 on most markets, so minLiquidity removes nearly all of them). Market status left on active when the markets you wanted have already resolved. Or Max results doing exactly its job. The run log names which filters were active.

Why is a run empty but marked as succeeded?

When nothing matches, the Actor writes one row with type: "no_results" and a noResultsReason explaining what was asked and what to change, and finishes successfully. A scheduled consumer can read the reason instead of guessing from a failed run.

Can I get a field that is not listed?

Open an issue on the Actor's Issues tab with the field and the exchange. Both APIs expose more than is mapped here (order book depth, Polymarket leaderboards, Kalshi settlement sources), and useful requests get added.

You might also like

Changelog

  • 0.1 (2026-09-04): first release. Polymarket and Kalshi markets, events, price history and trades in one schema, keyword and category filters, flat $1 per 1,000 rows.