Weatherkind API
One base URL, JSON in, weather out. Everything on weatherkind.com is served by the same endpoints documented here, including forecasts, historical observations, nowcasts, airport-delay predictions, alerts, accuracy, and climate.
https://api.weatherkind.comAuthorization: Bearer {api_key}application/json · ISO-8601v1 · additive changes onlyOverview
The API is a small family of endpoints around one idea: field-selectable weather. You state a coordinate, the forecast sections you want (from current conditions to daily summaries), and the exact variables in each section, and the response contains precisely that, nothing else.
Interactive weather endpoints below have a live console: build
the call with real parameters, copy it as curl, and inspect the
returned JSON or visualization. Console calls run through this site's
demo proxy. Airport-delay and map-tile endpoints include copyable
integration examples. Your own integration uses your API key against
api.weatherkind.com.
Data endpoints return their result directly; there is no
data envelope. Forecast-oriented weather responses carry
updated_at, a stale flag (true
only when a cached payload is served during upstream degradation),
and a warnings array for non-fatal notices.
Airport-delay predictions instead expose issued_at,
per-prediction data_freshness, and warnings.
POST /v1/forecast: named sections: current · quarter_hourly · hourly · dailyPOST /v1/nowcast: fixed two-hour, minute-by-minute precipitation nowcastPOST /v1/route: forecast along a drive or hike, timed to when you arrivePOST /v1/airport-delay: weather-attributed delay severity and cancellation risk for supported US airportsPOST /v1/airport-delay/accuracy: separate backtest, live, and route-aware verificationGET /v1/airport-delay/supported-airports: airports qualified for delay predictionPOST /v1/outlook: daily climate outlook, days 15–365POST /v1/historical: field-selectable daily observations for completed local datesGET /v1/historical/variables: variables, units, coverage limits, and methodology (public)POST /v1/alerts: CAP-aligned active public alertsPOST /v1/accuracy: our verified error record, by locality, region, or networkGET /v1/accuracy/catalog: regions, leads, variables, metrics, methodology (public)GET /v1/geocode: place-name search returning coordinates and time zonesGET /v1/map-tiles/{layer}/{z}/{x}/{y}: radar & environment rasters
Authentication
Every request carries a bearer token. Keys are scoped to a plan (free tier available) and work across all endpoints your plan includes.
Authorization: Bearer wk_live_…
Keys carry scopes: forecast:read covers forecast and
outlook; nowcast:read covers the Pro+
minute nowcast; route:read covers the Pro+
route forecast; alerts:read covers alerts; and
accuracy:read covers /v1/accuracy.
historical:read covers
/v1/historical.
airport_delay:read covers prediction, verification, and
the supported-airports catalog in the airport-delay family.
Calling an endpoint your key doesn't cover returns 403.
Three catalog endpoints need no key at all:
GET /v1/forecast/variables and
GET /v1/accuracy/catalog, and
GET /v1/historical/variables.
Keys are secrets: call the API from your backend or an edge proxy, not from browser JavaScript, and rotate any key that ships in a client binary.
Quick start
Current conditions for Aspen, Colorado, in one call:
Response
{
"location": {
"latitude": 39.1911,
"longitude": -106.8175,
"timezone": "America/Denver",
"forecast_elevation_m": 2422
},
"units": { "system": "us", "elevation": "m", "pressure": "hPa" },
"current": {
"time": "2026-07-30T17:04:00Z",
"temperature": 78.3,
"condition": "partly"
},
"updated_at": "2026-07-30T17:04:11Z",
"stale": false,
"warnings": []
} POST /v1/forecast
Returns the operational forecast from right now through the next two weeks. One request can combine current conditions, 15-minute or hourly detail, and daily summaries, with only the variables you select. Use this endpoint when you need specific near-term conditions or weather values for a particular time.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | object | Coordinates and optional time zone for the location being queried. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
timezone | optional | string | auto or an IANA timezone Default: "auto". |
units | optional | enum | Allowed: "metric", "us", "si". Default: "metric". See Units & time. |
| optional | object | Optional per-dimension overrides for measurement units. See Units & time. | |
elevation | optional | enum | Allowed: "m", "ft". |
precipitation | optional | enum | Allowed: "mm", "in", "m". |
precipitation_rate | optional | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | optional | enum | Allowed: "hPa", "inHg", "Pa". |
temperature | optional | enum | Allowed: "degC", "degF", "K". |
visibility | optional | enum | Allowed: "km", "mi", "m". |
wind_speed | optional | enum | Allowed: "km/h", "mph", "m/s". |
| optional | object | Current conditions at the requested location. | |
variables | required | array<string> | At least 1 item. See Variables. |
| optional | object | Weather variables returned at 15-minute intervals. | |
hours | required | integer | Range: 1…48. |
variables | required | array<string> | At least 1 item. See Variables. |
| optional | object | Weather variables returned at hourly intervals. | |
hours | required | integer | Range: 1…384. |
past_hours | optional | integer | Number of prior hourly records to include. Defaults to 0 (future hours only). Range: 0…48. |
variables | required | array<string> | At least 1 item. See Variables. |
| optional | object | Daily weather variables for the requested dates. | |
days | conditional | integer | Range: 1…15. |
variables | required | array<string> | At least 1 item. See Variables. |
end | conditional | local date | Last local date, inclusive |
start | conditional | local date | First local date, inclusive |
| Field | Presence | Type | Notes |
|---|---|---|---|
location | required | object | Forecast coordinate |
latitude | required | number | −90…90 |
longitude | required | number | −180…180 |
timezone | optional | string | "auto" by default, or an IANA zone |
units | optional | string | Defaults to "metric" (°C, km/h, mm, hPa, m); also accepts "us" or "si" |
unit_overrides | optional | object | Override individual measurement dimensions |
temperature | optional | enum | degC, degF, or K |
wind_speed | optional | enum | km/h, mph, or m/s |
precipitation | optional | enum | mm, in, or m |
precipitation_rate | optional | enum | mm/h, in/h, or m/s |
visibility | optional | enum | km, mi, or m |
pressure | optional | string | Pressure unit override |
elevation | optional | string | Elevation unit override |
current | optional | object | Current conditions section |
variables | required | string[] | Variables returned in one flat object at request time |
quarter_hourly | optional | object | 15-minute forecast section |
hours | required | integer | 1–48 hours |
variables | required | string[] | 15-minute variables to return |
hourly | optional | object | Hourly forecast section |
hours | required | integer | 1–384 future hours |
past_hours | optional | integer | 0–48 prior hours |
variables | required | string[] | Hourly variables to return |
daily | optional | object | Daily forecast section |
days | optional | integer | 1–15 local dates (today through day +14); mutually exclusive with start/end |
start | optional | local date | First exact date, inclusive |
end | optional | local date | Last exact date, inclusive |
variables | required | string[] | Daily variables to return |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Coordinates and optional time zone for the location being queried. | |
forecast_elevation_m | nullable | number | null | Representative forecast elevation, in metres. |
latitude | always | number | Latitude in decimal degrees. |
longitude | always | number | Longitude in decimal degrees. |
timezone | always | string | IANA time zone used for local date and time interpretation. |
| always | object | Unit system and per-dimension units for the returned values. See Units & time. | |
elevation | always | enum | Allowed: "m", "ft". |
percentage | always | enum | Always "%". |
precipitation | always | enum | Allowed: "mm", "in", "m". |
precipitation_rate | always | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | always | enum | Allowed: "hPa", "inHg", "Pa". |
system | always | enum | Allowed: "metric", "us", "si". |
temperature | always | enum | Allowed: "degC", "degF", "K". |
visibility | always | enum | Allowed: "km", "mi", "m". |
wind_speed | always | enum | Allowed: "km/h", "mph", "m/s". |
| conditional | object | Current conditions at the requested location. | |
* | conditional | any | Additional selected variable fields may appear in current records. |
| conditional | array<object> | Weather variables returned at 15-minute intervals. | |
time | always | ISO datetime | UTC instant represented by this record. |
* | conditional | any | Additional selected variable fields may appear in quarter hourly records. |
| conditional | array<object> | Weather variables returned at hourly intervals. | |
time | always | ISO datetime | UTC instant represented by this record. |
* | conditional | any | Additional selected variable fields may appear in hourly records. |
| conditional | array<object> | Daily weather variables for the requested dates. | |
date | always | local date | Local calendar date represented by this record. |
* | conditional | any | Additional selected variable fields may appear in daily records. |
updated_at | nullable | ISO datetime | null | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Interactive example
curl 'https://api.weatherkind.com/v1/forecast' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": {
"latitude": 39.1911,
"longitude": -106.8175
},
"timezone": "auto",
"units": "us",
"current": {
"variables": [
"temperature",
"condition",
"wind_speed"
]
},
"hourly": {
"hours": 48,
"variables": [
"temperature",
"condition",
"wind_speed",
"precipitation",
"precipitation_probability"
]
},
"daily": {
"days": 14,
"variables": [
"temperature_max",
"temperature_min",
"condition",
"precipitation",
"precipitation_probability"
]
}
}'{
"location": {
"timezone": "America/Denver",
"latitude": 39.1911,
"longitude": -106.8175,
"forecast_elevation_m": 2413
},
"warnings": [
{
"code": "stale_data",
"message": "One or more forecast sections are being served from stale data."
}
],
"units": {
"elevation": "ft",
"percentage": "%",
"precipitation": "in",
"precipitation_rate": "in/h",
"pressure": "inHg",
"system": "us",
"temperature": "degF",
"visibility": "mi",
"wind_speed": "mph"
},
"current": {
"condition": "clear-night",
"temperature": 71,
"time": "2026-09-10T02:21:39Z",
"wind_speed": 6
},
"stale": true,
"updated_at": "2026-09-10T02:21:29Z",
"daily": [
{
"condition": "sun",
"date": "2026-09-09",
"precipitation": 0,
"precipitation_probability": 0,
"temperature_max": 71,
"temperature_min": 60,
"type": "forecast"
},
{
"condition": "cloudy",
"date": "2026-09-10",
"precipitation": 0,
"precipitation_probability": 0,
"temperature_max": 79,
"temperature_min": 49,
"type": "forecast"
},
{
"condition": "cloudy",
"date": "2026-09-11",
"precipitation": 0,
"precipitation_probability": 1,
"temperature_max": 78,
"temperature_min": 50,
"type": "forecast"
},
{
"condition": "partly",
"date": "2026-09-12",
"precipitation": 0,
"precipitation_probability": 20,
"temperature_max": 80,
"temperature_min": 48,
"type": "forecast"
},
{
"condition": "drizzle",
"date": "2026-09-13",
"precipitation": 0.01,
"precipitation_probability": 45,
"temperature_max": 77,
"temperature_min": 51,
"type": "forecast"
},
{
"condition": "drizzle",
"date": "2026-09-14",
"precipitation": 0.04,
"precipitation_probability": 31,
"temperature_max": 75,
"temperature_min": 49,
"type": "forecast"
},
{
"condition": "drizzle",
"date": "2026-09-15",
"precipitation": 0.05,
"precipitation_probability": 46,
"temperature_max": 72,
"temperature_min": 47,
"type": "forecast"
},
{
"condition": "rain",
"date": "2026-09-16",
"precipitation": 0.16,
"precipitation_probability": 54,
"temperature_max": 75,
"temperature_min": 47,
"type": "forecast"
},
{
"condition": "rain",
"date": "2026-09-17",
"precipitation": 0.13,
"precipitation_probability": 29,
"temperature_max": 75,
"temperature_min": 46,
"type": "forecast"
},
{
"condition": "drizzle",
"date": "2026-09-18",
"precipitation": 0.05,
"precipitation_probability": 27,
"temperature_max": 77,
"temperature_min": 46,
"type": "forecast"
},
{
"condition": "drizzle",
"date": "2026-09-19",
"precipitation": 0.06,
"precipitation_probability": 29,
"temperature_max": 74,
"temperature_min": 46,
"type": "forecast"
},
{
"condition": "drizzle",
"date": "2026-09-20",
"precipitation": 0.06,
"precipitation_probability": 27,
"temperature_max": 80,
"temperature_min": 46,
"type": "forecast"
},
{
"condition": "sun",
"date": "2026-09-21",
"precipitation": 0,
"precipitation_probability": 18,
"temperature_max": 72,
"temperature_min": 40,
"type": "forecast"
},
{
"condition": "sun",
"date": "2026-09-22",
"precipitation": 0,
"precipitation_probability": 14,
"temperature_max": 77,
"temperature_min": 39,
"type": "forecast"
}
],
"hourly": [
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 64,
"time": "2026-09-10T04:00:00Z",
"type": "forecast",
"wind_speed": 2
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 60,
"time": "2026-09-10T05:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 58,
"time": "2026-09-10T06:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 55,
"time": "2026-09-10T07:00:00Z",
"type": "forecast",
"wind_speed": 6
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 52,
"time": "2026-09-10T08:00:00Z",
"type": "forecast",
"wind_speed": 5
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 51,
"time": "2026-09-10T09:00:00Z",
"type": "forecast",
"wind_speed": 6
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 50,
"time": "2026-09-10T10:00:00Z",
"type": "forecast",
"wind_speed": 7
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 49,
"time": "2026-09-10T11:00:00Z",
"type": "forecast",
"wind_speed": 7
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 49,
"time": "2026-09-10T12:00:00Z",
"type": "forecast",
"wind_speed": 8
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 50,
"time": "2026-09-10T13:00:00Z",
"type": "forecast",
"wind_speed": 7
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 52,
"time": "2026-09-10T14:00:00Z",
"type": "forecast",
"wind_speed": 7
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 59,
"time": "2026-09-10T15:00:00Z",
"type": "forecast",
"wind_speed": 1
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 65,
"time": "2026-09-10T16:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 70,
"time": "2026-09-10T17:00:00Z",
"type": "forecast",
"wind_speed": 6
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 75,
"time": "2026-09-10T18:00:00Z",
"type": "forecast",
"wind_speed": 8
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 76,
"time": "2026-09-10T19:00:00Z",
"type": "forecast",
"wind_speed": 9
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 77,
"time": "2026-09-10T20:00:00Z",
"type": "forecast",
"wind_speed": 10
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 78,
"time": "2026-09-10T21:00:00Z",
"type": "forecast",
"wind_speed": 10
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 78,
"time": "2026-09-10T22:00:00Z",
"type": "forecast",
"wind_speed": 10
},
{
"condition": "cloudy",
"precipitation": 0,
"precipitation_probability": 2,
"temperature": 77,
"time": "2026-09-10T23:00:00Z",
"type": "forecast",
"wind_speed": 10
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 74,
"time": "2026-09-11T00:00:00Z",
"type": "forecast",
"wind_speed": 9
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 69,
"time": "2026-09-11T01:00:00Z",
"type": "forecast",
"wind_speed": 5
},
{
"condition": "cloudy-night",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 63,
"time": "2026-09-11T02:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "cloudy-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 60,
"time": "2026-09-11T03:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 57,
"time": "2026-09-11T04:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 56,
"time": "2026-09-11T05:00:00Z",
"type": "forecast",
"wind_speed": 2
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 54,
"time": "2026-09-11T06:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 53,
"time": "2026-09-11T07:00:00Z",
"type": "forecast",
"wind_speed": 5
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 52,
"time": "2026-09-11T08:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 52,
"time": "2026-09-11T09:00:00Z",
"type": "forecast",
"wind_speed": 5
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 51,
"time": "2026-09-11T10:00:00Z",
"type": "forecast",
"wind_speed": 5
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 51,
"time": "2026-09-11T11:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "cloudy-night",
"precipitation": 0,
"precipitation_probability": 1,
"temperature": 50,
"time": "2026-09-11T12:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 53,
"time": "2026-09-11T13:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 55,
"time": "2026-09-11T14:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 61,
"time": "2026-09-11T15:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 66,
"time": "2026-09-11T16:00:00Z",
"type": "forecast",
"wind_speed": 2
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 71,
"time": "2026-09-11T17:00:00Z",
"type": "forecast",
"wind_speed": 5
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 0,
"temperature": 77,
"time": "2026-09-11T18:00:00Z",
"type": "forecast",
"wind_speed": 8
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 7,
"temperature": 76,
"time": "2026-09-11T19:00:00Z",
"type": "forecast",
"wind_speed": 9
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 7,
"temperature": 76,
"time": "2026-09-11T20:00:00Z",
"type": "forecast",
"wind_speed": 10
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 4,
"temperature": 75,
"time": "2026-09-11T21:00:00Z",
"type": "forecast",
"wind_speed": 10
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 7,
"temperature": 73,
"time": "2026-09-11T22:00:00Z",
"type": "forecast",
"wind_speed": 9
},
{
"condition": "partly",
"precipitation": 0,
"precipitation_probability": 7,
"temperature": 72,
"time": "2026-09-11T23:00:00Z",
"type": "forecast",
"wind_speed": 7
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 7,
"temperature": 71,
"time": "2026-09-12T00:00:00Z",
"type": "forecast",
"wind_speed": 7
},
{
"condition": "sun",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 67,
"time": "2026-09-12T01:00:00Z",
"type": "forecast",
"wind_speed": 4
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 3,
"temperature": 63,
"time": "2026-09-12T02:00:00Z",
"type": "forecast",
"wind_speed": 3
},
{
"condition": "clear-night",
"precipitation": 0,
"precipitation_probability": 5,
"temperature": 59,
"time": "2026-09-12T03:00:00Z",
"type": "forecast",
"wind_speed": 5
}
]
}- conditionclear-night
- temperature71
- wind_speed6
condition clear-night · sun · cloudy · partlytype forecastcondition sun · cloudy · partly · drizzletype forecastPOST /v1/nowcast
Returns the operational precipitation nowcast in one fixed shape: one-minute entries for the next two hours. It is refreshed on the radar cadence and cached independently from the broader forecast, so clients can poll it frequently without recomputing or transferring current, hourly, and daily sections.
Poll according to Retry-After when present. A
pending status means the first radar-backed result is
still warming; dry is a valid result with no active precipitation.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | object | Coordinates and optional time zone for the location being queried. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
timezone | optional | string | auto or an IANA timezone Default: "auto". |
units | optional | enum | Allowed: "metric", "us", "si". Default: "metric". See Units & time. |
| optional | object | Optional per-dimension overrides for measurement units. See Units & time. | |
elevation | optional | enum | Allowed: "m", "ft". |
precipitation | optional | enum | Allowed: "mm", "in", "m". |
precipitation_rate | optional | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | optional | enum | Allowed: "hPa", "inHg", "Pa". |
temperature | optional | enum | Allowed: "degC", "degF", "K". |
visibility | optional | enum | Allowed: "km", "mi", "m". |
wind_speed | optional | enum | Allowed: "km/h", "mph", "m/s". |
variables | optional | array<string> | Minute variables to return. Defaults to every nowcast variable. At least 1 item. See Variables. |
| Field | Presence | Type | Notes |
|---|---|---|---|
location | required | object | Nowcast coordinate |
latitude | required | number | −90…90 |
longitude | required | number | −180…180 |
timezone | optional | string | "auto" by default, or an IANA time zone |
units | optional | string | Defaults to "metric" (°C, km/h, mm, hPa, m); also accepts "us" or "si" |
unit_overrides | optional | object | Override individual measurement dimensions |
temperature | optional | enum | degC, degF, or K |
wind_speed | optional | enum | km/h, mph, or m/s |
precipitation | optional | enum | mm, in, or m |
precipitation_rate | optional | enum | mm/h, in/h, or m/s |
visibility | optional | enum | km, mi, or m |
pressure | optional | enum | hPa, inHg, or Pa |
elevation | optional | enum | m or ft |
variables | optional | string[] | Minute variables to return; defaults to every nowcast variable |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Coordinates and optional time zone for the location being queried. | |
forecast_elevation_m | nullable | number | null | Representative forecast elevation, in metres. |
latitude | always | number | Latitude in decimal degrees. |
longitude | always | number | Longitude in decimal degrees. |
timezone | always | string | IANA time zone used for local date and time interpretation. |
| always | object | Unit system and per-dimension units for the returned values. See Units & time. | |
elevation | always | enum | Allowed: "m", "ft". |
percentage | always | enum | Always "%". |
precipitation | always | enum | Allowed: "mm", "in", "m". |
precipitation_rate | always | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | always | enum | Allowed: "hPa", "inHg", "Pa". |
system | always | enum | Allowed: "metric", "us", "si". |
temperature | always | enum | Allowed: "degC", "degF", "K". |
visibility | always | enum | Allowed: "km", "mi", "m". |
wind_speed | always | enum | Allowed: "km/h", "mph", "m/s". |
status | always | enum | Allowed: "active", "dry", "pending". |
start | always | ISO datetime | Start of the requested or returned time window. |
end | always | ISO datetime | End of the requested or returned time window. |
| always | array<object> | Precipitation and confidence variables returned minute by minute. | |
time | always | ISO datetime | UTC instant represented by this record. |
* | conditional | any | Additional selected variable fields may appear in minutes records. |
updated_at | nullable | ISO datetime | null | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
radar_pending | always | boolean | Value for radar pending. |
onset_uncertainty_minutes | nullable | integer | null | Value for onset uncertainty minutes. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Interactive example
curl 'https://api.weatherkind.com/v1/nowcast' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": {
"latitude": 39.1911,
"longitude": -106.8175
},
"timezone": "auto",
"units": "us"
}'{
"start": "2026-09-10T03:26:00Z",
"status": "dry",
"location": {
"timezone": "America/Denver",
"latitude": 39.1911,
"longitude": -106.8175,
"forecast_elevation_m": 2413
},
"end": "2026-09-10T05:26:00Z",
"minutes": [],
"warnings": [],
"units": {
"elevation": "ft",
"percentage": "%",
"precipitation": "in",
"precipitation_rate": "in/h",
"pressure": "inHg",
"system": "us",
"temperature": "degF",
"visibility": "mi",
"wind_speed": "mph"
},
"stale": false,
"updated_at": "2026-09-10T03:22:53Z",
"radar_pending": false,
"onset_uncertainty_minutes": null
}Dry for the next two hours at this location.
POST /v1/route
Forecasts a journey rather than a place. Give it a path and a schedule and it returns the weather at each point at the time you will actually be there — the storm over the pass at four o'clock, not the storm at the trailhead now.
Timing comes from one of two sources, never both. Either every
waypoint carries its own time, which is what to send
when your routing engine already knows the leg durations, or you
send a departure_time and a travel model
and the server paces the route. Hiking applies Naismith's rule with
Langmuir's descent correction, so a climb changes the arrival times
rather than being ignored.
Samples are cut by time, not distance, so a drive and a hike are
both resolved where their conditions actually change. Your own
waypoints are always returned, flagged waypoint: true.
Alongside the samples, summary carries the extremes and
the stretches that matter: where it rains, where it freezes, where
it blows.
Coverage degrades per sample rather than per request. A sample whose
region is still warming comes back with
status: "unavailable" and a reason while the rest of the
route resolves normally; a route running past the 384-hour horizon is
truncated with a route_truncated warning and a
coverage_end_time, not rejected.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | array<object> | At least 2 items. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
time | optional | ISO datetime | Arrival time at this waypoint. Required on all waypoints or none. |
departure_time | optional | string | An ISO 8601 timestamp, or "now" |
| optional | object | How the route is paced when waypoints carry no times. | |
mode | optional | enum | Hiking applies Naismith's rule with Langmuir's descent correction, so climbs and descents change the arrival times. Allowed: "cycling", "driving", "hiking". Default: "driving". |
speed | optional | number | Flat-ground pace in the request's wind-speed unit. |
| optional | object | Object containing interval. | |
interval | optional | enum | How often along the route to sample. Original waypoints are always returned. Allowed: "15m", "1h", "30m". Default: "30m". |
timezone | optional | string | auto or an IANA timezone Default: "auto". |
units | optional | enum | Allowed: "metric", "us", "si". Default: "metric". See Units & time. |
| optional | object | Optional per-dimension overrides for measurement units. See Units & time. | |
distance | optional | enum | Allowed: "m", "km", "ft", "mi". |
elevation | optional | enum | Allowed: "m", "ft". |
precipitation | optional | enum | Allowed: "mm", "in", "m". |
precipitation_rate | optional | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | optional | enum | Allowed: "hPa", "inHg", "Pa". |
temperature | optional | enum | Allowed: "degC", "degF", "K". |
visibility | optional | enum | Allowed: "km", "mi", "m". |
wind_speed | optional | enum | Allowed: "km/h", "mph", "m/s". |
variables | optional | array<string> | At least 1 item. See Variables. |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Object containing arrival time, coverage end time, departure time, distance, duration seconds, mode, sample interval, and timezone. | |
arrival_time | always | ISO datetime | Value for arrival time. |
coverage_end_time | nullable | ISO datetime | null | Last sample the forecast horizon reaches, when the route was truncated. |
departure_time | always | ISO datetime | Value for departure time. |
distance | always | number | Range: 0…∞. |
duration_seconds | always | integer | Range: 0…∞. |
mode | nullable | string | null | Null when the caller supplied waypoint times. |
sample_interval | conditional | string | Value for sample interval. |
timezone | conditional | string | Timezone at the departure point. |
| always | object | Unit system and per-dimension units for the returned values. See Units & time. | |
distance | always | enum | Allowed: "m", "km", "ft", "mi". |
elevation | always | enum | Allowed: "m", "ft". |
percentage | always | enum | Always "%". |
precipitation | always | enum | Allowed: "mm", "in", "m". |
precipitation_rate | always | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | always | enum | Allowed: "hPa", "inHg", "Pa". |
system | always | enum | Allowed: "metric", "us", "si". |
temperature | always | enum | Allowed: "degC", "degF", "K". |
visibility | always | enum | Allowed: "km", "mi", "m". |
wind_speed | always | enum | Allowed: "km/h", "mph", "m/s". |
| always | array<object> | List of records containing distance, elevation, index, latitude, longitude, status, time, timezone, type, unavailable reason, and waypoint, plus additional fields. | |
distance | conditional | number | Distance travelled from the start of the route. Range: 0…∞. |
elevation | nullable | number | null | Value for elevation. |
index | always | integer | Range: 0…∞. |
latitude | always | number | Latitude in decimal degrees. |
longitude | always | number | Longitude in decimal degrees. |
status | always | enum | Allowed: "ok", "unavailable". |
time | always | ISO datetime | UTC instant represented by this record. |
timezone | nullable | string | null | IANA time zone used for local date and time interpretation. |
type | conditional | enum | Allowed: "analysis", "forecast". |
unavailable_reason | conditional | enum | Present only when status is unavailable. Allowed: "warming", "timeout", "geography_unavailable", "provider_unavailable". |
waypoint | always | boolean | True for the caller's own waypoints, false for interpolated samples. |
* | conditional | any | Additional fields may appear in samples records. |
| always | object | Object containing extremes and windows. | |
| always | object | Keyed by variable and aggregate, for example temperature_min or wind_gust_max. Only requested variables appear. | |
* | conditional | object | Object containing index, latitude, longitude, time, and value. |
| always | array<object> | List of records containing end index, end time, peak, start index, start time, and type, plus additional fields. | |
end_index | always | integer | Range: 0…∞. |
end_time | always | ISO datetime | Value for end time. |
| conditional | object | Object containing index, latitude, longitude, time, and value. | |
index | always | integer | Range: 0…∞. |
latitude | always | number | Latitude in decimal degrees. |
longitude | always | number | Longitude in decimal degrees. |
time | always | ISO datetime | UTC instant represented by this record. |
value | always | number | string | Value for value. |
start_index | always | integer | Range: 0…∞. |
start_time | always | ISO datetime | Value for start time. |
type | always | enum | Precipitation covers a wet condition code or at least a 50% chance; freezing is at or below 0degC; high wind is gusts at or above 60km/h, or sustained wind at or above 40km/h when gusts were not requested. Allowed: "precipitation", "freezing", "high_wind". |
updated_at | nullable | ISO datetime | null | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Interactive example
curl 'https://api.weatherkind.com/v1/route' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"path": [
{
"latitude": 39.1911,
"longitude": -106.8175
},
{
"latitude": 39.0972,
"longitude": -106.9403
},
{
"latitude": 39.0736,
"longitude": -106.9556
},
{
"latitude": 39.0475,
"longitude": -106.986
},
{
"latitude": 39.0264,
"longitude": -107.0069
},
{
"latitude": 38.9819,
"longitude": -107.0353
},
{
"latitude": 38.9583,
"longitude": -106.9925
},
{
"latitude": 38.8997,
"longitude": -106.9656
},
{
"latitude": 38.8697,
"longitude": -106.9878
}
],
"departure_time": "now",
"travel": {
"mode": "hiking",
"speed": 2.5
},
"sample": {
"interval": "1h"
},
"units": "us",
"variables": [
"temperature",
"condition",
"precipitation_probability",
"wind_gust"
]
}'{
"warnings": [
{
"code": "stale_data",
"message": "One or more route segments are being served from stale data."
}
],
"units": {
"distance": "mi",
"elevation": "ft",
"percentage": "%",
"precipitation": "in",
"precipitation_rate": "in/h",
"pressure": "inHg",
"system": "us",
"temperature": "degF",
"visibility": "mi",
"wind_speed": "mph"
},
"route": {
"mode": "hiking",
"timezone": "America/Denver",
"arrival_time": "2026-09-10T16:56:44Z",
"distance": 28.28,
"duration_seconds": 48667,
"sample_interval": "1h",
"coverage_end_time": null,
"departure_time": "2026-09-10T03:25:37Z"
},
"stale": true,
"updated_at": "2026-09-10T02:21:39Z",
"summary": {
"windows": [],
"extremes": {
"precipitation_probability_max": {
"index": 18,
"value": 3,
"time": "2026-09-10T09:25:37-06:00",
"latitude": 38.91884,
"longitude": -106.97438
},
"temperature_max": {
"index": 21,
"value": 66.73,
"time": "2026-09-10T10:56:44-06:00",
"latitude": 38.8697,
"longitude": -106.9878
},
"temperature_min": {
"index": 8,
"value": 36,
"time": "2026-09-10T04:22:13-06:00",
"latitude": 39.0736,
"longitude": -106.9556
},
"wind_gust_max": {
"index": 2,
"value": 11.57,
"time": "2026-09-09T23:25:37-06:00",
"latitude": 39.15026,
"longitude": -106.87097
}
}
},
"samples": [
{
"index": 0,
"status": "ok",
"type": "forecast",
"time": "2026-09-09T21:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.1911,
"longitude": -106.8175,
"elevation": 7890.42,
"distance": 0,
"waypoint": true,
"condition": "clear-night",
"precipitation_probability": 0.43,
"temperature": 65.72,
"wind_gust": 8.72
},
{
"index": 1,
"status": "ok",
"type": "forecast",
"time": "2026-09-09T22:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.17068,
"longitude": -106.84424,
"elevation": 8123.36,
"distance": 2.01,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 0.57,
"temperature": 56.72,
"wind_gust": 5.15
},
{
"index": 2,
"status": "ok",
"type": "forecast",
"time": "2026-09-09T23:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.15026,
"longitude": -106.87097,
"elevation": 10853.02,
"distance": 4.02,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1.43,
"temperature": 50.72,
"wind_gust": 11.57
},
{
"index": 3,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T00:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.12983,
"longitude": -106.89769,
"elevation": 9169.95,
"distance": 6.03,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1.57,
"temperature": 50.72,
"wind_gust": 11.44
},
{
"index": 4,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T01:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.10939,
"longitude": -106.92438,
"elevation": 9835.96,
"distance": 8.04,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1.57,
"temperature": 44.57,
"wind_gust": 6.15
},
{
"index": 5,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T02:01:24-06:00",
"timezone": "America/Denver",
"latitude": 39.0972,
"longitude": -106.9403,
"elevation": 9662.07,
"distance": 9.24,
"waypoint": true,
"condition": "clear-night",
"precipitation_probability": 1,
"temperature": 42.98,
"wind_gust": 3.93
},
{
"index": 6,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T02:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.09314,
"longitude": -106.94293,
"elevation": 10377.3,
"distance": 9.55,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1,
"temperature": 42.57,
"wind_gust": 2.72
},
{
"index": 7,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T03:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.08309,
"longitude": -106.94945,
"elevation": 12365.49,
"distance": 10.33,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1,
"temperature": 39,
"wind_gust": 2.43
},
{
"index": 8,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T04:22:13-06:00",
"timezone": "America/Denver",
"latitude": 39.0736,
"longitude": -106.9556,
"elevation": 12844.49,
"distance": 11.07,
"waypoint": true,
"condition": "clear-night",
"precipitation_probability": 1,
"temperature": 36,
"wind_gust": 3.37
},
{
"index": 9,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T04:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.07208,
"longitude": -106.95737,
"elevation": 12224.41,
"distance": 11.21,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1,
"temperature": 38.57,
"wind_gust": 3
},
{
"index": 10,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T05:20:34-06:00",
"timezone": "America/Denver",
"latitude": 39.0475,
"longitude": -106.986,
"elevation": 11742.13,
"distance": 13.5,
"waypoint": true,
"condition": "clear-night",
"precipitation_probability": 1.34,
"temperature": 37,
"wind_gust": 5.03
},
{
"index": 11,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T05:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.04509,
"longitude": -106.98839,
"elevation": 11768.37,
"distance": 13.71,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 1.43,
"temperature": 37,
"wind_gust": 5.28
},
{
"index": 12,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T06:04:43-06:00",
"timezone": "America/Denver",
"latitude": 39.0264,
"longitude": -107.0069,
"elevation": 11532.15,
"distance": 15.34,
"waypoint": true,
"condition": "clear-night",
"precipitation_probability": 2,
"temperature": 40,
"wind_gust": 6.92
},
{
"index": 13,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T06:25:37-06:00",
"timezone": "America/Denver",
"latitude": 39.01511,
"longitude": -107.01411,
"elevation": 11938.98,
"distance": 16.21,
"waypoint": false,
"condition": "clear-night",
"precipitation_probability": 2,
"temperature": 40,
"wind_gust": 3.72
},
{
"index": 14,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T07:25:37-06:00",
"timezone": "America/Denver",
"latitude": 38.98269,
"longitude": -107.03479,
"elevation": 11476.38,
"distance": 18.71,
"waypoint": false,
"condition": "sun",
"precipitation_probability": 2,
"temperature": 40.28,
"wind_gust": 2.43
},
{
"index": 15,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T07:27:05-06:00",
"timezone": "America/Denver",
"latitude": 38.9819,
"longitude": -107.0353,
"elevation": 11351.71,
"distance": 18.77,
"waypoint": true,
"condition": "sun",
"precipitation_probability": 2,
"temperature": 40.35,
"wind_gust": 2.45
},
{
"index": 16,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T08:16:08-06:00",
"timezone": "America/Denver",
"latitude": 38.9583,
"longitude": -106.9925,
"elevation": 9521,
"distance": 21.59,
"waypoint": true,
"condition": "sun",
"precipitation_probability": 2.27,
"temperature": 46.69,
"wind_gust": 2.73
},
{
"index": 17,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T08:25:37-06:00",
"timezone": "America/Denver",
"latitude": 38.95291,
"longitude": -106.99003,
"elevation": 9432.41,
"distance": 21.98,
"waypoint": false,
"condition": "sun",
"precipitation_probability": 2.43,
"temperature": 50.27,
"wind_gust": 2.57
},
{
"index": 18,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T09:25:37-06:00",
"timezone": "America/Denver",
"latitude": 38.91884,
"longitude": -106.97438,
"elevation": 9799.87,
"distance": 24.48,
"waypoint": false,
"condition": "sun",
"precipitation_probability": 3,
"temperature": 53.71,
"wind_gust": 4.56
},
{
"index": 19,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T09:59:19-06:00",
"timezone": "America/Denver",
"latitude": 38.8997,
"longitude": -106.9656,
"elevation": 9396.33,
"distance": 25.89,
"waypoint": true,
"condition": "sun",
"precipitation_probability": 3,
"temperature": 58.93,
"wind_gust": 7.93
},
{
"index": 20,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T10:25:37-06:00",
"timezone": "America/Denver",
"latitude": 38.88596,
"longitude": -106.97577,
"elevation": 9153.54,
"distance": 26.98,
"waypoint": false,
"condition": "sun",
"precipitation_probability": 3,
"temperature": 61.13,
"wind_gust": 7
},
{
"index": 21,
"status": "ok",
"type": "forecast",
"time": "2026-09-10T10:56:44-06:00",
"timezone": "America/Denver",
"latitude": 38.8697,
"longitude": -106.9878,
"elevation": 8920.6,
"distance": 28.28,
"waypoint": true,
"condition": "sun",
"precipitation_probability": 3,
"temperature": 66.73,
"wind_gust": 7
}
]
}- clear-night
- sun
Each label reads arrival time, then temperature and conditions, then chance of precipitation and gust (degF, mph). Labels thin out where they would overlap; your own waypoints keep theirs.
POST /v1/airport-delay
Predicts weather-attributed delay severity and cancellation risk
for a supported US airport. With only airport and
hours, it returns an hourly outlook for the next 1–48
hours and marginalizes risk across the airport's destination
network. Add a scheduled departure and destination to score a
specific flight instead.
Each prediction includes disruption and cancellation
probabilities, an operated-flight delay distribution, data
freshness, and probabilistic attribution across delay drivers and
weather locations. destination_mode is
exact for a named route and marginalized
for the network outlook.
These probabilities cover BTS-attributed weather delay minutes and weather-coded cancellations, not all-cause disruption. Driver and cause values are calibrated statistical attribution, not proof of why a particular flight was disrupted.
| Field | Presence | Type | Notes |
|---|---|---|---|
airport | required | string | Global IATA or ICAO code |
destination | optional | string | Optional supported destination airport, identified by IATA or ICAO code. |
scheduled_departure_time | optional | ISO datetime | Value for scheduled departure time. |
scheduled_arrival_time | optional | ISO datetime | Value for scheduled arrival time. |
hours | optional | integer | Range: 1…48. Default: 48. |
destination requires
scheduled_departure_time.
scheduled_arrival_time additionally requires a
destination and must be later than departure. Departure must be no
more than one hour in the past and no more than 48 hours ahead.
Without a departure time, hours controls the hourly
outlook and defaults to 48.
| Field | Presence | Type | Notes |
|---|---|---|---|
destination_mode | always | enum | Allowed: "exact", "marginalized". |
destination_coverage | conditional | number | Range: 0…1. |
arrival_time_estimated | conditional | boolean | Value for arrival time estimated. |
issued_at | always | ISO datetime | Value for issued at. |
| always | array<object> | Airport-delay predictions for the requested departure or outlook hours. | |
cancellation_probability | always | number | Range: 0…1. |
| always | object | Probabilistic attribution across delay and cancellation categories. | |
* | conditional | any | Additional fields may appear in cause attribution records. |
| conditional | object | Issue times, staleness, observation age, and TAF/FAA availability for the origin and destination inputs. | |
* | conditional | any | Additional fields may appear in data freshness records. |
disruption_probability | always | number | Range: 0…1. |
driver_basis | conditional | enum | Allowed: "predictive_associations_not_confirmed_causes". |
| conditional | array<object> | List of records for drivers. | |
* | conditional | any | Additional fields may appear in drivers records. |
model_scope | always | string | Value for model scope. |
| always | object | Probability distribution for delay among flights that operate. | |
* | conditional | any | Additional fields may appear in operated delay records. |
risk_basis | always | enum | Allowed: "weather_attributed". |
* | conditional | any | Additional fields may appear in predictions records. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
* | conditional | any | Additional fields may appear in warnings records. |
risk_basis | always | string | Probabilities represent weather-attributed delay and cancellation risk, not all-cause disruption. |
serving_mode | always | enum | Climatology is served when no promoted weather-target model is available; candidate model residuals are never served. Allowed: "model", "climatology". |
* | conditional | any | Additional fields may appear in records. |
Probability fields are decimals from 0 through
1. Inspect risk_basis, freshness, model
version, and warnings before using a result operationally.
Use this endpoint
12-hour DEN outlook
curl 'https://api.weatherkind.com/v1/airport-delay' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"airport": "DEN",
"hours": 12
}'const response = await fetch("https://api.weatherkind.com/v1/airport-delay", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WEATHERKIND_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"airport": "DEN",
"hours": 12
}),
});
if (!response.ok) {
throw new Error(`Weatherkind returned ${response.status}`);
}
const data = await response.json();
console.log(data);import os
import requests
response = requests.post(
"https://api.weatherkind.com/v1/airport-delay",
headers={
"Authorization": f"Bearer {os.environ['WEATHERKIND_API_KEY']}"
},
json={
"airport": "DEN",
"hours": 12
},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"airport": "DEN",
"hours": 12
}`)
req, err := http.NewRequest("POST", "https://api.weatherkind.com/v1/airport-delay", body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("WEATHERKIND_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
log.Fatalf("Weatherkind returned %s", resp.Status)
}
var data any
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", data)
}body = %{
airport: "DEN",
hours: 12
}
response =
Req.post!(
"https://api.weatherkind.com/v1/airport-delay",
auth: {:bearer, System.fetch_env!("WEATHERKIND_API_KEY")},
json: body
)
IO.inspect(response.body)require "json"
require "net/http"
uri = URI("https://api.weatherkind.com/v1/airport-delay")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("WEATHERKIND_API_KEY")}"
request["Content-Type"] = "application/json"
request.body = JSON.generate(JSON.parse(<<~JSON))
{
"airport": "DEN",
"hours": 12
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
raise "Weatherkind returned #{response.code}" unless response.is_a?(Net::HTTPSuccess)
puts JSON.pretty_generate(JSON.parse(response.body)) POST /v1/airport-delay/accuracy
Returns verification for a supported airport and model version.
backtest reports out-of-sample historical evaluation;
live reports predictions captured and scored after
activation; and live_route_aware isolates predictions
made with a specific destination. The modes remain separate so a
strong backtest cannot obscure weak live performance.
A mode may return status: "insufficient_data" with a
null verification score. That is a valid response, not zero skill.
Lead buckets expose their sample counts and outcome-day coverage.
| Field | Presence | Type | Notes |
|---|---|---|---|
airport | required | string | Supported US airport, identified by IATA or ICAO code. |
window_months | optional | integer | Range: 3…24. Default: 12. |
model_version | optional | string | Airport-delay model version used for this result. |
| Field | Presence | Type | Notes |
|---|---|---|---|
risk_basis | always | enum | Allowed: "weather_attributed". |
| always | object | Out-of-sample model verification from the historical backtest. | |
* | conditional | any | Additional fields may appear in backtest records. |
| always | object | Verification for predictions captured and scored after model activation. | |
* | conditional | any | Additional fields may appear in live records. |
| conditional | object | Verification for predictions that used a specific destination. | |
* | conditional | any | Additional fields may appear in live route aware records. |
| always | object | Object keyed by the selected methodology variables. | |
* | conditional | any | Additional fields may appear in methodology records. |
updated_at | always | ISO datetime | Time at which the returned data was generated. |
* | conditional | any | Additional fields may appear in records. |
Use this endpoint
DEN verification
curl 'https://api.weatherkind.com/v1/airport-delay/accuracy' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"airport": "DEN",
"window_months": 12
}'const response = await fetch("https://api.weatherkind.com/v1/airport-delay/accuracy", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WEATHERKIND_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"airport": "DEN",
"window_months": 12
}),
});
if (!response.ok) {
throw new Error(`Weatherkind returned ${response.status}`);
}
const data = await response.json();
console.log(data);import os
import requests
response = requests.post(
"https://api.weatherkind.com/v1/airport-delay/accuracy",
headers={
"Authorization": f"Bearer {os.environ['WEATHERKIND_API_KEY']}"
},
json={
"airport": "DEN",
"window_months": 12
},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"airport": "DEN",
"window_months": 12
}`)
req, err := http.NewRequest("POST", "https://api.weatherkind.com/v1/airport-delay/accuracy", body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("WEATHERKIND_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
log.Fatalf("Weatherkind returned %s", resp.Status)
}
var data any
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", data)
}body = %{
airport: "DEN",
window_months: 12
}
response =
Req.post!(
"https://api.weatherkind.com/v1/airport-delay/accuracy",
auth: {:bearer, System.fetch_env!("WEATHERKIND_API_KEY")},
json: body
)
IO.inspect(response.body)require "json"
require "net/http"
uri = URI("https://api.weatherkind.com/v1/airport-delay/accuracy")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("WEATHERKIND_API_KEY")}"
request["Content-Type"] = "application/json"
request.body = JSON.generate(JSON.parse(<<~JSON))
{
"airport": "DEN",
"window_months": 12
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
raise "Weatherkind returned #{response.code}" unless response.is_a?(Net::HTTPSuccess)
puts JSON.pretty_generate(JSON.parse(response.body)) GET /v1/airport-delay/supported-airports
Lists the US airports currently qualified for airport-delay
prediction. Use this catalog to validate an origin or destination
before presenting the prediction flow, and read
feature_readiness to distinguish a ready model from a
pipeline that is still bootstrapping or degraded.
An IATA or ICAO code absent from this catalog is rejected by the
prediction and verification endpoints with 404; the
service never silently substitutes another airport.
| Field | Presence | Type | Notes |
|---|---|---|---|
request body | none | none | This endpoint is a GET |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | array<object> | US airports currently qualified for airport-delay prediction. | |
iata_code | always | string | Three-character IATA airport code. |
icao_code | always | string | Four-character ICAO airport code. |
name | always | string | Airport name. |
timezone | always | string | IANA time zone used for local operational features. |
qualification | always | object | Traffic and data-coverage evidence used to qualify the airport. |
count | always | integer | Number of airports in the catalog. |
feature_readiness | always | object | Current feature-pipeline state: bootstrapping, ready, or degraded, with supporting detail. |
updated_at | always | ISO datetime | Time at which the catalog response was generated. |
Use this endpoint
Supported airport catalog
curl 'https://api.weatherkind.com/v1/airport-delay/supported-airports' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY"const response = await fetch("https://api.weatherkind.com/v1/airport-delay/supported-airports", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.WEATHERKIND_API_KEY}`,
},
});
if (!response.ok) {
throw new Error(`Weatherkind returned ${response.status}`);
}
const data = await response.json();
console.log(data);import os
import requests
response = requests.get(
"https://api.weatherkind.com/v1/airport-delay/supported-airports",
headers={
"Authorization": f"Bearer {os.environ['WEATHERKIND_API_KEY']}"
},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
)
func main() {
var body io.Reader
req, err := http.NewRequest("GET", "https://api.weatherkind.com/v1/airport-delay/supported-airports", body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("WEATHERKIND_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
log.Fatalf("Weatherkind returned %s", resp.Status)
}
var data any
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", data)
}response =
Req.get!(
"https://api.weatherkind.com/v1/airport-delay/supported-airports",
auth: {:bearer, System.fetch_env!("WEATHERKIND_API_KEY")}
)
IO.inspect(response.body)require "json"
require "net/http"
uri = URI("https://api.weatherkind.com/v1/airport-delay/supported-airports")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("WEATHERKIND_API_KEY")}"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
raise "Weatherkind returned #{response.code}" unless response.is_a?(Net::HTTPSuccess)
puts JSON.pretty_generate(JSON.parse(response.body)) POST /v1/outlook
Returns a long-range daily outlook for local dates 15 to 365 days
ahead. It is designed for seasonal planning and broad temperature
or precipitation tendencies, not precise event timing. Uncertainty
is higher than /v1/forecast, so use the forecast for
the next two weeks and the outlook for the period beyond it.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | object | Coordinates and optional time zone for the location being queried. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
timezone | optional | string | auto or an IANA timezone Default: "auto". |
units | optional | enum | Allowed: "metric", "us", "si". Default: "metric". See Units & time. |
| optional | object | Optional per-dimension overrides for measurement units. See Units & time. | |
elevation | optional | enum | Allowed: "m", "ft". |
precipitation | optional | enum | Allowed: "mm", "in", "m". |
precipitation_rate | optional | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | optional | enum | Allowed: "hPa", "inHg", "Pa". |
temperature | optional | enum | Allowed: "degC", "degF", "K". |
visibility | optional | enum | Allowed: "km", "mi", "m". |
wind_speed | optional | enum | Allowed: "km/h", "mph", "m/s". |
start | required | local date | First local date, inclusive |
end | required | local date | Last local date, inclusive |
variables | required | array<string> | At least 1 item. See Variables. |
| Field | Presence | Type | Notes |
|---|---|---|---|
location | required | object | Outlook coordinate |
latitude | required | number | −90…90 |
longitude | required | number | −180…180 |
timezone | optional | string | "auto" by default, or an IANA zone; defines local dates |
units | optional | string | Defaults to "metric" (°C and mm); also accepts "us" or "si" |
unit_overrides | optional | object | Override the measurement dimensions used by daily outlook variables |
temperature | optional | enum | degC, degF, or K |
precipitation | optional | enum | mm, in, or m |
start | required | local date | First date returned, 15–365 days ahead |
end | required | local date | Last date returned, inclusive |
variables | required | string[] | Daily temperature and precipitation variables |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Coordinates and optional time zone for the location being queried. | |
forecast_elevation_m | nullable | number | null | Representative forecast elevation, in metres. |
latitude | always | number | Latitude in decimal degrees. |
longitude | always | number | Longitude in decimal degrees. |
timezone | always | string | IANA time zone used for local date and time interpretation. |
| always | object | Unit system and per-dimension units for the returned values. See Units & time. | |
elevation | always | enum | Allowed: "m", "ft". |
percentage | always | enum | Always "%". |
precipitation | always | enum | Allowed: "mm", "in", "m". |
precipitation_rate | always | enum | Allowed: "mm/h", "in/h", "m/s". |
pressure | always | enum | Allowed: "hPa", "inHg", "Pa". |
system | always | enum | Allowed: "metric", "us", "si". |
temperature | always | enum | Allowed: "degC", "degF", "K". |
visibility | always | enum | Allowed: "km", "mi", "m". |
wind_speed | always | enum | Allowed: "km/h", "mph", "m/s". |
| conditional | object | Current conditions at the requested location. | |
* | conditional | any | Additional selected variable fields may appear in current records. |
| conditional | array<object> | Weather variables returned at 15-minute intervals. | |
time | always | ISO datetime | UTC instant represented by this record. |
* | conditional | any | Additional selected variable fields may appear in quarter hourly records. |
| conditional | array<object> | Weather variables returned at hourly intervals. | |
time | always | ISO datetime | UTC instant represented by this record. |
* | conditional | any | Additional selected variable fields may appear in hourly records. |
| conditional | array<object> | Daily weather variables for the requested dates. | |
date | always | local date | Local calendar date represented by this record. |
* | conditional | any | Additional selected variable fields may appear in daily records. |
updated_at | nullable | ISO datetime | null | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Interactive example
curl 'https://api.weatherkind.com/v1/outlook' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": {
"latitude": 39.1911,
"longitude": -106.8175
},
"units": "us",
"start": "2026-09-25",
"end": "2026-12-24",
"variables": [
"temperature_max",
"temperature_min",
"precipitation"
]
}'{
"location": {
"timezone": "America/Denver",
"latitude": 39.1911,
"longitude": -106.8175,
"forecast_elevation_m": 2405
},
"warnings": [
{
"code": "climatology_data",
"message": "Climatology values are expected conditions for the time of year, not predictions for a specific day.",
"interval": "1d"
}
],
"units": {
"elevation": "ft",
"percentage": "%",
"precipitation": "in",
"precipitation_rate": "in/h",
"pressure": "inHg",
"system": "us",
"temperature": "degF",
"visibility": "mi",
"wind_speed": "mph"
},
"stale": false,
"updated_at": "2026-09-10T02:21:31Z",
"daily": [
{
"basis": "ensemble",
"date": "2026-09-25",
"precipitation": 0.06,
"temperature_max": 59.09,
"temperature_min": 38.93,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-09-26",
"precipitation": 0.07,
"temperature_max": 58.19,
"temperature_min": 38.03,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-09-27",
"precipitation": 0.06,
"temperature_max": 57.29,
"temperature_min": 36.23,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-09-28",
"precipitation": 0.07,
"temperature_max": 59.09,
"temperature_min": 37.13,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-09-29",
"precipitation": 0.11,
"temperature_max": 57.65,
"temperature_min": 38.21,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-09-30",
"precipitation": 0.07,
"temperature_max": 56.75,
"temperature_min": 37.11,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-01",
"precipitation": 0.07,
"temperature_max": 56.75,
"temperature_min": 36.61,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-02",
"precipitation": 0.07,
"temperature_max": 56.03,
"temperature_min": 36.59,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-03",
"precipitation": 0.06,
"temperature_max": 55.31,
"temperature_min": 35.33,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-04",
"precipitation": 0.07,
"temperature_max": 55.85,
"temperature_min": 34.97,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-05",
"precipitation": 0.11,
"temperature_max": 54.95,
"temperature_min": 35.51,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-06",
"precipitation": 0.06,
"temperature_max": 55.13,
"temperature_min": 35.69,
"type": "climate_outlook"
},
{
"basis": "ensemble",
"date": "2026-10-07",
"precipitation": 0.15,
"temperature_max": 52.79,
"temperature_min": 35.15,
"type": "climate_outlook"
},
{
"basis": "ensemble_climatology_blend",
"date": "2026-10-08",
"precipitation": 0.06,
"temperature_max": 53.78,
"temperature_min": 33.03,
"type": "climate_outlook"
},
{
"basis": "ensemble_climatology_blend",
"date": "2026-10-09",
"precipitation": 0.07,
"temperature_max": 54.72,
"temperature_min": 32.88,
"type": "climate_outlook"
},
{
"basis": "ensemble_climatology_blend",
"date": "2026-10-10",
"precipitation": 0.07,
"temperature_max": 56.81,
"temperature_min": 33.03,
"type": "climate_outlook"
},
{
"basis": "ensemble_climatology_blend",
"date": "2026-10-11",
"precipitation": 0.07,
"temperature_max": 55.9,
"temperature_min": 33.12,
"type": "climate_outlook"
},
{
"basis": "ensemble_climatology_blend",
"date": "2026-10-12",
"precipitation": 0.09,
"temperature_max": 57.25,
"temperature_min": 31.35,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-13",
"precipitation": 0.06,
"temperature_max": 58.4,
"temperature_min": 31.41,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-14",
"precipitation": 0.07,
"temperature_max": 58.33,
"temperature_min": 31.62,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-15",
"precipitation": 0.08,
"temperature_max": 57.38,
"temperature_min": 30.5,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-16",
"precipitation": 0.06,
"temperature_max": 58.61,
"temperature_min": 30.74,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-17",
"precipitation": 0.05,
"temperature_max": 58.6,
"temperature_min": 30.24,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-18",
"precipitation": 0.07,
"temperature_max": 57.76,
"temperature_min": 29.99,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-19",
"precipitation": 0.07,
"temperature_max": 56.59,
"temperature_min": 29.74,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-20",
"precipitation": 0.04,
"temperature_max": 57.64,
"temperature_min": 30.4,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-21",
"precipitation": 0.05,
"temperature_max": 57.27,
"temperature_min": 29.62,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-22",
"precipitation": 0.03,
"temperature_max": 57.15,
"temperature_min": 29.79,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-23",
"precipitation": 0.07,
"temperature_max": 55.07,
"temperature_min": 28.67,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-24",
"precipitation": 0.1,
"temperature_max": 57.06,
"temperature_min": 28.07,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-25",
"precipitation": 0.03,
"temperature_max": 55.77,
"temperature_min": 27.62,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-26",
"precipitation": 0.09,
"temperature_max": 54.71,
"temperature_min": 26.33,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-27",
"precipitation": 0.07,
"temperature_max": 53.49,
"temperature_min": 25.77,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-28",
"precipitation": 0.05,
"temperature_max": 52.77,
"temperature_min": 26.1,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-29",
"precipitation": 0.1,
"temperature_max": 51.23,
"temperature_min": 25.98,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-30",
"precipitation": 0.04,
"temperature_max": 50.65,
"temperature_min": 24.92,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-10-31",
"precipitation": 0.08,
"temperature_max": 50.1,
"temperature_min": 25.87,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-01",
"precipitation": 0.09,
"temperature_max": 49.28,
"temperature_min": 25.97,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-02",
"precipitation": 0.09,
"temperature_max": 49.49,
"temperature_min": 25.67,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-03",
"precipitation": 0.07,
"temperature_max": 50.05,
"temperature_min": 24.81,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-04",
"precipitation": 0.05,
"temperature_max": 49.54,
"temperature_min": 24.39,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-05",
"precipitation": 0.07,
"temperature_max": 50.37,
"temperature_min": 24.75,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-06",
"precipitation": 0.07,
"temperature_max": 49.67,
"temperature_min": 25.44,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-07",
"precipitation": 0.01,
"temperature_max": 49.43,
"temperature_min": 24.74,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-08",
"precipitation": 0.07,
"temperature_max": 50.48,
"temperature_min": 25.25,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-09",
"precipitation": 0.15,
"temperature_max": 49.98,
"temperature_min": 23.58,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-10",
"precipitation": 0.1,
"temperature_max": 47.73,
"temperature_min": 23.27,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-11",
"precipitation": 0.08,
"temperature_max": 47.39,
"temperature_min": 22.41,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-12",
"precipitation": 0.05,
"temperature_max": 46.51,
"temperature_min": 21.91,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-13",
"precipitation": 0.05,
"temperature_max": 46.23,
"temperature_min": 20.86,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-14",
"precipitation": 0.12,
"temperature_max": 46.22,
"temperature_min": 21.68,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-15",
"precipitation": 0.06,
"temperature_max": 44.37,
"temperature_min": 19.96,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-16",
"precipitation": 0.04,
"temperature_max": 44.8,
"temperature_min": 19.37,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-17",
"precipitation": 0.06,
"temperature_max": 45.1,
"temperature_min": 21.01,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-18",
"precipitation": 0.06,
"temperature_max": 43.19,
"temperature_min": 19.14,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-19",
"precipitation": 0.05,
"temperature_max": 42.61,
"temperature_min": 18.58,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-20",
"precipitation": 0.03,
"temperature_max": 44.04,
"temperature_min": 18.63,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-21",
"precipitation": 0.06,
"temperature_max": 45.19,
"temperature_min": 18.85,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-22",
"precipitation": 0.06,
"temperature_max": 43.38,
"temperature_min": 18.8,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-23",
"precipitation": 0.06,
"temperature_max": 42.95,
"temperature_min": 17.38,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-24",
"precipitation": 0.07,
"temperature_max": 41.83,
"temperature_min": 18.07,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-25",
"precipitation": 0.06,
"temperature_max": 41.05,
"temperature_min": 16.67,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-26",
"precipitation": 0.1,
"temperature_max": 39.33,
"temperature_min": 16.02,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-27",
"precipitation": 0.12,
"temperature_max": 37.54,
"temperature_min": 14.55,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-28",
"precipitation": 0.09,
"temperature_max": 38.58,
"temperature_min": 13.7,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-29",
"precipitation": 0.08,
"temperature_max": 37.58,
"temperature_min": 15.55,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-11-30",
"precipitation": 0.04,
"temperature_max": 37.81,
"temperature_min": 14.14,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-01",
"precipitation": 0.08,
"temperature_max": 37.33,
"temperature_min": 14.41,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-02",
"precipitation": 0.07,
"temperature_max": 37.72,
"temperature_min": 14.1,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-03",
"precipitation": 0.06,
"temperature_max": 38.43,
"temperature_min": 14.76,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-04",
"precipitation": 0.06,
"temperature_max": 38.95,
"temperature_min": 14.19,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-05",
"precipitation": 0.04,
"temperature_max": 38.4,
"temperature_min": 13.75,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-06",
"precipitation": 0.07,
"temperature_max": 37.91,
"temperature_min": 13.86,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-07",
"precipitation": 0.08,
"temperature_max": 37.33,
"temperature_min": 13.81,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-08",
"precipitation": 0.06,
"temperature_max": 36.94,
"temperature_min": 12.97,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-09",
"precipitation": 0.09,
"temperature_max": 35.89,
"temperature_min": 12.43,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-10",
"precipitation": 0.04,
"temperature_max": 35.53,
"temperature_min": 11.38,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-11",
"precipitation": 0.06,
"temperature_max": 36.49,
"temperature_min": 13.97,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-12",
"precipitation": 0.05,
"temperature_max": 37.15,
"temperature_min": 12.94,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-13",
"precipitation": 0.06,
"temperature_max": 36.49,
"temperature_min": 12.45,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-14",
"precipitation": 0.09,
"temperature_max": 34.86,
"temperature_min": 12.39,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-15",
"precipitation": 0.06,
"temperature_max": 34.66,
"temperature_min": 11.44,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-16",
"precipitation": 0.05,
"temperature_max": 34.09,
"temperature_min": 9.65,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-17",
"precipitation": 0.07,
"temperature_max": 34.26,
"temperature_min": 10.98,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-18",
"precipitation": 0.03,
"temperature_max": 35.08,
"temperature_min": 10.63,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-19",
"precipitation": 0.07,
"temperature_max": 34.41,
"temperature_min": 11.57,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-20",
"precipitation": 0.06,
"temperature_max": 35.88,
"temperature_min": 12.47,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-21",
"precipitation": 0.08,
"temperature_max": 35.88,
"temperature_min": 12.91,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-22",
"precipitation": 0.09,
"temperature_max": 33.81,
"temperature_min": 11.6,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-23",
"precipitation": 0.08,
"temperature_max": 33.87,
"temperature_min": 11.06,
"type": "climate_outlook"
},
{
"basis": "climatology",
"date": "2026-12-24",
"precipitation": 0.09,
"temperature_max": 32.69,
"temperature_min": 7.71,
"type": "climate_outlook"
}
]
}type climate_outlookPOST /v1/historical
Returns field-selectable daily weather observations for completed
local dates. Use it for backtesting, event reconstruction, and
observed weather history—not forecast-performance metrics, which
come from /v1/accuracy.
Coverage depends on the location, date, and variable; missing
observations remain in the response as null with
structured warnings.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | object | Coordinates and optional time zone for the location being queried. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
timezone | optional | string | auto or an IANA timezone Default: "auto". |
units | optional | enum | Allowed: "metric", "us", "si". Default: "metric". See Units & time. |
| optional | object | Optional per-dimension overrides for measurement units. See Units & time. | |
precipitation | optional | enum | Allowed: "mm", "in", "m". |
temperature | optional | enum | Allowed: "degC", "degF", "K". |
start | required | local date | First local date, inclusive |
end | required | local date | Last local date, inclusive |
variables | required | array<string> | At least 1 item. See Historical variables. |
include | optional | array<string> | Default: []. |
| Field | Presence | Type | Notes |
|---|---|---|---|
location | required | object | Observation coordinate |
latitude | required | number | −90…90 |
longitude | required | number | −180…180 |
timezone | optional | string | "auto" by default, or an IANA zone; defines local calendar days |
units | optional | string | Defaults to "metric" (°C and mm); also accepts "us" or "si". Use unit_overrides for individual dimensions |
unit_overrides | optional | object | Override historical measurement dimensions |
temperature | optional | enum | degC, degF, or K |
precipitation | optional | enum | mm, in, or m |
start | required | local date | First completed local date, inclusive |
end | required | local date | Last completed local date, inclusive; the range may span up to 50 calendar years |
variables | required | string[] | One or more historical variables; at most 25,000 scalar values |
include | optional | string[] | "stations" and/or "sources" adds observation provenance |
Requests containing air_quality_index may span at
most 366 days. Other variables may span up to 50 calendar years,
subject to the 25,000-value request limit.
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Coordinates and optional time zone for the location being queried. | |
latitude | always | number | Latitude in decimal degrees. |
longitude | always | number | Longitude in decimal degrees. |
timezone | always | string | IANA time zone used for local date and time interpretation. |
| always | object | Unit system and per-dimension units for the returned values. See Units & time. | |
precipitation | always | enum | Allowed: "mm", "in", "m". |
system | always | enum | Allowed: "metric", "us", "si". |
temperature | always | enum | Allowed: "degC", "degF", "K". |
start | always | local date | First local date, inclusive |
end | always | local date | Last local date, inclusive |
| always | array<object> | Daily weather variables for the requested dates. | |
date | always | local date | Local calendar date represented by this record. |
* | conditional | any | Additional selected variable fields may appear in daily records. |
| conditional | array<object> | Data-source provenance for the returned observations. | |
* | conditional | any | Additional fields may appear in sources records. |
| conditional | array<object> | Weather stations contributing observations to the result. | |
* | conditional | any | Additional fields may appear in stations records. |
updated_at | nullable | ISO datetime | null | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Interactive example
curl 'https://api.weatherkind.com/v1/historical' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": {
"latitude": 39.1911,
"longitude": -106.8175
},
"timezone": "auto",
"units": "us",
"start": "2025-06-01",
"end": "2025-07-01",
"variables": [
"temperature_max",
"temperature_min",
"precipitation",
"rain_total",
"snow_total"
],
"include": [
"stations",
"sources"
]
}'{
"start": "2025-06-01",
"sources": [
{
"id": "ghcn_daily",
"label": "NOAA Global Historical Climatology Network Daily",
"variables": [
"temperature_max",
"temperature_min",
"precipitation",
"rain_total",
"snow_total"
],
"kind": "station_observation"
},
{
"id": "acis_station_observations",
"label": "Applied Climate Information System station observations",
"variables": [
"temperature_max",
"temperature_min",
"precipitation"
],
"kind": "station_observation"
}
],
"location": {
"timezone": "America/Denver",
"latitude": 39.1911,
"longitude": -106.8175
},
"end": "2025-07-01",
"warnings": [],
"units": {
"precipitation": "in",
"system": "us",
"temperature": "degF"
},
"stale": false,
"updated_at": "2026-09-09T18:17:15Z",
"stations": [
{
"code": "93073 1",
"name": "ASPEN PITKIN COUNTY AP SARDY FIELD",
"location": {
"latitude": 39.22994,
"longitude": -106.87052
},
"elevation_m": 2339.9496,
"distance_km": 6.286,
"observation_source": "acis_station_observations",
"observed_variables": [
"precipitation",
"temperature_max",
"temperature_min"
]
},
{
"code": "USC00050372",
"name": "ASPEN 1SW",
"location": {
"latitude": 39.1853,
"longitude": -106.8381
},
"elevation_m": 2491.7,
"distance_km": 1.794,
"observation_source": "ghcn_daily",
"observed_variables": [
"precipitation",
"rain_total",
"snow_total",
"temperature_max",
"temperature_min"
]
}
],
"daily": [
{
"date": "2025-06-01",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 79.24,
"temperature_min": 43.24
},
{
"date": "2025-06-02",
"precipitation": 0.27,
"rain_total": 0.27,
"snow_total": 0,
"temperature_max": 71.24,
"temperature_min": 43.24
},
{
"date": "2025-06-03",
"precipitation": 0.07,
"rain_total": 0.07,
"snow_total": 0,
"temperature_max": 67.24,
"temperature_min": 45.24
},
{
"date": "2025-06-04",
"precipitation": 0.01,
"rain_total": 0.01,
"snow_total": 0,
"temperature_max": 65.24,
"temperature_min": 39.24
},
{
"date": "2025-06-05",
"precipitation": 0.01,
"rain_total": 0.01,
"snow_total": 0,
"temperature_max": 61.24,
"temperature_min": 37.24
},
{
"date": "2025-06-06",
"precipitation": 0.07,
"rain_total": 0.07,
"snow_total": 0,
"temperature_max": 59.24,
"temperature_min": 37.24
},
{
"date": "2025-06-07",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 71.24,
"temperature_min": 33.24
},
{
"date": "2025-06-08",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 74.24,
"temperature_min": 41.24
},
{
"date": "2025-06-09",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 77.24,
"temperature_min": 40.24
},
{
"date": "2025-06-10",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 74.95,
"temperature_min": 45.97
},
{
"date": "2025-06-11",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 76.24,
"temperature_min": 45.24
},
{
"date": "2025-06-12",
"precipitation": 0.03,
"rain_total": 0.03,
"snow_total": 0,
"temperature_max": 80.24,
"temperature_min": 46.24
},
{
"date": "2025-06-13",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 80.24,
"temperature_min": 49.24
},
{
"date": "2025-06-14",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 82.24,
"temperature_min": 43.24
},
{
"date": "2025-06-15",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 84.24,
"temperature_min": 45.24
},
{
"date": "2025-06-16",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 83.24,
"temperature_min": 45.24
},
{
"date": "2025-06-17",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 74.24,
"temperature_min": 46.24
},
{
"date": "2025-06-18",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 78.24,
"temperature_min": 40.24
},
{
"date": "2025-06-19",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 84.24,
"temperature_min": 46.24
},
{
"date": "2025-06-20",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 84.24,
"temperature_min": 47.24
},
{
"date": "2025-06-21",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 84.24,
"temperature_min": 47.24
},
{
"date": "2025-06-22",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 76.24,
"temperature_min": 43.24
},
{
"date": "2025-06-23",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 80.24,
"temperature_min": 37.24
},
{
"date": "2025-06-24",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 76.24,
"temperature_min": 43.24
},
{
"date": "2025-06-25",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 76.24,
"temperature_min": 45.24
},
{
"date": "2025-06-26",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 79.24,
"temperature_min": 38.24
},
{
"date": "2025-06-27",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 81.24,
"temperature_min": 43.24
},
{
"date": "2025-06-28",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 83.24,
"temperature_min": 44.24
},
{
"date": "2025-06-29",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 81.24,
"temperature_min": 47.24
},
{
"date": "2025-06-30",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 83.24,
"temperature_min": 42.24
},
{
"date": "2025-07-01",
"precipitation": 0,
"rain_total": 0,
"snow_total": 0,
"temperature_max": 79.24,
"temperature_min": 48.24
}
]
}POST /v1/alerts
Returns active public weather alerts that apply to the requested
coordinate. Each alert includes CAP-aligned severity, urgency,
certainty, onset and expiration times, instructions, and the
issuing authority; request geometry when you also need the affected
polygon. A successful response with an empty alerts
array means no public alert is active at that point.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | object | Coordinates and optional time zone for the location being queried. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
include | optional | array<string> | Default: []. |
| Field | Presence | Type | Notes |
|---|---|---|---|
location | required | object | Alert lookup coordinate |
latitude | required | number | −90…90 |
longitude | required | number | −180…180 |
include | optional | string[] | Add "geometry" to return the GeoJSON polygon |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Coordinates and optional time zone for the location being queried. | |
latitude | always | number | Range: -90…90. |
longitude | always | number | Range: -180…180. |
| always | array<object> | Active public alerts affecting the requested location. | |
| always | array<object> | Geographic areas covered by the alert. | |
description | always | string | Value for description. |
categories | always | array<string> | List of string values. |
certainty | always | enum | Allowed: "observed", "likely", "possible", "unlikely", "unknown". |
description | nullable | string | null | Value for description. |
effective_at | nullable | ISO datetime | null | Value for effective at. |
ends_at | nullable | ISO datetime | null | Value for ends at. |
event | nullable | string | null | Value for event. |
expires_at | nullable | ISO datetime | null | Value for expires at. |
| nullable | object | null | Present only when geometry is requested. | |
* | conditional | any | Additional fields may appear in geometry records. |
headline | nullable | string | null | Value for headline. |
id | always | string | Stable public identifier for this alert message |
instruction | nullable | string | null | Value for instruction. |
| always | object | Authority that issued the alert. | |
name | nullable | string | null | Value for name. |
language | always | string | Value for language. |
message_type | always | enum | Allowed: "alert", "update", "cancel", "ack", "error". |
onset_at | nullable | ISO datetime | null | Value for onset at. |
references | always | array<string> | List of string values. |
response_types | always | array<string> | List of string values. |
sent_at | nullable | ISO datetime | null | Value for sent at. |
severity | always | enum | Allowed: "extreme", "severe", "moderate", "minor", "unknown". |
status | always | enum | Allowed: "actual", "exercise", "system", "test", "draft". |
urgency | always | enum | Allowed: "immediate", "expected", "future", "past", "unknown". |
updated_at | always | ISO datetime | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Interactive example
curl 'https://api.weatherkind.com/v1/alerts' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": {
"latitude": 39.1911,
"longitude": -106.8175
}
}'{
"location": {
"latitude": 39.1911,
"longitude": -106.8175
},
"warnings": [],
"stale": false,
"updated_at": "2026-09-10T03:25:38Z",
"alerts": []
}No active alerts at this point right now. Quiet skies. Try coordinates under a storm.
POST /v1/accuracy
Returns historical forecast-performance statistics, not current
weather. Query a coordinate, weather region, or the full verified
network to see error and skill by interval and lead time, scored
against quality-controlled station observations. Use it to
understand expected uncertainty, compare Weatherkind with a
persistence baseline, and qualify decisions made from
/v1/forecast.
| Field | Presence | Type | Notes |
|---|---|---|---|
| required | object | Geographic scope used to select the accuracy evaluation area. | |
| conditional | object | Coordinates and optional time zone for the location being queried. | |
latitude | required | number | Range: -90…90. |
longitude | required | number | Range: -180…180. |
type | required | enum | Allowed: "local", "region", "network". |
region | conditional | enum | Allowed: "mountain", "arid_interior", "pacific_coast", "northern_continental", "central_plains", "humid_east", "gulf_coast", "tropical", "arctic". |
days | optional | integer | Range: 7…365. Default: 30. |
units | optional | enum | Allowed: "metric", "us", "si". Default: "metric". See Units & time. |
| optional | object | Optional per-dimension overrides for measurement units. See Units & time. | |
precipitation | optional | enum | Allowed: "mm", "in", "m". |
temperature | optional | enum | Allowed: "degC", "degF", "K". |
| optional | object | Forecast variables returned minute by minute for accuracy scoring. | |
lead_minutes | optional | array<integer> | At least 1 item. |
variables | required | array<string> | At least 1 item. See Sections, leads & variables. |
| optional | object | Weather variables returned at hourly intervals. | |
lead_hours | optional | array<integer> | At least 1 item. |
variables | required | array<string> | At least 1 item. See Sections, leads & variables. |
| optional | object | Daily weather variables for the requested dates. | |
lead_days | optional | array<integer> | At least 1 item. |
variables | required | array<string> | At least 1 item. See Sections, leads & variables. |
compare_to | optional | array<string> | Default: []. |
include | optional | array<string> | Default: []. |
| Field | Presence | Type | Notes |
|---|---|---|---|
scope | required | object | Evaluation scope |
type | required | enum | "local", "region", or "network" |
location | local only | object | Coordinate evaluated for local scope |
latitude | required | number | −90…90 |
longitude | required | number | −180…180 |
region | region only | string | Region id |
days | optional | integer | Trailing window, 7–365; default 30 |
units | optional | string | Defaults to "metric" (°C and mm); also accepts "us" or "si". Dimension overrides are supported |
unit_overrides | optional | object | Override accuracy metric dimensions |
temperature | optional | enum | degC, degF, or K |
precipitation | optional | enum | mm, in, or m |
minutely | at least one | object | Minute-forecast accuracy section |
lead_minutes | optional | integer[] | Minute leads to evaluate; defaults are listed below |
variables | required | string[] | Minutely variables to evaluate |
hourly | at least one | object | Hourly-forecast accuracy section |
lead_hours | optional | integer[] | Hourly leads to evaluate; defaults are listed below |
variables | required | string[] | Hourly variables to evaluate |
daily | at least one | object | Daily-forecast accuracy section |
lead_days | optional | integer[] | Daily leads to evaluate; defaults are listed below |
variables | required | string[] | Daily variables to evaluate |
compare_to | optional | string[] | ["persistence"] adds baseline comparisons and skill scores |
include | optional | string[] | ["stations"] adds verifying stations for local scope |
Sections, leads & variables
| Section | Default leads | Variables |
|---|---|---|
1m | 5, 15, 30, 60, 90, 115 min | precipitation, precipitation_probability |
1h | 0, 1, 2, 3, 6, 12, 24 h | temperature, precipitation fields |
1d | 1–14 days | daily temperature and precipitation fields |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | object | Geographic scope used to select the accuracy evaluation area. | |
* | conditional | any | Additional fields may appear in scope records. |
| always | object | Date window and data cutoff used for this evaluation. | |
data_through | nullable | local date | null | Value for data through. |
days | always | integer | Value for days. |
end | always | local date | End of the requested or returned time window. |
start | always | local date | Start of the requested or returned time window. |
* | conditional | any | Additional fields may appear in evaluation period records. |
| always | object | Availability and verification coverage for this accuracy result. | |
available | always | boolean | Value for available. |
basis | always | string | Value for basis. |
radius_km | conditional | number | Value for radius km. |
verified_areas | always | integer | Value for verified areas. |
* | conditional | any | Additional fields may appear in coverage records. |
| always | object | Unit system and per-dimension units for the returned values. See Units & time. | |
precipitation | always | enum | Allowed: "mm", "in", "m". |
system | always | enum | Allowed: "metric", "us", "si". |
temperature | always | enum | Allowed: "degC", "degF", "K". |
| conditional | array<object> | Forecast variables returned minute by minute for accuracy scoring. | |
lead_minutes | always | integer | Range: 0…∞. |
* | conditional | any | Additional selected variable fields may appear in minutely records. |
| conditional | array<object> | Weather variables returned at hourly intervals. | |
lead_hours | always | integer | Range: 0…∞. |
* | conditional | any | Additional selected variable fields may appear in hourly records. |
| conditional | array<object> | Daily weather variables for the requested dates. | |
lead_days | always | integer | Range: 0…∞. |
* | conditional | any | Additional selected variable fields may appear in daily records. |
| conditional | array<object> | Weather stations contributing observations to the result. | |
* | conditional | any | Additional fields may appear in stations records. |
updated_at | always | ISO datetime | Time at which the returned data was generated. |
stale | always | boolean | Whether the response was served from resilient cache. |
| always | array<object> | Non-fatal notices about coverage, freshness, or substitutions. | |
code | always | string | Stable machine-readable code for this notice. |
message | always | string | Human-readable detail for this notice. |
* | conditional | any | Additional fields may appear in warnings records. |
Insufficient verified coverage is returned as a successful response with coverage.available: false, not as an error.
Interactive example
curl 'https://api.weatherkind.com/v1/accuracy' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"type": "local",
"location": {
"latitude": 39.1911,
"longitude": -106.8175
}
},
"days": 30,
"units": "us",
"hourly": {
"lead_hours": [
1,
6,
12,
24
],
"variables": [
"temperature",
"precipitation_probability"
]
},
"daily": {
"variables": [
"temperature_max",
"temperature_min"
]
},
"compare_to": [
"persistence"
],
"include": [
"stations"
]
}'{
"scope": {
"type": "local",
"location": {
"latitude": 39.1911,
"longitude": -106.8175
}
},
"evaluation_period": {
"start": "2026-06-30",
"end": "2026-07-30",
"data_through": "2026-07-29",
"days": 30
},
"coverage": {
"available": true,
"basis": "nearby_verified_areas",
"radius_km": 16.1,
"verified_areas": 18
},
"units": {
"system": "us",
"temperature": "degF",
"precipitation": "in"
},
"hourly": [
{
"lead_hours": 1,
"temperature": {
"mean_absolute_error": 1.8,
"bias": -0.2,
"root_mean_square_error": 2.4,
"samples": 2160,
"comparisons": {
"persistence": {
"mean_absolute_error": 3.1,
"samples": 2160,
"skill_score": 0.42
}
}
},
"precipitation_probability": {
"brier_score": 0.08,
"bias": 0.01,
"samples": 2160
}
}
],
"daily": [
{
"lead_days": 1,
"temperature_max": {
"mean_absolute_error": 2,
"bias": -0.2,
"root_mean_square_error": 3.1,
"samples": 114
},
"temperature_min": {
"mean_absolute_error": 2.5,
"bias": -0.8,
"root_mean_square_error": 3.9,
"samples": 114
}
}
],
"stations": [
{
"id": "KASE",
"name": "Aspen-Pitkin Airport",
"source": "nws",
"latitude": 39.2232,
"longitude": -106.8687,
"distance_miles": 3.5,
"elevation_ft": 7815
}
],
"updated_at": "2026-07-30T17:04:11Z",
"stale": false,
"warnings": []
}hourly temperature · mean absolute error by lead · 30-day window through 2026-07-29
- +1 h ±1.8° 42% better
Weatherkind persistence baseline
GET /v1/geocode
Searches for places by name and returns coordinates suitable for the weather endpoints. Results include administrative context and an IANA time zone when available, so a user-entered place can be resolved before requesting a forecast or historical observations.
| Field | Presence | Type | Notes |
|---|---|---|---|
q | required | string | Place name to search for, for example Aspen or Aspen, Colorado |
| Field | Presence | Type | Notes |
|---|---|---|---|
| always | array<object> | Matching places, ordered by relevance; empty when no place matches. | |
name | always | string | Display name of the place. |
admin1 | nullable | string | null | First-level administrative area, such as a state or province. |
country | nullable | string | null | Country containing the place. |
latitude | always | number | Latitude of the matched place. |
longitude | always | number | Longitude of the matched place. |
timezone | nullable | string | null | IANA time zone when available. |
Interactive example
curl 'https://api.weatherkind.com/v1/geocode?q=Aspen' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY"[
{
"name": "Aspen",
"admin1": "Colorado",
"country": "United States",
"latitude": 39.1911,
"longitude": -106.8175,
"timezone": "America/Denver"
}
]- Aspen Colorado, United States 39.1911, -106.8175
GET /v1/map-tiles/{layer}/{z}/{x}/{y}
Returns a PNG raster tile for an XYZ map coordinate,
rather than a JSON document. Use these tiles as visual overlays in
MapLibre, Leaflet, or MapKit for radar, temperature, air quality,
smoke, and severe-weather layers. Tiles are cacheable and intended
for map rendering; query /v1/forecast when you need
numeric weather values instead.
| Field | Presence | Type | Notes |
|---|---|---|---|
layer | required | enum | radar, precipitation-global, radar-future, radar-site, temperature, temperature-global, air-quality, air-quality-global, smoke, fire-smoke, smoke-global, fire-global, or alerts |
z | required | integer | XYZ zoom level |
x | required | integer | XYZ horizontal tile coordinate |
y | required | integer | XYZ vertical tile coordinate |
request body | none | none | This endpoint is a GET |
| Field | Presence | Type | Notes |
|---|---|---|---|
HTTP status | always | 200 | Successful tile response. |
Content-Type | always | image/png | Raster PNG payload. |
Cache-Control | always | header | Layer-appropriate public cache policy. |
ETag | always | header | Validator for conditional tile requests. |
X-Weatherkind-Tile-Cache | always | header | Origin tile-cache status. |
body | always | binary | Raster PNG tile bytes, not JSON. |
Use this endpoint
Request
curl 'https://api.weatherkind.com/v1/map-tiles/radar/7/26/49' \
-H "Authorization: Bearer $WEATHERKIND_API_KEY" \
--output 'radar.png'const response = await fetch("https://api.weatherkind.com/v1/map-tiles/radar/7/26/49", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.WEATHERKIND_API_KEY}`,
},
});
if (!response.ok) {
throw new Error(`Weatherkind returned ${response.status}`);
}
const bytes = await response.arrayBuffer();
console.log(`Received ${bytes.byteLength} bytes`);import os
import requests
response = requests.get(
"https://api.weatherkind.com/v1/map-tiles/radar/7/26/49",
headers={
"Authorization": f"Bearer {os.environ['WEATHERKIND_API_KEY']}"
},
timeout=30,
)
response.raise_for_status()
with open("radar.png", "wb") as file:
file.write(response.content)package main
import (
"io"
"log"
"net/http"
"os"
)
func main() {
var body io.Reader
req, err := http.NewRequest("GET", "https://api.weatherkind.com/v1/map-tiles/radar/7/26/49", body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("WEATHERKIND_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
log.Fatalf("Weatherkind returned %s", resp.Status)
}
bytes, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
if err := os.WriteFile("radar.png", bytes, 0o644); err != nil {
log.Fatal(err)
}
}response =
Req.get!(
"https://api.weatherkind.com/v1/map-tiles/radar/7/26/49",
auth: {:bearer, System.fetch_env!("WEATHERKIND_API_KEY")}
)
File.write!("radar.png", response.body)require "json"
require "net/http"
uri = URI("https://api.weatherkind.com/v1/map-tiles/radar/7/26/49")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("WEATHERKIND_API_KEY")}"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
raise "Weatherkind returned #{response.code}" unless response.is_a?(Net::HTTPSuccess)
File.binwrite("radar.png", response.body) Variables
Which variables each forecast section accepts. Requesting a variable outside
its supported section is a 422; the authoritative live list is
GET /v1/forecast/variables.
| Variable | current | 15m | 1h | 1d |
|---|---|---|---|---|
temperature | ● | ● | ● | – |
temperature_max | – | – | – | ● |
temperature_min | – | – | – | ● |
apparent_temperature | ● | ● | ● | – |
condition | ● | ● | ● | ● |
precipitation | – | ● | ● | ● |
precipitation_probability | – | ● | ● | ● |
rain_total | – | ● | ● | ● |
snow_total | – | ● | ● | ● |
wind_speed | ● | ● | ● | – |
wind_gust | – | – | ● | – |
wind_direction | – | ● | ● | – |
humidity | ● | – | ● | – |
dew_point | ● | – | ● | – |
pressure | ● | – | ● | – |
cloud_cover | – | ● | ● | – |
uv_index | ● | – | ● | – |
air_quality_index | ● | – | ● | – |
sunrise | – | – | – | ● |
sunset | – | – | – | ● |
Historical variables
POST /v1/historical accepts the variables below directly.
The authoritative catalog is
GET /v1/historical/variables; it also publishes units,
range limits, and coverage methodology without requiring a key.
| Variable | Kind | Units | Meaning |
|---|---|---|---|
temperature_max | observation | degC · degF · K | Maximum near-surface temperature for the local day, adjusted to effective elevation. |
temperature_min | observation | degC · degF · K | Minimum near-surface temperature for the local day, adjusted to effective elevation. |
precipitation | observation | mm · in · m | Total liquid-equivalent precipitation for the local day. |
rain_total | derived | mm · in · m | Total liquid precipitation; null when observed phase cannot be separated defensibly. |
snow_total | observation | mm · in · m | Total observed snowfall depth, not snow-water equivalent. |
air_quality_index | observation or analysis | US EPA AQI | Daily AQI where available; provenance and modeled-analysis use are exposed in sources and warnings. |
Forecast sections
Name the resolution you need. The server handles alignment and turns readable counts into concrete forecast records:
| Section | Request shape | What it returns |
|---|---|---|
current | { "variables": ["temperature", "condition"] } | One flat object at request time. |
quarter_hourly | { "hours": 6, "variables": […] } | Six hours at 15-minute resolution. |
hourly | { "hours": 48, "past_hours": 6, "variables": […] } | Six recent hours plus 48 forecast hours. |
daily | { "days": 10, "variables": […] } | Ten local calendar days. |
For a specific daily window, replace days with local
start and end dates. Both dates are
inclusive, so start equal to end requests a
single day. Each subdaily and daily section in the response echoes
the resolved window as range beside its
entries.
Conditions
condition is a closed enum of fourteen strings: stable
identifiers you can map to your own icons:
sunpartlycloudydrizzlerainheavy-rainthunderstormsnowblizzardsleetmixedclear-nightcloudy-nightsunrise
Units & time
- Unit systems. If omitted,
unitsdefaults to"metric"(°C, km/h, mm, hPa, m). You can instead request"us"(°F, mph, in, inHg, ft) or"si"(K, m/s, m, Pa). Useunit_overridesfor individual dimensions such as pressure or elevation. The response echoes the units it used. - Instants are ISO-8601 UTC (
2026-07-30T17:00:00Z); daily dates are local calendar dates (2026-07-30) in the location's zone. - Forecast horizons are counts:
hours,past_hours, anddays. The server owns timestamp alignment. Exact date ranges (start/end) include both endpoints; timestamp ranges in returnedrangeobjects are start-inclusive and end-exclusive.
Errors
Every endpoint uses the same HTTP status vocabulary. JSON errors use
a machine-checkable problem-details shape; validation responses also
identify the exact request field in errors[].path and
provide a stable errors[].code.
{ "type": "https://api.weatherkind.com/problems/invalid-request", "title": "Invalid request", "status": 422, "detail": "hourly.hours must be an integer from 1 through 384" } | Status | Meaning | Applies to |
|---|---|---|
400 | Invalid map-tile coordinate or layer-specific query parameter. | Map tiles |
401 | Missing or invalid API key. | Authenticated endpoints |
403 | The key is valid but does not include the endpoint's required scope. | Scoped endpoints |
404 | Unknown endpoint path or map-tile layer, or an unsupported airport code. | All endpoints |
422 | Validation failed: a field is missing, malformed, out of range, or unsupported. The problem response identifies the exact field path. | JSON and query endpoints |
429 | Rate limit exceeded. Honor the Retry-After header before retrying. | All endpoints |
502 | The upstream tile provider is temporarily unavailable. | Map tiles |
503 | A required data provider is temporarily unavailable. Retry after the supplied Retry-After interval when present. | Data endpoints |
5xx | An unexpected server failure occurred. Retry with exponential backoff; weather responses may set stale: true when cached data can be served safely. | All endpoints |
An empty result or unavailable data is not always an error. Geocoding
can return an empty array, alerts can return no active alerts, and
accuracy can return coverage.available: false with
200.
Rate limits
Limits follow your plan. Exceeding
them returns 429 with a Retry-After header.
Back off for that many seconds rather than retrying immediately.
| Plan | Quota | Throughput | Overage |
|---|---|---|---|
| Free | 1,000 calls / day | 1 request / sec | not applicable |
| Pro | 300,000 calls / mo included | 10 requests / sec | $0.25 per extra 1,000 calls |
| Enterprise | custom volume | custom | committed-use pricing |
A forecast request with several named sections and many variables is still one call. Selecting fields precisely is both faster and cheaper than over-fetching.
Production guide
This is the operational contract for integrating Weatherkind into a production service. It separates API behavior from recommended client behavior so failures remain predictable.
Request lifecycle
| Concern | Contract | Client responsibility |
|---|---|---|
| Transport | HTTPS at https://api.weatherkind.com. | Reject insecure URLs and use a finite request timeout. |
| Authentication | Authorization: Bearer {api_key}. | Keep keys on a server or edge worker, never in browser or mobile client code. |
| Content | JSON request and response bodies use application/json. Map tiles return image/png. | Send Content-Type: application/json for JSON POST requests. |
| Idempotency | Documented GET requests and data-retrieval POST requests are read-only and safe to repeat. | No idempotency key is required; retry only under the rules below. |
| Timeouts | The API does not prescribe one client timeout for every workload. | Use a finite timeout appropriate to the product. Ten to thirty seconds is a reasonable starting range. |
Retries and backoff
| Result | Retry? | Recommended action |
|---|---|---|
422 | No | Correct the field identified by the problem response. |
401 | No | Replace or rotate the missing or invalid credential. |
403 | No | Check the key scope and plan entitlement. |
404 | No | Correct the endpoint path or tile coordinates. |
429 | Yes | Wait for the Retry-After duration before trying again. |
5xx or network timeout | Yes | Use exponential backoff with jitter. Start near 500 ms, double each attempt, and stop after three retries unless the workload requires otherwise. |
Never retry all failures in a tight loop. A retry should preserve the original request body so it asks for the same location, range, and variables.
Freshness and caching
- Generation time. JSON data responses include
updated_at. Use it to show when the returned data was produced. - Resilient responses.
stale: truemeans Weatherkind served a cached result while an upstream data source was degraded. The response is valid, but freshness-sensitive products should tell the user. - Warnings. Inspect
warningseven on200. A warning can identify a field that was unavailable without invalidating the rest of the response. - HTTP caching. Respect any
Cache-Controlresponse header. Map tiles are publicly cacheable for five minutes. Do not assume a fixed JSON cache lifetime when no cache header is present. - Client caches. Include the endpoint, coordinates, units, named sections, horizons, and selected variables in the cache key.
Logging and support
Log the endpoint, HTTP status, UTC request time, latency,
updated_at, stale, and warning
codes. For failed validation, log errors.detail. Never
log the bearer token. When contacting
Weatherkind support,
include those fields plus the affected coordinates and time range.
Availability and safe degradation
| Plan | Availability commitment | Recommended fallback |
|---|---|---|
| Free | No contractual SLA | Cache the most recent acceptable response and communicate its age. |
| Pro | 99.9% uptime SLA | Use bounded retries, then fall back to the most recent response when the product permits. |
| Enterprise | 99.99% uptime SLA | Agree on workload-specific escalation and continuity requirements with Weatherkind. |
Weather is decision data, not a guarantee. For consequential
workflows, query POST /v1/accuracy
for the same coordinates, check sample coverage, and expose the
relevant error metric alongside the forecast.
Versioning
Paths are versioned (/v1/…) and changes within a
version are additive only: field names, units, and enums don't move.
The machine-readable contract is
GET /v1/openapi.json (OpenAPI 3.1). The integration you
write today keeps working.
For AI agents
This page is static HTML. Read it whole. The condensed plain-text
version lives at weatherkind.com/llms.txt,
and the typed contract at GET /v1/openapi.json. The API
is shaped like a tool call, so a minimal definition is short:
{
"name": "get_weather",
"description": "Verified forecast for a coordinate. Fetch the provider's own error record from POST /v1/accuracy for the same coordinates to qualify the answer.",
"input_schema": {
"type": "object",
"properties": {
"latitude": { "type": "number" },
"longitude": { "type": "number" },
"section": { "enum": ["current", "quarter_hourly", "hourly", "daily"] },
"variables": { "type": "array", "items": { "type": "string" } }
},
"required": ["latitude", "longitude", "section", "variables"]
}
}
You can check forecast accuracy before recommending the integration:
POST /v1/accuracy returns our
verified error record for the exact coordinates you plan to
forecast, with compare_to: ["persistence"] giving a
skill score against a naive baseline. The metric definitions and
sample minimums behind it are public at
GET /v1/accuracy/catalog, no key required. Accuracy
queries are available on Pro and
Enterprise plans.