Kalshi Weather Markets API — Temperature & Rain Odds avatar

Kalshi Weather Markets API — Temperature & Rain Odds

Pricing

from $1.00 / 1,000 market records

Go to Apify Store
Kalshi Weather Markets API — Temperature & Rain Odds

Kalshi Weather Markets API — Temperature & Rain Odds

Kalshi weather market data as JSON: live temperature (KXHIGH/KXLOW) and rain (KXRAIN) bracket odds with implied probability, bid/ask and volume, plus settled history for 24 US cities, each mapped to its settlement station. No API key. $1 per 1,000 markets.

Pricing

from $1.00 / 1,000 market records

Rating

5.0

(1)

Developer

Jack Sheward

Jack Sheward

Maintained by Community

Actor stats

0

Bookmarked

275

Total users

54

Monthly active users

72 days

Issues response

12 days ago

Last modified

Share

Kalshi Weather Markets Data — KXHIGH & KXLOW

Pull Kalshi weather markets data as clean JSON: every KXHIGH (daily high temperature) and KXLOW (daily low temperature) bracket market for 24 cities, plus Kalshi rain markets (KXRAIN daily "will it rain" markets for 28 cities and monthly rain-total markets). You get live bid/ask, implied probability, volume and open interest, and full settlement history with each market's result and the official settled temperature or rainfall (where Kalshi's archive records it, see FAQ). Each market is mapped to the weather station its settlement rules name, including the traps: Chicago temperature = Midway, Chicago rain = O'Hare, Dallas = DFW, Houston = Hobby.

Uses Kalshi's public market-data API directly. No login, no API key, no scraping.

What you get

One record per market (bracket):

FieldExampleNotes
tickerKXHIGHCHI-26SEP21-B65.5Kalshi market ticker
event_tickerKXHIGHCHI-26SEP21groups all brackets of one city-day (for KXRAIN: all cities of one day)
cityChicagocanonical city name
station_idKMDWICAO code of the station named in the market's settlement rules
series_tickerKXHIGHCHI
series_typeKXHIGHKXHIGH, KXLOW, KXRAIN (daily rain) or KXRAINM (monthly rain)
bracket_label65° to 66°human-readable bracket; rain markets: Above 0 inches, Above 7 inches (older archive rain markets, which carry no strike fields, get the threshold from their ticker: RAINNYC-22AUG22-T1.25 → Above 1.25 inches)
strike_typebetweengreater, less, or between
floor_strike65lower bound (°F, or inches for rain; null for "or below" brackets)
cap_strike66upper bound (null for "or above" brackets)
statusfinalizedactive (live) or finalized (settled)
resultyesyes / no / null while live
settlement_temp_f65.0official settled temperature (settled temperature markets only; null where Kalshi's archive left it blank, see FAQ)
settlement_time2026-09-22T12:09:38Z
open_time2026-09-20T14:00:00ZISO timestamp
close_time2026-09-22T06:00:00ZISO timestamp (UTC, so usually the day after date)
yes_bid0.0USD per contract, 0.00–1.00
yes_ask1.0USD per contract, 0.00–1.00
last_price0.99USD per contract, 0.00–1.00
volume14489.68contracts (fractional trading enabled)
open_interest9582.84contracts (fractional trading enabled)
liquidity0.0USD value of resting orders
date2026-09-21the day the high, low or rain is measured (YYYY-MM for monthly rain) — join key with station_id
implied_probability0.99yes bid/ask midpoint while the book has at least one side (a missing side counts as bid 0 / ask 1.00, so bid 0 + ask 0.02 gives 0.01); with an empty book (bid 0 / ask 1.00) the last traded price; null if never traded. Recently settled markets always show an empty book, so this is their last trade; older archive markets (for example 2022) kept their closing quote, so their settled records show the closing midpoint (HIGHNY-22JAN05-T43: bid 0.99 / ask 1.00 → 0.995)
spreadnullyes ask minus yes bid on the same basis: null with an empty book (recently settled markets), the closing spread on older archive markets (0.01 above)
volume_24h0.0contracts traded in the last 24 hours
market_urlhttps://kalshi.com/markets/kxhighchi/kxhighchi-26sep21the event's page on kalshi.com
settlement_precip_innullofficial settled rainfall in inches (settled rain markets only)
tradesarrayonly with includeTrades — up to 1,000 recent fills
orderbookobjectonly with includeOrderbook — bid levels, see below

Optional keys: the trades and orderbook keys exist in a record only when the corresponding flag is enabled — with the flag off the key is omitted entirely (not null), so read them with .get() rather than direct indexing. With the flag on, a per-market fetch failure leaves the key present with value null. When present they come straight after liquidity, as they always have, and the fields added on 2026-09-25 (date … settlement_precip_in) follow them, so existing CSV/Excel column positions don't move.

Orderbook structure: orderbook is {"yes_dollars": [[price, size], ...], "no_dollars": [[price, size], ...]} — despite the names (Kalshi's own field names, passed through), each value is a list of bid levels, not a single dollar amount: price in USD per contract, size in (fractional) contracts.

Example settled temperature record (real output, 2026-09-24 run):

{
"ticker": "KXHIGHCHI-26SEP21-B65.5",
"event_ticker": "KXHIGHCHI-26SEP21",
"city": "Chicago",
"station_id": "KMDW",
"series_ticker": "KXHIGHCHI",
"series_type": "KXHIGH",
"bracket_label": "65° to 66°",
"strike_type": "between",
"floor_strike": 65,
"cap_strike": 66,
"status": "finalized",
"result": "yes",
"settlement_temp_f": 65.0,
"settlement_time": "2026-09-22T12:09:38.212928Z",
"open_time": "2026-09-20T14:00:00Z",
"close_time": "2026-09-22T06:00:00Z",
"yes_bid": 0.0,
"yes_ask": 1.0,
"last_price": 0.99,
"volume": 14489.68,
"open_interest": 9582.84,
"liquidity": 0.0,
"date": "2026-09-21",
"implied_probability": 0.99,
"spread": null,
"volume_24h": 0.0,
"market_url": "https://kalshi.com/markets/kxhighchi/kxhighchi-26sep21",
"settlement_precip_in": null
}

The same day's Chicago rain market from the same run settled at O'Hare, not Midway: "ticker": "KXRAIN-26SEP21-CHI", "station_id": "KORD", "bracket_label": "Above 0 inches", "result": "no", "settlement_precip_in": 0.0, "volume": 57313.4.

Export as JSON, CSV, or Excel directly from the dataset. The Settled results view shows date, city, station, bracket, result and settled value side by side.

Holding a temperature bracket? Grade it with the Prediction Market Resolution Evidence Checker: paste the ticker and get the live observation at the settlement station, the implied YES/NO and a confidence grade.

Input

Default (live temperature markets, one city — fast, about 24 records):

{
"cities": ["NYC"],
"seriesType": "both",
"mode": "live"
}

Settled history (intentionally heavier: about 1,080 records per city at 90 days with highs and lows):

{
"cities": ["NYC", "Chicago"],
"seriesType": "both",
"mode": "settled",
"lookbackDays": 90
}

Only tomorrow's brackets, or an exact historical window:

{ "cities": ["all"], "mode": "live", "dateFrom": "2026-09-26", "dateTo": "2026-09-26" }
{ "cities": ["Houston"], "seriesType": "rain", "mode": "settled", "dateFrom": "2026-08-01", "dateTo": "2026-08-31" }
  • cities — city names or aliases (NYC, Philly, SF, NOLA, DFW, SD, EWR, SDF…), settlement station codes (KMDW or MDW), series or event tickers (KXHIGHCHI, KXHIGHNY-26SEP24), airports and qualifiers (JFK, Chicago O'Hare, Denver International Airport, Minneapolis/St. Paul), "Chicago, IL", coordinates ({"lat": 41.79, "lon": -87.75} picks the nearest station within 150 km that has markets of your seriesType, so Milwaukee coordinates give Chicago's temperature markets but Milwaukee's own rain markets), a comma-separated string, or "all" for every supported city. Records always carry the station the market really settles on (NYC settles on Central Park, KNYC, whichever NYC airport you named). If none of the entries is a supported city, the run returns no data, charges nothing and lists the supported cities in its status message — it never substitutes a different city.
  • seriesType — KXHIGH (daily highs), KXLOW (daily lows), both (highs + lows, the default), KXRAIN (daily rain), KXRAINM (monthly rain), rain (daily + monthly rain), or all (temperature + rain).
  • mode — live (currently tradeable markets with current prices), settled (finalized markets with results and settled values), or both.
  • lookbackDays — 1–365, settled-history window (only used in settled/both mode). The whole window comes back: markets Kalshi has moved out of its main market list (older than about two months) are fetched too.
  • dateFrom / dateTo — optional market-date range (YYYY-MM-DD; 20260925, today, tomorrow, yesterday, 7 days ago also work, relative words counted in US Eastern time, Kalshi's market day). Filters every mode; in settled mode dateFrom replaces lookbackDays and can reach back to 2021, and dateTo alone gives lookbackDays market dates ending on that date. A dateTo past 2100 (such as 9999-12-31) means no end date; empty or null means no bound.
  • maxRecords — optional cap on records returned and charged (empty, null or 0 = no cap). The run stops at the cap and says so in its status message.
  • includeTrades — attach up to 1,000 recent fills per market (one extra API call per market; fills of older markets come from Kalshi's trade history archive).
  • includeOrderbook — attach the current order book per open market (one extra API call per market; settled markets get an empty book without a call).

Pricing

Pay per event, no subscription: $0.01 per run (charged only once Kalshi has answered) + $0.002 per market record. Two optional add-ons are billed per delivered record, and only when you turn them on: +$0.002 with includeOrderbook and +$0.002 with includeTrades. These prices apply from October 15, 2026; until then a run costs $0.005 + $0.001 per record, with no add-on charges. Record counts below are from real runs on 2026-09-24; they move a little day to day.

RunInputRecordsCost
Default: one city, live highs + lows{"cities": ["NYC"]}24$0.058
Same, with the order book{"cities": ["NYC"], "includeOrderbook": true}24$0.106
One city, daily rain, live{"cities": ["NYC"], "seriesType": "KXRAIN"}2$0.014
Every rain market, live (28 daily-rain cities + 10 monthly series){"cities": ["all"], "seriesType": "rain"}138$0.286
All 24 temperature cities, live{"cities": ["all"]}576$1.162
One city, 30 days settled, highs + lows{"cities": ["NYC"], "mode": "settled", "lookbackDays": 30}354$0.718
One city, 90 days settled, highs + lows{"cities": ["NYC"], "mode": "settled", "lookbackDays": 90}1,074$2.158
Cappedadd "maxRecords": 500 to any input≤ 500≤ $1.01

Your maximum charge per run is always respected, add-ons included: the actor stops fetching once the budget is used and reports exactly how many records were delivered. Runs that return nothing because no named city is supported, or because Kalshi is unreachable, charge nothing.

Reliability

  • Rate limits (HTTP 429) and temporary Kalshi errors are retried with backoff, and requests are paced at about 10 per second, so large pulls don't silently lose cities. A series or market that still fails is skipped and named in the run log and status message; the rest of the run continues.
  • Results are streamed to the dataset in batches, so even "all" cities with trade history stays well within memory. A 90-day settled pull for all 24 temperature cities (about 23,000 records) takes about 30 seconds of fetching.
  • Long pulls stop shortly before the run timeout and keep everything fetched so far.
  • If Kalshi is unreachable (every request fails after retries), the run fails with a clear message and nothing is charged.

All prices are USD per contract (each contract pays $1.00). Quantities (volume, volume_24h, open_interest, trade count_fp, book sizes) are in contracts; Kalshi allows fractional contracts, so they can be non-integer.

Supported cities (temperature)

CityAliasesKXHIGH seriesKXLOW seriesSettlement station
NYCNew York, NYKXHIGHNYKXLOWTNYCKNYC (Central Park)
Chicago—KXHIGHCHIKXLOWTCHIKMDW (Midway, not O'Hare)
Miami—KXHIGHMIAKXLOWTMIAKMIA
Austin—KXHIGHAUSKXLOWTAUSKAUS
Los AngelesLAKXHIGHLAXKXLOWTLAXKLAX
Denver—KXHIGHDENKXLOWTDENKDEN
Phoenix—KXHIGHTPHXKXLOWTPHXKPHX
PhiladelphiaPhillyKXHIGHPHILKXLOWTPHILKPHL
Houston—KXHIGHTHOUKXLOWTHOUKHOU (Hobby, not Bush/IAH)
MinneapolisMinKXHIGHTMINKXLOWTMINKMSP
Oklahoma CityOKCKXHIGHTOKCKXLOWTOKCKOKC
San FranciscoSFKXHIGHTSFOKXLOWTSFOKSFO
Washington DCDCKXHIGHTDCKXLOWTDCKDCA
Boston—KXHIGHTBOSKXLOWTBOSKBOS
DallasDFWKXHIGHTDALKXLOWTDALKDFW (not Love Field)
Seattle—KXHIGHTSEAKXLOWTSEAKSEA
Las VegasLV, VegasKXHIGHTLVKXLOWTLVKLAS
Atlanta—KXHIGHTATLKXLOWTATLKATL
San AntonioSATXKXHIGHTSATXKXLOWTSATXKSAT
New OrleansNOLAKXHIGHTNOLAKXLOWTNOLAKMSY
San DiegoSDKXHIGHTSANKXLOWTSANKSAN
LouisvilleSDFKXHIGHTSDFKXLOWTSDFKSDF
NewarkEWRKXHIGHTEWRKXLOWTEWRKEWR
TrentonTTNKXHIGHTTTNKXLOWTTTNKTTN

Kalshi rain markets (KXRAIN)

Set seriesType to KXRAIN, KXRAINM, rain or all to get Kalshi's rain markets, charged like any other market record:

  • Daily rain (KXRAIN) — one yes/no market per city per day: "Will it rain in Chicago on Sep 25?" resolves YES if the day's precipitation total is above 0 inches (trace counts as 0). bracket_label is Above 0 inches; settled records carry settlement_precip_in.
  • Monthly rain (KXRAIN…M) — one market per inch threshold for the month's total ("Above 7 inches"); date is the month (2026-09).

Rain can settle on a different station than temperature in the same city, and Kalshi has moved rain stations mid-series, so every record's station_id is read from that market's own rules: Chicago daily rain = O'Hare (KORD) while Chicago temperature = Midway (KMDW); Houston daily rain settled at Bush (KIAH) through 2026-08-13 and at Hobby (KHOU) from 2026-08-14; Chicago monthly rain used Midway through August 2026 and O'Hare from September.

CityDaily rain stationMonthly rain series
NYCKNYC (Central Park)KXRAINNYCM
ChicagoKORD (O'Hare)KXRAINCHIM
MiamiKMIAKXRAINMIAM
AustinKAUSKXRAINAUSM
Los AngelesKLAXKXRAINLAXM
DenverKDENKXRAINDENM
HoustonKHOU (Hobby; KIAH before 2026-08-14)KXRAINHOUM
San FranciscoKSFOKXRAINSFOM
DallasKDFWKXRAINDALM
SeattleKSEAKXRAINSEAM
Phoenix, Philadelphia, Minneapolis, Oklahoma City, Washington DC, Boston, Las Vegas, Atlanta, San Antonio, New Orleans, Newark, Trentonsame station as temperature (table above)—
Pittsburgh, Providence, Milwaukee, Lexington, Columbus, College Station (rain only)KPIT, KPVD, KMKE, KLEX, KCMH, KCLLProvidence, Milwaukee, Lexington, Columbus, College Station series are listed by Kalshi and picked up when they open
St. Petersburg, FL (rain only)—KXRAINSTPM (KSPG)

Settled NYC daily rain before KXRAIN existed (2021 to July 2026) comes from Kalshi's older NYC-only rain series, so dateFrom can reach back years for NYC.

Why this instead of scraping the Kalshi website?

  • Structured market data, not HTML. Direct from Kalshi's public market-data API — stable JSON, no scrape fragility, no login wall.
  • Settlement-grade joins. Every market is mapped to the station its rules name — the mistakes (O'Hare vs Midway, Love Field vs DFW, Bush vs Hobby) that cost real traders real money are already handled, including stations Kalshi changed mid-series.
  • Backtest-ready history. Settled mode gives you bracket, result and the official settled value per city-day in one flat table — join it against any weather dataset by station_id and date.

FAQ

Which Kalshi weather markets are covered?

All daily high (KXHIGH*) and daily low (KXLOW*) temperature bracket markets for 24 cities, plus Kalshi's daily (KXRAIN) and monthly rain markets. New cities in these families are added as they list; series Kalshi lists with open markets that the actor has no station mapping for yet are logged as warnings.

What units are the prices in?

USD per contract, 0.00–1.00 (each contract settles at $1.00). yes_bid 0.04 means 4 cents; implied_probability 0.04 means the market prices a 4% chance. Volume and open interest are in contracts and can be fractional, since Kalshi supports fractional trading.

How do I get settled temperature or rain history for a city?

Set mode to settled, pick your cities and lookbackDays (or an exact dateFrom/dateTo). Each settled temperature record carries settlement_temp_f — the official high (or low) Kalshi settled on — and each rain record settlement_precip_in, plus the winning/losing bracket via result. One gap: Kalshi's archive leaves the settled value blank on many markets from 2022 to mid-2026 (for NYC daily highs, most of 2023–2024 and about half of the whole 2021+ archive), so settlement_temp_f is null there. result is still filled in, and the bracket with result yes gives the settled range. For the exact reading, use the station's observations (see the METAR actor below).

Which weather station does each market settle on?

Each Kalshi temperature market names one NWS climate station in its rules, for example CLINYC (Central Park), CLIMDW (Midway) or CLIDFW. Kalshi's current rules resolve on that station's daily max/min as reported by The Weather Company (weather.com/kalshi). Every record carries the station's ICAO code in station_id (read from that market's rules), so you can join against observation data. Traps: Chicago = Midway (KMDW), not O'Hare; Dallas = DFW (KDFW), not Love Field; Houston = Hobby (KHOU), not Bush. Rain markets name their own station, which can differ (Chicago rain = O'Hare) — see the rain table above.

Can I get the order book and trade history?

Yes — includeOrderbook attaches the book as {"yes_dollars": [[price, size], ...], "no_dollars": [[price, size], ...]} (lists of bid levels), includeTrades attaches up to 1,000 recent fills per market (price, size, taker side, timestamp). With either flag off, the corresponding key is omitted from the record entirely — use .get(). Each add-on costs $0.002 per delivered record from October 15, 2026 (see Pricing).

Is this affiliated with Kalshi? Does it trade?

No and no. It reads Kalshi's public, unauthenticated market-data API. No account, no credentials, no orders — data only.

Use with AI agents (MCP)

Connect your agent to the Apify MCP server (mcp.apify.com) and it can call this actor as a tool: ask for "current KXHIGH brackets in Chicago", "will it rain in Seattle tomorrow on Kalshi" or "settled NYC daily-high markets from the last 30 days" and the agent fills the input schema (cities, seriesType, mode, lookbackDays, dateFrom, maxRecords) itself. Input is forgiving for agents: cities can be a list or one comma-separated string, station codes and series tickers work, common variants like "high"/"rain"/"history" or "true"/"30 days" are understood, and unknown fields are ignored with a warning. Set maxRecords (for example 500) to bound what a call can cost.

Need the running high/low at the settlement station? Pair this with the METAR & NWS Weather Station Observations API, for example {"stationIds": ["KNYC", "KMDW", "KAUS", "KMIA", "KLAX", "KPHL", "KDEN"], "hoursBack": 24}.

More prediction-market data actors

Changelog

2026-10-01

  • Pricing from October 15, 2026: $0.01 per run + $0.002 per market record. The order book and trade history become paid add-ons at $0.002 per delivered record each, billed only when includeOrderbook / includeTrades is on. Your maximum charge per run now accounts for the add-ons, so a run never goes over it.
  • Live temperature runs end with a pointer to the matching Polymarket weather markets.

2026-09-25

  • Kalshi rain markets: new seriesType values KXRAIN (daily rain, 28 cities), KXRAINM (monthly rain totals), rain (both) and all (temperature + rain). Rain records carry settlement_precip_in and the station named in each market's rules. The default both still means temperature highs + lows only.
  • 4 new temperature cities: San Diego (KSAN), Louisville (KSDF), Newark (KEWR), Trenton (KTTN) — 24 in total — plus 7 rain-only cities.
  • New output fields (appended; existing fields unchanged): date, implied_probability, spread, volume_24h, market_url, settlement_precip_in. New Settled results dataset view.
  • New inputs: dateFrom / dateTo (market-date range, any mode) and maxRecords (optional cap on records returned and charged). All three are optional and accept null; maxRecords 0 means no cap.
  • Behaviour changes for inputs that were accepted before: seriesType "all" used to be read as highs + lows and now means temperature + rain (use "both" for temperature only). Alias keys that used to be ignored now apply: limit / max / maxItems cap the records like maxRecords; date / day pick one market date; from / since / start / after and to / until / end / before set dateFrom / dateTo.
  • Settled history: long windows now fetch the older part of the window with one request per series instead of paging through Kalshi's whole 2021+ archive (all-cities 90-day pull: 48 archive requests instead of about 480).
  • station_id now follows the station named in each market's settlement rules (Kalshi has moved some stations mid-series); series Kalshi lists with open markets but no mapping yet are logged.
  • Below-zero winter brackets (for example KXLOWTDEN-26JAN26-T-8) are now recognized: they used to come back with city, station_id and series_ticker null.
  • Settlement FAQ updated: Kalshi's rules resolve on the named station's value as reported by The Weather Company.