Prediction Markets Scraper – Kalshi + Polymarket Odds & Prices
Pricing
from $1.00 / 1,000 market records
Prediction Markets Scraper – Kalshi + Polymarket Odds & Prices
Kalshi and Polymarket prediction markets in one normalized table: question, yes/no price, bid/ask, volume, liquidity, close time, result. Politics, sports, crypto, economics and Kalshi weather markets (KXHIGH/KXLOW daily temperature). Public APIs, no login. Pay only for records delivered.
Pricing
from $1.00 / 1,000 market records
Rating
0.0
(0)
Developer
Tit Slobodjanac
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Prediction Markets Scraper — Kalshi + Polymarket in one table
Pull live odds and settled results from Kalshi and Polymarket into one normalized dataset: question, yes/no price, best bid and ask, spread, volume, 24-hour volume, liquidity, open interest, open/close time, result and a link to the market. Filter by keyword, category, Kalshi series or Polymarket tag. Optional order-book depth.
No Kalshi account, no Polymarket wallet, no API key. Data comes straight from both exchanges' public JSON APIs (Kalshi trade API v2, Polymarket Gamma + CLOB). No login, no cookies, no browser, no proxies — which is why it is fast and why runs do not fail.
Why this one
- It works every run. No headless browser and no scraping of HTML that changes. The only failure mode is an exchange API outage, and then the run fails loudly instead of returning an empty dataset.
- One schema for both exchanges. A Kalshi contract and a Polymarket market come back with the same field names, so you can join, compare and spot price gaps without mapping two formats.
- Real markets, not parlay noise. Kalshi lists thousands of auto-generated multi-leg combinations (
KXMVE…). They are excluded by default; flipexcludeMultiLegif you want them. - Pay only for records you receive. $1 per 1,000 market records. Nothing for a run that returns nothing.
What people use it for
- Arbitrage and cross-exchange comparison — same event, two prices, one table.
- Trading research and backtests — settled markets with results and close times, pulled daily on a schedule.
- Dashboards and newsletters — top markets by 24-hour volume in politics, sports, crypto, economics, commodities, weather.
- Weather markets — every Kalshi daily high/low (
KXHIGH*,KXLOW*) and hourly (KXTEMP*) temperature bracket for 50+ cities; pair with the Kalshi Weather Index actor for the settlement series itself. - Alerts — schedule hourly, compare
yesPricewith the previous run, push a Slack/Discord message through an Apify integration when a market moves. - AI agents — ask "what does the market think about X?" and get numbers, not vibes.
Input
{"platforms": ["kalshi", "polymarket"],"status": "open","keywords": ["fed", "bitcoin"],"categories": ["economics", "crypto"],"minVolume": 1000,"maxItems": 500,"includeOrderbook": false}
| Field | What it does |
|---|---|
platforms | kalshi, polymarket or both (default both). |
status | open (live prices), settled (results) or both. |
keywords | Keep markets whose question, event title or ticker contains any keyword. |
categories | Keep markets whose category/tag contains any word: politics, sports, crypto, economics, weather, entertainment, science, companies, world… |
minVolume, minLiquidity | Drop thin or toy markets. |
maxItems | Cost cap. Default 500. |
includeOrderbook | Attach top 10 levels per market (+$1 per 1,000, one extra call per market). |
lookbackDays | For settled Kalshi markets: how far back by close time (default 7). |
excludeMultiLeg | Hide Kalshi parlay combinations (default on). |
kalshiSeriesTickers | Exact tickers (KXBTC, KXFED, KXNBA) or prefixes with *: KXHIGH* = every daily-high temperature city, KXLOW* = every daily-low city (pair with categories: ["weather"] to skip the Lowe's earnings series KXLOW). |
polymarketTagIds | Raw tag IDs from gamma-api.polymarket.com/tags when you need a precise tag. |
language | en, es or pt: Kalshi market titles and rules in Spanish or Portuguese. |
archiveDatasetName | Also append every record to a named dataset in your account. Schedule the run and the dataset becomes a price and settlement history that outlives Kalshi's ~68-day API window. No extra charge. |
A categories filter on Kalshi now scans exactly the series in that category (weather → 367 series, commodities → 81), so small categories are never missed. Very large categories (sports, ~3,600 series) fall back to the generic scan; add kalshiSeriesTickers such as KXNBA* to narrow.
Output
One row per market:
{"platform": "polymarket","id": "4000248","ticker": "lol-hle1-t1-2026-09-02","question": "LoL: Hanwha Life Esports vs T1 (BO5) - LCK Playoffs","eventTitle": "LoL: Hanwha Life Esports vs T1 (BO5) - LCK Playoffs","category": "Esports","status": "open","outcomes": ["Hanwha Life Esports", "T1"],"outcomePrices": [0.565, 0.435],"yesPrice": 0.565,"noPrice": 0.435,"yesBid": 0.56,"yesAsk": 0.57,"lastPrice": 0.56,"spread": 0.01,"volume": 2009194.56,"volume24h": 1926235.0,"liquidity": 79729.05,"openInterest": 4529841.49,"priceChange1h": 0.22,"priceChange24h": -0.08,"openTime": "2026-08-30T12:20:38Z","closeTime": "2026-09-02T14:00:00Z","result": null,"url": "https://polymarket.com/event/lol-hle1-t1-2026-09-02/lol-hle1-t1-2026-09-02","fetchedAt": "2026-09-02T11:50:00.000Z"}
Kalshi rows carry the same fields plus noBid / noAsk, eventId (event ticker) and seriesId (series ticker). Prices are in dollars per contract (0–1). result is yes/no on Kalshi and the winning outcome name on Polymarket. With includeOrderbook an orderbook object is added: { yesBids: [{price,size}…], noBids | yesAsks: […] }.
Run it from code
curl -X POST "https://api.apify.com/v2/acts/gratified_ashram~prediction-markets-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"platforms":["kalshi","polymarket"],"categories":["politics"],"maxItems":200}'
Works the same from the Apify JavaScript/Python clients, Make, Zapier, n8n, or on a schedule in the Console.
FAQ
Do I need a Kalshi or Polymarket account? No. Both expose public market-data APIs; nothing here trades or logs in.
How fresh are the prices? As fresh as the exchange API at the moment of the run — typically seconds. Schedule the run as often as you like.
Can I get historical price series? Kalshi's API only serves roughly the last 68 days of settlements and no price history; Polymarket serves resolved markets at coarse granularity. Set archiveDatasetName and schedule the run (hourly for prices, daily for settlements): every run appends to one dataset in your account, and after 68 days you hold data the API no longer has. Runs by the maintainer have been archiving Kalshi weather, politics and sports since September 2026; open an issue if you need a slice of that.
Why is Kalshi's category sometimes empty? Categories come from the series list; a brand-new series may not be in it yet.
Pricing
$1.00 per 1,000 market records, plus $1.00 per 1,000 order books when you ask for depth. Platform usage is included. A run that returns no records costs nothing.
Found it useful? A short review on the Actor page helps others find it. Missing a field or an exchange? Open an issue on the Issues tab.