{"openapi":"3.0.1","info":{"title":"METAR / TAF / SIGMET API","description":"Public read-only API for aviation weather data sourced from [aviationweather.gov](https://aviationweather.gov/). Provides current and historical METAR observations, TAF forecasts, and SIGMET/AIRMET advisories with spatial filtering (bounding box, point + radius, ICAO station, country shortcut) and temporal filtering (single timestamp, range, list).\n\n## Response envelope\n\nEvery successful response is wrapped in the shared Atmosoar envelope:\n\n```json\n{\n  \"httpStatus\": 200,\n  \"message\": \"ok\",\n  \"data\": ... // single object or array, depending on endpoint\n}\n```\n\n## Error envelope\n\nEvery error response uses `APIError`. Validation errors include per-field detail in `errors[]`:\n\n```json\n{\n  \"httpStatus\": 400,\n  \"code\": \"VALIDATION_ERROR\",\n  \"message\": \"One or more request parameters are invalid.\",\n  \"errors\": [\n    { \"code\": \"INVALID_LOCATION\", \"field\": \"location\",\n      \"message\": \"bbox requires exactly 4 values: west,south,east,north (got 3)\" }\n  ]\n}\n```\n\nCommon error codes: `VALIDATION_ERROR`, `INVALID_LOCATION`, `INVALID_TIME_FORMAT`, `INVALID_TIME_RANGE`, `INVALID_PAGINATION`, `MISSING_REQUIRED_FIELD`, `INVALID_PARAMETER`, `NOT_FOUND`, `INTERNAL_ERROR`.\n\n## Quick examples\n\n```bash\n# Latest METAR for KJFK\ncurl https://api.atmosoar.io/metar/api/metar/station/KJFK\n\n# Latest METAR per station in a bounding box (lon/lat: west,south,east,north)\ncurl 'https://api.atmosoar.io/metar/api/metar/area?location=bbox:-75,40,-73,42\u0026limit=5'\n\n# SIGMETs covering a point, filtered by hazard\ncurl 'https://api.atmosoar.io/metar/api/sigmet/point?location=40.6,-73.7\u0026hazard=TURBULENCE'\n\n# Combined METAR + TAF for stations in an area at a specific time\ncurl 'https://api.atmosoar.io/metar/api/metar-taf/area?location=bbox:-75,40,-73,42\u0026time=2026-04-13T12:00:00Z'\n```\n\n## Conventions\n\n- All timestamps are RFC 3339 UTC.\n- All routes are mounted under the `/metar` prefix.\n- ICAO codes are case-insensitive.\n- `limit` defaults to 100 and is capped server-side; use `offset` for pagination.\n- Defaults when `time` is omitted: METAR 24h lookback, TAF 72h lookback, SIGMET 24h lookback.\n- All products retain 30 days of history; SIGMET/AIRMET amendments are archived as distinct versions (see `/sigmet/history` `versions`).\n- Area / nearest / combined endpoints only surface stations whose newest report falls within the lookback (24h METAR / 72h TAF) relative to the requested instant — stations reporting less recently are omitted rather than served stale.","contact":{"name":"Atmosoar Support","url":"https://atmosoar.io"},"version":"1.13.0","x-logo":{"url":"https://atmosoar.io/logo.png","backgroundColor":"#003b48","altText":"atmosoar"}},"paths":{"/metar/api/metar-taf/area":{"get":{"tags":["METAR+TAF"],"summary":"Latest METAR and TAF per station in a bounding box","description":"Returns combined METAR + TAF entries for stations within the requested area. A station is included if it has **at least one** of METAR or TAF data — the missing side is `null`. Useful for dashboards that need both observation and forecast in a single call.\n\n**Happy path** — `200 OK` with combined entries.\n\n**Bad paths**\n- `400 INVALID_LOCATION` — invalid `location` parameter.\n- `400 VALIDATION_ERROR` — invalid `time`, `limit`, or `offset`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example call**\n```bash\ncurl 'https://api.atmosoar.io/metar/api/metar-taf/area?location=bbox:-75,40,-73,42\u0026limit=10'\n```","operationId":"getMetarTafArea","parameters":[{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of combined METAR+TAF entries"},"400":{"description":"Validation error. Body is an APIError; field-level details are in errors[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/metar-taf/nearest":{"get":{"tags":["METAR+TAF"],"summary":"Latest METAR and TAF for the nearest station(s) to a point","description":"Returns the latest METAR and TAF for the station(s) closest to a geographic point, ordered by distance. The `location` parameter is required and must be a point (`lat,lon`), a radius (`lat,lon|radius_km`), or an ICAO station code; for a radius the search is capped to that distance. Use `n` to request more than the single closest station. When `time` is provided, the latest record at-or-before that timestamp is used per station; when omitted, the most recent record is returned. Each entry carries `distance_m`, the great-circle distance in metres from the requested point.\n\n**Happy path** — `200 OK` with up to `n` entries, nearest first.\n\n**Bad paths**\n- `400 INVALID_LOCATION` — `location` is a bbox/rectangle or otherwise not a point/radius/station.\n- `400 VALIDATION_ERROR` — invalid `time` or `n`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# Single nearest station to a point\ncurl 'https://api.atmosoar.io/metar/api/metar-taf/nearest?location=40.6,-73.7'\n\n# Three nearest stations within 200 km\ncurl 'https://api.atmosoar.io/metar/api/metar-taf/nearest?location=40.6,-73.7|200\u0026n=3'\n```","operationId":"getMetarTafNearest","parameters":[{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"n","in":"query","description":"Number of nearest stations to return, ordered by distance. Defaults to 1 (the single closest station). Capped server-side by MAX_AREA_RESULTS.","schema":{"type":"string","description":"Number of nearest stations to return, ordered by distance. Defaults to 1 (the single closest station). Capped server-side by MAX_AREA_RESULTS.","default":"1"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of nearest stations with their latest METAR and TAF, nearest first."},"400":{"description":"Validation error (commonly an invalid location).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/metar/area":{"get":{"tags":["METAR"],"summary":"Latest METAR per station in a bounding box","description":"Returns the latest METAR observation for every station within the requested area. The `location` parameter is required; for area endpoints it must be a bbox or NE|SW rectangle. When `time` is provided, returns the latest observation at-or-before that timestamp per station; when omitted, returns the most recent observations within the lookback window.\n\n**Happy path** — `200 OK` with one entry per station.\n\n**Bad paths**\n- `400 INVALID_LOCATION` — malformed bbox or unsupported `location` form for an area endpoint.\n- `400 VALIDATION_ERROR` — invalid `time`, `limit`, or `offset`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# US east coast bounding box\ncurl 'https://api.atmosoar.io/metar/api/metar/area?location=bbox:-75,40,-73,42\u0026limit=20'\n\n# Whole world (use with care; capped by MAX_AREA_RESULTS server-side)\ncurl 'https://api.atmosoar.io/metar/api/metar/area?location=bbox:-180,-90,180,90\u0026limit=100'\n\n# Latest observation at-or-before a specific time\ncurl 'https://api.atmosoar.io/metar/api/metar/area?location=bbox:-75,40,-73,42\u0026time=2026-04-13T12:00:00Z'\n```","operationId":"getMetarArea","parameters":[{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of latest METARs per station"},"400":{"description":"Validation error (commonly an invalid location).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/metar/nearest":{"get":{"tags":["METAR"],"summary":"Latest METAR for the nearest station(s) to a point","description":"Returns the latest METAR observation for the station(s) closest to a geographic point, ordered by distance. The `location` parameter is required and must be a point (`lat,lon`), a radius (`lat,lon|radius_km`), or an ICAO station code; for a radius the search is capped to that distance. Use `n` to request more than the single closest station. When `time` is provided, the latest record at-or-before that timestamp is used per station; when omitted, the most recent record is returned. Each entry carries `distance_m`, the great-circle distance in metres from the requested point.\n\n**Happy path** — `200 OK` with up to `n` entries, nearest first.\n\n**Bad paths**\n- `400 INVALID_LOCATION` — `location` is a bbox/rectangle or otherwise not a point/radius/station.\n- `400 VALIDATION_ERROR` — invalid `time` or `n`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# Single nearest station to a point\ncurl 'https://api.atmosoar.io/metar/api/metar/nearest?location=40.6,-73.7'\n\n# Three nearest stations within 200 km\ncurl 'https://api.atmosoar.io/metar/api/metar/nearest?location=40.6,-73.7|200\u0026n=3'\n```","operationId":"getMetarNearest","parameters":[{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"n","in":"query","description":"Number of nearest stations to return, ordered by distance. Defaults to 1 (the single closest station). Capped server-side by MAX_AREA_RESULTS.","schema":{"type":"string","description":"Number of nearest stations to return, ordered by distance. Defaults to 1 (the single closest station). Capped server-side by MAX_AREA_RESULTS.","default":"1"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of nearest stations with their latest METAR observation, nearest first."},"400":{"description":"Validation error (commonly an invalid location).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/metar/station/{icao}":{"get":{"tags":["METAR"],"summary":"Latest METAR for a station","description":"Returns the most recent METAR observation for the given ICAO station. ICAO codes are case-insensitive (`kjfk` and `KJFK` are equivalent).\n\n**Happy path** — `200 OK` with a single METAR object.\n\n**Bad paths**\n- `404 NOT_FOUND` — the station is unknown or has no observations within the retention window (METAR retention defaults to 30 days).\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example call**\n```bash\ncurl https://api.atmosoar.io/metar/api/metar/station/KJFK\n```","operationId":"getMetarLatest","parameters":[{"name":"icao","in":"path","description":"ICAO station identifier (case-insensitive).","required":true,"schema":{"type":"string","description":"ICAO station identifier (case-insensitive).","example":"KJFK"}}],"responses":{"200":{"description":"Latest METAR observation"},"404":{"description":"Station not found or no observations within retention window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/metar/station/{icao}/history":{"get":{"tags":["METAR"],"summary":"METAR history for a station","description":"Returns historical METAR observations for the station, ordered newest-first. The `time` parameter scopes the window — when omitted, the endpoint returns the most recent observations within the retention window (default 30 days). Pagination via `limit` and `offset`.\n\n**Happy path** — `200 OK` with an array of observations (possibly empty if no data for the window).\n\n**Bad paths**\n- `400 VALIDATION_ERROR` — invalid `time`, `limit`, or `offset` value.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# Last 5 observations\ncurl 'https://api.atmosoar.io/metar/api/metar/station/KJFK/history?limit=5'\n\n# Observations within an explicit time range\ncurl 'https://api.atmosoar.io/metar/api/metar/station/KJFK/history?time=2026-04-06T00:00:00Z,2026-04-07T00:00:00Z'\n\n# Page 2 with 50 per page\ncurl 'https://api.atmosoar.io/metar/api/metar/station/KJFK/history?limit=50\u0026offset=50'\n```\n\n### Charts — `format=chart_png|chart_svg|chartspec`\n\nThe same window can come back as a chart instead of JSON. All three encodings are rendered from one shared chart definition, so a METAR chart carries the same colours, units, axis ticks and threshold bands as an observation or forecast chart of the same parameter — the whole platform draws weather one way.\n\n`fields` picks the series: `temperature`, `dewpoint`, `wind_speed`, `wind_gust`, `wind_direction`, `qnh`, `visibility`, `ceiling`. It defaults to `wind_speed,visibility,ceiling` — the three that decide whether the aerodrome is VFR or IFR. One field draws a time series; several stack a meteogram, one panel each, over a shared time axis (never a second y-axis).\n\n`ceiling` is the lowest broken or overcast layer in metres, the ICAO ceiling — a scattered layer does not make one, and a report without such a layer charts as a gap rather than an infinite ceiling. `visibility` is metres, as in the JSON. A value the report does not carry is always a gap, never a zero: for a METAR that distinction matters, because calm wind *is* zero.\n\n`chart=windrose` draws the direction-and-speed distribution instead: 16 compass sectors, six speed classes, readings below 0.5 m/s counted as calm. `chartspec` returns the chart as JSON — series, axes, ticks, bands and the resolved palette — so a frontend draws the identical chart with its own library. `theme=dark` selects the dark palette.\n\n```bash\n# a day of flight-rules conditions as a meteogram\ncurl -o kjfk.png \\\n  'https://api.atmosoar.io/metar/api/metar/station/KJFK/history?limit=48\u0026format=chart_png'\n\n# the wind rose for the last 200 reports, dark\ncurl -o kjfk-rose.png \\\n  'https://api.atmosoar.io/metar/api/metar/station/KJFK/history?limit=200\u0026chart=windrose\u0026format=chart_png\u0026theme=dark'\n```","operationId":"getMetarHistory","parameters":[{"name":"icao","in":"path","description":"ICAO station identifier (case-insensitive).","required":true,"schema":{"type":"string","description":"ICAO station identifier (case-insensitive).","example":"KJFK"}},{"name":"chart","in":"query","description":"Chart form, for the chart formats. One of timeseries, meteogram, windrose. Omitted, the form follows the fields: one field is a time series, several are a meteogram. A windrose reads the wind and ignores 'fields'.","schema":{"type":"string","description":"Chart form, for the chart formats. One of timeseries, meteogram, windrose. Omitted, the form follows the fields: one field is a time series, several are a meteogram. A windrose reads the wind and ignores 'fields'.","example":"windrose"}},{"name":"fields","in":"query","description":"Comma-separated series to chart: temperature, dewpoint, wind_speed, wind_gust, wind_direction, qnh, visibility, ceiling. Defaults to wind_speed,visibility,ceiling — the three that decide the flight rules. Max 8.","schema":{"type":"string","description":"Comma-separated series to chart: temperature, dewpoint, wind_speed, wind_gust, wind_direction, qnh, visibility, ceiling. Defaults to wind_speed,visibility,ceiling — the three that decide the flight rules. Max 8.","example":"wind_speed,wind_gust"}},{"name":"format","in":"query","description":"Render the window as a chart instead of JSON. One of chart_png (PNG), chart_svg (SVG), chartspec (the chart definition as JSON, for a frontend to draw itself). Omitted, the response is the usual JSON array.","schema":{"type":"string","description":"Render the window as a chart instead of JSON. One of chart_png (PNG), chart_svg (SVG), chartspec (the chart definition as JSON, for a frontend to draw itself). Omitted, the response is the usual JSON array.","example":"chart_png"}},{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"theme","in":"query","description":"Colour mode for the chart formats: light (default) or dark. Ignored when 'format' is omitted.","schema":{"type":"string","description":"Colour mode for the chart formats: light (default) or dark. Ignored when 'format' is omitted.","default":"light","example":"dark"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to the endpoint lookback when omitted.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to the endpoint lookback when omitted.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of METAR observations"},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/sigmet/area":{"get":{"tags":["SIGMET"],"summary":"SIGMETs/AIRMETs intersecting a bounding box","description":"Returns SIGMETs and AIRMETs whose polygons intersect the requested area and are valid at the requested time. The `location` parameter must be a bbox or NE|SW rectangle for this endpoint.\n\nFilter by hazard, severity, type, and altitude band.\n\n**Happy path** — `200 OK` with matching advisories (possibly empty).\n\n**Bad paths**\n- `400 INVALID_LOCATION` — malformed bbox.\n- `400 VALIDATION_ERROR` — invalid filter, time, or pagination parameter.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# Continental US\ncurl 'https://api.atmosoar.io/metar/api/sigmet/area?location=bbox:-130,20,-60,50'\n\n# Only convective SIGMETs (not AIRMETs)\ncurl 'https://api.atmosoar.io/metar/api/sigmet/area?location=bbox:-130,20,-60,50\u0026hazard=CONVECTIVE\u0026type=SIGMET'\n```","operationId":"getSigmetArea","parameters":[{"name":"hazard","in":"query","description":"Filter by hazard type (e.g. TURBULENCE, ICING, IFR, CONVECTIVE).","schema":{"type":"string","description":"Filter by hazard type (e.g. TURBULENCE, ICING, IFR, CONVECTIVE).","example":"TURBULENCE"}},{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"max_alt","in":"query","description":"Maximum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or below this value.","schema":{"type":"string","description":"Maximum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or below this value."}},{"name":"min_alt","in":"query","description":"Minimum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or above this value.","schema":{"type":"string","description":"Minimum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or above this value."}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"severity","in":"query","description":"Filter by severity (e.g. LGT, MOD, SEV).","schema":{"type":"string","description":"Filter by severity (e.g. LGT, MOD, SEV).","example":"MOD"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}},{"name":"type","in":"query","description":"Filter by advisory type (SIGMET or AIRMET).","schema":{"type":"string","description":"Filter by advisory type (SIGMET or AIRMET)."}}],"responses":{"200":{"description":"List of matching SIGMETs"},"400":{"description":"Validation error. Body is an APIError; field-level details are in errors[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/sigmet/history":{"get":{"tags":["SIGMET"],"summary":"SIGMETs/AIRMETs valid within a time range","description":"Returns advisories from the 30-day version archive whose validity window overlaps with the requested `time` range, regardless of geography. Every distinct received version of an advisory (amendments included) is archived: by default each advisory appears once as its most recent received version; pass `versions=all` to see every archived amendment (repeated `source_id`s, differentiated by `received_at`). Filters apply before the version collapse, so the default mode returns the latest version *matching the filters*. Use this for backfilling historical analyses; for live ops use `/sigmet/area` or `/sigmet/point`.\n\n**Happy path** — `200 OK` with matching advisories.\n\n**Bad paths**\n- `400 INVALID_TIME_RANGE` — `start` is after `end`, or the range is otherwise malformed.\n- `400 VALIDATION_ERROR` — invalid filter or pagination parameter.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example call**\n```bash\ncurl 'https://api.atmosoar.io/metar/api/sigmet/history?time=2026-04-01T00:00:00Z,2026-04-02T00:00:00Z\u0026hazard=ICING'\n```","operationId":"getSigmetHistory","parameters":[{"name":"hazard","in":"query","description":"Filter by hazard type (e.g. TURBULENCE, ICING, IFR, CONVECTIVE).","schema":{"type":"string","description":"Filter by hazard type (e.g. TURBULENCE, ICING, IFR, CONVECTIVE).","example":"TURBULENCE"}},{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"max_alt","in":"query","description":"Maximum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or below this value.","schema":{"type":"string","description":"Maximum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or below this value."}},{"name":"min_alt","in":"query","description":"Minimum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or above this value.","schema":{"type":"string","description":"Minimum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or above this value."}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"severity","in":"query","description":"Filter by severity (e.g. LGT, MOD, SEV).","schema":{"type":"string","description":"Filter by severity (e.g. LGT, MOD, SEV).","example":"MOD"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}},{"name":"type","in":"query","description":"Filter by advisory type (SIGMET or AIRMET).","schema":{"type":"string","description":"Filter by advisory type (SIGMET or AIRMET)."}},{"name":"versions","in":"query","description":"Version selection: 'latest' (default) returns the most recent received version of each advisory; 'all' returns every distinct amendment/version received. Repeated source_id values in 'all' mode are differentiated by received_at.","schema":{"type":"string","description":"Version selection: 'latest' (default) returns the most recent received version of each advisory; 'all' returns every distinct amendment/version received. Repeated source_id values in 'all' mode are differentiated by received_at.","default":"latest","enum":["latest","all"]}}],"responses":{"200":{"description":"List of matching SIGMETs"},"400":{"description":"Validation error. Body is an APIError; field-level details are in errors[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/sigmet/point":{"get":{"tags":["SIGMET"],"summary":"SIGMETs/AIRMETs covering a geographic point","description":"Returns SIGMETs and AIRMETs whose polygons contain the requested point and are valid at the requested time. The `location` parameter for this endpoint accepts a single point (`lat,lon`), a radius (`lat,lon|radius_km`), or an ICAO station code (e.g. `KJFK`).\n\nFilter by hazard type, severity, advisory type, and altitude band.\n\n**Happy path** — `200 OK` with matching advisories (possibly empty).\n\n**Bad paths**\n- `400 INVALID_LOCATION` — malformed point/radius/station.\n- `400 VALIDATION_ERROR` — invalid filter, time, or pagination parameter.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# All advisories covering JFK right now\ncurl 'https://api.atmosoar.io/metar/api/sigmet/point?location=KJFK'\n\n# Only TURBULENCE advisories within 200 km of a point at FL180+\ncurl 'https://api.atmosoar.io/metar/api/sigmet/point?location=40.6,-73.7|200\u0026hazard=TURBULENCE\u0026min_alt=18000'\n```","operationId":"getSigmetPoint","parameters":[{"name":"hazard","in":"query","description":"Filter by hazard type (e.g. TURBULENCE, ICING, IFR, CONVECTIVE).","schema":{"type":"string","description":"Filter by hazard type (e.g. TURBULENCE, ICING, IFR, CONVECTIVE).","example":"TURBULENCE"}},{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"max_alt","in":"query","description":"Maximum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or below this value.","schema":{"type":"string","description":"Maximum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or below this value."}},{"name":"min_alt","in":"query","description":"Minimum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or above this value.","schema":{"type":"string","description":"Minimum altitude in metres (integer). Returns SIGMETs whose altitude range reaches at or above this value."}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"severity","in":"query","description":"Filter by severity (e.g. LGT, MOD, SEV).","schema":{"type":"string","description":"Filter by severity (e.g. LGT, MOD, SEV).","example":"MOD"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}},{"name":"type","in":"query","description":"Filter by advisory type (SIGMET or AIRMET).","schema":{"type":"string","description":"Filter by advisory type (SIGMET or AIRMET)."}}],"responses":{"200":{"description":"List of matching SIGMETs"},"400":{"description":"Validation error. Body is an APIError; field-level details are in errors[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/taf/area":{"get":{"tags":["TAF"],"summary":"Latest TAF per station in a bounding box","description":"Returns the latest TAF for every station within the requested area. The `location` parameter is required and must be a bbox or NE|SW rectangle.\n\n**Happy path** — `200 OK` with one entry per station that has a TAF.\n\n**Bad paths**\n- `400 INVALID_LOCATION` — malformed bbox or unsupported `location` form.\n- `400 VALIDATION_ERROR` — invalid `time`, `limit`, or `offset`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example call**\n```bash\ncurl 'https://api.atmosoar.io/metar/api/taf/area?location=bbox:-75,40,-73,42\u0026limit=10'\n```","operationId":"getTafArea","parameters":[{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of latest TAFs per station"},"400":{"description":"Validation error. Body is an APIError; field-level details are in errors[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/taf/nearest":{"get":{"tags":["TAF"],"summary":"Latest TAF for the nearest station(s) to a point","description":"Returns the latest TAF forecast for the station(s) closest to a geographic point, ordered by distance. The `location` parameter is required and must be a point (`lat,lon`), a radius (`lat,lon|radius_km`), or an ICAO station code; for a radius the search is capped to that distance. Use `n` to request more than the single closest station. When `time` is provided, the latest record at-or-before that timestamp is used per station; when omitted, the most recent record is returned. Each entry carries `distance_m`, the great-circle distance in metres from the requested point.\n\n**Happy path** — `200 OK` with up to `n` entries, nearest first.\n\n**Bad paths**\n- `400 INVALID_LOCATION` — `location` is a bbox/rectangle or otherwise not a point/radius/station.\n- `400 VALIDATION_ERROR` — invalid `time` or `n`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example calls**\n```bash\n# Single nearest station to a point\ncurl 'https://api.atmosoar.io/metar/api/taf/nearest?location=40.6,-73.7'\n\n# Three nearest stations within 200 km\ncurl 'https://api.atmosoar.io/metar/api/taf/nearest?location=40.6,-73.7|200\u0026n=3'\n```","operationId":"getTafNearest","parameters":[{"name":"location","in":"query","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","schema":{"type":"string","description":"Location to query. Accepts: bounding box 'bbox:west,south,east,north', point 'lat,lon', NE|SW rectangle 'lat1,lon1|lat2,lon2', radius 'lat,lon|radius_km', ICAO station code (e.g. 'KJFK'), or country shortcut (e.g. 'germany'). Endpoint-specific support varies — area endpoints accept bbox/rectangle, point endpoints accept point/radius/station.","example":"bbox:-130,20,-60,50"}},{"name":"n","in":"query","description":"Number of nearest stations to return, ordered by distance. Defaults to 1 (the single closest station). Capped server-side by MAX_AREA_RESULTS.","schema":{"type":"string","description":"Number of nearest stations to return, ordered by distance. Defaults to 1 (the single closest station). Capped server-side by MAX_AREA_RESULTS.","default":"1"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of nearest stations with their latest TAF forecast, nearest first."},"400":{"description":"Validation error (commonly an invalid location).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/taf/station/{icao}":{"get":{"tags":["TAF"],"summary":"Latest TAF for a station","description":"Returns the most recent TAF (Terminal Aerodrome Forecast) for the given ICAO station. Forecasts include `valid_from` / `valid_to` covering the next 24–30 hours.\n\n**Happy path** — `200 OK` with a single TAF object.\n\n**Bad paths**\n- `404 NOT_FOUND` — the station has no TAF within the retention window (TAF retention defaults to 30 days).\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example call**\n```bash\ncurl https://api.atmosoar.io/metar/api/taf/station/KJFK\n```","operationId":"getTafLatest","parameters":[{"name":"icao","in":"path","description":"ICAO station identifier (case-insensitive).","required":true,"schema":{"type":"string","description":"ICAO station identifier (case-insensitive).","example":"KJFK"}}],"responses":{"200":{"description":"Latest TAF forecast"},"404":{"description":"No TAF available for station within retention window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/api/taf/station/{icao}/history":{"get":{"tags":["TAF"],"summary":"TAF history for a station","description":"Returns historical TAFs for the station, ordered newest-first. Use the `time` parameter to scope the issuance window. Pagination via `limit` / `offset`.\n\n**Happy path** — `200 OK` with array of TAFs.\n\n**Bad paths**\n- `400 VALIDATION_ERROR` — invalid `time`, `limit`, or `offset`.\n- `500 INTERNAL_ERROR` — unexpected server error.\n\n**Example call**\n```bash\ncurl 'https://api.atmosoar.io/metar/api/taf/station/KJFK/history?limit=10'\n```","operationId":"getTafHistory","parameters":[{"name":"icao","in":"path","description":"ICAO station identifier (case-insensitive).","required":true,"schema":{"type":"string","description":"ICAO station identifier (case-insensitive).","example":"KJFK"}},{"name":"limit","in":"query","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","schema":{"type":"string","description":"Maximum number of results to return (positive integer). Defaults to 100, capped server-side.","default":"100"}},{"name":"offset","in":"query","description":"Number of results to skip (non-negative integer).","schema":{"type":"string","description":"Number of results to skip (non-negative integer).","default":"0"}},{"name":"time","in":"query","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","schema":{"type":"string","description":"Time to query. Accepts: single RFC 3339 timestamp, range 'start,end[,resolution]', list 't1|t2|...' (pipe-separated), or named shortcut. Defaults to now / endpoint-specific lookback when omitted. For area endpoints the latest timestamp is used; for history endpoints the full range.","example":"2025-04-13T12:00:00Z"}}],"responses":{"200":{"description":"List of TAF forecasts"},"400":{"description":"Validation error. Body is an APIError; field-level details are in errors[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/healthz":{"get":{"tags":["Health"],"summary":"Liveness probe","description":"Cheap liveness probe — returns `200 {\"status\":\"ok\"}` as long as the process is responsive. Does **not** check downstream dependencies; use `/metar/readyz` for readiness gating.","operationId":"healthLive","responses":{"200":{"description":"Service is alive"},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}}}}},"/metar/readyz":{"get":{"tags":["Health"],"summary":"Readiness probe","description":"Readiness probe — returns `200 {\"status\":\"ready\"}` when the database is reachable. Returns `503 {\"status\":\"unavailable\", \"reason\":\"...\"}` when the DB ping fails. Kubernetes uses this to decide whether to route traffic to the pod.","operationId":"healthReady","responses":{"200":{"description":"Service is ready"},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttputilsAPIError"}}}},"503":{"description":"Service is not ready (database unavailable).","content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}}}}}},"components":{"schemas":{"HttputilsAPIError":{"type":"object","properties":{"code":{"type":"string"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/HttputilsFieldError"}},"httpStatus":{"type":"integer","format":"int32"},"message":{"type":"string"}}},"HttputilsFieldError":{"type":"object","properties":{"code":{"type":"string"},"field":{"type":"string"},"message":{"type":"string"}}}}},"tags":[{"name":"Health","description":"Health and readiness probes"},{"name":"METAR","description":"Meteorological aerodrome reports (observations)"},{"name":"METAR+TAF","description":"Combined METAR and TAF queries"},{"name":"SIGMET","description":"SIGMETs and AIRMETs (significant weather advisories)"},{"name":"TAF","description":"Terminal aerodrome forecasts"}]}