# NWS Weather Alerts & Severe Storm Warnings Scraper (USA) (`scrapers_lat/nws-weather-alerts-scraper`) Actor

Scrape active US National Weather Service alerts by state or point: tornado, flood, hurricane, heat and winter warnings with severity, urgency, affected counties, instructions and expiry. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/nws-weather-alerts-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.34 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![NWS Weather Alerts & Severe Storm Warnings Scraper (USA)](https://scrapers.lat/banners/nws-weather-alerts-scraper.png)](https://console.apify.com/actors/YxfvcWu2ZMOFOWIYu/input)

## NWS Weather Alerts & Severe Storm Warnings Scraper (USA)

Here is one real result, with every field the actor returns:

```json
{
  "alertId": "urn:oid:2.49.0.1.840.0.9a8f54e6e50ad7bfae50e06ec65ad9bc9a666615.001.1",
  "event": "Extreme Heat Warning",
  "headline": "Extreme Heat Warning issued August 20 at 1:41PM PDT until August 23 at 8:00PM PDT by NWS San Diego CA",
  "severity": "Severe",
  "urgency": "Expected",
  "certainty": "Likely",
  "category": "Met",
  "messageType": "Update",
  "status": "Actual",
  "areaDesc": "Coachella Valley; San Diego County Deserts; San Gorgonio Pass Near Banning",
  "states": ["CA"],
  "senderName": "NWS San Diego CA",
  "sent": "2026-08-20T13:41:00-07:00",
  "effective": "2026-08-20T13:41:00-07:00",
  "onset": "2026-08-20T13:41:00-07:00",
  "expires": "2026-08-20T21:45:00-07:00",
  "ends": "2026-08-23T20:00:00-07:00",
  "description": "* WHAT...Dangerously hot conditions with temperatures up to 113.\n\n* WHERE...Coachella Valley, San Diego County Deserts, and San Gorgonio Pass near Banning.\n\n* WHEN...Until 8 PM PDT Sunday.\n\n* IMPACTS...Heat related illnesses increase significantly during extreme heat events.",
  "instruction": "Drink plenty of fluids, stay in an air-conditioned room, stay out of the sun, and check up on relatives and neighbors.",
  "nwsHeadline": "EXTREME HEAT WARNING REMAINS IN EFFECT UNTIL 8 PM PDT SUNDAY",
  "vtec": "/O.CON.KSGX.XH.W.0008.000000T0000Z-260824T0300Z/",
  "affectedZoneCount": 3,
  "affectedZonesUGC": ["CAZ061", "CAZ062", "CAZ065"],
  "affectedSameCodes": ["006065", "006073"],
  "allClear": false,
  "queryArea": "CA",
  "queryPoint": null,
  "forecastPeriod": null,
  "forecastTemperature": null,
  "forecastTemperatureUnit": null,
  "forecastWindSpeed": null,
  "forecastWindDirection": null,
  "forecastShort": null,
  "forecastDetailed": null,
  "forecastOffice": null,
  "forecastCity": null,
  "aiPlainSummary": null,
  "aiWhoIsAffected": null,
  "aiRecommendedAction": null,
  "aiRiskLevel": null,
  "source": "NWS",
  "observedAt": "2026-08-21T00:25:13.047Z",
  "error": null
}
```

The most complete US weather alerts scraper available. It returns every field the National Weather Service publishes for each active alert, including the full description and protective-action instructions, plus derived fields (state codes, affected zone and county codes, an all-clear flag), and gives you six filters plus two paid add-ons to target exactly the alerts you need.

**📥 [Input](https://apify.com/scrapers_lat/nws-weather-alerts-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/nws-weather-alerts-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/nws-weather-alerts-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/nws-weather-alerts-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-United%20States-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor pulls active US National Weather Service alerts for the states or point you pass, applies your filters, and writes one normalized record per alert to the run's dataset. It covers every alert type the NWS issues: tornado, severe thunderstorm, flash flood, hurricane and tropical storm, winter storm, blizzard, extreme heat, air quality, red flag fire, coastal and marine warnings, and more.

Each record carries the alert event, severity, urgency and certainty, the affected counties and zones, the issuing office, the full timing (sent, effective, onset, expires, ends), the complete description, and the recommended protective actions. Derived fields are added on top of the raw source: two-letter `states`, the affected `affectedZonesUGC` and `affectedSameCodes` code lists, and an `allClear` flag. When a state or point has no active alerts, the actor returns a single `allClear` row and does not charge for it.

Two opt-in paid add-ons are available: a short-term location forecast for a point input, and an AI action summary that turns each alert into a plain-language summary, who is affected, a recommended action, and a risk level.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns up to 10 active alerts for Texas.

```json
{
  "area": "TX",
  "maxResults": 10
}
```

Pass a comma-separated list to cover several states in one run, for example `"area": "FL,GA,AL"`. Use a `point` instead of `area` to get alerts covering one exact location, for example `"point": "29.76,-95.36"`. Add `severity` or `event` to narrow the results.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `area` | string | conditional | (empty) | One or more two-letter US state or territory codes, comma separated, for example `TX`, `FL,GA` or `CA,OR,WA`. Provide this or `point`. |
| `point` | string | conditional | (empty) | Latitude and longitude as `lat,lon`, for example `29.76,-95.36`, to get alerts covering that exact location. Provide this or `area`. |
| `event` | string | no | (empty) | Keep only alerts whose event name contains this text, for example `Tornado`, `Flood`, `Hurricane`, `Winter Storm`, `Heat`. Case-insensitive. |
| `severity` | enum | no | (any) | Return only alerts at this severity: `Extreme`, `Severe`, `Moderate`, `Minor`. |
| `urgency` | enum | no | (any) | Return only alerts at this urgency: `Immediate`, `Expected`, `Future`. |
| `status` | enum | no | `actual` | `actual` returns real operational alerts. `test` returns system test messages. |
| `includeForecast` | boolean | no | `false` | Paid add-on (paid plans, point input only). Adds the short-term NWS forecast for the point. Charged only when a real forecast is returned. |
| `aiAlertAction` | boolean | no | `false` | Paid add-on (paid plans). Adds an AI plain-language summary, who is affected, a recommended action, and a risk level per alert. Charged only when a usable result is produced. |
| `maxResults` | integer | no | `10` | Maximum alert records to return across the run. Free Apify plans are capped at 10 per run. |

Either `area` or `point` is required. Filters combine with logical AND.

### Output reference

One dataset item per active alert. Types: `string`, `number`, `boolean`, `string[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `alertId` | string | Unique NWS alert identifier. |
| `event` | string | Alert event type, for example `Tornado Warning`, `Flood Watch`, `Extreme Heat Warning`. |
| `headline` | string | Human-readable alert headline. |
| `severity` | string | `Extreme`, `Severe`, `Moderate`, `Minor`, or `Unknown`. |
| `urgency` | string | `Immediate`, `Expected`, `Future`, `Past`, or `Unknown`. |
| `certainty` | string | `Observed`, `Likely`, `Possible`, `Unlikely`, or `Unknown`. |
| `category` | string | Alert category, for example `Met` (meteorological). |
| `messageType` | string | `Alert`, `Update`, or `Cancel`. |
| `status` | string | Alert status, for example `Actual` or `Test`. |
| `areaDesc` | string | Affected areas described (counties and zones), semicolon separated. |
| `states` | string\[] | Two-letter US state codes covered by the alert. |
| `senderName` | string | Issuing NWS office. |
| `sent` | string | When the alert was sent (ISO 8601). |
| `effective` | string | When the alert becomes effective (ISO 8601). |
| `onset` | string | When the hazard is expected to begin (ISO 8601). |
| `expires` | string | When the alert message expires (ISO 8601). |
| `ends` | string | When the hazard is expected to end (ISO 8601). |
| `description` | string | Full alert description narrative. |
| `instruction` | string | Recommended protective action instructions. |
| `nwsHeadline` | string | Extra NWS headline parameter, if present. |
| `vtec` | string | VTEC event code string, if present. |
| `affectedZoneCount` | number | Number of affected forecast or county zones. |
| `affectedZonesUGC` | string\[] | UGC zone and county codes affected. |
| `affectedSameCodes` | string\[] | SAME (FIPS) county codes affected. |
| `allClear` | boolean | `true` when there are no active alerts for the query. These rows are not charged. |
| `queryArea` | string | The `area` input that produced this record. |
| `queryPoint` | string | The `point` input that produced this record. |
| `forecastPeriod` | string | Forecast add-on: period name, for example `Tonight`. |
| `forecastTemperature` | number | Forecast add-on: temperature. |
| `forecastTemperatureUnit` | string | Forecast add-on: temperature unit (`F` or `C`). |
| `forecastWindSpeed` | string | Forecast add-on: wind speed. |
| `forecastWindDirection` | string | Forecast add-on: wind direction. |
| `forecastShort` | string | Forecast add-on: short forecast text. |
| `forecastDetailed` | string | Forecast add-on: detailed forecast text. |
| `forecastOffice` | string | Forecast add-on: NWS forecast office code. |
| `forecastCity` | string | Forecast add-on: nearest city to the point. |
| `aiPlainSummary` | string | AI add-on: plain-language summary of the alert. |
| `aiWhoIsAffected` | string | AI add-on: who and where is affected. |
| `aiRecommendedAction` | string | AI add-on: most important recommended action. |
| `aiRiskLevel` | string | AI add-on: risk level (`low`, `moderate`, `high`, `extreme`). |
| `source` | string | Data source. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

### Example output record

Real record from a live run with the location forecast add-on (input `{"point": "29.76,-95.36", "includeForecast": true}`):

```json
{
  "alertId": "urn:oid:2.49.0.1.840.0.c35c7a4380227a208f17cf70594085980a2954d2.001.1",
  "event": "Heat Advisory",
  "headline": "Heat Advisory issued August 20 at 1:30PM CDT until August 21 at 7:00PM CDT by NWS Houston/Galveston TX",
  "severity": "Moderate",
  "urgency": "Expected",
  "certainty": "Likely",
  "category": "Met",
  "messageType": "Update",
  "status": "Actual",
  "areaDesc": "Houston; Trinity; Madison; Walker; San Jacinto; Polk; Burleson; Brazos; Montgomery; Inland Harris; Fort Bend; Coastal Galveston; Galveston Island",
  "states": ["TX"],
  "senderName": "NWS Houston/Galveston TX",
  "onset": "2026-08-20T13:30:00-05:00",
  "expires": "2026-08-20T21:30:00-05:00",
  "ends": "2026-08-21T19:00:00-05:00",
  "instruction": "Drink plenty of fluids, stay in an air-conditioned room, stay out of the sun, and check up on relatives and neighbors.",
  "affectedZoneCount": 33,
  "queryArea": null,
  "queryPoint": "29.76,-95.36",
  "forecastPeriod": "Tonight",
  "forecastTemperature": 81,
  "forecastTemperatureUnit": "F",
  "forecastWindSpeed": "5 to 10 mph",
  "forecastWindDirection": "S",
  "forecastShort": "Slight Chance Showers And Thunderstorms then Partly Cloudy",
  "forecastOffice": "HGX",
  "forecastCity": "Houston",
  "source": "NWS",
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~nws-weather-alerts-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"area":"TX,OK","event":"Tornado","maxResults":50}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~nws-weather-alerts-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"area":"CA","severity":"Severe","maxResults":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/nws-weather-alerts-scraper \
  --input '{"point":"29.76,-95.36","includeForecast":true}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per active alert returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/nws-weather-alerts-scraper/pricing) for the current per-result price.
- **No charge on all-clear or failure.** When a state or point has no active alerts, the actor returns a single `allClear` row and does not charge. If a run errors, it writes a single item with a populated `error` field and does not charge for it.
- **Add-ons are opt-in and paid-plan only.** The location forecast and AI alert action add-ons are disabled for free users, default off, and charge only when they genuinely return data.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 records per run. Upgrade for higher `maxResults`.

### FAQ and troubleshooting

**A run returned a single row with `allClear: true`. Why?**
That state or point has no active alerts right now. This is a valid all-clear response and is not charged. Many states have zero active alerts on a calm day.

**How do I get only the most serious warnings?**
Set `severity` to `Extreme` or `Severe`, or set `event` to a specific type such as `Tornado` or `Hurricane`. You can combine both.

**Can I monitor several states at once?**
Yes. Pass a comma-separated list in `area`, for example `FL,GA,AL,SC`.

**What is the difference between `area` and `point`?**
`area` returns every active alert for the listed states. `point` returns only the alerts whose polygon or zone covers that exact latitude and longitude, which is useful for a single facility, farm, or route waypoint.

**What does the location forecast add-on add?**
For a `point` input, it fetches the short-term NWS forecast for that location (period, temperature, wind, and conditions) and attaches it to the alerts, so you get both the warning and the near-term outlook in one row.

**What does the AI alert action add-on add?**
It reads each alert and returns a plain-language summary, who is affected, the single most important action to take, and a risk level, so non-specialists can act on the alert quickly.

**Is this an official NWS tool?**
No. This actor is independent and has no affiliation with the National Weather Service or NOAA. It reads only data that is publicly available. Always follow official guidance from local authorities during a weather emergency.

### Related scrapers

- [Open-Meteo Weather Forecast Scraper](https://apify.com/scrapers_lat/open-meteo-weather-scraper): global weather forecasts and historical weather by location.
- [openFDA Food Recall & Enforcement Scraper](https://apify.com/scrapers_lat/openfda-food-recalls-scraper): US food recalls and enforcement reports.
- [NHTSA Vehicle Complaints & Safety Ratings Scraper](https://apify.com/scrapers_lat/nhtsa-vehicle-complaints-scraper): US vehicle safety complaints and NCAP ratings.
- [Federal Register Document Scraper](https://apify.com/scrapers_lat/federal-register-scraper): US Federal Register documents.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with the National Weather Service or NOAA. Accesses only publicly available data. Always follow official guidance from local authorities during a weather emergency.

# Actor input Schema

## `area` (type: `string`):

One or more two-letter US state or territory codes to pull active alerts for, comma separated, for example "TX", "FL,GA" or "CA,OR,WA". Provide this or a point below.

## `point` (type: `string`):

Latitude and longitude ("lat,lon", e.g. "29.76,-95.36") to pull active alerts covering that exact location. Use instead of area for a precise spot. Required if area is empty.

## `event` (type: `string`):

Optional. Keep only alerts whose event name contains this text, for example "Tornado", "Flood", "Hurricane", "Winter Storm", "Heat". Case-insensitive.

## `severity` (type: `string`):

Optional. Return only alerts at this severity level.

## `urgency` (type: `string`):

Optional. Return only alerts at this urgency level.

## `status` (type: `string`):

Alert status. "actual" returns real operational alerts (default). "test" returns system test messages.

## `includeForecast` (type: `boolean`):

Opt-in paid add-on (paid Apify plans only, point input only). Fetches the short-term NWS forecast for the queried point (period, temperature, wind, conditions) and attaches it to the alerts. Charged only when a real forecast is returned.

## `aiAlertAction` (type: `boolean`):

Opt-in paid add-on (paid Apify plans only). Uses AI to turn each alert into a plain-language summary, who is affected, a recommended action and a risk level. Charged once per alert only when a usable result is produced.

## `maxResults` (type: `integer`):

Maximum number of alert records to return across the run. Free Apify plans are capped at 10 per run.

## Actor input object example

```json
{
  "area": "TX",
  "status": "actual",
  "includeForecast": false,
  "aiAlertAction": false,
  "maxResults": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "area": "TX",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/nws-weather-alerts-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "area": "TX",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/nws-weather-alerts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "area": "TX",
  "maxResults": 10
}' |
apify call scrapers_lat/nws-weather-alerts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/nws-weather-alerts-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YxfvcWu2ZMOFOWIYu/builds/S9WlXT1Dh1TwUG4YI/openapi.json
