Real estate · Lead generation
FEMA Disaster Declarations Scraper
Export US federal disaster declaration history straight from OpenFEMA — filter by state, county, incident type, declaration type and date range, paged and validated into clean JSON, CSV or Excel rows without hand-writing an OData client.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
OpenFEMA publishes every US federal disaster declaration — hurricanes, floods, fires, severe storms — back to 1953, but reaching a specific slice (one state, one county, one incident type, one date range) means hand-paging FEMA.gov or writing your own OData client against a filter syntax that rejects a malformed clause with a bare 400. This Actor builds that $filter expression from up to five inputs, pages it deterministically with $top/$skip, and hands back clean, typed rows — disaster number, declaration type, incident dates, program flags, county — ready for a spreadsheet or a risk model.
What we handle for you
- 🧱 Multi-filter OData query building — combine state, county, incident type, declaration type and date range in one request instead of hand-writing
$filtersyntax. - 📄 Deterministic paging —
$top/$skipwalked against OpenFEMA's own result count, capped by yourmaxResults, never over- or under-fetching. - ✅ Honest zero-row handling — a narrow filter that matches nothing finishes as a successful run with a clear status message, not a failed one.
- 🔁 Retries transient 429/5xx responses with exponential backoff instead of failing the whole run.
- 🧊 Per-record fault isolation — one malformed record is skipped and logged; it never takes down the rest of the run.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
Use cases
- Back a county-level insurance or restoration-contractor lead list with real declaration history.
- Feed a real-estate risk model with disaster frequency by state or county.
- Build an emergency-management consulting briefing on a state's declaration record.
- Track new declarations for a state or incident type on a schedule.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
state | string | no | 2-letter US postal code (e.g. FL). Leave empty for all states. |
county | string | no | Free-text county / designated-area match (e.g. Pinellas). Leave empty for all counties. |
incidentType | string | no | Free text, e.g. Hurricane, Flood, Fire. Leave empty for all incident types. |
declarationType | string | no | Restrict to one declaration type. Leave unset for all. |
dateFrom | string | no | Only declarations on or after this date, as YYYY-MM-DD. Leave empty for no floor. |
dateTo | string | no | Only declarations on or before this date, as YYYY-MM-DD. Leave empty for no ceiling. |
maxResults | integer | no | Hard cap on total rows fetched across all pages. Each row is one billed result event. |
{
"state": "FL",
"incidentType": "Hurricane",
"maxResults": 5,
"proxyConfiguration": {
"useApifyProxy": false
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
fema_declaration_stringdisaster_numberstatedeclaration_typedeclaration_dateincident_typedeclaration_titleincident_begin_dateincident_end_datedesignated_areaia_program_declaredpa_program_declaredregion
{
"fema_declaration_string": "DR-4734-FL",
"disaster_number": 4734,
"state": "FL",
"declaration_type": "DR",
"declaration_date": "2025-09-28T00:00:00.000Z",
"fy_declared": 2025,
"incident_type": "Hurricane",
"declaration_title": "HURRICANE HELENE",
"incident_begin_date": "2025-09-26T00:00:00.000Z",
"incident_end_date": "2025-10-01T00:00:00.000Z",
"disaster_closeout_date": null,
"designated_area": "Pinellas (County)",
"place_code": "12103",
"ih_program_declared": true,
"ia_program_declared": true,
"pa_program_declared": true,
"hm_program_declared": true,
"region": 4,
"last_refresh": "2026-01-05T10:12:00.000Z",
"source_hash": "a1b2c3d4e5f6",
"source_id": "5f8a1c2e-0000-0000-0000-000000000000",
"fips_state_code": "12",
"fips_county_code": "103",
"incident_id": "5f9a1c2e-0000-0000-0000-000000000001"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result emitted | $0.0020 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Returns the declaration-summary fields OpenFEMA publishes — not the full disaster narrative or FEMA's individual-assistance case data.
countymatches OpenFEMA's rawdesignatedAreatext, which mixes formats (e.g. "Pinellas (County)"), so it is a substring match rather than a normalized county lookup.
FAQ
Do I need an API key?
How far back does this go?
What happens if my filters match nothing?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors