NOAA Weather Alert Monitor
## What does NOAA Weather Alert Monitor do?
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| alert-fetched | Charged per weather alert record retrieved from NOAA. | $0.001 |
Example: 100 events = $0.10 · 1,000 events = $1.00
Documentation
What does NOAA Weather Alert Monitor do?
NOAA Weather Alert Monitor queries the official National Weather Service API (api.weather.gov) to retrieve weather alerts across all US states and territories. It operates in two distinct modes. Active mode (the default) fetches all currently live warnings, watches, and advisories in real time -- ideal for monitoring dashboards and notification systems. Historical mode searches recent past alerts within a specified date range -- useful for post-event analysis, insurance risk assessment, and climate research. Each alert record includes the full headline, severity classification, safety instructions, affected area descriptions, SAME and UGC geocodes, issuing NWS office, and complete timing fields. The NWS API is free, open, and requires no API key.
Why use NOAA Weather Alert Monitor on Apify?
- No API key or authentication required -- the NWS API is completely free and open. This actor handles all communication, required headers, pagination, and data transformation automatically.
- Structured, normalized output -- raw NOAA GeoJSON responses with deeply nested properties are transformed into clean, flat JSON records ready for processing, filtering, and export.
- Automatic cursor-based pagination -- the actor follows NWS pagination links to retrieve complete result sets, handling up to 5,000 alerts across up to 20 API pages per run.
- Scheduled monitoring -- run on a recurring Apify schedule (every 15 minutes, hourly, daily) to build a continuous weather alert feed with zero infrastructure.
- Cloud execution with integrations -- no servers or cron jobs needed. Built-in REST API access, webhook triggers, and integrations to Slack, Google Sheets, Zapier, and more.
Key features
- Dual-mode operation -- active alerts for real-time monitoring, or historical search with date ranges for research and trend analysis.
- State and territory filtering -- target any US state or territory using standard two-letter postal codes (CA, TX, FL, PR, GU, etc.) or leave empty for nationwide coverage.
- Three-dimensional alert filtering -- filter by severity (Extreme, Severe, Moderate, Minor), urgency (Immediate, Expected, Future, Past), and certainty (Observed, Likely, Possible, Unlikely).
- Event type search -- find specific alert types like "Tornado Warning", "Flood Watch", "Heat Advisory", or any NWS event name.
- SAME and UGC geocodes -- each alert includes FIPS county codes (SAME) and NWS zone codes (UGC) for county-level geographic targeting.
- NWS headline extraction -- pulls the condensed NWS-specific headline from nested alert parameters for concise summaries.
- Run summary logging -- outputs event type breakdown (top 10), severity distribution, and unique issuing offices after each run.
- Up to 5,000 alerts per run -- configurable
maxResultscap with automatic pagination to retrieve large datasets.
How to use NOAA Weather Alert Monitor
- Go to the NOAA Weather Alert Monitor page on Apify and click Start.
- Choose your mode: leave Active Alerts Only checked for live monitoring, or uncheck it for historical search.
- Enter a State/Territory Code (e.g.,
TXfor Texas) or leave empty for all US alerts. - Optionally set Severity, Urgency, Certainty, or Event Type filters.
- For historical mode, set Start Date and End Date in
YYYY-MM-DDformat. - Set Max Results (default 100, up to 5,000).
- Click Start and wait for results (typically 5--30 seconds).
- Download results from the Dataset tab in JSON, CSV, Excel, or XML format.
- Optionally, set up a recurring schedule (e.g., every 15 minutes) for continuous monitoring.
- Access results programmatically via the Apify API or connect integrations (Slack, webhooks, Google Sheets, Zapier).
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
activeOnly | Boolean | true | When checked, returns only currently active alerts via /alerts/active. Uncheck for historical search with date range filters via /alerts. |
area | String | "CA" (prefill) | Two-letter US state or territory code (e.g., CA, TX, FL, NY, PR). Automatically uppercased. Leave empty for all US alerts. |
severity | Select | -- | Filter by severity: Extreme, Severe, Moderate, Minor, or Unknown. |
urgency | Select | -- | Filter by urgency: Immediate, Expected, Future, Past, or Unknown. |
certainty | Select | -- | Filter by certainty: Observed, Likely, Possible, Unlikely, or Unknown. |
eventType | String | -- | Specific NWS event type (e.g., Tornado Warning, Flash Flood Warning, Winter Storm Watch). Must match NWS naming exactly. |
startDate | String | -- | Start date in YYYY-MM-DD format. Only used when activeOnly is unchecked (historical mode). Converted to T00:00:00Z. |
endDate | String | -- | End date in YYYY-MM-DD format. Only used when activeOnly is unchecked (historical mode). Converted to T23:59:59Z. |
maxResults | Integer | 100 | Maximum number of alerts to return (1--5,000). |
Input examples
Active severe alerts in Texas:
{
"activeOnly": true,
"area": "TX",
"severity": "Severe",
"maxResults": 50
}
Historical tornado warnings with date range:
{
"activeOnly": false,
"area": "OK",
"eventType": "Tornado Warning",
"startDate": "2025-04-01",
"endDate": "2025-04-30",
"maxResults": 500
}
Extreme urgency with observed certainty:
{
"activeOnly": true,
"area": "FL",
"severity": "Extreme",
"urgency": "Immediate",
"certainty": "Observed",
"maxResults": 100
}
All active alerts nationwide (no filters):
{
"activeOnly": true,
"maxResults": 1000
}
Tips for best results
- Active mode is best for monitoring -- it returns only currently live alerts and responds faster since the NWS active endpoint is optimized for real-time queries.
- Date filters are ignored in active mode --
startDateandendDateonly apply whenactiveOnlyis unchecked. This is by design of the NWS API. - Event type strings must match exactly -- use official NWS event names like
Tornado Warning,Flood Watch, orWinter Storm Warning. Partial matches and case variations do not work. - State codes are case-insensitive -- the actor automatically uppercases the
areaparameter, soca,Ca, andCAall work identically. - Combine all three filter dimensions for the most targeted monitoring. Setting severity to
Extreme, urgency toImmediate, and certainty toObservedcaptures only confirmed, life-threatening events in progress. - Schedule runs every 15--30 minutes for continuous monitoring. Connect a webhook or Slack integration to receive notifications when new severe alerts appear.
Output example
Each alert is output as a flat JSON object with 23 fields. Here is a realistic tornado warning:
{
"alertId": "urn:oid:2.49.0.1.840.0.2025.04.15.14.23.0045",
"event": "Tornado Warning",
"headline": "Tornado Warning issued April 15 at 2:23PM CDT by NWS Norman OK",
"severity": "Extreme",
"urgency": "Immediate",
"certainty": "Observed",
"category": "Met",
"status": "Actual",
"messageType": "Alert",
"response": "Shelter",
"areaDesc": "Cleveland, OK; McClain, OK",
"senderName": "NWS Norman OK",
"sender": "[email protected]",
"sent": "2025-04-15T14:23:00-05:00",
"effective": "2025-04-15T14:23:00-05:00",
"onset": "2025-04-15T14:23:00-05:00",
"expires": "2025-04-15T15:00:00-05:00",
"ends": "2025-04-15T15:00:00-05:00",
"description": "The National Weather Service in Norman has issued a Tornado Warning for southeastern Cleveland County in central Oklahoma and northern McClain County in central Oklahoma until 300 PM CDT. At 223 PM CDT, a confirmed tornado was located near Moore, moving northeast at 35 mph. HAZARD: Damaging tornado. SOURCE: Radar confirmed tornado. IMPACT: Flying debris will be dangerous to those caught without shelter.",
"instruction": "TAKE COVER NOW! Move to a basement or an interior room on the lowest floor of a sturdy building. Avoid windows. If you are outdoors, in a mobile home, or in a vehicle, move to the closest substantial shelter and protect yourself from flying debris.",
"sameCodes": ["040027", "040087"],
"ugcCodes": ["OKC025", "OKC087"],
"nwsHeadline": "TORNADO WARNING IN EFFECT UNTIL 300 PM CDT",
"extractedAt": "2025-04-15T19:24:12.345Z"
}
Output fields reference
| Field | Type | Description |
|---|---|---|
alertId | String | Unique NWS alert identifier in URN OID format. |
event | String | NWS event type name (e.g., Tornado Warning, Flood Watch). |
headline | String/null | Human-readable headline with event type, date/time, and issuing office. |
severity | String | Severity level: Extreme, Severe, Moderate, Minor, or Unknown. |
urgency | String | Urgency level: Immediate, Expected, Future, Past, or Unknown. |
certainty | String | Certainty level: Observed, Likely, Possible, Unlikely, or Unknown. |
category | String | CAP alert category (e.g., Met for meteorological, Geo for geophysical). |
status | String | Alert status: Actual, Exercise, System, Test, or Draft. |
messageType | String | Message type: Alert, Update, or Cancel. |
response | String | Recommended action: Shelter, Evacuate, Prepare, Monitor, AllClear, or None. |
areaDesc | String | Human-readable description of affected areas (counties, zones, cities). |
senderName | String | Name of the issuing NWS forecast office (e.g., NWS Norman OK). |
sender | String | Email address of the sending NWS office. |
sent | String | ISO 8601 timestamp when the alert was sent. |
effective | String | ISO 8601 timestamp when the alert becomes effective. |
onset | String/null | ISO 8601 timestamp of expected event onset. Null if not specified. |
expires | String | ISO 8601 timestamp when the alert expires. |
ends | String/null | ISO 8601 timestamp when the event is expected to end. Null if not specified. |
description | String | Full NWS hazard description with event details, source, and expected impact. |
instruction | String/null | Official safety instructions and recommended protective actions. Null if not provided. |
sameCodes | String[] | SAME (Specific Area Message Encoding) FIPS county codes for EAS broadcast targeting. |
ugcCodes | String[] | UGC (Universal Geographic Code) NWS zone/county identifiers. |
nwsHeadline | String/null | Condensed NWS headline extracted from nested alert parameters. Null if not present. |
extractedAt | String | ISO 8601 timestamp when this record was extracted by the actor. |
How it works
Input Config
|
v
Select Endpoint ──> activeOnly=true? ──yes──> /alerts/active
| ──no──> /alerts (+ date params)
v
Build Query Params (area, severity, urgency, certainty, event)
|
v
Fetch Page ──> User-Agent + Accept: application/geo+json
|
v
Parse GeoJSON Features ──> pagination.next exists? ──yes──> Follow cursor URL
| (cap: 20 pages) ──no──> Continue
v
Transform Each Feature ──> Flatten properties, extract geocodes + NWSheadline
|
v
Push to Apify Dataset + Log Summary (event types, severity counts, sources)
Dual-endpoint architecture
The NWS API exposes two separate alert endpoints. The actor selects between them based on the activeOnly flag:
/alerts/active(default) -- returns only currently live alerts. This endpoint is faster and returns smaller payloads because expired alerts are excluded server-side./alerts-- returns both active and historical alerts. This endpoint acceptsstartandenddate query parameters for time-range searches.
When activeOnly is true (or unset), the actor uses the active endpoint. Setting activeOnly to false switches to the full alerts endpoint with date filter support.
Date filter restriction
The startDate and endDate parameters are only appended to the request URL when activeOnly is explicitly false. This matches the NWS API design: the /alerts/active endpoint does not accept date parameters since all returned alerts are, by definition, currently active. Date values are formatted with time suffixes -- T00:00:00Z for start and T23:59:59Z for end -- to cover complete days in UTC.
Cursor-based pagination
Unlike page-number pagination, the NWS API uses cursor-based pagination. Each API response may include a pagination.next URL pointing to the next batch of results. The actor follows these URLs sequentially until one of three conditions is met: no next URL is present, the maxResults cap is reached, or a safety limit of 20 pages is hit. This approach is more reliable than offset-based pagination because it handles data that changes between requests.
NWS headline extraction
NWS alerts contain a nested parameters object with additional metadata. The NWSheadline field (accessed at parameters.NWSheadline[0]) provides a condensed, uppercase headline that is distinct from the main headline field. The actor extracts this into the nwsHeadline output field. This headline is typically shorter and more direct, making it useful for notification subject lines and dashboard displays.
SAME and UGC geocode extraction
Each alert includes a geocode object with two code systems. SAME codes (Specific Area Message Encoding) are six-digit FIPS county codes used by the Emergency Alert System for broadcast targeting on TV, radio, and wireless devices. UGC codes (Universal Geographic Code) are NWS-specific zone and county identifiers used in forecast operations. The actor extracts both arrays from the nested geocode object, defaulting to empty arrays when codes are absent.
User-Agent requirement
The NWS API requires a valid User-Agent header on all requests. Requests without this header are rejected with a 403 error. The actor sends apify-noaa-weather-alerts/1.0 ([email protected]) to comply with this requirement, along with an Accept: application/geo+json header to receive GeoJSON-formatted responses.
Run summary
After processing all alerts, the actor logs a summary that includes:
- Event type breakdown -- the top 10 event types by count (e.g.,
Flood Warning: 15, Heat Advisory: 8, Tornado Watch: 3). - Severity distribution -- count of alerts at each severity level (e.g.,
Extreme: 3, Severe: 12, Moderate: 20). - Unique sources -- list of all NWS forecast offices that issued alerts in the result set.
How much does it cost to run?
The NWS API is completely free with no usage fees. The only cost is Apify platform compute time. Since the actor makes lightweight HTTP requests with no browser rendering, runs are very fast and inexpensive.
| Scenario | Estimated alerts | Estimated time | Estimated cost |
|---|---|---|---|
| Active alerts for one state | 5--100 | ~5 seconds | ~$0.001 |
| Active alerts nationwide | 200--2,000 | ~15 seconds | ~$0.005 |
| Historical search with date range | 500--5,000 | ~30 seconds | ~$0.01 |
Costs are based on Apify platform usage at standard rates with 256 MB memory. Actual costs depend on alert volume and pagination depth. Scheduled monitoring (e.g., every 15 minutes, 24/7) costs approximately $0.10/day.
Limitations and responsible use
- US-only coverage -- the NWS API covers the 50 US states, DC, and US territories (PR, GU, VI, AS, MP). International weather alerts are not available.
- Historical depth is limited -- the NWS API retains historical alerts for a limited window (typically days to weeks). It is not a long-term archive.
- Event type exact match -- the
eventTypefilter requires the exact NWS event name string. Typos, partial names, or case variations return no results. - Pagination safety limit -- the actor follows up to 20 pages of cursor-based pagination. Extremely broad queries exceeding this are truncated.
- No geometry data -- the actor extracts alert properties but does not include GeoJSON polygon coordinates. Use the NWS API directly if you need geographic boundaries.
- No deduplication -- if an alert is updated (e.g.,
messageType: Update), both the original and update may appear. The actor does not deduplicate by event. - Not a substitute for official warnings -- this is a data tool for monitoring and research. For life-safety decisions, always rely on official NWS alerts at weather.gov.
- API availability -- the NWS API may experience degraded performance during severe weather events when demand is highest. The actor throws a descriptive error if the API returns a non-200 status.
- Date precision --
startDateandendDateare converted to full ISO 8601 timestamps (T00:00:00ZandT23:59:59Z). Sub-day time precision is not supported through the actor input.
NWS alert severity levels
| Level | Description |
|---|---|
| Extreme | Extraordinary threat to life or property |
| Severe | Significant threat to life or property |
| Moderate | Possible threat to life or property |
| Minor | Minimal or no known threat to life or property |
| Unknown | Severity is unknown at the time of issuance |
NWS alert urgency levels
| Level | Description |
|---|---|
| Immediate | Responsive action should be taken immediately |
| Expected | Responsive action should be taken within the next hour |
| Future | Responsive action should be taken in the near future |
| Past | Responsive action is no longer required |
| Unknown | Urgency is not determined or not applicable |
NWS alert certainty levels
| Level | Description |
|---|---|
| Observed | Event has been observed or confirmed (e.g., tornado sighted) |
| Likely | Probability greater than 50% the event will occur |
| Possible | Probability between 25% and 50% the event will occur |
| Unlikely | Probability less than 25% the event will occur |
| Unknown | Certainty is not determined or not applicable |
API integration examples
Use the Apify API to run the actor programmatically and retrieve results in your applications, pipelines, or automated workflows.
Python:
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/noaa-weather-alerts").call(run_input={
"activeOnly": True,
"area": "TX",
"severity": "Severe",
"maxResults": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['event']}: {item['headline']}")
print(f" Severity: {item['severity']} | Urgency: {item['urgency']}")
print(f" Areas: {item['areaDesc']}")
print()
JavaScript:
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/noaa-weather-alerts").call({
activeOnly: true,
area: "FL",
severity: "Extreme",
urgency: "Immediate",
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const alert of items) {
console.log(`${alert.event}: ${alert.headline}`);
console.log(` Instruction: ${alert.instruction}`);
}
cURL:
# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~noaa-weather-alerts/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"activeOnly": false,
"area": "CA",
"eventType": "Flood Warning",
"startDate": "2025-01-01",
"endDate": "2025-01-31",
"maxResults": 200
}'
# Retrieve results (replace DATASET_ID from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
FAQ
What types of weather alerts does this actor return? Every alert type issued by the National Weather Service, including Tornado Warnings, Severe Thunderstorm Warnings, Flash Flood Warnings, Flood Watches, Winter Storm Warnings, Blizzard Warnings, Ice Storm Warnings, Hurricane Warnings, Tropical Storm Warnings, Heat Advisories, Excessive Heat Warnings, High Wind Warnings, Wind Advisories, Fire Weather Watches, Red Flag Warnings, Dense Fog Advisories, Freeze Warnings, Frost Advisories, Tsunami Warnings, and dozens more. Any alert published through the NOAA Weather API is captured.
What US states and territories are supported? All 50 US states, Washington DC, and US territories including Puerto Rico (PR), Guam (GU), US Virgin Islands (VI), American Samoa (AS), and Northern Mariana Islands (MP). Use standard two-letter postal codes.
Can I search for multiple states at once?
The NWS API area parameter accepts a single state code per request. To monitor multiple states, leave the area field empty to search all US alerts nationwide, or run the actor separately for each state.
Why do my date filters have no effect?
Date filters (startDate and endDate) only work in historical mode. Make sure activeOnly is set to false. When activeOnly is true (the default), the actor uses the /alerts/active endpoint which does not accept date parameters.
How often are NWS alerts updated? The NWS updates alerts in near real-time. New alerts are typically available within seconds of issuance. For continuous monitoring, schedule the actor to run every 15--30 minutes.
What are SAME codes and UGC codes? SAME codes are six-digit FIPS county identifiers used by the Emergency Alert System (EAS) for broadcast targeting on TV, radio, and wireless devices. UGC codes are NWS-specific zone and county codes used in forecast products. Both are useful for programmatic geographic matching and integration with emergency notification systems.
How do I set up continuous weather monitoring? On the Apify platform, create a scheduled task that runs this actor at your desired interval (e.g., every 15 minutes). Configure a webhook or integration (Slack, email, Zapier, Google Sheets) to receive or store the output dataset after each run. This provides automated, continuous weather alert monitoring without any server infrastructure.
Related actors
| Actor | Description | Link |
|---|---|---|
| FEMA Disaster Declaration Search | Search FEMA disaster declarations by state, type, and date range | ryanclinton/fema-disaster-search |
| GDACS Disaster Alerts | Monitor global disaster alerts from earthquakes, floods, cyclones, and volcanoes | ryanclinton/gdacs-disaster-alerts |
| UK Environment Agency Flood Warnings | Search active flood warnings and alerts across England | ryanclinton/uk-flood-warnings |
| Weather Forecast Search | Get detailed weather forecasts for any global location | ryanclinton/weather-forecast-search |
| USGS Earthquake Search | Search recent and historical earthquake data from USGS | ryanclinton/usgs-earthquake-search |
| Website Change Monitor | Monitor any weather-related web page for content changes | ryanclinton/website-change-monitor |
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
Bulk Email Verifier
Verify email deliverability at scale. MX record validation, SMTP mailbox checks, disposable and role-based detection, catch-all flagging, and confidence scoring. No external API costs.
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Website Tech Stack Detector
Detect 100+ web technologies on any website. Identifies CMS, frameworks, analytics, marketing tools, chat widgets, CDNs, payment systems, hosting, and more. Batch-analyze multiple sites with version detection and confidence scoring.
Ready to try NOAA Weather Alert Monitor?
Start for free on Apify. No credit card required.
Open on Apify Store