10 KiB
weatherapi HTTP API
This is the canonical public HTTP contract for weatherapi. The service is a
read-only API over the latest weather records available in the configured
weatherfeeder-populated Postgres database.
Base URL
All paths are relative to the deployment root:
http://localhost:8080
Use your deployment host in production.
Authentication
weatherapi does not implement authentication or authorization. Put access
control in front of the service when a deployment requires it.
Response Envelope
Successful JSON and XML responses use a top-level envelope:
{
"data": {}
}
When no latest/current resource exists, the request still succeeds and returns
data: null.
Text responses are rendered from endpoint-specific templates. When the payload is missing, the templates return a short no-data message.
Formats
Every implemented endpoint can produce:
| Format | Media type |
|---|---|
json |
application/json |
xml |
application/xml |
text |
text/plain |
Format selection is:
formatquery parameter;Acceptheader;- configured
server.default_format.
format values are case-insensitive. Unsupported formats return 406 Not Acceptable with an error envelope.
Shared Query Rules
Unknown query parameters are rejected with 400 Bad Request.
| Parameter | Values | Default | Supported on |
|---|---|---|---|
format |
json, xml, text |
configured default | all endpoints |
units |
metric, us |
metric |
all endpoints |
precision |
integer 0 through 2 |
0 |
observations, current conditions, forecasts |
tz or TZ |
timezone selector | UTC/no conversion | forecasts, discussions, weather stories |
units, format, and precision values are normalized case-insensitively
where applicable. units=metric returns metric field names; units=us returns
US-customary field names for unit-bearing payloads. Alerts, discussions, and
weather stories accept units but their current payload fields are not
materially changed by it.
precision controls numeric rounding. The default 0 rounds to whole numbers.
precision is rejected on alerts, discussions, and weather stories.
Timezone selectors accepted by tz / TZ:
- IANA timezone names such as
America/Chicago; - common US abbreviations such as
CDT,CST,EDT,EST,MDT,MST,PDT, andPST; - UTC offsets in
+H,+HH,+HH:MM,-H,-HH, or-HH:MMform, bounded to-14:00through+14:00; - aliases
ChicagoandStl, both mapped toAmerica/Chicago.
If both tz and TZ are provided, their values must match
case-insensitively. Timezone conversion affects rendered timestamps and forecast
/today and /tomorrow day-slice filtering. Without a timezone parameter,
day-slice routes use UTC.
Errors
API errors use a stable error envelope:
{
"error": {
"code": "invalid_parameter",
"message": "..."
}
}
Implemented API error statuses:
| Status | Code | Cause |
|---|---|---|
400 Bad Request |
invalid_parameter |
unknown query parameter, invalid parameter value, invalid timezone, conflicting tz / TZ, or unsupported parameter on a route |
406 Not Acceptable |
unsupported_format |
requested response format is not supported by the endpoint/renderers |
Unhandled service or database errors are returned as server errors by the runtime.
Behavior Not Implemented
weatherapi does not implement pagination, cache-control headers, rate-limit
headers, idempotency keys, retries, writes, or historical browsing outside the
implemented latest-resource and forecast day-slice routes.
Endpoints
Observations
GET /observations
Returns the latest weather observation.
Query parameters: format, units, precision.
Metric data fields:
| Field | Type | Notes |
|---|---|---|
stationId, stationName |
string | optional |
timestamp |
RFC3339 datetime | required when data is not null |
conditionCode |
integer | WMO weather code |
isDay |
boolean | optional |
textDescription |
string | optional |
temperatureC, dewpointC, apparentTemperatureC |
number | optional |
windDirectionDegrees, windSpeedKmh, windGustKmh |
number | optional |
barometricPressurePa, visibilityMeters |
number | optional |
relativeHumidityPercent |
number | optional |
presentWeather |
array | optional |
US mode replaces unit-bearing fields with temperatureF, dewpointF,
apparentTemperatureF, windSpeedMph, windGustMph,
barometricPressureInHg, and visibilityMiles. Direction and percentage
fields keep the same names.
Example:
GET /observations?units=us&precision=1
Current Conditions
GET /conditions/current
Returns current conditions aggregated from recent observations rows. The
implemented observation window is 30 minutes.
Query parameters: format, units, precision.
Common data fields:
| Field | Type | Notes |
|---|---|---|
conditionText |
string | optional text derived from WMO code and day/night flag |
isDay |
boolean | optional |
relativeHumidityPercent |
number | optional |
windDirectionDegrees |
number | optional |
Metric fields: temperatureC, apparentTemperatureC, dewpointC,
windSpeedKmh.
US fields: temperatureF, apparentTemperatureF, dewpointF,
windSpeedMph.
Example:
GET /conditions/current?format=json&precision=0
Active Alerts
GET /alerts/active
Returns the latest active-alert snapshot.
Query parameters: format, units.
Run data fields:
| Field | Type | Notes |
|---|---|---|
locationId, locationName |
string | optional |
asOf |
RFC3339 datetime | required when data is not null |
latitude, longitude |
number | optional |
alerts |
array | active alerts, possibly empty |
Alert fields include id, event, headline, severity, urgency,
certainty, status, messageType, category, response, description,
instruction, sent, effective, onset, expires, areaDescription,
senderName, and references. Most alert fields are optional except id when
an alert item is present.
Reference fields are id, identifier, sender, and sent.
Example:
GET /alerts/active?format=text
Forecasts
GET /forecast/hourly
GET /forecast/hourly/today
GET /forecast/hourly/tomorrow
GET /forecast/narrative
GET /forecast/narrative/today
GET /forecast/narrative/tomorrow
Returns the latest hourly or narrative forecast run. /today and /tomorrow
return a copy of the latest run with periods filtered by each period's
startTime in the resolved timezone. If no periods match, data remains an
object and periods is an empty array.
Query parameters: format, units, precision, tz / TZ.
Run data fields:
| Field | Type | Notes |
|---|---|---|
locationId, locationName |
string | optional |
issuedAt |
RFC3339 datetime | required when data is not null |
updatedAt |
RFC3339 datetime | optional |
product |
string | hourly or narrative for implemented routes |
latitude, longitude |
number | optional |
elevationMeters or elevationFeet |
number | optional, depends on units |
periods |
array | ordered forecast periods |
Metric period fields:
startTime, endTime, name, isDay, conditionCode,
textDescription, temperatureC, temperatureCMin, temperatureCMax,
dewpointC, relativeHumidityPercent, windDirectionDegrees,
windSpeedKmh, windGustKmh, barometricPressurePa, visibilityMeters,
apparentTemperatureC, cloudCoverPercent,
probabilityOfPrecipitationPercent, precipitationAmountMm,
snowfallDepthMm, and uvIndex.
US mode uses the same non-unit fields and replaces unit-bearing fields with
temperatureF, temperatureFMin, temperatureFMax, dewpointF,
windSpeedMph, windGustMph, barometricPressureInHg, visibilityMiles,
apparentTemperatureF, precipitationAmountIn, snowfallDepthIn, and
elevationFeet at run level.
startTime and endTime are required for each period. Other period fields are
optional, including conditionCode; narrative forecasts may omit it.
Examples:
GET /forecast/hourly?units=us&precision=1&TZ=-5
GET /forecast/narrative/tomorrow?format=text&tz=Chicago
Forecast Discussions
GET /discussion
GET /discussion/key-messages
GET /discussion/short-term
GET /discussion/long-term
Returns the latest forecast discussion or a focused subresource.
Query parameters: format, units, tz / TZ.
Full discussion data fields:
| Field | Type | Notes |
|---|---|---|
officeId, officeName |
string | optional |
product |
string | currently afd from weatherfeeder data |
issuedAt |
RFC3339 datetime | required when data is not null |
updatedAt |
RFC3339 datetime | optional |
keyMessages |
array of strings | optional |
shortTerm, longTerm |
object | optional section objects |
Discussion section fields are qualifier, issuedAt, and text, all
optional.
Subresources return the same metadata plus only their focused field:
keyMessages, shortTerm, or longTerm.
Example:
GET /discussion/short-term?format=text&tz=CDT
Weather Stories
GET /weatherstories
GET /weatherstories/latest
/weatherstories returns the latest weather-story run and its ordered stories.
/weatherstories/latest returns the latest individual story.
Query parameters: format, units, tz / TZ.
Run data fields:
| Field | Type | Notes |
|---|---|---|
officeId |
string | optional |
asOf |
RFC3339 datetime | required when data is not null |
stories |
array | ordered story objects |
Story fields:
| Field | Type | Notes |
|---|---|---|
officeId |
string | optional |
startTime, endTime, updatedAt |
RFC3339 datetime | required when a story is present |
title, description, altText, downloadUrl |
string | optional |
priority |
boolean | required when a story is present |
order |
integer | required when a story is present |
Examples:
GET /weatherstories?tz=America/Chicago
GET /weatherstories/latest?format=xml
Copyable Requests
See examples/requests.http for a compact set of
requests covering the implemented endpoint families.