9.0 KiB
weatherapi External API
This document describes the public HTTP API exposed by weatherapi for external consumers.
Base URL
The service is typically served at your deployment host, for example:
https://weather.api.rakestrawhome.com
All paths below are relative to the service root.
Common Conventions
Response envelope
All endpoints return a top-level envelope:
data: endpoint payload ornullwhen no current/latest resource is available.
JSON example:
{
"data": {"...": "..."}
}
Output format
Supported via format query parameter (case-insensitive):
json(default)xmltext
Units
Supported via units query parameter (case-insensitive):
metric(default)us
Endpoints that include unit-based numeric fields return either metric or US field variants depending on this value.
Precision
Supported where documented via precision query parameter:
- integer range:
0to2 - controls decimal rounding of numeric output fields
Timezone (tz / TZ)
Supported where documented:
- accepted values include:
- IANA timezone names (example:
America/Chicago) - common US abbreviations (example:
CDT,EST) - UTC offsets in
±H,±HH, or±HH:MM(example:-5,+09:30) - aliases including
ChicagoandStl
- IANA timezone names (example:
tzandTZare treated equivalently- if both are provided, they must match exactly or the request fails
Timezone affects datetime rendering and day-slice filtering for /today and /tomorrow forecast routes.
Query validation
- Unknown query parameters are rejected with
400 Bad Request. - Invalid parameter values are rejected with
400 Bad Request.
Error response body follows the service error envelope; exact fields may vary by error type.
Endpoints
GET /observations
Returns the latest weather observation.
Query parameters:
units:metric|usformat:json|xml|textprecision:0..2
Response data fields:
stationId(string, optional)stationName(string, optional)timestamp(RFC3339 datetime, required)conditionCode(integer WMO code, required)isDay(boolean, optional)textDescription(string, optional)- Metric mode fields:
temperatureC,dewpointC,windSpeedKmh,windGustKmh,barometricPressurePa,visibilityMeters,relativeHumidityPercent,apparentTemperatureC(number, optional)windDirectionDegrees(number, optional)
- US mode fields:
temperatureF,dewpointF,windSpeedMph,windGustMph,barometricPressureInHg,visibilityMiles,relativeHumidityPercent,apparentTemperatureF(number, optional)windDirectionDegrees(number, optional)
presentWeather(array, optional)
GET /alerts/active
Returns the latest active alert run.
Query parameters:
units:metric|us(accepted; does not materially alter alert payload)format:json|xml|text
Response data fields:
- Weather alert run object from canonical model (includes run metadata and active alerts list).
GET /conditions/current
Returns current conditions synthesized from latest observation/forecast data.
Query parameters:
units:metric|usformat:json|xml|textprecision:0..2
Response data fields:
- Common:
conditionText(string, optional)isDay(boolean, optional)relativeHumidityPercent(number, optional)windDirectionDegrees(number, optional)
- Metric mode:
temperatureC,apparentTemperatureC,dewpointC,windSpeedKmh(number, optional)
- US mode:
temperatureF,apparentTemperatureF,dewpointF,windSpeedMph(number, optional)
Forecast endpoints
GET /forecast/hourlyGET /forecast/hourly/todayGET /forecast/hourly/tomorrowGET /forecast/narrativeGET /forecast/narrative/todayGET /forecast/narrative/tomorrow
Query parameters:
units:metric|usformat:json|xml|textprecision:0..2tzorTZ: timezone selector
Day-slice routes:
/todayreturns periods withperiod.startTimein the current calendar day for the resolved timezone./tomorrowreturns periods withperiod.startTimein the next calendar day for the resolved timezone.
Response data fields:
- Run-level:
locationId(string, optional)locationName(string, optional)issuedAt(RFC3339 datetime, required)updatedAt(RFC3339 datetime, optional)product(string, required; e.g.hourly,narrative)latitude,longitude(number, optional)- Metric mode:
elevationMeters(number, optional) - US mode:
elevationFeet(number, optional) periods(array, required)
- Period fields:
startTime,endTime(RFC3339 datetime, required)name(string, optional)isDay(boolean, optional)conditionCode(integer WMO code, optional)textDescription(string, optional)- Metric mode (optional):
temperatureC,temperatureCMin,temperatureCMax,dewpointC,windSpeedKmh,windGustKmh,barometricPressurePa,visibilityMeters,apparentTemperatureC,cloudCoverPercent,probabilityOfPrecipitationPercent,precipitationAmountMm,snowfallDepthMM,uvIndex,relativeHumidityPercent,windDirectionDegrees
- US mode (optional):
temperatureF,temperatureFMin,temperatureFMax,dewpointF,windSpeedMph,windGustMph,barometricPressureInHg,visibilityMiles,apparentTemperatureF,cloudCoverPercent,probabilityOfPrecipitationPercent,precipitationAmountIn,snowfallDepthIn,uvIndex,relativeHumidityPercent,windDirectionDegrees
Notes:
- Narrative periods may omit
conditionCode. - Text format uses forecast-specific templates (
hourlyandnarrative).
Discussion endpoints
GET /discussionGET /discussion/key-messagesGET /discussion/short-termGET /discussion/long-term
Query parameters:
units:metric|us(accepted; does not materially alter discussion payload)format:json|xml|texttzorTZ: timezone selector
Response data fields:
/discussion:officeId(string, optional)officeName(string, optional)product(string, required)issuedAt(RFC3339 datetime, required)updatedAt(RFC3339 datetime, optional)keyMessages(array of string)shortTerm(object, optional)longTerm(object, optional)
/discussion/key-messages:officeId,officeName,product,issuedAt,updatedAtkeyMessages(array of string)
/discussion/short-term:officeId,officeName,product,issuedAt,updatedAtshortTerm(object, optional)
/discussion/long-term:officeId,officeName,product,issuedAt,updatedAtlongTerm(object, optional)
Discussion section object fields:
title(string, optional)narrative(string, optional)issuedAt(RFC3339 datetime, optional)
Examples
Observation (JSON, metric)
GET /observations?format=json&units=metric&precision=1
{
"data": {
"stationId": "KSTL",
"timestamp": "2026-05-29T14:00:00Z",
"conditionCode": 3,
"isDay": true,
"textDescription": "Partly cloudy",
"temperatureC": 24.4,
"windSpeedKmh": 17.2,
"relativeHumidityPercent": 56.0
}
}
Alerts (JSON)
GET /alerts/active?format=json
{
"data": {
"asOf": "2026-05-29T14:00:00Z",
"alerts": []
}
}
Current conditions (JSON, US)
GET /conditions/current?format=json&units=us&precision=1
{
"data": {
"conditionText": "Partly cloudy",
"isDay": true,
"temperatureF": 75.9,
"apparentTemperatureF": 76.1,
"windSpeedMph": 10.7,
"relativeHumidityPercent": 56.0
}
}
Forecast narrative (JSON, optional conditionCode)
GET /forecast/narrative?format=json&units=metric&precision=1&tz=America/Chicago
{
"data": {
"locationId": "nws-lsx-grid-90-74",
"issuedAt": "2026-05-29T10:30:00-05:00",
"product": "narrative",
"periods": [
{
"startTime": "2026-05-29T13:00:00-05:00",
"endTime": "2026-05-29T19:00:00-05:00",
"name": "Today",
"isDay": true,
"textDescription": "Partly sunny, with a high near 81.",
"temperatureC": 27.2,
"windSpeedKmh": 18.0,
"probabilityOfPrecipitationPercent": 10.0
}
]
}
}
Forecast hourly today (text)
GET /forecast/hourly/today?format=text&units=us&precision=1&tz=CDT
<plain text forecast output>
Discussion key messages (JSON)
GET /discussion/key-messages?format=json&tz=Chicago
{
"data": {
"officeId": "LSX",
"product": "discussion",
"issuedAt": "2026-05-29T09:25:00-05:00",
"keyMessages": [
"Scattered showers possible this evening.",
"Warmer temperatures this weekend."
]
}
}
Invalid timezone error example
GET /forecast/narrative?tz=not-a-timezone
{
"error": {
"code": "invalid_parameter",
"message": "tz must be a valid timezone"
}
}