Kalshi Market Scraper
Pricing
from $1.63 / 1,000 kalshi market rows
Kalshi Market Scraper
A scraper for public Kalshi prediction markets: prices, volume, open interest, close times and settlement rules for open or settled markets, by series, by event or by ticker. No login, no API key, no personal data.
Pricing
from $1.63 / 1,000 kalshi market rows
Rating
0.0
(0)
Developer
Leonardo Santos
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape public Kalshi prediction markets: walk the open event listing for a series or the whole board, or resolve specific markets and events by ticker. Every row is flat, typed and null-safe for pricing research, market monitoring, spreadsheets and agent pipelines.
Why this actor?
- Two buyer-shaped modes:
search(the public event listing, one row per market) anddetail(resolve exact market or event tickers). - One flat row per market: ticker, event and series tickers, market and event titles, category, status, yes/no bids and asks, last and previous price, volume, 24h volume, open interest, liquidity, open/close/expiration times, settlement result, primary rules and the canonical record URL.
- Real pagination with a hard page bound: the listing is walked in 10-event
pages via its cursor until
maxItemsmarkets are delivered or the listing ends, and duplicates never double-deliver. - Blank or malformed tickers, tickers Kalshi does not know, filters that match nothing and blocked or throttled fetches are free error rows.
- Public JSON surface only: no login, no API key, no personal data, no challenge bypass.
Input
{"mode":"search","seriesTicker":"KXNFLGAME","status":"open","maxItems":100}
For one exact instrument, set mode to detail and provide tickers:
{"mode":"detail","tickers":["KXNFLGAME-26SEP20CLETB"]}
| Input | Meaning |
|---|---|
mode | search (walk the public event listing) or detail (resolve exact tickers). |
seriesTicker | search mode: restrict the listing to one Kalshi series, e.g. KXNFLGAME (NFL games), KXBTCD (Bitcoin price), KXFED (Fed decisions). Empty lists the whole board. |
status | search mode: open (default), unopened, closed, settled or any. |
tickers | detail mode: market tickers (KXNFLGAME-26SEP20CLETB-TB) or event tickers (KXNFLGAME-26SEP20CLETB); an event ticker returns every market in that event. Deduplicated and capped at 25 per run. |
maxItems | Hard local cap of delivered market rows (1–1000, default 100). |
proxyConfiguration | Proxy for the public Kalshi trade API; datacenter is the default. |
Output
One row per market. This one was captured from the public record
KXNFLGAME-26SEP20CLETB-TB on 2026-09-20:
{"input":"KXNFLGAME-26SEP20CLETB","mode":"detail","source_type":"detail","source":"KXNFLGAME-26SEP20CLETB","ticker":"KXNFLGAME-26SEP20CLETB-TB","event_ticker":"KXNFLGAME-26SEP20CLETB","series_ticker":"KXNFLGAME","title":"Tampa Bay wins","subtitle":"Tampa Bay","event_title":"CLE Browns vs TB Buccaneers","event_subtitle":"CLE vs TB (Sep 20)","category":"Sports","status":"active","market_type":"binary","strike_type":"structured","yes_bid":0.78,"yes_ask":0.79,"no_bid":0.21,"no_ask":0.22,"last_price":0.79,"previous_price":0.79,"volume":254522.52,"volume_24h":131022.43,"open_interest":217288.11,"liquidity":0,"open_time":"2026-08-25T15:33:00Z","close_time":"2026-09-22T17:00:00Z","expiration_time":"2026-09-22T17:00:00Z","expected_expiration_time":"2026-09-20T20:00:00Z","result":null,"can_close_early":true,"rules_primary":"If Tampa Bay wins the CLE Browns vs TB Buccaneers Pro Football game originally scheduled for Sep 20, 2026, then the market resolves to Yes.","url":"https://api.elections.kalshi.com/trade-api/v2/markets/KXNFLGAME-26SEP20CLETB-TB","error":null,"scraped_at":"2026-09-20T10:00:00.000Z"}
| Field | Meaning |
|---|---|
mode | Which mode produced the row: search or detail. |
input | The input exactly as provided (series ticker, market/event ticker) — or the listing filter a search row came from. |
source_type | search for listing rows, detail for a resolved ticker. |
source | Normalized source: the series filter, or the ticker that was resolved. |
ticker | Kalshi market ticker — the row's unique key. |
event_ticker | The event this market belongs to. |
series_ticker | The series this market belongs to. |
title | Market title, e.g. Tampa Bay wins. |
subtitle | The market's yes-side subtitle, e.g. Tampa Bay or $71,600 or above. |
event_title | Event title, e.g. CLE Browns vs TB Buccaneers. |
event_subtitle | Event subtitle, e.g. CLE vs TB (Sep 20). |
category | Event category, e.g. Sports, Economics, World. |
status | Market status as upstream reports it (active, closed, settled). |
market_type | Market type, e.g. binary. |
strike_type | Strike type, e.g. structured, custom, greater, less. |
yes_bid / yes_ask | Best yes bid / ask in dollars (0–1). |
no_bid / no_ask | Best no bid / ask in dollars (0–1). |
last_price | Last traded price in dollars (0–1). |
previous_price | Previous traded price in dollars (0–1). |
volume | Total traded contracts. |
volume_24h | Contracts traded in the last 24 hours. |
open_interest | Open interest in contracts. |
liquidity | Quoted liquidity in dollars. |
open_time | Market open time, ISO 8601. |
close_time | Market close time, ISO 8601. |
expiration_time | Expiration time, ISO 8601. |
expected_expiration_time | Expected expiration time, ISO 8601. |
result | Settlement result (yes / no); null while the market is open. |
can_close_early | Whether the market may close before its close time. |
rules_primary | The market's primary settlement rule as published upstream. |
url | Canonical public record URL for this market. |
error | Free per-input error message; null on market rows. |
scraped_at | Extraction timestamp. |
Pricing
Pay per event, and the platform usage is on us — the price you see is the price you pay, with no compute bill on top.
| Event | Price | What one charge buys |
|---|---|---|
| Kalshi market row | $0.0025 | One delivered public Kalshi market row: market, event and series tickers, market and event titles, category, status, yes/no bids and asks, last and previous price, volume, 24h volume, open interest, liquidity, open, close and expiration times, settlement result, primary rules and the canonical record URL. Free and never charged: a blank or malformed ticker, a ticker Kalshi does not know, a listing filter that matches no market, and any blocked, throttled, 5xx or timeout fetch. |
| Actor Start | $0.002 | One run, whatever it returns. |
Higher Apify subscription tiers pay less on every event (Silver −20%, Gold −35%).
Notes
- The surface is Kalshi's public trade API (
https://api.elections.kalshi.com/trade-api/v2), the same open JSON surface the radar preflight measured from datacenter space (one 200application/json, 71176 bytes forGET /markets?limit=20). Thekalshi.comwebsite is deliberately not part of the surface: every request to it is answeredHTTP 429withX-Vercel-Mitigated: challenge. A challenge marker is a finding, not something to work around. searchmode walksGET /events?status=…&series_ticker=…&limit=10&with_nested_markets=truein 10-event pages (each event carries its nested markets), following the responsecursoruntilmaxItemsmarkets are delivered, the cursor runs out, or 20 pages have been fetched. A market is delivered once: rows are deduplicated by ticker across the whole run.detailmode resolves a market ticker throughGET /markets/{ticker}. An event ticker answers404there and is resolved throughGET /events/{ticker}?with_nested_markets=true, which yields one row per market in that event. A bare market ticker also gets one best-effort, cached and capped (10 per run) event lookup for its event metadata; if that lookup fails the row is still delivered, with the event metadatanull.- Free error rows, never charged: a blank or malformed ticker, a
kalshi.comwebsite URL (rejected by name, no request spent), a well-formed ticker Kalshi does not know (404from both endpoints), a listing filter that matches no market (200with an empty event list), and any throttled (429), refused (403/412),5xxor timed-out fetch. - Requests go through the Apify proxy configured in
proxyConfiguration(datacenter by default, recorded asproxyTierin.actor/publish.json).
Use cases
- Track the odds of an event series over time (elections, Fed decisions, game lines) by pulling its markets on a schedule.
- Price a whole open board for research, dashboards or external-market monitoring.
- Resolve one market or event ticker on demand for an agent or a spreadsheet.
This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Kalshi; it reads the same public JSON records the Kalshi web app reads, and publishes only publicly available market data.