resident.alerts

API, CLI and MCP

Everything on the map is open to scripts and agents. No key. Be kind: 120 requests a minute per address.

HTTP

GET https://resident.alerts.pit.world/api/v1/incidents?lat=47.61&lon=-122.33&km=5&hours=6
GET https://resident.alerts.pit.world/api/v1/incidents?kinds=police,fire&min_severity=3&hours=1
GET https://resident.alerts.pit.world/api/v1/incidents/<id>
GET https://resident.alerts.pit.world/api/v1/radio?lat=29.76&lon=-95.37
GET https://resident.alerts.pit.world/api/v1/sources

Wildfire

GET https://resident.alerts.pit.world/api/v1/fires?lat=37.23&lon=-121.97&km=150     # active fires (with perimeters), evacuation zones, red flag warnings
GET https://resident.alerts.pit.world/api/v1/hotspots?s=36.5&w=-122.5&n=38&e=-121    # VIIRS satellite heat detections, last 48 hours
GET https://resident.alerts.pit.world/api/v1/conditions?lat=37.23&lon=-121.97         # wind, humidity, temperature (NWS) and AQI (AirNow)
POST https://resident.alerts.pit.world/api/v1/devices/follow {"endpoint","auth","id","follow":true}   # pushes when a fire grows, is contained, or is out

Fires, evacuation zones and standing warnings are live: they show for as long as the agency lists them, whatever hours says, and leave when it stops. A shaped incident carries shape, rings of [lat, lon].

Kinds: police, fire, medical, traffic, weather, quake, hazard, other. Severity 1 routine, 2 notable, 3 serious. Times are epoch milliseconds. Without a key, hours stops at 24; send X-Premium-Key: ra_… for up to 30 days.

Command line and terminal UI

bunx @profullstack/residentalerts near 47.61 -122.33 --km 3
bunx @profullstack/residentalerts serious --hours 1
bunx @profullstack/residentalerts radio 29.76 -95.37
bunx @profullstack/residentalerts watch 47.61 -122.33   # live terminal view

MCP

claude mcp add residentalerts -- bunx @profullstack/residentalerts mcp

Tools: incidents_near, serious_incidents, get_incident, radio_near, incident_comments, area_chat, coverage.

Community API

POST /api/v1/residents {"name":"Tony"}          -> { token: "rt_…" }   (send as Authorization: Bearer rt_…)
GET|POST /api/v1/incidents/<id>/comments {"text","media":[ids]}
GET|POST /api/v1/chat?lat=&lon= {"lat","lon","text","media"}
POST /api/v1/media  (multipart "file": photo up to 10 MB, video up to 25 MB)
POST /api/v1/reports {"kind","title","detail","lat","lon","media"}
POST /api/v1/reports/<id>/confirm · POST /api/v1/flag {"target":"post:<id>"}