Kalshi Weather Markets API - Temperature Odds & NWS Forecast
Pricing
from $2.19 / 1,000 market returneds
Kalshi Weather Markets API - Temperature Odds & NWS Forecast
For weather traders and forecast models: Kalshi temperature, rain and snow markets as rows with bid, ask, volume, open interest and strike range; daily markets add the NWS forecast for the station in the market's rules. All 143 weather series (2026-09-21). Settled history and price-move monitor.
Pricing
from $2.19 / 1,000 market returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get every Kalshi weather market (daily high and low temperature, rain, snow) as one clean row per market: yes/no bid and ask, last price, volume, open interest, close time and the strike range ("70° to 71°"). Each daily market also carries the National Weather Service forecast for the weather station named in its rules (for example CLINYC = New York City, Central Park), and a flag saying whether that forecast falls inside the market's Yes range. Settled history with the official settled value, automatic discovery of all weather series, and a monitoring mode that returns only markets whose price or volume moved.
It reads Kalshi's official public market-data API (api.elections.kalshi.com/trade-api/v2) and the NWS API (api.weather.gov). No login, no API key, no proxy.
Why this Actor
- Reads Kalshi's current field names. Kalshi now sends prices as
yes_bid_dollars("0.4900") and quantities asvolume_fp("4039.48"); the old integer fields such asyes_bidare no longer in the response (checked 2026-09-21). This Actor reads both the new and the old names, and returnsnull(never 0) when a value is missing, so a format change does not silently turn prices into zeros. - Forecast next to the odds. For each daily temperature, rain and snow market, the settlement station is taken from the market's own rules, and the NWS forecast high, low and precipitation chance for the market's date is added to the same row:
nwsForecastForThisMarketFandnwsForecastInYesRangelet you compare the crowd price with the forecast without a second data source. - Honest empty results. A series Kalshi does not have, a series with no open market, a refusal, a rate limit and a cut-off page each come back as a separate free row that says what happened. Kalshi answers an unknown or lowercase series with an empty list (HTTP 200), so the Actor checks the series itself before saying "no markets".
Input
| Field | Type | Default | What it does |
|---|---|---|---|
series | list | (prefilled: KXHIGHNY, KXLOWTNYC, KXHIGHCHI) | Kalshi series tickers, one per line. Lowercase is accepted. Left out (with discovery and monitoring off), the three example series are read. |
discoverSeries | boolean | false | Also read every Kalshi "Climate and Weather" series of the types below: daily high and low temperature series, and daily, weekly or monthly rain and snow series (143 series on 2026-09-21; most have no open market at a given time, which costs nothing). |
weatherTypes | list | all | Used with discoverSeries: high, low, rain, snow. |
marketStatus | select | open | open (tradable now; Kalshi reports them as active), settled (with result and settlementValue), closed (trading ended, not settled yet) or all. |
closedWithinDays | integer | (none) | For settled, closed and all: only markets whose close time is within the last N days. Ignored for open. Required in monitoring mode with settled, closed or all. |
includeForecast | boolean | true | Attach the NWS forecast of the settlement station to daily temperature, rain and snow markets. No extra charge. |
maxResults | integer | 1000 | Stop after this many market rows (monitoring off). A free row says what was left out. |
monitoringMode | boolean | false | Return only markets whose yes bid, yes ask, last price, volume, open interest, status or result changed since the last run, plus newly opened markets. |
resetMonitoringState | boolean | false | Forget what monitoring remembered, so the next monitoring run returns everything again. Turn it off after one run. |
Examples:
{ "series": ["KXHIGHNY", "KXLOWTNYC"] }
{ "discoverSeries": true, "weatherTypes": ["high", "low"] }
{ "series": ["KXHIGHNY"], "marketStatus": "settled", "closedWithinDays": 30 }
Daily temperature series and their settlement stations
Read from the market rules on 2026-09-21 (station names from the NWS station list). Kalshi adds and retires series; discoverSeries always uses the live list.
| City | Daily high | Daily low | Station in the rules | NWS station |
|---|---|---|---|---|
| New York City | KXHIGHNY | KXLOWTNYC | CLINYC | KNYC Central Park |
| Chicago | KXHIGHCHI | KXLOWTCHI | CLIMDW | KMDW Midway (not O'Hare) |
| Los Angeles | KXHIGHLAX | KXLOWTLAX | CLILAX | KLAX |
| Miami | KXHIGHMIA | KXLOWTMIA | CLIMIA | KMIA |
| Austin | KXHIGHAUS | KXLOWTAUS | CLIAUS | KAUS |
| Denver | KXHIGHDEN | KXLOWTDEN | CLIDEN | KDEN |
| Philadelphia | KXHIGHPHIL | KXLOWTPHIL | CLIPHL | KPHL |
| Houston | KXHIGHTHOU | KXLOWTHOU | CLIHOU | KHOU Hobby (not Bush/IAH) |
| Dallas | KXHIGHTDAL | KXLOWTDAL | CLIDFW | KDFW |
| Phoenix | KXHIGHTPHX | KXLOWTPHX | CLIPHX | KPHX |
| Las Vegas | KXHIGHTLV | KXLOWTLV | CLILAS | KLAS |
| Seattle | KXHIGHTSEA | KXLOWTSEA | CLISEA | KSEA |
| San Francisco | KXHIGHTSFO | KXLOWTSFO | CLISFO | KSFO |
| San Diego | KXHIGHTSAN | KXLOWTSAN | CLISAN | KSAN |
| San Antonio | KXHIGHTSATX | KXLOWTSATX | CLISAT | KSAT |
| Boston | KXHIGHTBOS | KXLOWTBOS | CLIBOS | KBOS |
| Washington DC | KXHIGHTDC | KXLOWTDC | CLIDCA | KDCA Reagan National |
| Atlanta | KXHIGHTATL | KXLOWTATL | CLIATL | KATL |
| Minneapolis | KXHIGHTMIN | KXLOWTMIN | CLIMSP | KMSP |
| New Orleans | KXHIGHTNOLA | KXLOWTNOLA | CLIMSY | KMSY |
| Oklahoma City | KXHIGHTOKC | KXLOWTOKC | CLIOKC | KOKC |
| Louisville | KXHIGHTSDF | KXLOWTSDF | CLISDF | KSDF |
| Newark | KXHIGHTEWR | KXLOWTEWR | CLIEWR | KEWR |
| Trenton | KXHIGHTTTN | KXLOWTTTN | CLITTN | KTTN |
Rain: KXRAIN (daily, one market per city, each with its own station) and monthly series such as KXRAINNYCM, KXRAINCHIM, KXRAINDENM.
Output
One row per market. Example (KXHIGHNY, read 2026-09-21):
{"seriesTicker": "KXHIGHNY","seriesTitle": "Highest temperature in NYC","marketKind": "high","eventTicker": "KXHIGHNY-26SEP21","marketTicker": "KXHIGHNY-26SEP21-B70.5","yesLabel": "70° to 71°","strikeType": "between","floorStrike": 70,"capStrike": 71,"targetDate": "2026-09-21","marketStatus": "active","yesBid": 0.5,"yesAsk": 0.51,"noBid": 0.49,"noAsk": 0.5,"yesMid": 0.505,"spread": 0.01,"lastPrice": 0.49,"volume": 4039.53,"openInterest": 3317.18,"closeTime": "2026-09-22T05:00:00Z","settlementStationCode": "CLINYC","nwsStationId": "KNYC","nwsStationName": "New York City, Central Park","settlementSource": "The Weather Company","nwsForecastHighF": 70,"nwsForecastHighPeriod": "Monday","nwsForecastLowF": 59,"nwsForecastLowPeriod": "Overnight","nwsPrecipChanceDayPct": 7,"nwsForecastForThisMarketF": 70,"nwsForecastInYesRange": true}
| Column | Meaning |
|---|---|
yesBid, yesAsk, noBid, noAsk, lastPrice, previousPrice | USD per contract (a contract pays $1.00). 0 means Kalshi reports no resting bid at any price; null means the field was not in the response. |
yesMid, spread | Calculated from yes bid and ask, only when both sides have resting orders and the market is not settled; otherwise null. When nobody is selling, Kalshi reports the yes ask as 1.00 with size 0 (and the yes bid as 0 with size 0 when nobody is buying), so check yesAskSize / yesBidSize before reading those prices as quotes. |
volume, volume24h, openInterest, yesBidSize, yesAskSize | Contracts. Kalshi allows fractional contracts, so these can have decimals. |
strikeType, floorStrike, capStrike, yesLabel | greater = above floorStrike (floor 73 is "74° or above"); less = below capStrike (cap 66 is "65° or below"); between = from floorStrike to capStrike, both included ("72° to 73°"). |
targetDate | The date in the market's event ticker (-26SEP21 = 2026-09-21). For weekly markets this is the first day of the week the market covers; for monthly markets (-26SEP) it is null. Forecasts are attached only to daily markets. |
result, settlementValue, settledAt | For settled markets: yes/no, the settled value (for example 69 = official high of 69°F) and when it settled. |
settlementStationCode, nwsStationId | The station named in the market rules (CLINYC) and its NWS station id (KNYC). |
settlementSource | The source Kalshi names for settlement in the series (on 2026-09-21: "The Weather Company"). The NWS forecast is a forecast for that station, not the settlement value. |
nwsForecastHighF | NWS forecast high: the daytime period (6 am to 6 pm local) of the market date. |
nwsForecastLowF | NWS forecast low: the night that ends on the morning of the market date (6 pm the day before to 6 am; after midnight NWS calls the rest of it "Overnight"). |
nwsPrecipChanceDayPct, nwsPrecipChanceNightPct | Precipitation chance of the daytime period and of the night that starts on the evening of the market date. |
nwsForecastForThisMarketF, nwsForecastInYesRange | The forecast high for high markets or the forecast low for low markets, and whether it falls inside the Yes range. null for other markets. |
nwsForecastNote | Why a forecast column is null: past date, beyond the NWS forecast (about 7 days), a period that has already passed, a market with no station in its rules (hourly markets settle on Synoptic Data), a station outside the US, or includeForecast off. |
monitorStatus, changedFields | Monitoring mode only: first-check, changed (with the columns that changed) or new-market. |
Rows whose status is not ok are free and explain themselves in note: unknown-series, no-markets, duplicate, blocked, unreadable, refused, incomplete, not-checked, budget-reached, no-change-since-last-run, invalid-input.
Pricing
- $3.00 per 1,000 market rows returned.
- Monitoring mode adds $0.30 per 1,000 series checks: each series whose markets are read costs one check, whether or not anything changed. Unknown series, series with no market and failed requests are not charged.
- The NWS forecast columns cost nothing extra. Free rows (the ones that explain why something was not returned) cost nothing.
- The run stops before it would go over the maximum total charge you set, and a free row says what was left out.
Monitoring mode
Turn on monitoringMode and run the Actor on a schedule (for example every 10 minutes during the trading day). The first run returns every market once as a baseline. Later runs return only markets whose yes bid, yes ask, last price, volume, open interest, status or result changed, plus markets that opened since, with changedFields naming what moved. A run with no change returns one free no-change-since-last-run row. Markets are remembered per series in a named key-value store; markets you did not receive because the maximum total charge was reached are not remembered, so the next run returns them if they still differ. Do not put the same series in two schedules that can run at the same time (Apify's key-value store has no atomic update).
Notes and limits
- Kalshi's public API is read at about 6 requests per second; a rate limit (HTTP 429) is waited out and retried, and reported as a free
blockedrow if it persists. - NWS covers the United States only. Series settled at stations outside the US (for example Tokyo or Paris) get
nullforecasts with the reason. - This Actor returns market data and forecasts. It does not place orders and is not trading advice.