Live US severe-weather alerts from the National Weather Service. Pass a point ("lat,lon") to get every active watch, warning, and advisory for that exact location, or an area (2-letter US state or marine zone code) for area-wide alerts. Optionally filter by severity or urgency. Each alert returns the event type, severity, urgency, certainty, headline, affected-area description, issuing office, recommended public response, onset / expiry / end times, and the full hazard description plus protective-action instructions. Results are sorted most-severe first and capped by limit, with the true total reported. Public-domain NOAA / National Weather Service data, refreshed in real time.
/api/weather/alertsPAYMENT-SIGNATURE.The alerts API is a pay-per-call weather endpoint built for AI agents and autonomous software. Live US severe-weather alerts from the National Weather Service.
There is no signup and no API key. An agent (or any HTTP client) hits the endpoint, receives an x402 "402 Payment Required" challenge, signs a sub-cent USDC payment on Base or Solana, and retries — the data comes back on the paid request. That makes it a drop-in alerts data source for an agent tool-use loop, an MCP host, or a backend that needs weather data on demand without onboarding to yet another vendor portal.
| Name | Type | Description |
|---|---|---|
point | string | Exact location as "lat,lon" in decimal degrees, e.g. "25.7617,-80.1918". Returns alerts covering that point. Provide point OR area, not both. |
area | string | 2-letter US state / territory or NWS marine area code, e.g. "FL", "TX", "PK". Returns all active alerts for that area. Provide point OR area, not both. |
severity | string | Filter to a single severity level. one of: Extreme | Severe | Moderate | Minor | Unknown |
urgency | string | Filter to a single urgency level. one of: Immediate | Expected | Future | Past | Unknown |
limit | integer | Max alerts to return (1-100, default 20). Most-severe first. min 1 · max 100 |
# 1. Probe with no auth → 402 envelope with PaymentRequirements curl -sS 'https://2s.io/api/weather/alerts?point=example&area=example&severity=Extreme&urgency=Immediate&limit=20' # 2. Sign + retry with PAYMENT-SIGNATURE: curl -sS 'https://2s.io/api/weather/alerts?point=example&area=example&severity=Extreme&urgency=Immediate&limit=20' \ -H 'PAYMENT-SIGNATURE: <base64-json-payload>' # Or use the canonical runner (handles probe → sign → retry): # EVM_PRIVATE_KEY=0x... node --env-file=.env.local \ # --experimental-strip-types scripts/x402-pay.ts \ # 'https://2s.io/api/weather/alerts?point=example&area=example&severity=Extreme&urgency=Immediate&limit=20'
import { TwoS } from '@2sio/sdk'
const client = new TwoS({
privateKey: process.env.EVM_PRIVATE_KEY as `0x${string}`,
})
const result = await client.weather.alerts({
"point": "example",
"area": "example",
"severity": "Extreme",
"urgency": "Immediate",
"limit": 20
})
console.log('endpoint:', result.endpoint)
console.log('cost:', result.costUsd, 'USDC')
console.log('tx:', result.settlement?.txHash)
console.log('data:', result.data)import os
from twosio import TwoS
client = TwoS(private_key=os.environ["EVM_PRIVATE_KEY"])
result = client.weather.alerts(point="example", area="example", severity="Extreme", urgency="Immediate", limit=20)
print("endpoint:", result.endpoint)
print("cost:", result.cost_usd, "USDC")
print("tx:", (result.settlement or {}).get("tx_hash"))
print("data:", result.data)// 1. Add @2sio/mcp to your MCP host config (Claude Desktop example below).
// EVM_PRIVATE_KEY funds x402 payments per call.
// claude_desktop_config.json
{
"mcpServers": {
"2sio": {
"command": "npx",
"args": ["-y", "@2sio/mcp"],
"env": { "EVM_PRIVATE_KEY": "0x..." }
}
}
}
// 2. Once the server is running, agents call this tool via standard MCP:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "weather.alerts",
"arguments": {
"point": "example",
"area": "example",
"severity": "Extreme",
"urgency": "Immediate",
"limit": 20
}
}
}| Field | Type | Description |
|---|---|---|
ok | boolean | one of: true |
items | array | |
total | integer | Total matching rows upstream; null when unknown. |
source | object | |
meta | object |
{
"ok": true,
"items": [
{
"id": "example",
"event": "example",
"severity": "example",
"urgency": "example",
"certainty": "example",
"category": "example",
"headline": "example",
"areaDescription": "example",
"senderName": "example",
"response": "example",
"status": "example",
"messageType": "example",
"effective": "example",
"onset": "example",
"expires": "example",
"ends": "example",
"description": "example",
"instruction": "example"
}
],
"total": 1,
"source": {
"provider": "example",
"url": "example",
"license": "example"
},
"meta": {
"scope": {
"point": {
"lat": 1,
"lon": 1
},
"area": "example"
}
}
}