Kalshi Scraper: Prediction Markets, Odds, Trades, Order Books
Pricing
from $1.80 / 1,000 markets
Kalshi Scraper: Prediction Markets, Odds, Trades, Order Books
Scrape Kalshi prediction markets: yes and no bid and ask, last price, implied probability, volume, open interest, close dates, results and rules. Search, browse by category or paste tickers and links. Also events, series, trades and order books. No login or API key.
Pricing
from $1.80 / 1,000 markets
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
From The Mine Works, makers of Polymarket Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Updated 21 Oct 2026: first release. Markets, events, series, trades and order book snapshots from Kalshi, the US regulated prediction market exchange, through its public market data API. Search, browse by category, or paste tickers and kalshi.com links. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- Every price a trader reads, as numbers. Each market row has the Yes bid and ask, the No bid and ask, the sizes at the best prices, the spread, the last trade, the price 24 hours ago and the change, plus an
implied_probabilityfrom 0 to 1 that says how it was worked out (midof a tight book orlast_price). Volume, 24 hour volume and open interest come in contracts, and one contract pays $1. - Five kinds of rows from one actor. Markets, whole events (all outcomes in one row with the leading one), series (the recurring question behind events, with its fee model and contract filing), trades (one row per fill with side, price, contracts and dollars), and order book snapshots with depth and dollar liquidity per market.
- Pay per row, nothing for errors. Tickers Kalshi does not know, searches with no results, the summary row and duplicates found twice are never charged. No Kalshi account, API key or login.
Part of The Mine Works Company and business data family: Company Domain Finder, GST Taxpayer Lookup, Company KYB Resolver, SEC EDGAR Filings Scraper, EU VAT Checker (VIES), Tech Stack Detector.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns 50 open markets from what is trending on Kalshi right now, the 5 most traded outcomes of each event. In our test it read 18 events in under 3 seconds:
{"mode": "markets","status": "open","maxItems": 50,"maxMarketsPerEvent": 5}
Type words in searchText (for example fed, bitcoin or super bowl) to search the way the kalshi.com search box does, pick a category, or paste tickers and links. Switch mode to get events, series, trades or order books for the same selection.
Apify's free plan includes $5 of credit every month, which covers about 1,350 markets at this actor's price.
Copy to your AI assistant
themineworks/kalshi-scraper on Apify. Reads Kalshi prediction markets from Kalshi's public market data API, no login or key, and returns flat rows. Call ApifyClient("TOKEN").actor("themineworks/kalshi-scraper").call(run_input={"mode": "markets", "searchText": "fed", "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Input: mode (markets, events, series, trades, orderbook; default markets), searchText (string), category (Politics, Elections, Economics, Financials, Crypto, Commodities, Companies, Climate and Weather, Science and Technology, Entertainment, Sports, Mentions, Health, Social, World), seriesTickers, eventTickers, marketTickers (lists; tickers or kalshi.com links), status (open, closed, settled, all; default open), sortBy (trending, volume, totalVolume, newest, closingSoon, relevance), minVolume (contracts), maxItems (default 100, 1 to 20000, rows per run), maxMarketsPerEvent (0 = all), tradesPerMarket (default 100), tradesSince (YYYY-MM-DD), orderbookDepth (default 10). Nothing selected = browse trending markets; trades mode with nothing selected = the exchange wide trade feed. Every data row has record_type (market, event, series, orderbook, trade). Market rows carry ticker, event_ticker, series_ticker, title, subtitle, yes_subtitle, no_subtitle, event_title, event_subtitle, series_title, category, tags, status, status_raw, market_type, yes_bid, yes_ask, no_bid, no_ask, yes_bid_size, yes_ask_size, spread, last_price, previous_price, price_change_24h, implied_probability, implied_probability_pct, probability_source, volume, volume_24h, open_interest, notional_value, open_time, close_time, expiration_time, expected_expiration_time, latest_expiration_time, created_time, settlement_time, result, settlement_value, can_close_early, strike_type, floor_strike, cap_strike, rules_summary, rules_details, mutually_exclusive, settlement_sources, url, found_by, position, scraped_at. Order book rows add orderbook_yes_bids, orderbook_no_bids (price, quantity, best first), book_best_yes_bid, book_best_no_bid, book_yes_ask, yes_depth_contracts, no_depth_contracts, liquidity, orderbook_levels, snapshot_at. Event rows: event_ticker, title, category, status, market_count, open_market_count, volume, volume_24h, open_interest, leading_outcome, leading_probability, markets (array), url. Series rows: series_ticker, title, category, tags, frequency, volume, fee_type, contract_url. Trade rows: trade_id, ticker, trade_time, unix_time, taker_side, yes_price, no_price, price, contracts, usd_value, is_block_trade. Prices are dollars per contract, 0 to 1. Rows with _type summary, info or error are not charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~kalshi-scraper/builds/default (Bearer TOKEN). Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- Search and browse like kalshi.com.
searchTextuses the same search feed as the site. With no search, the actor browses Kalshi's markets in the order you pick: trending, recent volume, total volume, newest, or closing soonest. Add acategoryto stay in Politics, Economics, Crypto, Sports or any other Kalshi category. - Tickers and links. Paste a market ticker (
KXFEDDECISION-26OCT-H0), an event ticker (KXFEDDECISION-26OCT), a series ticker (KXFEDDECISION) or a kalshi.com link. The actor works out which one it is: an event gives all its outcomes, a series gives its events newest first. - Status filter that matches the site. Open markets still trading, closed markets waiting for their result, settled markets with
result(yesorno),settlement_valueandsettlement_time, or all of them. - One outcome per row, or one event per row. Markets mode gives each outcome its own row, ready to sort by chance or volume. Events mode puts a whole question in one row, with every outcome in
marketsand, for questions where only one outcome can win, theleading_outcomeand its probability. - Trades and order books. Trades mode returns each fill with the side the taker bought, the price paid, contracts and dollar value, newest first; with nothing selected it reads the exchange wide trade feed. Order book mode returns every market with its bid levels on both sides, depth in contracts and dollars resting in the book.
- Stops cleanly. Six failed requests in a row end the run; 60 events in a row with nothing that passes your filters end the run; the run stops before its time limit and keeps every row. The summary row says why it stopped.
How to use it
Follow one question: the next Fed decision
{"eventTickers": ["KXFEDDECISION-26OCT"],"status": "all"}
Five rows, one per outcome (cut more than 25 bps, cut 25, hold, hike 25, hike more than 25), each with its bid, ask, last price and implied probability. Run it on a schedule to build your own odds history.
Everything about a topic
{"searchText": "bitcoin","maxItems": 300,"maxMarketsPerEvent": 10}
The best matching events for the search, up to 10 outcomes each, most traded first.
A whole category, as events
{"mode": "events","category": "Politics","sortBy": "totalVolume","maxItems": 100}
One row per event, biggest by all time volume first, with the leading outcome and every market in markets.
Settled results for back testing
{"seriesTickers": ["KXHIGHNY"],"status": "settled","maxItems": 2000}
Each settled New York high temperature market with its strikes, last price before close and result. Compare last_price with result to see how well the market priced the outcome.
Large trades on one market
{"mode": "trades","marketTickers": ["KXFEDDECISION-26OCT-H0"],"tradesPerMarket": 1000,"tradesSince": "2026-10-01"}
Filter the rows on usd_value to keep the big fills.
Order book depth across a series
{"mode": "orderbook","seriesTickers": ["KXFEDDECISION"],"orderbookDepth": 20,"maxItems": 50}
Each open market with its top 20 bid levels per side, liquidity in dollars and depth in contracts.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
mode | string | markets | markets, events, series, trades or orderbook. |
searchText | string | empty | Words to search, as on kalshi.com. |
category | string | any | One Kalshi category, alone or with a search. |
seriesTickers | array | empty | Series tickers such as KXFEDDECISION. |
eventTickers | array | empty | Event tickers such as KXFEDDECISION-26OCT. |
marketTickers | array | empty | Market tickers or kalshi.com links, up to 500. |
status | string | open | open, closed, settled or all. |
sortBy | string | trending | Order of a search, category or browse: trending, volume, totalVolume, newest, closingSoon, relevance. |
minVolume | integer | 0 | Only rows that traded at least this many contracts. |
maxItems | integer | 100 | Most rows the run returns in total, 1 to 20,000. |
maxMarketsPerEvent | integer | 0 | Most outcomes per event, most traded first; 0 keeps all. |
tradesPerMarket | integer | 100 | Trades mode: most recent trades per selected market. |
tradesSince | string | empty | Trades mode: only trades on or after this day. |
orderbookDepth | integer | 10 | Order book mode: levels per side; 0 keeps the whole book. |
Leave every selection field empty to browse. The sources are read in this order: tickers and links, events, series, then the search, category or browse feed.
What data do you get?
Every data row has record_type: market, event, series, orderbook or trade. Data rows have no _type field; the summary, info and error rows do, so a filter on _type separates them.
| Field | What it is |
|---|---|
ticker, event_ticker, series_ticker | Kalshi tickers of the market, its event and its series |
title, subtitle, yes_subtitle, no_subtitle | The market question and the outcome it stands for |
event_title, event_subtitle, series_title | The event and series it belongs to |
category, tags | Kalshi category and series tags |
status, status_raw | open, unopened, paused, closed or settled, and Kalshi's own word |
yes_bid, yes_ask, no_bid, no_ask | Best prices in dollars per contract, 0 to 1 |
yes_bid_size, yes_ask_size, spread | Contracts at the best prices, and ask minus bid |
last_price, previous_price, price_change_24h | Last trade, the last trade 24 hours ago, and the change |
implied_probability, implied_probability_pct, probability_source | Chance of Yes from 0 to 1, in percent, and whether it is the mid or the last_price |
volume, volume_24h, open_interest | Contracts traded in total and in 24 hours, contracts held |
open_time, close_time, expiration_time, expected_expiration_time | When trading opens and closes, and when the result is due |
result, settlement_value, settlement_time | Settled markets: yes or no, the settled value, when |
strike_type, floor_strike, cap_strike | Strikes of range and threshold markets |
rules_summary, rules_details | What makes the market resolve Yes, and the edge cases |
mutually_exclusive, settlement_sources | Whether only one outcome can win, and the sources Kalshi settles on |
url | Link on kalshi.com |
found_by, position, scraped_at | The input that found the row, its order in the run, when it was read |
Order book rows add orderbook_yes_bids and orderbook_no_bids (price and quantity, best first), book_best_yes_bid, book_best_no_bid, book_yes_ask, yes_depth_contracts, no_depth_contracts, liquidity (dollars resting in the levels kept), orderbook_levels and snapshot_at.
Event rows: event_ticker, title, subtitle, category, status, mutually_exclusive, strike_date, market_count, open_market_count, volume, volume_24h, open_interest (summed over outcomes), leading_market_ticker, leading_outcome, leading_probability, close_time, markets and url.
Series rows: series_ticker, title, category, categories, tags, frequency, volume, fee_type, fee_multiplier, settlement_sources, contract_url, contract_terms_url, last_updated and url.
Trade rows: trade_id, ticker, series_ticker, trade_time, unix_time, taker_side, yes_price, no_price, price, contracts, usd_value, is_block_trade, plus the market's event_ticker, title, category and url when the trades come from selected markets.
Summary row (_type: "summary", never charged): mode, rows_delivered, charged_for, events_read, markets_seen, filtered_out, duplicates_skipped, not_found, search_pages, event_requests, http_requests, http_megabytes, stopped (why the run ended), shortfall_reason when fewer rows came back than asked, and per_source, the rows each input delivered. The same summary is saved as the OUTPUT record of the run.
Error rows (_type: "error", never charged): one per input that could not be read, with error_type (invalid_input, not_found, no_results, fetch_error), identifier and reason.
Stable fields for automations
Present on every market row of our test runs (50 open markets from 18 events), with names that will not change: record_type, ticker, event_ticker, series_ticker, title, subtitle, event_title, category, status, yes_bid, yes_ask, no_bid, no_ask, last_price, implied_probability, volume, volume_24h, open_interest, open_time, close_time, rules_summary, url, position, scraped_at.
Present only when Kalshi has a value: spread and implied_probability (a market with no bids and no trades has neither), result, settlement_value and settlement_time (settled markets), floor_strike and cap_strike (range markets), rules_details, tags.
Output examples
One market from the trending browse (test run, 21 Oct 2026, trimmed):
{"record_type": "market","ticker": "KXATPMATCH-26OCT18MEDNAK-NAK","event_ticker": "KXATPMATCH-26OCT18MEDNAK","series_ticker": "KXATPMATCH","title": "Brandon Nakashima wins","subtitle": "Brandon Nakashima","event_title": "Medjedovic vs Nakashima","series_title": "ATP Tennis Match","category": "Sports","tags": ["Tennis"],"status": "open","yes_bid": 0.92,"yes_ask": 0.93,"no_bid": 0.07,"no_ask": 0.08,"spread": 0.01,"last_price": 0.93,"previous_price": 0.72,"price_change_24h": 0.21,"implied_probability": 0.925,"implied_probability_pct": 92.5,"probability_source": "mid","volume": 545560.23,"volume_24h": 430701.66,"open_interest": 246715.46,"close_time": "2026-11-01T08:00:00.000Z","rules_summary": "If Brandon Nakashima wins the Medjedovic vs Nakashima professional tennis match in the 2026 ATP Lyon Round Of 32 after a ball has been played, then the market resolves to Yes.","mutually_exclusive": true,"url": "https://kalshi.com/markets/kxatpmatch/atp-tennis-match/kxatpmatch-26oct18mednak","found_by": "browse: trending","position": 8}
One event row from Events mode (same day, trimmed to two of its five outcomes):
{"record_type": "event","event_ticker": "KXFEDDECISION-26OCT","series_ticker": "KXFEDDECISION","title": "Fed decision in Oct 2026?","subtitle": "On Oct 28, 2026","category": "Economics","status": "open","mutually_exclusive": true,"market_count": 5,"open_market_count": 5,"volume": 13012004.81,"volume_24h": 434737.11,"open_interest": 6175641.04,"leading_market_ticker": "KXFEDDECISION-26OCT-H0","leading_outcome": "Fed maintains rate","leading_probability": 0.875,"markets": [{ "ticker": "KXFEDDECISION-26OCT-H0", "outcome": "Fed maintains rate", "status": "open", "yes_bid": 0.87, "yes_ask": 0.88, "last_price": 0.88, "implied_probability": 0.875, "volume": 5942846.22 },{ "ticker": "KXFEDDECISION-26OCT-H25", "outcome": "Hike 25bps", "status": "open", "yes_bid": 0.12, "yes_ask": 0.13, "last_price": 0.13, "implied_probability": 0.125, "volume": 4393195.34 }],"url": "https://kalshi.com/markets/kxfeddecision/fed-meeting/kxfeddecision-26oct"}
An order book row, trimmed to 3 levels a side:
{"record_type": "orderbook","ticker": "KXATPCHALLENGERMATCH-26OCT20MILGIU-GIU","title": "Lorenzo Giustino wins","yes_bid": 0.32,"yes_ask": 0.33,"orderbook_yes_bids": [{ "price": 0.32, "quantity": 209.93 }, { "price": 0.31, "quantity": 745 }, { "price": 0.3, "quantity": 976 }],"orderbook_no_bids": [{ "price": 0.67, "quantity": 80 }, { "price": 0.66, "quantity": 5420.67 }, { "price": 0.65, "quantity": 2645.81 }],"book_best_yes_bid": 0.32,"book_yes_ask": 0.33,"yes_depth_contracts": 4273.93,"no_depth_contracts": 11855.04,"liquidity": 8961.41,"orderbook_levels": 10}
A trade row:
{"record_type": "trade","trade_id": "072436fb-8109-a3dd-fd7c-b32cad1a2de3","ticker": "KXATPCHALLENGERMATCH-26OCT20MILGIU-GIU","trade_time": "2026-10-20T22:21:20.435Z","unix_time": 1792534880,"taker_side": "yes","yes_price": 0.33,"no_price": 0.67,"price": 0.33,"contracts": 142.82,"usd_value": 47.13,"is_block_trade": false}
An error row for a ticker Kalshi does not know (nothing charged):
{ "_type": "error", "error_type": "not_found", "identifier": "NOTAREALTICKER-XYZ", "reason": "No Kalshi market, event or series has this ticker. Check the spelling, for example KXFEDDECISION-26OCT-H0 (market), KXFEDDECISION-26OCT (event) or KXFEDDECISION (series)." }
Pricing
Pay per event: you pay for the rows you receive, plus a flat $0.003 per run, whatever memory you choose.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
market-scraped | Once per market, event, series or order book row stored in your dataset | $3.60 per 1,000 | $3.20 per 1,000 | $2.50 per 1,000 | $1.80 per 1,000 |
trade-scraped | Once per trade row stored in your dataset | $3.60 per 1,000 | $3.20 per 1,000 | $2.50 per 1,000 | $1.80 per 1,000 |
run-start | Once per run, after Kalshi returned the first rows | $0.003 | $0.003 | $0.003 | $0.003 |
The price of one row is the price per 1,000 divided by 1,000.
Never charged:
- tickers and links Kalshi does not know, and searches with no results (each gets an error row);
- a market, event, series or trade that a second input of the same run finds again;
- rows past your
maxItems, or filtered out bystatusorminVolume; - the summary, info and error rows;
- a run with no valid input or nothing to return: the start fee is charged only once Kalshi has returned rows;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input and click Save as a new task.
- In the task, open Schedules, click Add schedule and pick how often (every hour, every day at 08:00 and so on).
- Each run is a snapshot: store
ticker,implied_probabilityandscraped_atto build a probability history, or comparelast_pricebetween runs to spot moves. - Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.
FAQ
What does this actor read?
Kalshi's public market data API at api.elections.kalshi.com, the read only endpoints Kalshi documents for anyone, plus the search feed kalshi.com uses for its search box. It does not log in, place orders or read anything tied to an account.
How fresh are the prices?
They are read at run time. scraped_at is when the market was read, snapshot_at when its order book was read. Kalshi prices can move within seconds on live sports and crypto markets, so the order book and the market's own best prices can differ slightly.
How is implied_probability worked out?
A Kalshi Yes contract pays $1 if the market resolves Yes, so its price reads as a chance. When both sides are quoted and the spread is 10 cents or less, the actor uses the middle of the bid and ask; otherwise it uses the last trade price. probability_source says which one was used. A market with no bids and no trades has no implied probability.
Why do so many trending markets come from sports?
That is what trades most on Kalshi on a given day. Pick a category, use searchText, or sort by totalVolume to see the largest questions of all time instead.
What is the difference between an event, a market and a series?
A series is a recurring question (the Fed meeting). An event is one instance of it (the October 2026 meeting). A market is one outcome of that event that trades Yes or No (the Fed holds rates). Markets mode gives one row per outcome, Events mode one row per event, Series mode one row per series.
Can I get the result of finished markets?
Yes. Set status to settled. Each row then has result (yes or no), settlement_value (for example the winner's name or the measured number) and settlement_time.
How long does a run take?
In our tests: under 3 seconds for the "Try it" input (50 markets from 18 events), about 1 second for 30 trades from the trade feed, and 3 seconds for 8 order books. The default time limit is 3,600 seconds; the actor stops before it and keeps every row.
Do I need a Kalshi account, an API key or a proxy?
No. The data is public. The actor calls Kalshi directly and switches to Apify Proxy only if Kalshi refuses the run's own address.
Which actor should I use for other prediction markets?
Polymarket Scraper reads Polymarket's markets, price history and trades with matching names where the two overlap (volume_24h, liquidity, url, scraped_at, prices from 0 to 1), so the two datasets are easy to line up for cross market comparisons.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Markets, Events, Trades and Order books. In CSV and Excel, arrays such as markets and orderbook_yes_bids are flattened into columns such as markets/0/ticker.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/kalshi-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http kalshi-scraper "https://mcp.apify.com/?tools=themineworks/kalshi-scraper"
Is it legal to scrape Kalshi?
The actor reads only public market data that Kalshi publishes through its own API for anyone to use, without an account. You are responsible for how you use the data, including Kalshi's terms. This is general information, not legal or trading advice. The actor is not affiliated with Kalshi.
Integrations
- Google Sheets: send each run's markets to a sheet with Apify's Google Sheets integration; one row per market fits a sheet as is.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "post the Fed decision odds to Slack every morning".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
Company and business data
- Company Domain Finder
- GST Taxpayer Lookup
- Company KYB Resolver
- SEC EDGAR Filings Scraper
- EU VAT Checker (VIES)
- Tech Stack Detector
- Bundesanzeiger Scraper
- Domain to LinkedIn URL Resolver
- World Bank Trade Scraper
- US Import Records
- Y Combinator Scraper
- Norway Company Register
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a market that comes back with an empty field, or a ticker or link the actor does not understand? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.
Read Kalshi prediction markets as flat rows: Yes and No prices, implied probability, volume, open interest, dates, results and rules, plus events, series, trades and order books, no login.

