curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/weather_point_markets \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"latitude": 40.785,
"longitude": -73.965,
"date": "2026-11-11",
"start_hour": 11,
"end_hour": 12,
"timezone": "America/New_York",
"floor_value": 123,
"cap_value": 123
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/weather_point_markets"
payload = {
"latitude": 40.785,
"longitude": -73.965,
"date": "2026-11-11",
"start_hour": 11,
"end_hour": 12,
"timezone": "America/New_York",
"floor_value": 123,
"cap_value": 123
}
headers = {
"KALSHI-ACCESS-KEY": "<api-key>",
"KALSHI-ACCESS-SIGNATURE": "<api-key>",
"KALSHI-ACCESS-TIMESTAMP": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'KALSHI-ACCESS-KEY': '<api-key>',
'KALSHI-ACCESS-SIGNATURE': '<api-key>',
'KALSHI-ACCESS-TIMESTAMP': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
latitude: 40.785,
longitude: -73.965,
date: '2026-11-11',
start_hour: 11,
end_hour: 12,
timezone: 'America/New_York',
floor_value: 123,
cap_value: 123
})
};
fetch('https://external-api.kalshi.com/trade-api/v2/weather_point_markets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://external-api.kalshi.com/trade-api/v2/weather_point_markets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'latitude' => 40.785,
'longitude' => -73.965,
'date' => '2026-11-11',
'start_hour' => 11,
'end_hour' => 12,
'timezone' => 'America/New_York',
'floor_value' => 123,
'cap_value' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"KALSHI-ACCESS-KEY: <api-key>",
"KALSHI-ACCESS-SIGNATURE: <api-key>",
"KALSHI-ACCESS-TIMESTAMP: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://external-api.kalshi.com/trade-api/v2/weather_point_markets"
payload := strings.NewReader("{\n \"latitude\": 40.785,\n \"longitude\": -73.965,\n \"date\": \"2026-11-11\",\n \"start_hour\": 11,\n \"end_hour\": 12,\n \"timezone\": \"America/New_York\",\n \"floor_value\": 123,\n \"cap_value\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("KALSHI-ACCESS-KEY", "<api-key>")
req.Header.Add("KALSHI-ACCESS-SIGNATURE", "<api-key>")
req.Header.Add("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://external-api.kalshi.com/trade-api/v2/weather_point_markets")
.header("KALSHI-ACCESS-KEY", "<api-key>")
.header("KALSHI-ACCESS-SIGNATURE", "<api-key>")
.header("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"latitude\": 40.785,\n \"longitude\": -73.965,\n \"date\": \"2026-11-11\",\n \"start_hour\": 11,\n \"end_hour\": 12,\n \"timezone\": \"America/New_York\",\n \"floor_value\": 123,\n \"cap_value\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/weather_point_markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["KALSHI-ACCESS-KEY"] = '<api-key>'
request["KALSHI-ACCESS-SIGNATURE"] = '<api-key>'
request["KALSHI-ACCESS-TIMESTAMP"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"latitude\": 40.785,\n \"longitude\": -73.965,\n \"date\": \"2026-11-11\",\n \"start_hour\": 11,\n \"end_hour\": 12,\n \"timezone\": \"America/New_York\",\n \"floor_value\": 123,\n \"cap_value\": 123\n}"
response = http.request(request)
puts response.read_body{
"event_ticker": "<string>",
"market_ticker": "KXRFQRAINHOURS-40785N73965W-26NOV1105Z-24H-G2",
"created": true,
"latitude": 123,
"longitude": 123
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Create Weather Point Market
Returns the on-request weather market for a location, time window and
threshold, creating it if it doesn’t exist yet. The same request always
returns the same market, so call this before sending an RFQ for a
market you haven’t seen. created tells you whether the market is new.
The location snaps to the center of the NOAA MRMS grid cell containing
it; the response carries the snapped coordinates. Markets are only
offered where GET /weather_point_markets/availability says so, and
not over open water.
A market is traded through RFQs: pass the returned market_ticker to
POST /communications/rfqs. These markets are in series starting with
KXRFQ and are left out of unscoped market listings.
A market created a moment ago may not be readable yet: if
GET /markets/{ticker} returns 404 right after creation, retry.
A request that is well formed but can’t be offered returns 409 with the reason in the error message: the variable isn’t offered at that location, the location is over open water, or the window starts too soon. Reaching a creation limit returns 429.
curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/weather_point_markets \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"latitude": 40.785,
"longitude": -73.965,
"date": "2026-11-11",
"start_hour": 11,
"end_hour": 12,
"timezone": "America/New_York",
"floor_value": 123,
"cap_value": 123
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/weather_point_markets"
payload = {
"latitude": 40.785,
"longitude": -73.965,
"date": "2026-11-11",
"start_hour": 11,
"end_hour": 12,
"timezone": "America/New_York",
"floor_value": 123,
"cap_value": 123
}
headers = {
"KALSHI-ACCESS-KEY": "<api-key>",
"KALSHI-ACCESS-SIGNATURE": "<api-key>",
"KALSHI-ACCESS-TIMESTAMP": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'KALSHI-ACCESS-KEY': '<api-key>',
'KALSHI-ACCESS-SIGNATURE': '<api-key>',
'KALSHI-ACCESS-TIMESTAMP': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
latitude: 40.785,
longitude: -73.965,
date: '2026-11-11',
start_hour: 11,
end_hour: 12,
timezone: 'America/New_York',
floor_value: 123,
cap_value: 123
})
};
fetch('https://external-api.kalshi.com/trade-api/v2/weather_point_markets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://external-api.kalshi.com/trade-api/v2/weather_point_markets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'latitude' => 40.785,
'longitude' => -73.965,
'date' => '2026-11-11',
'start_hour' => 11,
'end_hour' => 12,
'timezone' => 'America/New_York',
'floor_value' => 123,
'cap_value' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"KALSHI-ACCESS-KEY: <api-key>",
"KALSHI-ACCESS-SIGNATURE: <api-key>",
"KALSHI-ACCESS-TIMESTAMP: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://external-api.kalshi.com/trade-api/v2/weather_point_markets"
payload := strings.NewReader("{\n \"latitude\": 40.785,\n \"longitude\": -73.965,\n \"date\": \"2026-11-11\",\n \"start_hour\": 11,\n \"end_hour\": 12,\n \"timezone\": \"America/New_York\",\n \"floor_value\": 123,\n \"cap_value\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("KALSHI-ACCESS-KEY", "<api-key>")
req.Header.Add("KALSHI-ACCESS-SIGNATURE", "<api-key>")
req.Header.Add("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://external-api.kalshi.com/trade-api/v2/weather_point_markets")
.header("KALSHI-ACCESS-KEY", "<api-key>")
.header("KALSHI-ACCESS-SIGNATURE", "<api-key>")
.header("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"latitude\": 40.785,\n \"longitude\": -73.965,\n \"date\": \"2026-11-11\",\n \"start_hour\": 11,\n \"end_hour\": 12,\n \"timezone\": \"America/New_York\",\n \"floor_value\": 123,\n \"cap_value\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/weather_point_markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["KALSHI-ACCESS-KEY"] = '<api-key>'
request["KALSHI-ACCESS-SIGNATURE"] = '<api-key>'
request["KALSHI-ACCESS-TIMESTAMP"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"latitude\": 40.785,\n \"longitude\": -73.965,\n \"date\": \"2026-11-11\",\n \"start_hour\": 11,\n \"end_hour\": 12,\n \"timezone\": \"America/New_York\",\n \"floor_value\": 123,\n \"cap_value\": 123\n}"
response = http.request(request)
puts response.read_body{
"event_ticker": "<string>",
"market_ticker": "KXRFQRAINHOURS-40785N73965W-26NOV1105Z-24H-G2",
"created": true,
"latitude": 123,
"longitude": 123
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Authorizations
Your API key ID
Base64 signature of the pre-sign text (timestamp + method + path) made with the API key's algorithm - RSA-PSS with SHA-256 for RSA keys, Ed25519 for Ed25519 keys
Request timestamp in milliseconds
Body
Latitude of the location in degrees.
40.785
Longitude of the location in degrees.
-73.965
What a weather point market measures over its window, and the unit its thresholds are in:
precip_hours: hours with measurable precipitation, in whole hours.precip_total: total precipitation, in hundredths of an inch.max_temp: highest temperature, in whole °F.min_temp: lowest temperature, in whole °F.
precip_hours, precip_total, max_temp, min_temp How the measured value is compared to the thresholds:
greater settles Yes above floor_value, less below
cap_value, and between from floor_value to cap_value
inclusive.
greater, less, between Local calendar date the window starts on, as YYYY-MM-DD in timezone.
"2026-11-11"
First local hour of the window (0-23).
0 <= x <= 23Local hour the window ends at, exclusive (1-24, after start_hour). 24 is the following midnight, so 0 to 24 is the whole day.
1 <= x <= 24IANA time zone of the location, which the date and hours are read in. The window must start and end on whole UTC hours.
"America/New_York"
Lower threshold, in the variable's unit. Required for greater and between.
Upper threshold, in the variable's unit. Required for less and between.
Response
Market returned or created successfully
Event ticker of the market.
Market ticker of the market.
"KXRFQRAINHOURS-40785N73965W-26NOV1105Z-24H-G2"
False when a market for the same request already existed.
Latitude of the market's location, the center of the grid cell containing the request.
Longitude of the market's location, the center of the grid cell containing the request.