Skip to content
Docs navigation
Guides

List the warnings in effect across the US

Give /v1/alerts a bounding box instead of a point and you get the alerts whose area touches it, most severe first.

The request

GET/v1/alerts

ParameterValueWhat it does
min_lon-125Bounding-box west edge.
min_lat24Bounding-box south edge.
max_lon-66Bounding-box east edge.
max_lat50Bounding-box north edge.

Call it

# first, read the key from .env (never source it as shell):
export SMARTERWEATHER_API_KEY="$(sed -n 's/^\(export \)\{0,1\}SMARTERWEATHER_API_KEY=//p' .env | tail -n 1 | tr -d "\r\"' ")"
curl "https://api.smarterweather.com/v1/alerts?min_lon=-125&min_lat=24&max_lon=-66&max_lat=50" \
  -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/alerts?min_lon=-125&min_lat=24&max_lon=-66&max_lat=50",
  { 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));
# pip install requests python-dotenv
import os, sys, requests
from dotenv import load_dotenv

load_dotenv(".env")  # ./.env in the current directory; variables already set are kept

r = requests.get(
    "https://api.smarterweather.com/v1/alerts?min_lon=-125&min_lat=24&max_lon=-66&max_lat=50",
    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/alerts?min_lon=-125&min_lat=24&max_lon=-66&max_lat=50", 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))
}
{
  "name": "get_alerts",
  "arguments": {
    "bbox": {
      "west": -125,
      "south": 24,
      "east": -66,
      "north": 50
    }
  }
}

Your agent can ask the same question through the hosted weather MCP (36 tools).

Run this tool

One-click installs are global; for the key, put the per-project config in the project's .cursor/mcp.json / .vscode/mcp.json.

The key is read from SMARTERWEATHER_API_KEY, the same as on every docs page and in the playground. The code is identical to the playground's “Call it yourself”.

What it answers

Example answer from the recorded sample, Oct 15, 2026 · 24, -125 to 50, -66

At least 50 NWS alerts are in effect; showing the 50 most severe.

  • Freeze Watch17alerts[].event
  • Freeze Warning9alerts[].event
  • Fire Weather Watch7alerts[].event
  • Flood Warning6alerts[].event
  • TruncatedYestruncated

Source: NWS alerts

Fields it reads:

  • alerts[]
  • truncated
  • alerts[].event

Gotchas

  • The box returns every alert type. Add event (for example Tornado Warning) to keep only the ones you act on.
  • A box returns at most 50 alerts, most severe first. truncated is true when the result reached that cap: more alerts may exist, and there is no next page.
  • This box covers the lower 48. Alaska and Hawaii need boxes of their own.
Run it in the playground