Prediction Markets Scraper - Kalshi & Polymarket Odds
Pricing
from $17.00 / 1,000 market summaries
Prediction Markets Scraper - Kalshi & Polymarket Odds
Scrape live Kalshi and Polymarket odds: yes/no prices, bid/ask, volume, open interest, order books, price history, recent trades and cross-platform price gaps for the same question. Export CSV, Excel, JSON or API. No login or API key. Verified: 10 markets + 10 matches in 12 s.
Pricing
from $17.00 / 1,000 market summaries
Rating
0.0
(0)
Developer
RecordsData
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
14 days ago
Last modified
Categories
Share
Prediction Markets Scraper collects live odds from Kalshi and Polymarket in one run. Each row has the yes/no price, best bid/ask, volume, liquidity, category and close time, with optional order book depth, price history, recent trades and top holders. Filter by category, minimum volume or liquidity and sort order, or switch on monitor mode to receive only new markets and price moves. It also matches the same question across both exchanges and reports the price gap. Export CSV, Excel, JSON or API. No login, no API key. Verified 2026-10-10: $0.02 per market row.
Prediction Markets Scraper reads the public APIs of Kalshi and Polymarket and returns one normalized schema for both. A real test run on 2026-10-07 returned 10 market rows plus 10 cross-platform matches in 12 seconds.
π― What does the Prediction Markets Scraper do?
- Scrapes Kalshi prediction market odds and Polymarket odds in the same run, or either one alone, normalized to one
yesPriceandnoPricebetween 0 and 1. - Filters by search terms, category, status, minimum volume and minimum liquidity (Polymarket), with six sort orders.
- Monitor mode (
onlyNew) returns only markets earlier runs did not deliver, and can re-deliver a market when its Yes price moves by an amount you set. Skipped rows cost nothing. - Adds order book depth, price history, recent trades, top holders (Polymarket) and wallet mode for up to 100 wallets when you turn them on.
- Finds the same question on Kalshi and Polymarket and outputs the price gap, the spread in percent and which exchange is cheaper.
π What data can you extract from Kalshi and Polymarket?
| Field | Type | Platforms | Example |
|---|---|---|---|
recordType, platform | string | both | market-summary, kalshi |
marketId, eventId, eventTitle, outcomeLabel | string | both | KXOAIANTH-40-ANTH, KXOAIANTH-40 |
question, category, tags | string, array | both (tags Polymarket) | Will Open AI or Anthropic IPO first? |
status, yesPrice, noPrice | string, number (0 to 1) | both | open, 0.94, 0.06 |
yesBid, yesAsk, noBid, noAsk, lastPrice | number | both (no* Kalshi only) | 0.94, 0.95 |
volume, volume24h | number | both, when above zero | 207250, 54 |
openInterest, liquidity, spread | number | Kalshi, Polymarket, both | 54186.64, 63561 |
priceChange1h, 1d, 1w, 1m, 1y | number | Polymarket only | price change per window |
previousClose, volume1w, volume1m, volume1y | number | previousClose Kalshi, volumes Polymarket | previous UTC day close, volume per window |
resolved, result, rules, resolutionSource | mixed | both | settlement and rules text |
changeType, previousYesPrice | string, number | monitor mode | new or price-move, and the earlier price |
openTime, createdTime, closeTime | string | both | 2040-01-01T04:59:00Z |
orderBook, priceHistory, recentTrades, topHolders | object, array | when enabled | {"bids":[...],"asks":[...]}, [{"time":"...","price":0.026}] |
wallet, size, avgPrice, currentValue, cashPnl, realizedPnl | mixed | wallet mode | one row per position, recordType wallet-position |
url, scrapedAt | string | both | https://kalshi.com/markets/..., 2026-10-07T19:31:59.699Z |
The dataset schema lists 77 typed fields; Polymarket rows also carry outcomes, outcomePrices, negRisk and conditionId. Columns the exchange does not provide are left out: no N/A, null or placeholder values.
π§Ύ Sample output
Real Polymarket row from a run on 2026-10-07 (default settings, no extras):
{"recordType": "market-summary","platform": "polymarket","marketId": "559651","question": "Xi Jinping out before 2027?","status": "active","yesPrice": 0.0265,"noPrice": 0.9735,"lastPrice": 0.027,"volume": 14425353,"volume24h": 7491,"closeTime": "2027-01-01","url": "https://polymarket.com/event/xi-jinping-out-before-2027","scrapedAt": "2026-10-07T19:32:00.617Z"}
Real cross-platform match from a run on 2026-10-07 (same question on both exchanges):
{"recordType": "cross-match-record","question": "Will Gavin Newsom be the Democratic Presidential nominee in 2028?","matchScore": 79,"kalshi": { "marketId": "KXPRESNOMD-28-GN", "yesPrice": 0.14 },"polymarket": { "marketId": "559652", "yesPrice": 0.1705 },"priceGap": -0.0305,"absPriceGap": 0.0305,"cheaperPlatform": "kalshi","spreadPercent": 21.79,"scrapedAt": "2026-10-07T19:33:07.290Z"}
The kalshi and polymarket objects also carry eventId, question and url (shortened here). priceGap is the Kalshi yes price minus the Polymarket yes price.
π° How much does it cost to scrape prediction markets?
Pay per event. You are charged only for rows saved to your dataset. Rows with missing data, failed requests and rows skipped by monitor mode are never charged.
| Event | What it is | Price (FREE plan) |
|---|---|---|
market-summary | One market row | $0.02 each ($20.00 per 1,000) |
cross-match-record | One matched pair with the price gap | $0.01 each |
order-book-record, price-history-record, recent-trades-record, holders-record | Each extra, only when data came back | $0.01 each |
wallet-position-record | One current Polymarket position of a wallet | $0.003 each ($3.00 per 1,000) |
On higher Apify plans the market row price drops to $0.019, $0.018 or $0.017 depending on the plan; the extras keep the same price. Example: 10 markets with three extras plus 10 cross-matches = 10 x $0.02 + 40 x $0.01 = $0.60. A wallet run returning 40 positions costs 40 x $0.003 = $0.12. The default run (10 markets, no extras, cross-match off) costs $0.20; each cross-match found adds $0.01. A monitor run that finds nothing new returns 0 rows and charges $0. Free Apify accounts are limited to 10 market rows per run.
π How to scrape Kalshi and Polymarket (3 steps)
- Open the Actor in Apify Console and keep both platforms selected.
- Optionally add search terms such as
bitcoin, setMax itemsand switch on extras. - Click Start, then download CSV, Excel or JSON from the Output tab.
βοΈ Input
| Field | Default | What it does |
|---|---|---|
platforms | ["kalshi","polymarket"] | Exchanges to read. |
status | open | open, closed, settled, all. |
searchTerms | [] | Keep only markets that match any phrase. Polymarket searches title, description and tags; Kalshi matches literally. |
categories | [] | Keep only markets in these categories, for example crypto. |
minVolume | 0 | Minimum volume. USD on Polymarket, contracts on Kalshi. |
minLiquidity, liquidOnly | 0, false | Minimum liquidity in USD (Polymarket only); drop zero-volume markets. |
sortBy | default | default (most traded first), volume, volume24h, liquidity, newest or endingSoon. |
maxPerPlatform | 300 | Markets fetched per exchange (up to 5,000). |
maxItems | 100 | Maximum market-summary rows; cross-match rows are capped separately. |
onlyNew | false | Monitor mode: skip markets an earlier run of the same search already delivered. |
priceChangeThreshold | 0 | With onlyNew, re-deliver a seen market when its Yes price moved this much (0.05 is 5 cents). |
stateKey, resetSeen | empty, false | Separate monitor memories for the same filters; clear memory before the run. |
includeOrderBook, includePriceHistory, includeTrades | false | Add top 10 bids and asks, the hourly price series, the last 20 trades. |
includeHolders | false | Add the top holders per outcome (Polymarket only), $0.01 per market. |
includeCrossMatch | true | Add one row per same-question pair (needs both platforms). |
crossMatchDepth | 3000 | Markets scanned per exchange to find pairs (paid accounts). |
walletAddresses | [] | Wallet mode: current Polymarket positions of up to 100 wallets, $0.003 per position. |
{"platforms": ["kalshi", "polymarket"],"status": "open","categories": ["crypto"],"minVolume": 1000,"sortBy": "volume24h","maxItems": 20,"onlyNew": true,"includeOrderBook": true,"includeCrossMatch": false}
Rows alternate between exchanges, so a small maxItems gives you both. With includeCrossMatch on, a run can return up to maxItems market rows plus up to maxItems cross-match rows. Kalshi has no server side filter or sort, so sorting there works inside the first 1,500 markets read. Monitor mode keeps its memory in the key-value store prediction-markets-seen in your account, one record per search; rows are marked changeType: "new" or "price-move".
π¦ Output
The dataset has three record types: market-summary, cross-match-record and wallet-position. In the Output tab you get a Markets view, a Cross-platform matches view and a Wallet positions view. Download as JSON, CSV, Excel, XML or HTML, or fetch it through the API. A search that matches nothing finishes as SUCCEEDED and charges nothing. If both exchanges cannot be read, the run fails with a clear message and charges nothing.
π Prediction markets scraper vs alternatives
Store pages read on 2026-10-10. "Not stated" means the listing does not show the feature.
| Feature | This Actor | scrapesage | chorelet |
|---|---|---|---|
| Price per 1,000 markets | $20 ($17 Gold) | from $1.66 | from $1.40 ($2 on FREE) |
| Monitor, only new rows | Yes, plus price-move re-delivery | Yes, odds and volume moves | Not stated |
| Filters and sort | Category, volume, liquidity, 6 sort orders | Tags, volume, liquidity, sort | Tags, volume, 5 sort orders |
| Order book | Top 10 levels per market | Not stated | Top of book only |
| Holders and wallets | Holders and wallet positions, Polymarket | Holders, wallet P&L, trades | Not stated |
| Cross-platform price gap | Yes, per question | Yes, arbitrage mode | Not stated |
Other Actors read the same day: scrapebench charges $0.0015 per market with a volume filter, and feedforge from $4.00 per 1,000 with search and minimum volume only. We are 6 to 13 times more expensive per plain market row, so if you only need a flat price dump, a cheaper Actor will do. scrapesage covers more modes, such as events, trade feeds and wallet P&L totals, and costs far less. The higher price here buys one schema for both exchanges, per-market order books, hourly history and same-question gaps in one run.
π‘ Use cases
Arbitrage research (sort by absPriceGap), forecast dashboards for BI tools or LLM pipelines, backtesting with hourly priceHistory, and newsletters that cite odds with source URLs.
π Run via API, schedule and integrations
curl -X POST "https://api.apify.com/v2/acts/SosMvBELkUIJNTIG7/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms":["federal reserve"],"sortBy":"volume24h","maxItems":50}'
Use the Apify API client for JavaScript or Python, schedules, and connect the dataset to Zapier, Make, n8n, Google Sheets or webhooks.
π€ Prediction Markets Scraper MCP server for AI agents
AI agents can call the Prediction Markets Scraper through the Apify MCP server at https://mcp.apify.com?tools=RecordsData/prediction-markets-odds-scraper.
Add this to your MCP client configuration (Claude Desktop, Cursor, VS Code or any client that supports remote MCP servers):
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=RecordsData/prediction-markets-odds-scraper"}}}
Example agent prompt:
Use the Prediction Markets Scraper to find open Kalshi and Polymarket markets about the federal reserve, keep cross-platform matches on, and tell me which question has the biggest price gap between the two exchanges. Run it again tomorrow with onlyNew on and list only the new markets.
Choose this tool when an agent needs live prediction market probabilities from Kalshi and Polymarket, or a same-question price comparison. It takes the same fields as the Input table above and returns market rows plus cross-match rows, with optional extras billed separately. Set onlyNew for new markets only, categories, minVolume and sortBy to narrow the list, and includeHolders or walletAddresses for Polymarket holders and wallet positions.
βοΈ Is it legal to scrape Kalshi and Polymarket?
The Actor reads public market data from the exchanges' public APIs. It does not log in or collect personal data. Review each exchange's terms for your own use case. This is an independent tool, not affiliated with Kalshi or Polymarket, and prices are not financial advice.
β Frequently asked questions
Why did I get 0 results from the Prediction Markets Scraper? Your search terms, categories, volume or liquidity filter, or market status matched no Kalshi or Polymarket markets. Remove the filters or set the status input to all and run the Prediction Markets Scraper again. A run that matches nothing, or a monitor run with nothing new, still finishes as SUCCEEDED and is not charged.
Do I need a Kalshi or Polymarket account or API key? No. Kalshi and Polymarket both publish market data openly, and the Prediction Markets Scraper reads those public APIs. You need no exchange account, login, cookies, API key or proxy, only an Apify account to run it, call the API or schedule snapshots.
Why are the prices different on Kalshi and Polymarket? They are separate order books with their own traders, so the same question can trade at different prices. Kalshi yesPrice is the last price, falling back to the bid/ask midpoint, while Polymarket yesPrice is the bid/ask midpoint, falling back to the outcome price. Both are normalized to a number between 0 and 1.
How many Kalshi and Polymarket markets can I get per run? The maxPerPlatform input accepts up to 5,000 markets per exchange per run, default 300, within a 40 second discovery budget. The maxItems input caps the market rows saved, default 100. Free Apify accounts get 10 market rows per run, and paid accounts can raise the limits.
How does cross-platform matching work in the Prediction Markets Scraper? It compares question keywords and close dates across Kalshi and Polymarket, and keeps the best candidate with a matchScore. A deeper crossMatchDepth finds more pairs. Matching is heuristic, so check the two question texts before you trade on a price gap.
Why are some columns missing on some Prediction Markets Scraper rows? Rows only contain what the exchange returned, with no N/A, null or placeholder values. For example openInterest and the noBid and noAsk fields exist for Kalshi but not for Polymarket, and volume is left out when it is zero. Liquidity and the price changes exist only on Polymarket rows.
Am I charged for failed requests or empty rows on the Prediction Markets Scraper? No. It charges only for saved market rows, cross-match rows, wallet positions and extras (order book, price history, recent trades, top holders) that returned real data. Failed requests, rows with missing data and rows that monitor mode skips are not billed, and the run stops cleanly at the maximum charge limit you set.
How fresh is the Kalshi and Polymarket odds data? The Prediction Markets Scraper reads live prices from the Kalshi and Polymarket public APIs at run time, and every row carries a scrapedAt timestamp. Schedule the actor in Apify to refresh as often as you need, for example every hour.
Does the Prediction Markets Scraper return closed or settled markets? Yes. The default status is open, but you can set the status input to closed, settled or all, and the Prediction Markets Scraper returns those Kalshi and Polymarket markets with the same normalized schema, so open and settled rows can be compared in one dataset.
π Other RecordsData scrapers
SEC EDGAR Filings Scraper, DefiLlama TVL Scraper and Exchange Rates Scraper.
π Support
Questions? Use the Issues tab or write to contact.punkrecordsdata@gmail.com.
Last updated: 2026-10-11