Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Kalshi Markets Scraper icon

Kalshi Markets Scraper

Kalshi prices, volume, open interest and results as rows. Temperature brackets in 24 US cities carry the forecast for their station and day.

85 runs on Apify $0.00092 per market ($0.92 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust status, weatherCities, weatherKind (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00092 per market = $0.92 per 1,000

You are charged forWhenPrice
Market returnedOne Kalshi market returned in the dataset.$0.00092

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-14, and they are what you are actually charged.

Inputs

FieldWhat it doesType
statusLeave it empty and the run returns open markets for the cities, categories or series you pick, and market or event tickers whatever their status. With nothing at all set, you get one sample row.string
weatherCitiesKalshi's daily highest and lowest temperature markets in these cities, six brackets a day. Each bracket gets the forecast for the station the market settles on.array
weatherKindWhich of the two temperature markets to fetch for each city.string
addForecastNext to each temperature bracket: the forecast high or low for that station and day from Open-Meteo, whether it falls inside the bracket, and by how many degrees it misses. Today and the next 15 days get a forecast; past days don't.boolean
categoriesKalshi's own categories. Every market in them comes back, subject to the status and filters.array
tagsKalshi's sub-categories, written the way Kalshi shows them, for example Daily temperature or Inflation. With categories set too, a series has to carry both.array
seriesTickersA series is the question Kalshi asks again and again, such as KXHIGHNY (highest temperature in New York) or KXFED. Every market in it comes back.array
eventTickersOne occurrence of a series, such as KXHIGHNY-26SEP14. All of its markets come back.array
marketTickersSingle markets, such as KXHIGHNY-26SEP14-B81.5.array
keywordOnly markets whose title, bracket or event mentions this. Capitals don't matter.string
closeFromOnly markets whose trading closes on or after this day, UTC. For settled markets this reaches back past Kalshi's live window into its archive.string
closeToOnly markets whose trading closes on or before this day, UTC.string
minVolumeOnly markets where at least this many contracts have traded since the market opened.integer
minVolume24hOnly markets where at least this many contracts traded in the last 24 hours.integer
minOpenInterestOnly markets with at least this many contracts still held.integer
combosKalshi generates combo markets, several outcomes bundled into one contract, in very large numbers. They're left out unless you ask. Market tickers you list come back either way.string
includeOrderbookThe resting bids on the yes and no side of each market, best price first.boolean
orderbookDepthHow many price levels per side.integer
includeTradesThe latest trades of each market, newest first. This asks Kalshi once per market, so a run with trades stops at 2,000 markets.boolean
tradesPerMarketHow many of the latest trades per market.integer
maxMarketsThe most markets returned in one run. Each market returned is one charge.integer

What you get

A structured dataset — each result includes fields like:

tickereventTitleyesSubTitlecategorystatusGroupyesBidyesAsklastPricevolumeopenInterestcloseTimeresulturlcityweatherDatetemperatureKindforecastTempFforecastInBracketforecastDistanceFsettledTempF

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Kalshi Markets Scraper: prediction market prices, volume and settlement, as rows

Pull Kalshi's 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.

InputCities, Kalshi categories, tags, or series, event and market tickers
OutputOne row per market
Ceiling50,000 markets per run
Account neededNone, and no API key
Price$0.92 per 1,000 markets, flat on every plan

📈 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 you give it

{
  "status": "open",
  "weatherCities": ["New York City", "Chicago", "Miami"],
  "weatherKind": "both",
  "addForecast": true,
  "minVolume24h": 100,
  "maxMarkets": 500
}
FieldDefaultWhat it is
statusnone, box starts at openopen, closed, settled, unopened, paused or any. Tickers you list come back whatever their status.
weatherCitiesnone, box starts at threeUp to 30 of the 24 cities Kalshi runs temperature markets in.
weatherKindbothboth, high or low.
addForecastonAdds the forecast fields to each temperature bracket.
categoriesnoneKalshi's own categories. Every market inside comes back.
tagsnoneKalshi's sub-categories, written as Kalshi shows them: Daily temperature, Inflation. With categories set too, a series has to carry both.
seriesTickersnoneUp to 200, like KXFED. Every market in the series.
eventTickersnoneUp to 500, like KXHIGHNY-26SEP14. All of that event's markets.
marketTickersnoneUp to 5,000 single markets.
keywordnoneOnly markets whose title, bracket or event mentions it. Capitals do not matter.
closeFrom, closeTononeTrading 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, minOpenInterestnoneContract-count floors, lifetime, last 24 hours, and still held.
combosexcludeexclude, include or only.
includeOrderbookoffResting bids on both sides, best price first.
orderbookDepth10Price levels per side, up to 100.
includeTradesoffLatest trades per market. This costs one request per market, so a run with trades stops at 2,000 markets.
tradesPerMarket20Up to 100.
maxMarkets1000, box starts at 100Markets in one run, up to 50,000.

📤 What you get back

A real temperature row from a recent run:

{
  "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.

FieldWhat it is
Every price fieldIn dollars, so 0.37 is 37 cents a contract.
status, statusGroupKalshi's own word, and the coarser group the filters use.
floorStrike, capStrikeThe numeric edges of the question, when it has them.
seriesTickerRead 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.
categoryThe 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, bracketHighFWhole degrees, both ends inclusive. One of them is null on an open-ended bracket.
settledTempFThe temperature the market settled on, once it has closed or settled.
forecastSourceNames the forecast service the numbers came from, the same on every row.
orderbook, recentTradesOnly when you asked for them. Both newest or best first.

🧾 Reading the output

RowHow to spot itCharged
A market_sample is absentyes
The sample row_sample: trueno

Run it with nothing set and you get that one sample row, a real temperature bracket with its forecast attached.

The forecast, the orderbook and the trades ride along with the market row. They are not charged separately.

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.

▶️ How to run it

1. Open Kalshi Markets Scraper and click Try for free. 2. For temperature markets, pick Cities and leave Add the forecast on. 3. For anything else, pick Categories, or paste tickers into Series tickers, Event tickers or Market tickers. 4. Set Market status and Maximum markets, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.92 per 1,000 markets. Flat on every Apify plan, no volume tiers.

You pay per market row delivered. 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 free. The forecast, orderbook and trades add nothing on top of the market row.

💡 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 closeFrom and closeTo to build a history of how a question paid.
  • Screening the open board by minVolume24h to 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

multivariate events out of the events endpoint.

  • 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 settledTempF is null. One row in

552 on a recent archive read.

  • Trades cost a request each, which is why a run with trades on stops at 2,000 markets.

🧭 Which markets scraper do you need?

If you wantUse
Kalshi prices, volume, settlement and temperature bracketsThis one
Sportsbook lines and player propsSports Odds Scraper
What members of Congress bought and soldCongress Stock Trades Scraper
Crypto prices, market cap and volumeCoinGecko Scraper

❓ Questions people ask

Do I need a Kalshi account? 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 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.

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 scraping and the law 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.