Kalshi Weather Markets API — Temperature & Rain Odds
Pricing
from $1.00 / 1,000 market records
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
Maintained by CommunityActor stats
0
Bookmarked
275
Total users
54
Monthly active users
72 days
Issues response
12 days ago
Last modified
Categories
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):
| Field | Example | Notes |
|---|---|---|
ticker | KXHIGHCHI-26SEP21-B65.5 | Kalshi market ticker |
event_ticker | KXHIGHCHI-26SEP21 | groups all brackets of one city-day (for KXRAIN: all cities of one day) |
city | Chicago | canonical city name |
station_id | KMDW | ICAO code of the station named in the market's settlement rules |
series_ticker | KXHIGHCHI | |
series_type | KXHIGH | KXHIGH, KXLOW, KXRAIN (daily rain) or KXRAINM (monthly rain) |
bracket_label | 65° 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_type | between | greater, less, or between |
floor_strike | 65 | lower bound (°F, or inches for rain; null for "or below" brackets) |
cap_strike | 66 | upper bound (null for "or above" brackets) |
status | finalized | active (live) or finalized (settled) |
result | yes | yes / no / null while live |
settlement_temp_f | 65.0 | official settled temperature (settled temperature markets only; null where Kalshi's archive left it blank, see FAQ) |
settlement_time | 2026-09-22T12:09:38Z | |
open_time | 2026-09-20T14:00:00Z | ISO timestamp |
close_time | 2026-09-22T06:00:00Z | ISO timestamp (UTC, so usually the day after date) |
yes_bid | 0.0 | USD per contract, 0.00–1.00 |
yes_ask | 1.0 | USD per contract, 0.00–1.00 |
last_price | 0.99 | USD per contract, 0.00–1.00 |
volume | 14489.68 | contracts (fractional trading enabled) |
open_interest | 9582.84 | contracts (fractional trading enabled) |
liquidity | 0.0 | USD value of resting orders |
date | 2026-09-21 | the day the high, low or rain is measured (YYYY-MM for monthly rain) — join key with station_id |
implied_probability | 0.99 | yes 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) |
spread | null | yes 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_24h | 0.0 | contracts traded in the last 24 hours |
market_url | https://kalshi.com/markets/kxhighchi/kxhighchi-26sep21 | the event's page on kalshi.com |
settlement_precip_in | null | official settled rainfall in inches (settled rain markets only) |
trades | array | only with includeTrades — up to 1,000 recent fills |
orderbook | object | only with includeOrderbook — bid levels, see below |
Optional keys: the
tradesandorderbookkeys exist in a record only when the corresponding flag is enabled — with the flag off the key is omitted entirely (notnull), so read them with.get()rather than direct indexing. With the flag on, a per-market fetch failure leaves the key present with valuenull. When present they come straight afterliquidity, 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:
orderbookis{"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:pricein USD per contract,sizein (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 (KMDWorMDW), 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 yourseriesType, 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), orall(temperature + rain).mode—live(currently tradeable markets with current prices),settled(finalized markets with results and settled values), orboth.lookbackDays— 1–365, settled-history window (only used insettled/bothmode). 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 agoalso work, relative words counted in US Eastern time, Kalshi's market day). Filters every mode; in settled modedateFromreplaceslookbackDaysand can reach back to 2021, anddateToalone giveslookbackDaysmarket dates ending on that date. AdateTopast 2100 (such as9999-12-31) means no end date; empty ornullmeans no bound.maxRecords— optional cap on records returned and charged (empty,nullor0= 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.
| Run | Input | Records | Cost |
|---|---|---|---|
| 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 |
| Capped | add "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)
| City | Aliases | KXHIGH series | KXLOW series | Settlement station |
|---|---|---|---|---|
| NYC | New York, NY | KXHIGHNY | KXLOWTNYC | KNYC (Central Park) |
| Chicago | — | KXHIGHCHI | KXLOWTCHI | KMDW (Midway, not O'Hare) |
| Miami | — | KXHIGHMIA | KXLOWTMIA | KMIA |
| Austin | — | KXHIGHAUS | KXLOWTAUS | KAUS |
| Los Angeles | LA | KXHIGHLAX | KXLOWTLAX | KLAX |
| Denver | — | KXHIGHDEN | KXLOWTDEN | KDEN |
| Phoenix | — | KXHIGHTPHX | KXLOWTPHX | KPHX |
| Philadelphia | Philly | KXHIGHPHIL | KXLOWTPHIL | KPHL |
| Houston | — | KXHIGHTHOU | KXLOWTHOU | KHOU (Hobby, not Bush/IAH) |
| Minneapolis | Min | KXHIGHTMIN | KXLOWTMIN | KMSP |
| Oklahoma City | OKC | KXHIGHTOKC | KXLOWTOKC | KOKC |
| San Francisco | SF | KXHIGHTSFO | KXLOWTSFO | KSFO |
| Washington DC | DC | KXHIGHTDC | KXLOWTDC | KDCA |
| Boston | — | KXHIGHTBOS | KXLOWTBOS | KBOS |
| Dallas | DFW | KXHIGHTDAL | KXLOWTDAL | KDFW (not Love Field) |
| Seattle | — | KXHIGHTSEA | KXLOWTSEA | KSEA |
| Las Vegas | LV, Vegas | KXHIGHTLV | KXLOWTLV | KLAS |
| Atlanta | — | KXHIGHTATL | KXLOWTATL | KATL |
| San Antonio | SATX | KXHIGHTSATX | KXLOWTSATX | KSAT |
| New Orleans | NOLA | KXHIGHTNOLA | KXLOWTNOLA | KMSY |
| San Diego | SD | KXHIGHTSAN | KXLOWTSAN | KSAN |
| Louisville | SDF | KXHIGHTSDF | KXLOWTSDF | KSDF |
| Newark | EWR | KXHIGHTEWR | KXLOWTEWR | KEWR |
| Trenton | TTN | KXHIGHTTTN | KXLOWTTTN | KTTN |
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_labelisAbove 0 inches; settled records carrysettlement_precip_in. - Monthly rain (KXRAIN…M) — one market per inch threshold for the month's total ("Above 7 inches");
dateis 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.
| City | Daily rain station | Monthly rain series |
|---|---|---|
| NYC | KNYC (Central Park) | KXRAINNYCM |
| Chicago | KORD (O'Hare) | KXRAINCHIM |
| Miami | KMIA | KXRAINMIAM |
| Austin | KAUS | KXRAINAUSM |
| Los Angeles | KLAX | KXRAINLAXM |
| Denver | KDEN | KXRAINDENM |
| Houston | KHOU (Hobby; KIAH before 2026-08-14) | KXRAINHOUM |
| San Francisco | KSFO | KXRAINSFOM |
| Dallas | KDFW | KXRAINDALM |
| Seattle | KSEA | KXRAINSEAM |
| Phoenix, Philadelphia, Minneapolis, Oklahoma City, Washington DC, Boston, Las Vegas, Atlanta, San Antonio, New Orleans, Newark, Trenton | same station as temperature (table above) | — |
| Pittsburgh, Providence, Milwaukee, Lexington, Columbus, College Station (rain only) | KPIT, KPVD, KMKE, KLEX, KCMH, KCLL | Providence, 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_idanddate.
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
- METAR & NWS Weather Station Observations API - the raw station observations these markets settle on.
- Prediction Market Resolution Evidence Checker - paste a market URL, get the live observation that resolves it, graded.
- Polymarket Weather Markets API - Polymarket's daily temperature markets for 51 cities, with odds and the resolution station: compare the same city's highs across both venues.
- Polymarket Weather Resolution Checker - which Polymarket temperature brackets are already locked YES or NO today, from the running high/low at each resolution station.
- US Economic Calendar API - official release dates for CPI, jobs, GDP and FOMC, the events Kalshi's economics markets settle on.
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/includeTradesis 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
seriesTypevaluesKXRAIN(daily rain, 28 cities),KXRAINM(monthly rain totals),rain(both) andall(temperature + rain). Rain records carrysettlement_precip_inand the station named in each market's rules. The defaultbothstill 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) andmaxRecords(optional cap on records returned and charged). All three are optional and acceptnull;maxRecords0 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/maxItemscap the records likemaxRecords;date/daypick one market date;from/since/start/afterandto/until/end/beforesetdateFrom/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_idnow 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 withcity,station_idandseries_tickernull. - Settlement FAQ updated: Kalshi's rules resolve on the named station's value as reported by The Weather Company.