Docs navigation
REST API
Weather MCP
Agents as developers
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
Active radar-tracked storm cells with projected paths, speeds, and hail/rotation attributes.
Recent severe weather reports including tornadoes, hail, and damaging wind events from SPC.
Radar-derived storm features for map overlays and nowcast work.
Active tropical cyclone tracks and advisory positions.
Hurricane Hunter aircraft reconnaissance: vortex fixes and flight-level observations for active systems.
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.