On-request weather markets are not live yet. They will be released soon, and this page describes how they will work at launch.
Flow
- Check what can be created with Get Weather Point Market Availability.
- Call Create Weather Point Market with the location, window and threshold. It returns the
market_ticker, creating the market if it doesn’t exist yet. - Send an RFQ for that ticker with
POST /communications/rfqs. - Makers quote, you accept one side, and the maker confirms. This part is the same as for any other RFQ.
- The market closes when its window ends. Settlement is expected about two hours later.
rfq_created on the communications WebSocket channel with the market’s ticker, and the ticker says what the market is (see Tickers). For rain markets, weather pricing gives a reference probability to quote around.
What you can request
Not every variable is offered everywhere, and the set differs between production and demo. The availability endpoint is the source of truth: a variable missing from its
variables list can’t be created, and enabled: false means creation is off entirely. It needs no authentication.
Location. A point inside an offered region whose grid cell touches land in a US state or territory. A cell entirely over open water is refused, and so is a cell entirely outside the US even where a region’s rectangle covers it, such as Toronto inside conus. The point snaps to the center of the NOAA MRMS grid cell that contains it, roughly 1 km across (about half that in Hawaii and Guam), so every request for a point in the same cell, with the same variable, window, strike type and thresholds, resolves to the same market. The response returns the snapped coordinates.
Window. Whole local hours on one calendar day: date, start_hour (0 to 23), end_hour (1 to 24, exclusive, and after start_hour) and an IANA timezone. 0 to 24 is the whole day. A new market’s window must start at least 15 minutes from now and within 365 days. The window must start and end on whole UTC hours, so time zones offset by a fraction of an hour are refused. A window can span a clock change, but it can’t start or end on an hour that the change skips or repeats.
Threshold. strike_type with floor_value and cap_value, in the variable’s threshold unit:
Some thresholds are refused:
- For
precip_hourswithgreater,floor_valuemust be below the number of hours in the window. - For the precipitation variables with
less,cap_valuemust be above 0. - For
between,cap_valuemust not be belowfloor_value, and aprecip_hoursrange can’t cover every count from 0 to the length of the window.
Create a market
<YYYY-MM-DD> with a date whose window hasn’t started. The response below is for 2026-11-20.
The same request returns the same market, with created: false once it exists, until its window ends. You can call it before each RFQ. An existing market is normally returned even where new markets like it are no longer offered. If weather markets are switched off entirely, the request can be refused whether or not the market exists. A market created a moment ago may not be readable yet: if GET /markets/{ticker} returns 404 right after creation, retry.
Then request quotes on it with POST /communications/rfqs:
Tickers
A ticker fully defines its market, so a maker can tell what an RFQ is for from the ticker alone.KXRFQRAINHOURS-40785N73965W-26NOV2005Z-24H-G2
The first four segments are the event ticker. One event holds every threshold requested for the same variable, point and window, with a creation limit of 40 markets.
Threshold values in the ticker are in the variable’s threshold unit, so
KXRFQRAIN-…-G25 is more than 0.25 inch. The market’s floor_strike and cap_strike give the same thresholds in display units (0.25 for that market), and rules_primary states the location, the local window and the comparison in words.
Finding these markets
Series starting withKXRFQ are left out of unscoped listings, so that markets created for one request don’t crowd out everything else:
GET /marketsandGET /historical/marketsskip them unless the request setsseries_ticker,event_tickerortickersto one of them. OnGET /markets,mve_filter=excludeskips them even then.GET /historical/marketstakes only one of those four filters at a time.GET /markets/tradesandGET /historical/tradesskip their trades unless the request setsticker.GET /eventsleaves them out, including when the request setsseries_tickerto one of their series.GET /seriesleaves their series out.- The WebSocket
tradeandtickerchannels deliver them only to subscriptions that list the market.market_lifecycle_v2leaves them out.
GET /markets/{ticker}, GET /events/{event_ticker} and GET /series/{series_ticker}.
Settlement
- The market closes at the end of its window (
close_time). - It settles on the hourly data the exchange’s weather data provider reports for the market’s point, as available when the market is determined. That is expected about two hours after the window ends (
expected_expiration_time), and takes longer when the data for the window arrives late. Later revisions to the data don’t change the outcome. - Precipitation totals are rounded to the nearest hundredth of an inch and temperatures to the nearest whole °F before they are compared to the threshold.
- If the provider’s data for the window is missing, the exchange determines the market.
latest_expiration_timeis seven days after close.
rules_primary and rules_secondary carry the full terms.
Weather pricing
Weather pricing is not live yet. At launch it will be released to all API users for a limited period. After that period, access may be restricted or withdrawn.
GET /weather_point_markets/{market_ticker}/pricing returns the weather data provider’s probability that a rain market settles Yes. Makers can use it as a reference when quoting an RFQ.
yes_probability(0 to 1) is the chance this exact market settles Yes, computed with the market’s own settlement rules: an hour counts as rainy at 0.01 inch or more, totals are rounded to hundredths of an inch,greateris strictly above,lessis strictly below andbetweenis inclusive.exceedancescarry selected fields of the provider responses behind that number. Each point is the probability that the value is at leastthreshold. Forcalculation: "hourly",thresholdis a number of hours andparameter_maxis the amount, inunit, that makes an hour count. Forcalculation: "aggregation",thresholdis a total inunit.source_model,ensemble_init_timeandensemble_memberssay what the probability is based on. For a forecast they identify the run, so you can tell when it has updated. For windows priced from climatology,source_modelisclimatologyand the other two can be empty strings.
KXRFQRAINHOURS and KXRFQRAIN). The market must exist and its window must not have ended.
For 404 and 409 the reason is in the error’s
message. A 500 or 503 carries only a generic message. Requests count against your read rate limit.
Please note:
- The data is licensed from the provider. Use it only for quoting on Kalshi, and don’t redistribute it or store it for other use.
- Responses are sent with
Cache-Control: no-store. Fetch a fresh price for each quote. - It is a reference, not a recommended price. You are responsible for your own quotes.
Limits and errors
The create endpoint is charged against your write rate limit. Creation limits are separate from request-rate limits.
The specific reason is in the error’s
details when there is one; a rate-limit error can come without it.