Kalshi Weather Markets | Price History API
Pricing
from $0.50 / 1,000 results
Kalshi Weather Markets | Price History API
Export hourly or daily Kalshi weather prediction market candles with prices, bids, asks, volume and open interest. Preserve decimal strings, source nulls and settlement context.
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
Eli J
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
Share
What you can export
Use this Kalshi weather price-history API to analyze hourly or daily candles for Climate and Weather markets. Supply market tickers and a UTC window to export prices, bids, asks, volume, open interest and settlement context.
Prices remain source decimal strings, and missing prices are not filled in. Settlement text and contract payouts are distinct from observed weather; review the output definitions and data-use qualifications below.
How to export Kalshi weather price history
- Name the Kalshi market tickers in
marketTickers, at most 12. - Set
startTimeandendTimein UTC, asYYYY-MM-DDTHH:MM:SSZ, at most 48 hours apart. - Choose
periodInterval:60for hourly or1440for daily candles. - Start the run.
- Read the candle rows from the run's default dataset, and any failures from
its
ERRORSkey-value record.
Two public example tasks carry ready inputs for one Austin weather market: hourly candles and daily candles.
Pricing
How much does it cost to export Kalshi weather-market candles?
A run is charged per dataset row plus the platform's automatic
apify-actor-start event, which is charged separately when the run starts; input
refused by the running Actor still incurs that start event. The number of start
events depends on the run's memory, one event per GB with a minimum of one
event, and the default run memory is 512 MB, so a run at the default memory is
charged one start event. A failure, note or notice is never a dataset row, so
it is never charged as one. One market's rows come to at most 49 hourly or 3
daily dataset rows before the start event, and actual counts are usually lower.
Each row and each start event is charged at the rate in the current Pricing
section of this Actor's Apify Store listing.
Input
| Field | Type | Prefill | Rule |
|---|---|---|---|
marketTickers | array | ["KXHIGHAUS-26JUL12-T97"] | Kalshi market tickers, read in the order given. At most 12 entries, counted before duplicates are removed; the first occurrence of a ticker wins. Each entry is used exactly as typed: 1 to 200 uppercase ASCII letters, digits, dots or hyphens, starting with a letter or digit. |
startTime | string | 2026-07-11T14:00:00Z | Window start in UTC, written exactly as YYYY-MM-DDTHH:MM:SSZ with a real calendar date and time. Required when a market is named. |
endTime | string | 2026-07-13T05:59:00Z | Window end in the same format: later than startTime, at most 172800 seconds (48 hours) after it, and not later than the moment the run starts. Required when a market is named. |
periodInterval | integer | 60 | Candle period in minutes: 60 for hourly or 1440 for daily candles. Required when a market is named. |
No field has a default. Omitting marketTickers (including {}) or sending
[] is refused before any run or charge.
Input rejected by the Actor is reported by field name only: the run fails before any
request, and its ERRORS record names the field and the rule it broke, never
the value you sent.
The hourly example task uses the four prefills as its input:
{"marketTickers": ["KXHIGHAUS-26JUL12-T97"],"startTime": "2026-07-11T14:00:00Z","endTime": "2026-07-13T05:59:00Z","periodInterval": 60}
The daily example task differs only in periodInterval 1440.
Requests and time
Every request is one GET to the public Kalshi Trade API, counted before it is
sent. Only HTTP 429 is retried. A request that gets 429 is retried up to 3
times, after waits of 1, 2 and 4 seconds, at most 7 seconds of backoff in
total. Each retry is a counted request. If the cutoff request still gets 429
after its 3 retries, the run fails with cutoff-unavailable before any market
is read. If any other request still gets 429 after its 3 retries, further
requests stop and the run ends normally with a rate-limited notice. No
redirect is followed.
Without a 429, a one-market run makes 5 requests to reach its candles (cutoff, live detail, event, series and candles), or 6 when the live detail answers 404 and the historical detail is read instead. Event and series results are cached across markets, so a shared event or series is fetched once.
An input takes at most 12 ticker entries, counted before duplicates are
removed. A run makes at most 61 requests, retries included. A request that
would exceed that ceiling is not sent or counted, and the run stops with a
request-ceiling notice. The ceiling can cut a request's retries short and
leave the current and later markets unprocessed.
Request starts are at least 1 second apart, so a 61-request run has at least 60 seconds between its first and last start. That bounds the span of the starts; it is not time added to response durations. If 1 second or more has passed since the previous start, for example during a slow response or a 429 backoff, the next request starts without an extra pacing wait.
Each request has a configured 30-second timeout for each blocking operation, such as the connection attempt. It is a blocking operation timeout, not a whole-response deadline. The platform's default run timeout is 300 seconds, and a long run is not guaranteed to finish within it.
Output
One row per candle in the default dataset, recordType marketCandle, with 41
columns. Prices, bids and asks are USD decimal strings with up to 6 decimal
places, and volume and open interest are contract counts with 2 decimal places;
each is kept exactly as the source sent it and never converted to a number or
rounded.
Source responses determine actual row counts.
An excerpt of one hourly row from the example input, showing only the columns whose values that input fixes:
{"recordType": "marketCandle","marketTicker": "KXHIGHAUS-26JUL12-T97","periodInterval": 60,"priceCurrency": "USD","quantityUnit": "contracts"}
| Column | Type | Meaning |
|---|---|---|
recordType | string | Literal marketCandle |
rowKey | string | <marketTicker>:<periodInterval>:<endPeriodTs>, unique per row |
marketTicker | string | The market ticker you named |
eventTicker | string | The market's event ticker |
seriesTicker | string | The event's series ticker |
eventTitle | string | Event title, as returned |
yesSubTitle | string | YES subtitle, as returned |
strikeType | string or null | Source text, not interpreted |
marketStatus | string | Market status, as returned |
marketResult | string | Market result, as returned; an empty string is kept |
settlementTs | string or null | Settlement time, verbatim source text |
settlementValueDollars | string or null | USD decimal string: the YES/LONG contract payout, not observed weather |
expirationValue | string | Source settlement text, verbatim, not a labelled temperature; an empty string is kept |
marketDetailRoute | string | live or historical: the detail request that answered |
marketCapturedAt | string | UTC receipt time of that market detail, YYYY-MM-DDTHH:MM:SSZ |
eventSettlementSources | array or null | The market's own event's settlement sources, members {name, url} as returned |
eventCapturedAt | string | UTC receipt time of the event; markets sharing an event share its first receipt time |
candleRoute | string | live or historical: the candle route this run's cutoff selected |
historicalCutoffTs | string | This run's historical cutoff, verbatim |
periodInterval | integer | Candle period in minutes, 60 or 1440 |
endPeriodTs | integer | Unix seconds: the inclusive end of the candle period |
periodEnd | string | The same instant as YYYY-MM-DDTHH:MM:SSZ |
priceOpen | string or null | Open price, USD decimal string |
priceHigh | string or null | High price, USD decimal string |
priceLow | string or null | Low price, USD decimal string |
priceClose | string or null | Close price, USD decimal string |
priceMean | string or null | Mean price, USD decimal string |
pricePrevious | string or null | Previous price, USD decimal string, under the definition of the route that answered |
yesBidOpen | string | YES bid open, USD decimal string |
yesBidHigh | string | YES bid high, USD decimal string |
yesBidLow | string | YES bid low, USD decimal string |
yesBidClose | string | YES bid close, USD decimal string |
yesAskOpen | string | YES ask open, USD decimal string |
yesAskHigh | string | YES ask high, USD decimal string |
yesAskLow | string | YES ask low, USD decimal string |
yesAskClose | string | YES ask close, USD decimal string |
volume | string | Volume in contracts, decimal string |
openInterest | string | Open interest in contracts, decimal string |
priceCurrency | string | Literal USD |
quantityUnit | string | Literal contracts |
candlesCapturedAt | string | UTC receipt time of that market's candle response |
Null prices
A null price is a source null or an omitted optional live value; it does not by itself establish that no trade occurred. The historical route documents its open, high, low, close and mean prices as null if no trades occurred, while the live route says only that they may be null if there was no trade during the period, and a live candle can omit a price key while keeping other trading values. No price is filled in, carried forward or inferred from bids, asks or volume.
pricePrevious follows the definition of the route that answered, and neither
definition is a missing open, high, low or close:
- Historical candle route: "Close price from the previous candlestick period (in dollars). Null if this is the first candlestick or no prior trade exists."
- Live candle route: "Last traded YES contract price on the market before the candlestick period (in dollars). May be null if there were no trades before the period."
Settlement fields
expirationValue is the source's settlement text, kept verbatim. It is not a
labelled temperature, and this Actor does not parse a temperature out of it.
settlementValueDollars is the YES/LONG contract payout as a USD decimal
string, not an observed weather value.
Related Actors
| Actor | Fit | What it exports |
|---|---|---|
| UFCStats Scraper | Fight & Round Statistics | Fight and round statistics | UFCStats fight and round statistics as flat rows with fighter IDs, event dates and locations, from event or fight URLs; CSV or JSON. |
| Tennis Abstract Scraper | Match History API | Tennis match history | ATP and WTA player match histories from Tennis Abstract, including scores, opponents, surfaces and available serve and return statistics, filtered by season, surface or head-to-head opponent; JSON, CSV or Excel. |
| Google Trends Scraper | Keyword Data API | Keyword interest | Google Trends interest over time, interest by region and related/rising queries for your keywords, location and date range, plus the Trending Now board by country; JSON, CSV or Excel. |
| Clutch Agency Scraper | B2B Directory Export | Agency research | B2B agency listings from Clutch.co directories: company names, websites, ratings, review counts, locations, rates, headcounts and service mix; JSON, CSV or Excel. |
| Google Ads Transparency Scraper & Archive | Ad-creative research | Advertiser ad records from Google's Ads Transparency Center: creative format, available images, first and last shown dates and source links, for selected advertisers and a region; JSON, CSV or Excel. |
FAQ and support
Does it export daily and hourly candles?
Yes. Set periodInterval to 60 for hourly or 1440 for daily candles; no
other period is accepted.
How many markets and how long a window can one run read?
Up to 12 markets, counted before duplicates are removed, and a window of at
most 172800 seconds (48 hours) from startTime to endTime.
Why are some prices null?
A null price is a source null or an omitted optional live value, not by itself
proof that no trade occurred; nothing is filled in. pricePrevious follows the
definition of the route that answered. Both are described under Null prices in
the Output section.
Are expirationValue and settlementValueDollars measured weather?
No. expirationValue is the source's settlement text, kept verbatim and not
parsed into a temperature, and settlementValueDollars is the YES/LONG contract
payout, not an observed weather value.
Is a run that names no market charged?
Omitting marketTickers or sending [] is refused before any run or charge.
When a market produces no rows
Failures are never dataset rows. Each one is recorded in the run's ERRORS
key-value record as an object with exactly four keys, target, id,
errorClass and message, and the key-value store schema lists every class.
Per market, market-not-found, event-not-found, series-not-found,
not-weather, candles-not-found, blocked, transport and
unreadable-response are failures, and no-candles is a note, not a failure,
for a market whose candle request returned an empty list. At run level,
invalid-input and cutoff-unavailable fail the run before any market is
read. rate-limited (a request other than the cutoff still got HTTP
429 after its 3 retries), request-ceiling (a further request would exceed the
61-request ceiling) and charge-limit are notices that stop further requests
and end the run normally. A rate-limited or request-ceiling notice names
the markets left unprocessed: the interrupted one and every market after it.
The run log reports markets selected, markets with rows, markets with no candles, markets failed, rows pushed and requests sent. Rows are counted as delivered, never as offered, and when the platform does not report how many rows the last push delivered, the log says that count is unknown.
Data rights
The data comes from Kalshi's public Trade API. Kalshi's Data Terms of Service and Developer Agreement restrict commercial redistribution, AI/ML use and API data sharing without written authorization from Kalshi. This Actor grants no data-use rights and does not confirm that your use is permitted; you are responsible for your use of the data.
Developer Agreement section 6.4 also says "You must obtain prior written approval from Kalshi prior to releasing any statements" relating to Kalshi or its API, including promotional or marketing materials. That is an additional unresolved conflict, recorded here as a disclosure, not as permission. Disclosing these conflicts does not cure them.
This Actor reads no page behind a login, uses no credential and writes nothing back to the source.
Support
Report a problem or ask a question in the Issues tab of this Actor's Apify Store page.