---
title: "Get active storm-cell tracks as GeoJSON."
method: GET
path: "/v1/storm-tracks"
tags: ["Storms"]
---

# Get active storm-cell tracks as GeoJSON.

`GET /v1/storm-tracks`

## Request

- Base URL: `https://api.smarterweather.com`
- URL: `https://api.smarterweather.com/v1/storm-tracks`
- Auth: HTTP bearer

Returns a GeoJSON `FeatureCollection` of active storm-cell
tracks aggregated from NEXRAD radar products. Each feature
carries cell metadata (id, site, scan / valid times) plus an
optional impact section listing affected cities and population
when `detailed=true` is requested.

### Site filter

`site` is an optional NEXRAD radar site code. The storm-track
pipeline keys on the 3-letter site code (e.g., `LOT`, `TLX`);
a 4-letter ICAO (e.g., `KLOT`) is also accepted. Empty `site`
returns one feature per active radar cell across the network;
setting `site` filters to that radar. Site IDs are uppercased
server-side.

### Detailed mode

`detailed=true` adds each cell's impact payload
(`properties.impact.affected_cities`,
`properties.impact.affected_population`). Detailed responses
are larger and use a 60s server-side cache; the all-sites
all-cells path uses a 30s cache.

### Schema stability

The GeoJSON `type`, `geometry`, and `properties.cell_id` /
`properties.site_id` / `properties.scan_time` /
`properties.valid_time` fields are stable. Other property-bag
keys (`impact.*`, `category`, etc.) are documented as
forward-compat: the data pipeline may add new keys without a
sw-api release, so consumers should treat unknown keys as
opaque additive data.

### Caching

Successful responses carry `Cache-Control: public, max-age=30,
stale-while-revalidate=30`. Edge cache key includes the
full query string (`site` and `detailed`) so each variant
gets its own TTL.

### Auth

Standard sw-api Bearer auth applies.

## Query parameters

- `site` string
- `detailed` boolean

## Response `200`

GeoJSON FeatureCollection. Empty `features` array when no
active cells are tracked (this is a 200, not a 404 — a 200
with `{"features": []}` is the canonical "no active storms"
response).

## 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)
