Kalshi Markets Scraper - Odds, Volume & Weather Forecasts
Pricing
from $0.89 / 1,000 markets
Kalshi Markets Scraper - Odds, Volume & Weather Forecasts
Kalshi prediction markets as rows: yes and no prices, last trade, volume, open interest, close time and result. The daily high and low temperature brackets in 24 US cities also get the forecast for their station and day. No login. $0.92 per 1,000 markets.
Pricing
from $0.89 / 1,000 markets
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Pull Kalshi's prediction markets into a table: the yes and no quotes, the last trade, volume, open interest, when trading closes and how it settled. Ask by city, by Kalshi category, by tag, or by series, event or market ticker. The orderbook and recent trades come along if you want them.
Prices carry Kalshi's own 15-second cache header, so treat a row as up to 15 seconds old rather than as a live tick.
| Input | Cities, Kalshi categories, tags, or series, event and market tickers, plus status, date and volume filters |
| Output | One row per market: yes and no quotes, last price, volume, open interest, close time, result. Temperature brackets add the station, the bracket edges and a forecast |
| Ceiling | 50,000 markets per run, or 2,000 with trades on |
| Speed | Three cities' brackets in about 3 seconds, all 24 cities in about 25, and 10,000 markets in 40 |
| Account needed | None, and no API key |
| Price | $0.92 per 1,000 markets, flat on every plan. The free plan's $5 a month covers about 5,400 |
🔍 What Kalshi Markets Scraper does
It runs each search you give it and writes one row per market. A market is a single yes-or-no
contract, an event is one occurrence of a question, and a series is the question Kalshi asks over
and over, so KXHIGHNY is the series, KXHIGHNY-26SEP14 the event and KXHIGHNY-26SEP14-B81.5 one
bracket inside it.
Temperature markets get extra treatment. Kalshi runs daily high and low temperature brackets in 24 US cities, six brackets a day. Pick cities and every bracket comes back with the weather station it settles on, the bracket edges in whole degrees, the settled temperature once there is one, and a forecast for that station and day: the number, whether it lands inside the bracket, and by how many degrees it misses. Today and the next 15 days get a forecast. Past days do not.
Combo markets, where several outcomes are bundled into one contract, are left out by default. Kalshi generates them in very large numbers and they would swamp everything else.
📋 What data you get from each Kalshi market
| What you get | Field |
|---|---|
| Market, event and series tickers, and the question in words | ticker, eventTicker, seriesTicker, title, yesSubTitle, noSubTitle, eventTitle, eventSubTitle |
| Category, state and the numeric edges of the question | category, status, statusGroup, result, marketType, strikeType, floorStrike, capStrike |
| Yes and no quotes, the last trade, and the same a day earlier | yesBid, yesAsk, noBid, noAsk, lastPrice, yesBidSize, yesAskSize, previousYesBid, previousYesAsk, previousPrice |
| Contracts traded and still held | volume, volume24h, openInterest, notionalValue |
| When it opens, closes and settles | openTime, closeTime, expectedExpirationTime, latestExpirationTime, settlementTime |
| How it settled | settlementValue, expirationValue, canCloseEarly, archived |
| The rule text, the link and when the row was read | rulesPrimary, url, isCombo, fetchedAt |
| Temperature brackets: city, station, day, bracket edges, settled temperature | city, stationCode, stationName, weatherDate, temperatureKind, bracketLowF, bracketHighF, settledTempF |
| Temperature brackets: the forecast and how far it misses | forecastTempF, forecastInBracket, forecastDistanceF, forecastSource, forecastFetchedAt |
| The orderbook and recent trades, when you ask | orderbook, recentTrades |
▶️ How to scrape Kalshi markets
- Open Kalshi Markets Scraper and click Try for free.
- For temperature markets, pick Cities and leave Add the forecast on.
- For anything else, pick Categories, or paste tickers into Series tickers, Event tickers or Market tickers.
- Set Market status and Maximum markets.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Run it with nothing set and you get one labelled sample row, a real temperature bracket with its forecast attached. It is not charged.
💰 How much does it cost to scrape Kalshi markets?
$0.92 per 1,000 markets. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 5,400 markets.
You pay per market row delivered. The forecast, the orderbook and the trades ride along with the market row and add nothing on top. Markets your filters set aside, repeats, a ticker Kalshi does not know, a search that could not be read, and the sample row are all uncharged.
📥 What you give it
{"status": "open","weatherCities": ["New York City", "Chicago", "Miami"],"weatherKind": "both","addForecast": true,"minVolume24h": 100,"maxMarkets": 500}
| Field | Default | What it is |
|---|---|---|
status | none, the box starts at open | open, closed, settled, unopened, paused or any. Left empty, cities, categories and series return open markets, and tickers you list come back whatever their status. |
weatherCities | none, the box starts at three | Any of the 24 cities Kalshi runs temperature markets in. |
weatherKind | both | both, high or low. |
addForecast | on | Adds the forecast fields to each temperature bracket. |
categories | none | Kalshi's own categories. Every market inside comes back. |
tags | none | Kalshi's sub-categories, written as Kalshi shows them: Daily temperature, Inflation. With categories set too, a series has to carry both. |
seriesTickers | none | Up to 200, like KXFED. Every market in the series. |
eventTickers | none | Up to 500, like KXHIGHNY-26SEP14. All of that event's markets. |
marketTickers | none | Up to 5,000 single markets. |
keyword | none | Only markets whose title, bracket or event mentions it. Capitals do not matter. |
closeFrom, closeTo | none | Trading closes on or after, and on or before, these UTC days. For settled markets closeFrom reaches back past Kalshi's live window into its archive. |
minVolume, minVolume24h, minOpenInterest | none | Contract-count floors: lifetime, last 24 hours, and still held. |
combos | exclude | exclude, include or only. |
includeOrderbook | off | Resting bids on both sides, best price first. |
orderbookDepth | 10 | Price levels per side, up to 100. |
includeTrades | off | Latest trades per market, fetched market by market, so a run with trades stops at 2,000 markets. |
tradesPerMarket | 20 | Up to 100. |
maxMarkets | 1000, the box starts at 100 | Markets in one run, up to 50,000. |
📤 What you get back
A real temperature row from a run on 14 September 2026:
{"ticker": "KXHIGHNY-26SEP14-T81","eventTicker": "KXHIGHNY-26SEP14","seriesTicker": "KXHIGHNY","title": "Will the maximum temperature be >81° on Sep 14, 2026?","yesSubTitle": "82° or above","eventTitle": "Highest temperature in New York City on Sep 14, 2026?","category": "Climate and Weather","status": "active","statusGroup": "open","result": null,"marketType": "binary","strikeType": "greater","floorStrike": 81,"capStrike": null,"yesBid": 0,"yesAsk": 0.01,"noBid": 0.99,"noAsk": 1,"lastPrice": 0.01,"yesAskSize": 11128.31,"volume": 1186.01,"volume24h": 1186.01,"openInterest": 1186.01,"openTime": "2026-09-13T14:00:00Z","closeTime": "2026-09-15T05:00:00Z","settlementValue": null,"isCombo": false,"rulesPrimary": "If the maximum temperature recorded at New York City (CLINYC) for Sep 14, 2026, is greater than 81° fahrenheit according to The Weather Company, then the market resolves to Yes.","url": "https://kalshi.com/markets/kxhighny","fetchedAt": "2026-09-14T05:45:15.320Z","city": "New York City","stationCode": "CLINYC","stationName": "New York City, Central Park","weatherDate": "2026-09-14","temperatureKind": "high","bracketLowF": 82,"bracketHighF": null,"settledTempF": null,"forecastTempF": 71.8,"forecastInBracket": false,"forecastDistanceF": 10}
Cut short here: the row also carries noSubTitle, eventSubTitle, yesBidSize, previousYesBid,
previousYesAsk, previousPrice, notionalValue, expectedExpirationTime,
latestExpirationTime, settlementTime, expirationValue, canCloseEarly, archived,
forecastSource and forecastFetchedAt.
| Field | How to read it |
|---|---|
| Every price field | In dollars, so 0.37 is 37 cents a contract. |
status, statusGroup | Kalshi's own word, and the coarser group the filters use. |
floorStrike, capStrike | The numeric edges of the question, when it has them. |
seriesTicker | Read off the event record rather than guessed from the ticker, because 75 of about 7,000 open events do not start with their own series. |
category | The event's category. A series can sit in more than one, so a search by category can return rows labelled with a different one. |
bracketLowF, bracketHighF | Whole degrees, both ends inclusive. One of them is null on an open-ended bracket. |
settledTempF | The temperature the market settled on, once it has closed or settled. |
forecastSource | Names the forecast service the numbers came from, the same on every row. |
orderbook, recentTrades | Only when you asked for them. Both best or newest first. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A market | _sample is absent | yes |
| The sample row | _sample: true | no |
There are no diagnostic rows. The status message leads with the result, like "Returned N markets (M
temperature brackets, K with a forecast)", then names what was set aside and why. RUN_REPORT in
the key-value store holds the long version: one entry per search with its status and page count,
skipped counts by reason, tickers Kalshi did not recognise, and where the archive cutoff fell.
Two dataset views are set up, overview and weather, so the temperature fields have somewhere
sensible to land in a spreadsheet.
💡 What people use it for
- Watching the temperature brackets for a city against the forecast, to see where the two disagree.
- Pulling a settled series with
closeFromandcloseToto build a history of how a question paid. - Screening the open board by
minVolume24hto find the markets that are actually trading. - Feeding a model with yes and no quotes plus open interest, on a schedule, keyed on
ticker. - Reading the orderbook on a handful of markets to see how deep the resting bids go.
🚧 What it does not do
- No trading. It reads public market data. It does not place, hold or cancel anything.
- Prices are up to 15 seconds old, because that is what Kalshi's own cache header says.
- A wide walk stops at 120 pages, about 120,000 markets. The open board without combos was 119,253, so anything broader than that gets cut off with a message.
- A category search does not reach the archive. Old settled markets need a series, event, ticker or city.
- Combo markets arrive thin. No event title, series, category or link, because Kalshi leaves combo events out of its event listings.
- If the forecast service does not answer, brackets come back without forecast fields and are still charged as markets. The status says how many.
- The city list is fixed at Kalshi's 24 US cities. A new one Kalshi adds arrives as a plain market with no weather fields until the list is updated here.
- An archived bracket can be missing its settled value, so
settledTempFisnull. One row in 552 on a recent archive read. - Trades are fetched market by market, which is why a run with trades on stops at 2,000 markets.
- It is not an official Kalshi tool. Dami's Studio is independent and is not affiliated with or endorsed by Kalshi, or by any other company named on this page.
🧭 Which markets scraper do you need?
| If you want | Use |
|---|---|
| Kalshi prices, volume, settlement and temperature brackets | This one |
| Large Polymarket trades, with the wallet behind each one | Polymarket Whale Tracker |
| A forecast or past daily weather for any city, not just Kalshi's 24 | Weather Scraper |
| Sportsbook lines and player props | Sports Odds Scraper |
| Crypto prices, market cap and volume | CoinGecko Scraper |
❓ Questions people ask
Do I need a Kalshi account or API key?
No. No login and no API key.
How do I get one day's temperature brackets for a city?
Set Cities to that city, and Closes on or after and Closes on or before to the day you want.
Why is a row's category not the one I searched?
category belongs to the event, and a series can live under more than one. 15 of 300 rows found
through Economics came back labelled Financials, Science and Technology, Politics or Elections.
Can I get historical settled Kalshi markets?
Yes, for a series, event, ticker or city. Set Market status to settled and push Closes on or after back.
Why did my wide search stop early?
Either Maximum markets or the 120-page walk limit. The status message says which.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/kalshi-markets-scraper. Either way the
run happens on your Apify account at the same price.
Is scraping Kalshi legal?
This reads Kalshi's own public market data with no account. Kalshi's terms govern what you may do with it, so read them against your plan. Apify's write-up on the legality of web scraping is a starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the tickers or cities you used. The
status message and RUN_REPORT name which search fell short.