Kalshi Scraper — Prediction Market Odds & Probabilities
Pricing
from $1.49 / 1,000 results
Kalshi Scraper — Prediction Market Odds & Probabilities
Scrape event contracts from Kalshi, the US-regulated prediction market: market title, yes/no prices, implied probability, last price, volume, open interest, liquidity, status and close time. Pull markets or events by series, status or ticker. No login or API key. Export JSON, CSV, Excel.
Kalshi Scraper 📊🇺🇸 — Prediction-Market Odds, Prices & Implied Probabilities
This Kalshi scraper extracts event contracts, live yes/no prices and implied probabilities from Kalshi, the first US-regulated prediction market — no login, no coding, no API key. Scrape Kalshi events (a question with its priced yes/no markets) or raw markets, and pull market title, yes/no bid/ask, last price, implied probability (%), volume, open interest, liquidity, category, status and close time into one clean, de-duplicated dataset. Use it to scrape Kalshi markets by status, series or event in minutes.
Export to JSON, CSV, Excel, or API.
Built for quants, prediction-market traders, forecasters, sports-betting and odds analysts, data scientists and AI/LLM builders who need real-time, money-backed probability data as an alternative-data feed.
🔎 Why scrape Kalshi?
Kalshi is a CFTC-regulated exchange where people trade yes/no contracts on real-world events — elections, interest rates, inflation prints, weather, sports, tech milestones and more. Each contract trades between 1¢ and 99¢, and that price is a crowd-sourced, money-backed estimate of how likely the event is: a contract at 55¢ means the market implies roughly a 55% probability. That makes Kalshi one of the richest public sources of forward-looking, quantitative sentiment data available.
Reading those numbers off the website one event at a time is slow and useless for analysis. There are thousands of live markets, prices move continuously, and the structure (events containing nested markets, with bids, asks, volume and open interest) is awkward to copy by hand. To build a watchlist, a forecasting model, a backtest or a dashboard you need the whole board as structured data — repeatedly and on a schedule.
This Kalshi scraper does exactly that. It reads Kalshi's public market data and returns clean, typed records with prices already parsed to numbers and implied probabilities computed, so you can go straight to analysis.
Common reasons people scrape Kalshi:
- 📈 Track live implied probabilities across politics, economics, weather and world events.
- 🧠 Build forecasting and sentiment signals from money-backed market odds.
- 💹 Spot mispricings and arbitrage by comparing prices, volume and liquidity across markets.
- 🔬 Backtest strategies and study probability calibration on settled markets.
- 🤖 Feed AI/LLM agents, models and data products with structured prediction-market data.
- 📊 Power dashboards and alternative-data feeds that update on a schedule.
- 🗳️ Monitor specific series (e.g. an election or a rate decision) end to end.
✨ What this Kalshi scraper does
- ✅ Two collection modes — scrape Events (each question with its priced nested yes/no markets, recommended) or raw Markets (individual contracts). Pick with one dropdown.
- ✅ Automatic pagination — walks Kalshi's cursor-paginated API 200 records at a time and keeps going until the whole result set is collected, returning hundreds to thousands of de-duplicated records (de-duplicated by
ticker/eventTicker). - ✅ Prices & probability — captures
yesBid,yesAsk,noBid,noAsk,lastPriceand computes theimpliedProbabilityPct(0–100%) for every market. - ✅ Depth & activity —
volume,volume24h,openInterestandliquiditywhere Kalshi exposes them. - ✅ Rich event + market fields —
eventTicker,seriesTicker,title,subtitle,yesSubTitle,noSubTitle,category,marketType,mutuallyExclusive,marketCount,status,result,canCloseEarly, and timing (openTime,closeTime,expirationTime), plus ascrapedAttimestamp. - ✅ Filters & targeting — by status (open / closed / settled / unopened / all), by series ticker, or by a single event ticker.
- ✅ Export anywhere — JSON, CSV, Excel, HTML, RSS or the Apify API.
- ✅ Fast & reliable — pure HTTP (no browser), realistic TLS fingerprint, 6 automatic retries with exponential backoff, and optional proxy support.
Only the fields Kalshi actually returns are emitted — the scraper does not invent data. No login, no cookies, no API key.
🎯 Use cases
- Quant & systematic traders — pull the full board of yes/no prices, depth and open interest to find mispricings and build watchlists.
- Forecasters & analysts — use
impliedProbabilityPctas a real-time, money-backed signal for elections, rates and macro events. - Data scientists & researchers — collect
settledmarkets and theirresultto backtest and study calibration of market-implied probabilities. - Sports-betting & odds modelers — blend Kalshi sports markets with sportsbook lines for edge detection.
- AI & LLM builders — feed structured prediction-market data into agents, RAG pipelines and models via the Kalshi API export.
- Fintech & media teams — power probability dashboards, newsroom graphics and alternative-data products.
- Economists & policy researchers — monitor inflation, Fed, GDP and election series as leading indicators.
- Arbitrage & market-making desks — track liquidity and spreads across correlated events.
📥 Input
Configure a few simple fields — all optional, with sensible defaults.
| Field | Type | Description |
|---|---|---|
dataType | string (events | markets) | Scrape events (question + priced nested markets, recommended) or raw markets (individual contracts). Default events. |
status | string | Filter by status: open (tradeable now), closed, settled, unopened, or `` (empty = all). Default open. |
seriesTicker | string | Limit to one series, e.g. KXHIGHNY (NYC high temp) or a politics/economics series. Empty = all. |
eventTicker | string | Limit to a single event's markets by its event ticker. Empty = all. |
maxItems | integer | Maximum markets/events to collect. 0 = unlimited (fetch everything). Default 0. |
proxyConfiguration | object | Optional proxy. Off by default — a direct connection works best because Kalshi rejects many shared proxy IPs. Enable only if you specifically need one. |
Example input
{"dataType": "events","status": "open","maxItems": 500}
📤 Output
Each record is a clean, flat JSON object. In Events mode you get the question with its priced markets nested; in Markets mode you get individual contracts at the top level. Prices are in dollars from 0 to 1 (0.55 = 55¢), and impliedProbabilityPct converts that to a 0–100% probability.
Example output (event with nested markets)
{"eventTicker": "KXELONMARS-99","seriesTicker": "KXELONMARS","title": "Will Elon Musk visit Mars in his lifetime?","subtitle": "","category": "World","mutuallyExclusive": false,"marketCount": 1,"markets": [{"ticker": "KXELONMARS-99-VISIT","eventTicker": "KXELONMARS-99","marketType": "binary","title": "Will Elon Musk visit Mars before Aug 1, 2099?","subtitle": "","yesSubTitle": "Yes","noSubTitle": "No","status": "active","yesBid": 0.09,"yesAsk": 0.11,"noBid": 0.88,"noAsk": 0.90,"lastPrice": 0.10,"impliedProbabilityPct": 10,"volume": 12000,"volume24h": 350,"openInterest": 8400,"liquidity": 25000,"openTime": "2024-01-10T15:00:00Z","closeTime": "2099-08-01T04:59:00Z","expirationTime": "2099-08-01T04:59:00Z","result": "","canCloseEarly": true,"category": "World"}],"scrapedAt": "2026-10-25T12:00:00Z"}
Field reference
Event fields
| Field | Description |
|---|---|
eventTicker, seriesTicker | Event and parent series tickers |
title, subtitle | The event question |
category | Politics, Economics, World, Sports, etc. |
mutuallyExclusive | Whether the nested markets are mutually exclusive |
marketCount | Number of nested markets |
markets | Array of nested market objects (Events mode) |
scrapedAt | ISO timestamp of the scrape |
Market fields
| Field | Description |
|---|---|
ticker, eventTicker | Market and parent event tickers |
marketType | Market type (e.g. binary / scalar) |
title, subtitle, yesSubTitle, noSubTitle | Market question and yes/no labels |
status | active, closed, settled, … |
yesBid, yesAsk, noBid, noAsk | Best bid/ask prices (dollars, 0–1) |
lastPrice | Last traded price (dollars, 0–1) |
impliedProbabilityPct | Implied probability of "yes" (0–100%) |
volume, volume24h | Contracts traded (total / last 24h) |
openInterest | Open contracts outstanding |
liquidity | Resting liquidity (dollars) |
openTime, closeTime, expirationTime | Market timing |
result | Settlement result — present when settled |
canCloseEarly | Whether the market can close early |
category | Market category |
Depth fields (volume, volume24h, openInterest, liquidity) and result are present when available — low-volume or unsettled markets may leave some blank. Core fields (tickers, title, prices, implied probability, status, timing) populate for essentially every market.
🔁 Pagination & scale
The actor calls Kalshi's public events / markets endpoints with limit=200 and follows the API's cursor pagination: after each page it reads the cursor token and requests the next page, repeating until Kalshi returns no further cursor (the end of the result set). Every record is de-duplicated by ticker (markets) or eventTicker (events) before it is stored, so you never get repeats across pages.
This means the scraper reliably returns large result sets — hundreds to thousands of events or markets in a single run. Use maxItems to cap the total (e.g. 500 for a quick pull) or leave it at 0 to collect the entire open/closed/settled board. Because it is pure HTTP with no browser, it is fast and inexpensive, and a small polite delay between pages keeps requests well-behaved.
⚙️ How to use
- Open the actor on Apify Console and click Try for free (or Start).
- Choose a Data Type — Events (recommended) or Markets.
- Pick a Status — Open = tradeable now; Settled for resolved outcomes.
- (Optional) Narrow to a Series Ticker or a single Event Ticker.
- Set Max Items (or
0for everything) and click Start. - Export the dataset as JSON, CSV, Excel, HTML or RSS, or pull it from the Apify API.
- Integrate with Make, Zapier, Google Sheets, Slack or a webhook, or call it from an MCP server in your AI agent. Use the Apify Scheduler to re-run and track probabilities over time.
💡 Tips
- Use Events mode for analysis — you get each question with its priced yes/no markets nested together.
- Set Status =
settledand leavemaxItemshigh to build a historical outcomes dataset for backtesting and calibration studies. - Pass a
seriesTicker(e.g. a specific election or rate series) to track one storyline end to end. impliedProbabilityPctis derived fromlastPricewhen available, otherwise from the midpoint ofyesBid/yesAsk— handy when a market hasn't traded recently.- Leave the proxy off (the default). Kalshi rejects many shared proxy IP ranges, so a direct connection is the most reliable.
- Schedule the actor every few minutes or hours to capture how probabilities move around events, data releases and games.
❓ FAQ
Is scraping Kalshi legal? This Kalshi scraper collects only publicly available market data — the same prices and market information any visitor can see without logging in. It does not place trades, access accounts, or touch anything behind authentication. You are responsible for complying with Kalshi's Terms of Service and applicable laws; nothing here is financial advice.
Do I need a Kalshi account or API key? No. There is no login and no API key required — choose your filters and run.
How many results can I get, and how fast?
The scraper paginates through the entire board and typically returns hundreds to thousands of events or markets per run, limited only by maxItems. It runs as pure HTTP (no browser), so a few hundred records finish in seconds to a minute.
Do I need proxies? No. The default is a direct connection, which is the most reliable because Kalshi blocks many shared proxy IP ranges. A proxy field is available if you specifically need one.
Is there a Kalshi API, and does this use it? This actor reads Kalshi's public market-data endpoints and returns the data as a clean dataset you can export or pull via the Apify API — so you effectively get a ready-to-use Kalshi API without writing code.
How do I read the prices?
Prices are in dollars from 0 to 1 — 0.55 means 55¢, i.e. a 55% implied probability. The impliedProbabilityPct field gives you that percentage (0–100) directly.
What is the difference between Events and Markets? An event is a question (e.g. "Who wins the election?") containing one or more markets (the individual yes/no contracts). Events mode gives you questions with their priced markets nested inside; Markets mode gives you the raw contracts at the top level.
Can I get settled outcomes for backtesting?
Yes — set Status to settled to collect resolved markets and their result, ideal for backtesting and studying probability calibration.
Can I filter by topic or a single market? Yes — use a Series Ticker to limit to a series, or an Event Ticker to limit to a single event's markets.
How fresh is the data?
Every run fetches live data straight from Kalshi at request time, with a scrapedAt timestamp on each record. Schedule recurring runs to build a time series.
What export formats are supported? JSON, CSV, Excel, HTML table, RSS, and the Apify API. Connect to Make, Zapier, Google Sheets, Slack, webhooks or an MCP server.
🔗 Related scrapers
- DraftKings Odds Scraper — live sportsbook odds, lines and player props from DraftKings.
- PrizePicks Player Props Scraper — real-time DFS player projections and lines from PrizePicks.
Ready to pull live prediction-market odds? Click Try for free, choose your filters, and export clean Kalshi data as JSON, CSV or Excel in minutes.