Kalshi Weather Index, Station Obs & Settlement Audit avatar

Kalshi Weather Index, Station Obs & Settlement Audit

Pricing

from $0.03 / 1,000 index points

Go to Apify Store
Kalshi Weather Index, Station Obs & Settlement Audit

Kalshi Weather Index, Station Obs & Settlement Audit

Kalshi's minute temperature index for 13 cities, plus station observations (NWS, METAR), the NWS Daily Climate Report and a settlement-audit row per city-day for KXHIGH/KXLOW temperature markets. Public APIs, no login. Pay per row.

Pricing

from $0.03 / 1,000 index points

Rating

0.0

(0)

Developer

Tit Slobodjanac

Tit Slobodjanac

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

19 days ago

Last modified

Share

Kalshi Weather Index — station observations, NWS Daily Climate Report, METAR, settlement audit for Kalshi temperature markets

Everything a Kalshi temperature trader pulls by hand, in one dataset: Kalshi's own minute-by-minute temperature index for 13 metro areas, the station observations for the exact station each KXHIGH/KXLOW market names (NWS api.weather.gov and METAR), the NWS Daily Climate Report (CLI) parsed to max / min / precipitation, and a settlement audit row per city-day that puts the index high, the CLI max, the METAR max and the settled Kalshi bracket side by side with an agree/disagree flag.

Public endpoints only. No Kalshi account, no API key, no scraping. Runs cost cents.

Four modes

modeWhat you getRow
index (default)Kalshi's minute temperature index, the series behind its hourly KXTEMP markets. From 2026-09-10 Kalshi marks backfilled points with receipt_basis; rows carry it as receiptBasis and settlementEligible: false (compact rows: b on the minute).one per minute per city
stationsNWS and METAR observations for the market's station (or any ICAO station via stations) (time, °F/°C, dewpoint, wind, raw report), plus one daily row per city-day with NWS obs max/min, METAR max/min, the METAR 24-hour max/min group, and the Daily Climate Report max/min/precip with the raw report textobservations + one daily row
auditOne row per city-day: index high/low, CLI max/min/precip, METAR max/min, the settled KXHIGH* and KXLOW* bracket and value, highAgree/lowAgree/agree flags and the differences in °Fone per city-day
calibrationsThe station configuration Kalshi publishes behind each city's index: station ids (e.g. KLGA1M), weights, °C offsets, the city reference, effective and published dates and the change reason, one row per city per config version (Kalshi endpoint added 2026-08-31).one per city per version

Which source settles what (read this before trading on it)

  • Daily high/low temperature markets (KXHIGH*, KXLOW*) settle on The Weather Company (weather.com/kalshi) since 2026-08-27; the market rules name the station by its NWS climate-report code, e.g. "Chicago (CLIMDW)", "New York City (CLINYC)". The NWS Daily Climate Report for that station is the public cross-check, not the settlement source. In the days we checked it matched the settled value to the degree every time, but treat audit as an audit and forecast-input tool, not settlement truth.
  • Monthly rain markets (KXRAIN…M) settle on the NWS Daily Climate Report — cliPrecipIn is the number that counts there.
  • Hourly temperature markets (KXTEMP*) use Kalshi's minute index (index mode). The daily high market and the hourly market can show different numbers for the same station on the same day; the audit row shows both.

Cities and stations

Index cities (all modes): nyc KNYC Central Park · chicago KMDW Midway · miami KMIA · dfw KDFW · houston KHOU Hobby · phl-delaware-valley KPHL · puget-sound KSEA · sf-bay KSFO · greater-boston KBOS · southeast-michigan KDTW (no market) · kansas-city KMCI (no market) · minneapolis-st-paul KMSP · la-coastal KLAX.

Any other station in the world: stations: ["ZBAA", "EGLL", "RJTT"] adds METAR stations by ICAO code (the ones Polymarket's global temperature markets resolve on). They get observations, daily max/min and the 24-hour group; cliLocation, Kalshi and index columns stay null; local days follow stationTimezone or the station's solar offset.

Market-only cities (stations and audit; index columns stay null): austin KAUS · denver KDEN · atlanta KATL · washington-dc KDCA · newark KEWR · las-vegas KLAS · new-orleans KMSY · oklahoma-city KOKC · phoenix KPHX · san-diego KSAN · san-antonio KSAT · louisville KSDF · trenton KTTN.

Every mapping was taken from the market rules text of the live series and checked against the station named in the report header (the Houston market, for instance, uses Hobby CLIHOU, not Intercontinental). Leave cities empty for all.

Input

{ "mode": "audit", "cities": ["nyc", "chicago"], "lastDays": 7, "maxItems": 200 }
FieldModesWhat it does
modeallindex, stations or audit.
citiesallCity IDs above. Empty = all (index mode: the original ten).
lastDaysstations, auditComplete local days ending yesterday, 1–30.
from / tostations, auditExplicit dates (YYYY-MM-DD); to may be today (the CLI is then the afternoon preliminary report, flagged cliPreliminary).
sourcesstationsnws, metar or both (default) for the observation rows.
lastHours, from/to, detailed, compact, alignToHour, archiveDatasetName, archiveOnlyindexUnchanged from 0.1; see the index section below.
maxItemsallCost cap: points in index mode, rows otherwise.

Data retention upstream: Daily Climate Reports about 7 days, METAR 30 days, the Kalshi index about 7–10 days. Older days get null in those columns and are still one row.

Output

Audit row (mode: audit), New York, 5 September 2026:

{
"type": "audit", "city": "nyc", "date": "2026-09-05", "station": "KNYC", "cliLocation": "CLINYC", "timezone": "America/New_York",
"indexHighF": 79.7, "indexHighTime": "2026-09-05T18:23:00.000Z", "indexLowF": 67.71, "indexPoints": 1441,
"cliMaxF": 79, "cliMaxTimeLocal": "2:33 PM", "cliMinF": 68, "cliPrecipIn": 0, "cliPreliminary": false,
"cliProductUrl": "https://api.weather.gov/products/84665814-3b95-47e7-b79b-fbe720b0310a",
"metarMaxF": 77, "metarMinF": 69.08, "day24hMaxF": 78.98, "day24hMinF": 68,
"highSeries": "KXHIGHNY", "highEvent": "KXHIGHNY-26SEP05", "highMarketStatus": "finalized",
"highSettledF": 79, "highBracket": "79° to 80°", "highBracketTicker": "KXHIGHNY-26SEP05-B79.5",
"highAgree": true, "highDiffF": 0, "highBracketContainsCli": true,
"lowSeries": "KXLOWTNYC", "lowSettledF": 68, "lowBracket": "68° to 69°", "lowAgree": true, "lowDiffF": 0,
"agree": true, "indexVsCliHighDiffF": 0.7, "metarVsCliMaxDiffF": -2,
"settlementSource": "The Weather Company (weather.com/kalshi); NWS CLI is the cross-check", "warnings": []
}

highDiffF = CLI max − settled value; highAgree is true when they are the same degree; highBracketContainsCli tells you whether the winning bracket contains the CLI max. agree is the AND of the flags that could be computed. Markets not yet settled give highMarketStatus: "active" and null settled fields. metarMaxF is the highest hourly/special report temperature and is normally a degree or two under the CLI max, which comes from continuous sensor data; day24hMaxF is the station's own 24-hour maximum from the METAR 4sTTTsTTT remark group and is the closest station-side number to the CLI.

Stations rows (mode: stations): observation rows with type: "observation", source: "nws" | "metar", time, timeLocal, temperatureF, temperatureC, dewpointF, windDirectionDeg, windSpeedKt, windGustKt, raw; then one type: "daily" row per city-day with nwsMaxF/nwsMinF, metarMaxF/metarMinF, day24hMaxF/day24hMinF, cliMaxF/cliMinF/cliPrecipIn, cliPreliminary, cliProductUrl and cliRawText (the full report, so you can check the parse).

Index rows (mode: index), unchanged:

{ "city": "miami", "time": "2026-09-03T10:56:00.000Z", "timestampMs": 1788432960000, "temperatureF": 79.52, "temperatureC": 26.4,
"status": "normal", "contributors": 5, "configVersion": "miami-temperature-v1.0-cal-20260831", "units": "fahrenheit", "fetchedAt": "2026-09-03T11:56:26.995Z" }

status is normal, degraded or incomplete. Minutes where the station quorum failed are absent from Kalshi's series and therefore absent here. compact: true gives one row per city per hour with the minutes inside; archiveDatasetName appends to a named dataset in your account so an hourly schedule builds the history Kalshi only serves as a window.

What people use it for

  • Pricing daily-high bins from live station data: stations mode every hour with to set to today gives the NWS/METAR readings so far plus the preliminary afternoon climate report.
  • Checking a settlement: audit for the city and day; if highAgree is false, the row has the CLI report link, the METAR maximum and the winning bracket ticker to argue with.
  • Backtesting hourly strategies against the exact index that settles them, and daily strategies against the CLI/settled pairs.
  • Monthly rain markets: cliPrecipIn per day, per station, from the source those markets settle on.

Pairs with Prediction Markets Scraper for the market prices themselves (kalshiSeriesTickers: ["KXTEMP*", "KXHIGH*", "KXLOW*"]).

Free public archive (CC BY 4.0)

Kalshi only serves the last 7–10 days of its index. Since 2026-09-03 an hourly schedule appends every completed city-hour of the ten original cities to a public dataset you can download without an account:

  • JSON: https://api.apify.com/v2/datasets/sBYy8Bm1pgdPsfvRd/items?format=json&clean=true
  • CSV: https://api.apify.com/v2/datasets/sBYy8Bm1pgdPsfvRd/items?format=csv&clean=true
  • Newest first, one page: add &desc=1&limit=1000&offset=0

One row per city-hour (city, hour, minutes[{m, v, s, c}], minF, maxF, points, configVersion), one row only, complete hours only (60 points unless Kalshi had a gap). Licence: CC BY 4.0, attribution "Kalshi weather index archive, gratified_ashram on Apify". The underlying numbers are Kalshi's published index. (The first dataset, KY2KhrpIY23EwWdg6, stays readable but mixes 540 per-minute rows from the first day with duplicated boundary rows; use this one.)

Pricing

$0.05 per 1,000 index points (index mode), $0.50 per 1,000 station rows (stations mode: one NWS or METAR observation, or one parsed Daily Climate Report) and $2.00 per 1,000 audit rows (audit mode: one city-day, built from four API calls). Platform usage included. Rows are charged after they are written; a run that returns nothing costs nothing and says why in the log.


Found it useful? A review on the Actor page helps other people find it. Missing a city or a field? Open an issue.