# NOAA Storm Events, Damage & Weather Risk Scraper (`logiover/noaa-storm-events-bulk-scraper`) Actor

Export official NOAA storm events from 1950 onward with event type, location, coordinates, fatalities, injuries, property and crop damage, magnitude and narratives. Bulk weather-risk data for insurance, logistics and climate analytics.

- **URL**: https://apify.com/logiover/noaa-storm-events-bulk-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#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

## NOAA Storm Events, Damage & Weather Risk Scraper

Stream and export official NOAA Storm Events records from 1950 onward. Each result can include event type, dates, state, county or forecast zone, locations, coordinates, magnitude, tornado attributes, fatalities, injuries, property and crop damage, source and narratives.

The Actor automatically discovers NOAA's latest revised archive for each requested year, decompresses it as a stream and saves clean structured records. This design supports large exports without loading an entire annual file into memory and needs no NOAA API key.

### What can you do with this Actor?

- Build historical severe-weather and catastrophe datasets for insurance or reinsurance.
- Quantify property and crop damage by event type, region and time.
- Enrich logistics, supply-chain, energy, agriculture and real-estate risk models.
- Analyze tornadoes, hail, wind, floods, winter weather, heat and other NOAA event categories.
- Map event paths and locations using available start and end coordinates.
- Create research datasets with event and episode narratives.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `years` | integer\[] | Years from 1950 onward. Empty input uses the current and previous year. |
| `states` | string\[] | Exact NOAA state or area names, usually uppercase. |
| `eventTypes` | string\[] | Exact NOAA event types such as `Hail`, `Tornado` or `Flash Flood`. |
| `startDate` | date | Earliest event-begin date. |
| `endDate` | date | Latest event-begin date. |
| `minPropertyDamage` | number | Minimum normalized property damage in USD. |
| `minCropDamage` | number | Minimum normalized crop damage in USD. |
| `fatalitiesOnly` | boolean | Keep only events reporting at least one death. |
| `injuriesOnly` | boolean | Keep only events reporting at least one injury. |
| `maxResults` | integer | Maximum unique events, up to 500,000. |

Example for damaging Texas events:

```json
{
  "years": [2025, 2024],
  "states": ["TEXAS"],
  "eventTypes": ["Hail", "Thunderstorm Wind", "Tornado"],
  "minPropertyDamage": 1000,
  "maxResults": 20000
}
```

### Output

One item represents one NOAA event record.

| Field group | Included data |
| --- | --- |
| Identity | `recordId`, `eventId`, `episodeId`, year and month. |
| Classification | State, event type, county/zone type and FIPS, WFO and source. |
| Time and place | Begin/end timestamps, locations, coordinates and time zone. |
| Severity | Magnitude, magnitude type, tornado scale/length/width, flood cause and category. |
| Impact | Direct/indirect deaths and injuries, totals, normalized property damage and crop damage. |
| Context | Episode narrative and event narrative. |
| Lineage | Exact NOAA archive URL and scrape timestamp. |

```json
{
  "eventId": "1234567",
  "year": 2025,
  "state": "TEXAS",
  "eventType": "Hail",
  "countyZoneName": "TRAVIS",
  "beginDateTime": "2025-05-28T18:15:00",
  "magnitude": 2.25,
  "magnitudeType": "EG",
  "deaths": 0,
  "injuries": 0,
  "propertyDamage": 250000,
  "cropDamage": 0
}
```

### Damage normalization

NOAA bulk files commonly encode values with suffixes such as `K`, `M` and `B`. The Actor converts them to numeric dollars: `25K` becomes `25000` and `1.5M` becomes `1500000`. Missing damage is normalized to zero for consistent threshold filtering. These are reported estimates and should not be treated as audited loss totals.

### Annual revisions and scale

NOAA can revise historical files. The Actor reads the directory at run time and selects the highest revision stamp for each requested year. This avoids hard-coded file names becoming stale. Requested years are processed newest first, records are deduplicated by year and event ID, and result batches are written continuously.

For a full-history warehouse, split runs into year ranges so each run stays under the 500,000-item limit. For operational monitoring, schedule the current year regularly because recent records may be added or revised.

### Integrations and API

Use the Apify Console, REST API, JavaScript client or Python client. Export datasets as JSON, JSONL, CSV, Excel, XML or RSS and connect them to schedules, webhooks, Make, Zapier, Google Sheets, databases or BI systems.

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~noaa-storm-events-bulk-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"years":[2025],"states":["FLORIDA"],"maxResults":10000}'
```

Through Apify MCP, AI agents can request structured storm-event evidence instead of relying on unverified web summaries.

### FAQ

**Which NOAA source is used?** The official NCEI Storm Events bulk CSV archive.

**Does it need an API key?** No.

**What years are available?** NOAA publishes records from 1950 onward; event coverage and reporting practices vary by era.

**What does empty input do?** It processes the current year and previous year, newest first, up to the default result limit.

**Why is a recent year incomplete?** NOAA reporting and quality control lag real-world events and files are revised.

**Are all coordinates populated?** No. Location fields depend on the original report.

**Can I filter multiple event types?** Yes; use exact NOAA labels.

**Are fatalities and injuries combined?** Direct and indirect values are preserved and summed into convenient totals.

**Can I download more than 500,000 items?** Split the export by year, state or event type.

### Responsible use

This Actor is not affiliated with or endorsed by NOAA or NCEI. Storm Events data contains reported estimates and historical inconsistencies. Verify life-safety, legal, actuarial and financial decisions against authoritative current sources.

### Changelog

#### 2026-08-04

- Initial official NOAA Storm Events bulk exporter.
- Added live latest-revision discovery and memory-efficient gzip/CSV streaming.
- Added year, state, event type, date, damage, fatality and injury filters.
- Added normalized damage amounts, stable IDs, coordinates, impact totals and narratives.

# Actor input Schema

## `years` (type: `array`):

Storm Data years from 1950 onward. Empty input automatically uses the current and previous year.

## `states` (type: `array`):

Exact NOAA state/area names, for example TEXAS, FLORIDA, or GULF OF MEXICO.

## `eventTypes` (type: `array`):

Exact NOAA event types, for example Tornado, Flood, Hail, or Thunderstorm Wind.

## `startDate` (type: `string`):

Only events beginning on or after this date.

## `endDate` (type: `string`):

Only events beginning on or before this date.

## `minPropertyDamage` (type: `number`):

Only include events with at least this reported property damage.

## `minCropDamage` (type: `number`):

Only include events with at least this reported crop damage.

## `fatalitiesOnly` (type: `boolean`):

Only include events reporting at least one direct or indirect death.

## `injuriesOnly` (type: `boolean`):

Only include events reporting at least one direct or indirect injury.

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

Maximum number of storm-event records saved.

## Actor input object example

```json
{
  "years": [],
  "states": [],
  "eventTypes": [],
  "fatalitiesOnly": false,
  "injuriesOnly": false,
  "maxResults": 200
}
```

# 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 = {
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/noaa-storm-events-bulk-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 = { "maxResults": 200 }

# Run the Actor and wait for it to finish
run = client.actor("logiover/noaa-storm-events-bulk-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 '{
  "maxResults": 200
}' |
apify call logiover/noaa-storm-events-bulk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/noaa-storm-events-bulk-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/VYUF69JDpYRdms5dm/builds/nUqvUyfSYcKLPgVwB/openapi.json
