NEW: Live arbitrage across 10+ prediction markets.Arbitrage →
← Index
APISep 27, 2026

Kalshi Weather Bot (2026): How to Build One With the API

Kalshi Weather Bot (2026): How to Build One With the API

The Short Answer

A Kalshi weather bot reads Kalshi's temperature markets through the public API, compares each bracket's price with its own forecast of the day's high, and trades only where the gap covers fees and spread. The best-known series is KXHIGHNY, which splits each day's New York high into six markets: four two-degree brackets and two open-ended tails. Daily highs settle on the maximum temperature The Weather Company reports for a named station, CLINYC for New York, so that station is what your forecast has to predict. Predictefy lets you run the finished bot against Kalshi's live order books with paper trading at 0 credits before any real order.

Key Takeaways

  • Kalshi lists 411 Climate and Weather series, including 48 daily-high series across US and international cities.
  • Each KXHIGHNY day is six markets, four two-degree brackets and two tails, and trading closes at 05:00 UTC the next day.
  • Settlement uses The Weather Company's maximum for a named station, not the reading on your phone.
  • Kalshi's weather index serves minute-level temperatures for 13 cities without a key, and it backs the hourly markets.
  • Build the edge from forecasts, then prove it on paper against live books before trading real money.

What are Kalshi's weather markets?

Kalshi groups them under its Climate and Weather category, which held 411 series when this was written. The ones bots care about most are the daily temperature markets: 48 daily-high series, with tickers starting KXHIGH, and 54 daily-low series starting KXLOW. They cover major US cities and a growing list of international ones, from Tokyo and Singapore to Paris, Toronto and São Paulo. There is also an hourly directional series for New York, KXHIGHNYD.

SeriesCitySettlement source
KXHIGHNYNew York CityThe Weather Company
KXHIGHCHIChicagoThe Weather Company
KXHIGHMIAMiamiThe Weather Company
KXHIGHLAXLos AngelesThe Weather Company
KXHIGHAUSAustinThe Weather Company
KXHIGHDENDenverThe Weather Company
KXHIGHPHILPhiladelphiaThe Weather Company
KXHIGHOUHoustonNWS Climatological Report

Check the settlement source for every series you trade, because it is not the same everywhere. Most daily-high series settle on The Weather Company, while a few, such as the Houston series above, settle on a National Weather Service climatological report.

How is a Kalshi temperature market structured?

Each series creates one event per day, and each event splits the day's high into mutually exclusive markets. For New York on 27 September 2026, the event KXHIGHNY-26SEP27 held six markets:

Market tickerPays if the high isstrike_type
KXHIGHNY-26SEP27-T7273° or abovegreater, floor 72
KXHIGHNY-26SEP27-B71.571° to 72°between, floor 71, cap 72
KXHIGHNY-26SEP27-B69.569° to 70°between, floor 69, cap 70
KXHIGHNY-26SEP27-B67.567° to 68°between, floor 67, cap 68
KXHIGHNY-26SEP27-B65.565° to 66°between, floor 65, cap 66
KXHIGHNY-26SEP27-T6564° or belowless, cap 65

Exactly one of the six pays out. The market rules resolve on the maximum temperature recorded at New York City's CLINYC station for that date, according to The Weather Company, and trading closes at 05:00 UTC the following day. Kalshi's rules also warn that preliminary readings can differ from the final value through rounding and conversion, so the number that counts is the final one.

How do you pull Kalshi's weather markets from the API?

Market data needs no account. Kalshi's own market-data quickstart uses this exact series:

import requests

BASE = "https://external-api.kalshi.com/trade-api/v2"

resp = requests.get(f"{BASE}/markets", params={"series_ticker": "KXHIGHNY", "status": "open"})
markets = resp.json()["markets"]
for m in markets:
    print(m["ticker"], m["strike_type"], m.get("floor_strike"), m.get("cap_strike"),
          m["yes_bid_dollars"], m["yes_ask_dollars"])

Prices arrive as dollar strings such as "0.2400", so convert them before doing arithmetic. strike_type, floor_strike and cap_strike define each bracket, which is everything the pricing step below needs. If the external-api host answers 403 from your network, Kalshi's shared api.elections.kalshi.com host serves the same public data. Full series metadata, including settlement sources, comes from GET /series/KXHIGHNY.

Where does the temperature signal come from?

Two free sources cover most bots: a forecast for the day, and a live reading as the day unfolds.

The forecast. The US National Weather Service publishes free forecasts through api.weather.gov. A point lookup resolves coordinates to a forecast grid, and the hourly forecast gives you the day's expected high:

headers = {"User-Agent": "my-weather-bot (you@example.com)"}

point = requests.get("https://api.weather.gov/points/40.7829,-73.9654", headers=headers).json()
hourly = requests.get(point["properties"]["forecastHourly"], headers=headers).json()

day = "2026-09-27"
temps = [p["temperature"] for p in hourly["properties"]["periods"] if p["startTime"][:10] == day]
forecast_high = max(temps)

The coordinates are Central Park, which resolves to the OKX forecast grid. The API asks every client to identify itself with a User-Agent header. Period start times carry the local offset, so slicing the date keeps the calculation on New York's calendar day.

The live reading. Kalshi publishes its own minute-level temperature index, free and without a key, for 13 cities: nyc, chicago, miami, dfw, houston, la-coastal, sf-bay, puget-sound, greater-boston, phl-delaware-valley, southeast-michigan, kansas-city and minneapolis-st-paul.

idx = requests.get(f"{BASE}/live_data/weather/nyc", params={"last_sec": 3600}).json()
latest = idx["timeseries"][-1]
print(latest["v"], latest["status"], latest["contributors"])

Each point is a Fahrenheit value rounded to 0.01, a status of normal or degraded, and the number of contributing stations. Minutes without a valid reading are simply missing, so gaps are real gaps. This index is the canonical series behind Kalshi's hourly temperature markets. Daily highs settle on The Weather Company's reported maximum instead, so treat the index as a live view of the day rather than the settlement number. Station weights and offsets are published at /live_data/weather/{city}/calibrations.

How do you turn a forecast into bracket prices?

Treat the forecast as a distribution rather than a number. With a forecast high and an estimate of its error, the chance of each bracket follows from the normal distribution, using half-degree edges because the brackets are defined in whole degrees:

from math import erf, sqrt

def p_below(x, mean, sd):
    return 0.5 * (1 + erf((x - mean) / (sd * sqrt(2))))

def bracket_probability(m, mean, sd):
    lo, hi = m.get("floor_strike"), m.get("cap_strike")
    if m["strike_type"] == "greater":   # e.g. 73 degrees or above
        return 1 - p_below(lo + 0.5, mean, sd)
    if m["strike_type"] == "less":      # e.g. 64 degrees or below
        return p_below(hi - 0.5, mean, sd)
    return p_below(hi + 0.5, mean, sd) - p_below(lo - 0.5, mean, sd)

for m in markets:
    fair = bracket_probability(m, mean=forecast_high, sd=2.0)
    ask = float(m["yes_ask_dollars"])
    if fair - ask > 0.05:   # leave room for fees and model error
        print("candidate", m["ticker"], round(fair, 2), ask)

The standard deviation of 2.0 degrees is a placeholder. Estimate your own from how far past forecasts landed from the settled highs, because that single number drives every probability. The 5-cent threshold is deliberately generous: Kalshi's fees are largest near 50 cents, as Kalshi fees explained breaks down, and a model that is confidently wrong loses money quickly.

How do you test a Kalshi weather bot before risking money?

In two passes. First backtest the pricing logic against settled days, using Kalshi's market history, covered in Kalshi historical data. Then run the whole loop live without real orders.

For the live pass, Predictefy's paper trading fills simulated orders against Kalshi's real order book from a simulated USD balance. It costs 0 credits and is included on every plan, including Free:

import uuid
from predictefy import Predictefy

client = Predictefy(api_key="pk_live_YOUR_KEY")

order = client.place_paper_order(
    "kalshi", "MARKET_ID", "OUTCOME_ID", "buy", 0.24, 20,
    tif="GTC",
    idempotency_key=str(uuid.uuid4()),
)
positions = client.paper_positions()

Fills walk the real displayed depth, so a thin bracket shows you honestly how little size is there. When the paper results hold up, the same parameters go to live trading. The full comparison with Kalshi's demo exchange is in Kalshi paper trading.

What trips up Kalshi weather bots?

  • The wrong thermometer. Markets settle on the named station's value from the named source. Kalshi's rules say other weather sources may guide you but are not the official value.
  • Preliminary numbers. Early readings can shift through rounding and conversion before the final value is published.
  • Thin tails. Tail markets often show no bid and a 1-cent ask. A price there says little about real liquidity.
  • The clock. Trading runs until 05:00 UTC the next day, and a late-evening front can still move the high. Decide in advance when your bot stops trading a day.
  • Degraded data. When the index reports degraded or goes quiet, pause rather than trade on a stale view.

For order placement itself, the V2 order methods are covered in the Kalshi SDK guide, and a full bot structure in how to build a Kalshi trading bot.

Frequently Asked Questions

How do Kalshi temperature markets settle?

Each daily-high market resolves on the maximum temperature reported for a named station by the series' settlement source. For New York's KXHIGHNY that is The Weather Company's value for the CLINYC station. A few series, such as one Houston series, settle on a National Weather Service climatological report instead, so check each one.

Does Kalshi have a weather API?

Yes. Beyond the market data endpoints, Kalshi publishes a weather index at GET /live_data/weather/{city}, a minute-level temperature series for 13 cities that needs no API key. It backs the hourly temperature markets. Daily-high markets settle on the named source's reported maximum, so treat the index as a live reading.

Which cities have Kalshi temperature markets?

Kalshi runs 48 daily-high series, covering US cities such as New York, Chicago, Miami, Los Angeles, Austin, Denver, Philadelphia and Houston, plus international cities including Tokyo, Singapore, Paris, Toronto and São Paulo. Another 54 series track daily lows, and New York also has an hourly directional temperature series.

What does KXHIGHNY mean on Kalshi?

KXHIGHNY is the series ticker for the highest temperature in New York City. Each day gets an event such as KXHIGHNY-26SEP27, holding six markets: four two-degree brackets and two open-ended tails. Market tickers end in T for a tail or B for a bracket, followed by the strike.

Can you test a Kalshi weather bot without real money?

Yes. Predictefy's paper trading fills simulated orders against Kalshi's live order books from a simulated USD balance, at 0 credits on every plan, so a weather strategy meets real prices and depth. Kalshi's demo exchange is useful for testing authentication and order flow, but its prices may not match real markets.