---
title: "Get recent NWS local storm reports as GeoJSON."
method: GET
path: "/v1/storm-reports"
tags: ["Storms"]
---

# Get recent NWS local storm reports as GeoJSON.

`GET /v1/storm-reports`

## Request

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

Returns a GeoJSON `FeatureCollection` of recent NWS local storm
reports (LSR) — observed tornadoes, hail, damaging wind, flood,
etc. Each feature carries the report's geometry plus a
`properties` bag with at minimum `valid_time` and the
report's payload fields (event-type-specific magnitude /
narrative). The full property bag is forward-compat: the data
pipeline may add new keys without a sw-api release, so consumers
should treat unknown keys as opaque additive data.

### Filters

- `hours` — rolling lookback in whole hours, applied from 1 to
  168 (7 days). Empty means the default window of 6 hours.
- `type` — single-letter NWS report code (e.g. `T` tornado, `H`
  hail, `W` damaging wind, `F` flood). Server uppercases the
  input before forwarding.
- `wfo` — 3-letter NWS Weather Forecast Office identifier (e.g.
  `LOT`). Server uppercases the input.

Filters compose: setting all three returns the reports that match
every filter.

### Caching

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

### Auth

Standard sw-api Bearer auth applies.

## Query parameters

- `hours` integer
- `type` string
- `wfo` string

## Response `200`

GeoJSON FeatureCollection. Empty `features` array when no
reports match the filters (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)
