API
There is no application server. The API is a small set of static JSON
objects, served straight from object storage (Cloudflare R2) behind a CDN. Fetch
them with a plain GET. A machine-readable schema is at
/schema/api-v1.json.
Endpoints
| Path | What it is | Cache |
|---|---|---|
/api/v1/active.json |
The global list of active storms — the entry point. Written last each run,
so it never references a storm whose objects don't yet exist. Carries
degraded (bool) and sources_down (array) so this one
object distinguishes an upstream outage from a genuine no-storms result. |
no-cache |
/api/v1/storms/<storm_id>.json |
Per-storm manifest: the current issuance and the URLs of its three graphics
plus the canonical snapshot. Carries a compact summary object
(current wind/gust/pressure, movement, position, forecast peak, cone
availability) so a client can show intensity without fetching the full
snapshot. |
no-cache |
/api/v1/status.json |
Pipeline-health mirror (generated time, active count, degraded flag). | no-cache |
/storms/<storm_id>/<issue_ts>/<product>.{png,webp,json} |
Immutable products: the graphic (PNG master + WebP) and its provenance sidecar. Keyed by issuance time and never overwritten. | immutable, 1 year |
How to consume it
- Fetch
/api/v1/active.json. - For each storm, follow its
manifest_urlto the per-storm manifest. - Use the product
png_url/webp_urldirectly — they are absolute, immutable, and cache forever. There is nolatest/alias; the manifest is the pointer, so an image URL is never stale.
The summary object
Each per-storm manifest carries a summary denormalized from the
canonical snapshot, so a reader can show intensity and motion without downloading
the full snapshot (which includes the entire forecast and model guidance). Values
are raw canonical units; presentation (mph, Saffir-Simpson category, compass
points) is the reader's job. Any field is null when the source omits it.
| Field | Meaning |
|---|---|
max_sustained_wind_kt | Current max sustained wind (knots). |
gust_kt | Current gust (knots), if reported. |
min_pressure_hpa | Minimum central pressure (hectopascals). |
movement_bearing_deg / movement_speed_kt | Motion: bearing (° from north) and speed (knots). A stationary storm has speed 0 and a null bearing. |
position_lat / position_lon | Current center, signed decimal degrees (N+/S−, E+/W−). |
peak_forecast_wind_kt | Highest max-sustained wind across the official forecast. |
has_cone | Whether an official NHC cone of uncertainty is available for this storm. |
Notes
- Outage ≠ "no storms." An empty
stormsarray withdegraded: falsemeans genuinely no active cyclones;degraded: true(or a failed fetch) means data is delayed while a source recovers. They are different states — don't conflate them. - Wind is in knots, pressure in hectopascals, coordinates in signed decimal degrees.
- Attribution (
"Data: NOAA/NHC"/"Data: JTWC") must be shown. These graphics are not an official government product.