Skip to content
Docs navigation

Storms and tropical

Smarter Weather covers the 50 US states and DC only. Every route that takes a point (lat and lon, zip or location) returns 404 outside-coverage for a point outside the 50 states and DC. /v1/alerts and /v1/observations return it for a bounding box that touches no US domain (CONUS, Alaska, Hawaii); a box that touches one may still include area outside the US. /v1/weather/batch reports it per item as outside_coverage, and /v1/point with points and /v1/series/batch mark such points out_of_domain, as they do a point the check could not reach in time (retry it). If the location lookup is unavailable, the check can briefly fail open. Routes keyed by a station, radar site, forecast office or alert id, and nationwide lists, are not filtered by point, so do not treat an empty result as an all-clear. See Errors.

GeoJSON endpoints for map overlays: storm cells, storm reports, NEXRAD features, tropical cyclones, and recent climate records. Responses use a standard GeoJSON FeatureCollection, compatible with MapLibre, Mapbox, Leaflet, and deck.gl.

Available datasets

Storm trackscache: ~60s

Active radar-tracked storm cells with projected paths, speeds, and hail/rotation attributes.

Storm reportscache: ~60s

Recent severe weather reports including tornadoes, hail, and damaging wind events from SPC.

NEXRAD featurescache: ~60s

Radar-derived storm features for map overlays and nowcast work.

Tropicalcache: ~60s

Active tropical cyclone tracks and advisory positions.

Tropical observationscache: ~30s

Hurricane Hunter aircraft reconnaissance: vortex fixes and flight-level observations for active systems.

Record eventscache: ~60s

Temperature and precipitation records that have been set or tied recently.

Response shape

Every dataset returns a GeoJSON FeatureCollection whose features carry dataset-specific properties. The per-dataset property schema is in the embedded reference below.

Map integration

Fetch the dataset and hand the FeatureCollection to your map library's GeoJSON source. A scheduling or alerting product reaches here when it needs cells, reports, or tracks on a map rather than a single-point forecast.

# first: export SMARTERWEATHER_API_KEY=sw_live_... (or: set -a; source .env; set +a)
curl "https://api.smarterweather.com/v1/storm-tracks" \
  -H "Authorization: Bearer $SMARTERWEATHER_API_KEY"
// save as sample.mjs; run: node --env-file=.env sample.mjs (Node 20.6+, ESM top-level await)
const res = await fetch(
  "https://api.smarterweather.com/v1/storm-tracks",
  { headers: { Authorization: `Bearer ${process.env.SMARTERWEATHER_API_KEY}` } },
);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
console.log(JSON.stringify(data, null, 2));
import os, sys, requests

r = requests.get(
    "https://api.smarterweather.com/v1/storm-tracks",
    headers={"Authorization": f"Bearer {os.environ['SMARTERWEATHER_API_KEY']}"},
)
if not r.ok:
    sys.exit(f"{r.status_code} {r.text}")
data = r.json()
print(data)
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest("GET", "https://api.smarterweather.com/v1/storm-tracks", nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("SMARTERWEATHER_API_KEY"))
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	if res.StatusCode < 200 || res.StatusCode > 299 {
		log.Fatalf("%s %s", res.Status, body)
	}
	fmt.Println(string(body))
}

Storms and tropical reference

Rendered live from the canonical OpenAPI document. This is the canonical reference for the storms and tropical resource.

Paste a test key (sw_test_*) from your dashboard into Test Request. Calls with your own key count toward your plan.

Loading API reference…