---
title: "Get Hurricane Hunter aircraft reconnaissance as GeoJSON."
method: GET
path: "/v1/tropical/observations"
tags: ["Storms"]
---

# Get Hurricane Hunter aircraft reconnaissance as GeoJSON.

`GET /v1/tropical/observations`

## Request

- Base URL: `https://api.smarterweather.com`
- URL: `https://api.smarterweather.com/v1/tropical/observations`
- Auth: HTTP bearer

Returns a GeoJSON `FeatureCollection` of NOAA/USAF Hurricane
Hunter aircraft observations: vortex data message (VDM) center
fixes and high-density (HDOB) flight-level observations. These
are **aircraft observations, not surface stations** — METAR
station reports are `GET /v1/observations`. NHC cones, tracks,
and outlook areas stay on the sibling `GET /v1/tropical`
overlay and are never merged into this payload.

Foreign member `storms[]` is the newest VDM fix per storm (or
unnumbered USAF mission), queried independently of `kind` and
`limit`. Unnumbered USAF missions carry `atcf: null` /
`storm_name: null`, so `storm=` never matches them; `kind=hdob`
without `storm` is how to see them.

Retention is 72 hours (`hours` max). The schema is
`x-stability: experimental`: dropsonde/RECCO (`kind` values and
properties) will land later and experimental excludes this
resource from the 90-day breaking-change commitment.

### Filters

- `kind` — `vdm` (vortex fixes), `hdob` (flight-level obs), or
  `all` (both). Default `all`.
- `storm` — ATCF id (`al14`) or name (`polo`). 1–32 letters,
  digits, spaces, or hyphens.
- `hours` — lookback window, integer 1–72. Default 24.
- `limit` — maximum features, integer 1–2000. Default 500.
- `min_lon`, `min_lat`, `max_lon`, `max_lat` — optional bbox.
  All four must be supplied together as numbers. The box must
  satisfy `-180 <= min_lon <= max_lon <= 180` and
  `-90 <= min_lat <= max_lat <= 90` (NaN rejected);
  antimeridian-crossing boxes are not supported. Empty-valued
  bbox params count as absent.

### Caching

Successful responses carry `Cache-Control: public, max-age=30,
stale-while-revalidate=30`.

### Auth

Standard sw-api Bearer auth applies.

## Query parameters

- `kind` 'vdm' | 'hdob' | 'all'
- `storm` string
- `hours` integer
- `limit` integer
- `min_lon` number
- `min_lat` number
- `max_lon` number
- `max_lat` number

## Response `200`

GeoJSON FeatureCollection of recon features. Empty
`features` and `storms` arrays when no aircraft has flown
in the window (200, not 404).

## Other responses

- `400`: Bad request.
- `401`: Missing or invalid API key. Carries a `WWW-Authenticate` challenge and a `next_steps` extension. `recommended` is `device_flow`: the object is a complete no-install mint recipe.
- `403`: API key lacks the required scope. Carries a `WWW-Authenticate` challenge with `error="insufficient_scope"` and a `next_steps` extension.
- `429`: Rate limit exceeded. Carries a `next_steps` extension (`recommended: upgrade`, plus `pricing` and `usage`) telling the caller how to lift the limit.
- `500`: Internal server error.
- `502`: Bad gateway. The service received an invalid response from an upstream data source. Transient; clients should retry with backoff.
- `503`: Service unavailable. An upstream dependency is unavailable or shedding load (type `service-unavailable`). Transient; retry with backoff and honor any `Retry-After` header.
- `504`: Gateway timeout. An upstream data source did not respond within the service's budget.

---

[API](https://skmtc.dev/smarterweather/apis/smarter-weather-api.md) · [All operations](https://skmtc.dev/smarterweather/apis/smarter-weather-api/llms.txt) · [OpenAPI document](https://skmtc.dev/smarterweather/apis/smarter-weather-api/revisions/520d55a696e4?raw)
