FEMA Disaster Declarations & ZIP Damage Data Scraper
Pricing
from $2.10 / 1,000 records
FEMA Disaster Declarations & ZIP Damage Data Scraper
Scrape federal disaster declarations and ZIP-code-level FEMA housing inspection damage and Individual and Households Program (IHP) assistance totals from OpenFEMA v2.
Pricing
from $2.10 / 1,000 records
Rating
0.0
(0)
Developer
Groundplane Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Pull federal disaster declarations and ZIP-code-level homeowner inspection damage and approved Individual and Households Program (IHP) financial assistance totals from the official OpenFEMA v2 API. Filter by dataset mode (ZIP_DAMAGE or DECLARATIONS), US state or territory, declaration date, incident type, and minimum inspected damage.
Disclaimer: This Actor is an independent open-data integration tool and is not affiliated with, endorsed by, or sponsored by the Federal Emergency Management Agency (FEMA) or the U.S. Department of Homeland Security.
What it does
- Queries two official OpenFEMA v2 datasets:
DisasterDeclarationsSummariesandHousingAssistanceOwners. ZIP_DAMAGEmode (default): Joins disaster declaration metadata (declarationTitle,incidentType,declarationDate) withHousingAssistanceOwnersrecords ondisasterNumberto output ZIP-level homeowner registrations, FEMA property inspection counts, FEMA-inspected damage dollar estimates, official damage tier buckets ($1–$10k,$10k–$20k,$20k–$30k,>$30k), and approved IHP repair/replacement, rental, and Other Needs Assistance amounts.DECLARATIONSmode: Outputs county- and area-level federal disaster declarations (DR,EM,FM) with program flags (ihProgramDeclared,iaProgramDeclared,paProgramDeclared,hmProgramDeclared) and FIPS county codes.- Suppresses small cells for privacy:
ZIP_DAMAGErows withvalidRegistrationsbelow 3 are dropped before pushing, and the run status message reports how many rows were suppressed. - Validates every output row against the schema before pushing, deduplicates on natural keys (
disasterNumber + zipCode + city + countyinZIP_DAMAGEmode, matching the source grain, since one ZIP and city can span two counties;femaDeclarationString + fipsCountyCode + designatedAreainDECLARATIONSmode, since tribal designated areas share FIPS county code000), and sorts newest first bydeclarationDatedescending andtotalDamagedescending.
Who it's for
- Property insurance & catastrophe risk teams analyzing ZIP-level FEMA-inspected storm, flood, hurricane, and wildfire damage severity.
- Building materials & restoration market analysts sizing post-disaster repair demand across affected counties and postal codes.
- Municipal resilience, housing & public policy researchers tracking federal IHP assistance disbursements and inspection outcomes.
- Real estate & mortgage risk analysts monitoring recent federal disaster declarations by county and ZIP code.
Input
| Field | Type | Default / Prefill | Description |
|---|---|---|---|
mode | string (enum) | "ZIP_DAMAGE" | "ZIP_DAMAGE" for ZIP-level homeowner inspection damage and approved IHP assistance, or "DECLARATIONS" for county/area-level federal disaster declarations. |
states | array of strings | ["FL"] | Two-letter US state or territory postal codes (e.g. ["FL"], ["WV", "OH", "WI"]). Leave empty for all states. |
declaredSince | string | "" (365 days ago) | Earliest declarationDate in YYYY-MM-DD format. When left blank in ZIP_DAMAGE mode, defaults to 365 days ago; if no ZIP damage rows are collected in that window, the lookback automatically widens (800 days, then 1095 days) and the run status message discloses the expansion. |
incidentTypes | array of strings | [] | Optional OpenFEMA incidentType filters (e.g. ["Hurricane", "Severe Storm", "Flood"]). |
minTotalDamageUsd | number | 0 | Minimum ZIP-level totalDamage in USD (ZIP_DAMAGE mode only). |
maxItems | integer | 200 | Maximum number of records to return, sorted newest first. |
Example input JSON
{"mode": "ZIP_DAMAGE","states": ["FL"],"declaredSince": "","incidentTypes": [],"minTotalDamageUsd": 0,"maxItems": 200}
Example run options (default max charge $50, 256 MB, 300 s timeout)
When starting a run via the Apify API or Console, set a default maximum charge limit of $50 ("maxTotalChargeUsd": 50), 256 MB of memory ("memoryMbytes": 256), and a 300 second timeout ("timeoutSecs": 300):
{"maxTotalChargeUsd": 50,"memoryMbytes": 256,"timeoutSecs": 300}
The Actor checks your remaining spending limit before every dataset push and stops cleanly if the limit is reached.
Output
Output fields (ZIP_DAMAGE mode)
| Field | Type | Description |
|---|---|---|
disasterNumber | integer | FEMA disaster number (e.g. 4834). |
declarationTitle | string | null | Official FEMA disaster declaration title. |
incidentType | string | null | FEMA incident type (Hurricane, Severe Storm, Flood, Fire, Tornado, etc.). |
declarationDate | string | Disaster declaration date in YYYY-MM-DD format. |
state | string | Two-letter US state or territory postal code. |
county | string | null | County name. |
city | string | null | City name. |
zipCode | string | null | 5-digit postal ZIP code. |
validRegistrations | integer | null | Count of valid FEMA Individual Assistance homeowner registrations in the ZIP/city. |
totalInspected | integer | null | Total number of homeowner properties inspected by FEMA. |
totalDamage | number | null | Total FEMA-inspected homeowner property damage in USD. |
averageFemaInspectedDamage | number | null | Average FEMA-inspected damage per inspected registration in USD. |
noFemaInspectedDamage | integer | null | Count of inspected homes with no FEMA-inspected damage. |
femaInspectedDamageBetween1And10000 | integer | null | Count of inspected homes with damage between $1 and $10,000. |
femaInspectedDamageBetween10001And20000 | integer | null | Count of inspected homes with damage between $10,001 and $20,000. |
femaInspectedDamageBetween20001And30000 | integer | null | Count of inspected homes with damage between $20,001 and $30,000. |
femaInspectedDamageGreaterThan30000 | integer | null | Count of inspected homes with damage greater than $30,000. |
approvedForFemaAssistance | integer | null | Count of homeowner registrations approved for FEMA IHP financial assistance. |
totalApprovedIhpAmount | number | null | Total approved Individual and Households Program (IHP) dollar amount in USD. |
repairReplaceAmount | number | null | Approved housing repair and replacement assistance amount in USD. |
rentalAmount | number | null | Approved temporary rental assistance amount in USD. |
otherNeedsAmount | number | null | Approved Other Needs Assistance (ONA) amount in USD. |
Output fields (DECLARATIONS mode)
In DECLARATIONS mode, each row includes disasterNumber, declarationTitle, incidentType, femaDeclarationString, declarationType, declarationDate, incidentBeginDate, incidentEndDate, state, designatedArea, fipsCountyCode, ihProgramDeclared, iaProgramDeclared, paProgramDeclared, and hmProgramDeclared.
Sample output row (synthetic example)
{"disasterNumber": 9901,"declarationTitle": "SYNTHETIC TROPICAL STORM EXAMPLE","incidentType": "Hurricane","declarationDate": "2026-09-18","state": "FL","county": "Example County (County)","city": "EXAMPLE BAY","zipCode": "33999","validRegistrations": 4120,"totalInspected": 2840,"totalDamage": 18450230.5,"averageFemaInspectedDamage": 6496.56,"noFemaInspectedDamage": 633,"femaInspectedDamageBetween1And10000": 1520,"femaInspectedDamageBetween10001And20000": 410,"femaInspectedDamageBetween20001And30000": 185,"femaInspectedDamageGreaterThan30000": 92,"approvedForFemaAssistance": 2610,"totalApprovedIhpAmount": 14920800.0,"repairReplaceAmount": 9840500.0,"rentalAmount": 2150300.0,"otherNeedsAmount": 2930000.0}
How pricing works
Pay per result. You only pay for rows returned.
Data source and terms
- Official Source: OpenFEMA API v2 (
https://www.fema.gov/api/open/v2/DisasterDeclarationsSummariesandhttps://www.fema.gov/api/open/v2/HousingAssistanceOwners). - Update Frequency: Updated daily by FEMA.
- Attribution (OpenFEMA terms, verbatim): "This product uses the Federal Emergency Management Agency's OpenFEMA API, but is not endorsed by FEMA. The Federal Government or FEMA cannot vouch for the data or analyses derived from these data after the data have been retrieved from the Agency's website(s)."
- Dataset and endpoint version: OpenFEMA API v2. This Actor cites and queries the v2 dataset endpoints
DisasterDeclarationsSummariesv2 (https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries) andHousingAssistanceOwnersv2 (https://www.fema.gov/api/open/v2/HousingAssistanceOwners). Cite the dataset version (v2) when you cite the data. - Retrieval date: Each run retrieves data live from OpenFEMA at run time, and the Apify run record for that run records the retrieval date and time. Note the run date alongside any figure you publish, because FEMA revises and refreshes these datasets.
- Terms of Use: Use of OpenFEMA data is governed by the OpenFEMA terms and conditions (
https://www.fema.gov/about/openfema/terms-conditions), not by an unrestricted grant. Under those terms, use the data for statistical research or as a reporting record only; do not attempt to reidentify any individual from the data, and do not use the data to make determinations affecting an individual's eligibility for any benefit, service, or other right. All records inHousingAssistanceOwnersare aggregated by disaster, state, county, city, and ZIP code; no individual or household records are published, and this Actor further suppresses rows withvalidRegistrationsbelow 3 to reduce reidentification risk (see Limits and FAQ).
Troubleshooting (PARTIAL: status messages)
- If a run finishes with a status message starting with
PARTIAL:, the Actor preserved and pushed all validated records collected before a paging cap, scan-time budget (240s), upstream HTTP retry exhaustion, or schema drift check was triggered. - A
PARTIAL:caused by a source problem (schema drift, source errors) ends with: "If this keeps happening, please open an issue on this actor's Issues tab and we'll fix it fast." APARTIAL:caused only by your own limits (max items, charge limit, scan budget) does not carry that line. - A
PARTIAL:message naminginspections not yet published for DR-xxxx (declared YYYY-MM-DD); N registration-only rowsmeans FEMA has published registrations for that disaster but no completed inspection results yet. The rows pushed are registration-only rows (alltotalInspectedvalues are 0), not damage findings. Re-run after FEMA publishes inspections for that disaster. - A run whose filters match nothing finishes successfully with a
Complete: 0 rows matched your filtersstatus message naming the filters to widen. - Found a problem or need a field? Open an issue on the Issues tab; we respond quickly.
Limits and FAQ
- Why does
ZIP_DAMAGEmode only include certain disasters? FEMA'sHousingAssistanceOwnersdataset only contains rows for disasters where the Individuals and Households Program (ihProgramDeclared = true) was activated and homeowner inspections have been processed. Fire Management Assistance (FM) or Public Assistance-only (PA) declarations appear inDECLARATIONSmode but do not generate homeowner inspection rows. - Why does a fresh disaster show registrations but zero inspected damage? Inspection lag. For a newly declared disaster, FEMA publishes
HousingAssistanceOwnersregistration rows before field inspections are completed and published, sototalInspected,totalDamage, and the damage tier buckets can all be 0 even though registrations exist. When every row for a disaster hastotalInspectedequal to 0, the run endsPARTIAL:with a reason of the forminspections not yet published for DR-xxxx (declared YYYY-MM-DD); N registration-only rows, naming each affected disaster, instead of reporting a silent all-zeroComplete. Wait for FEMA to publish inspections for that disaster (often days to weeks after declaration) and re-run. - Why are some ZIP rows missing (small-cell suppression)? To reduce reidentification risk under the OpenFEMA terms,
ZIP_DAMAGErows withvalidRegistrationsbelow 3 are suppressed (dropped) and are not pushed to the dataset. The run status message reports how many rows were suppressed. - How are records deduplicated? In
ZIP_DAMAGEmode, records are deduplicated bydisasterNumber + zipCode + city + county, which is the grain the source publishes (a ZIP code and city that cross a county line produce one row per county, and each row is kept). InDECLARATIONSmode, records are deduplicated byfemaDeclarationString + fipsCountyCode + designatedArea, because tribal designated areas all carry FIPS county code000and are distinct rows. - Canary input:
{ "mode": "ZIP_DAMAGE", "states": ["WV"], "declaredSince": "2026-01-01", "incidentTypes": [], "minTotalDamageUsd": 0, "maxItems": 5 }returns 5 rows in a few seconds. A passing canary must also assert at least one returned row withtotalInspectedgreater than 0; a canary where every row hastotalInspectedequal to 0 does not pass, because inspections for that disaster may not be published yet.
Changelog
-
v0.1.2 (2026-11-01): Fixes after Grok Red Team review: a disaster whose rows all have
totalInspectedequal to 0 now ends the runPARTIAL:naming the disaster and its declaration date (inspections not yet published) instead of a silent all-zeroComplete; the verbatim OpenFEMA attribution statement, dataset endpoint version (v2) citation, retrieval-date note, and FEMA use conditions are documented and the earlier terms understatement is removed; small-cell rows withvalidRegistrationsbelow 3 are suppressed and counted in the run status; default run options now set 256 MB memory and a 300 second timeout alongside the $50 max charge; the omittednoFemaInspectedDamagebucket is now output; sourceidis used as the paging tiebreak;Retry-Afteris honored in HTTP-date form as well as in seconds; the description now starts with "Scrape" and damage figures are described as FEMA-inspected estimates. -
v0.1.1 (2026-10-31): Fixes after review: dedupe keys now match the source grain (county added in
ZIP_DAMAGEmode, designated area added inDECLARATIONSmode, so distinct rows are no longer dropped silently); a core-column check on the first record of every source page fails loudly on schema drift; runs where over 20% of rows fail validation now fail instead of shipping a partial dataset as complete; zero matches finish asComplete: 0 rows matched your filtersinstead of failing; the Issues-tab line is appended only to source-causedPARTIAL:messages; the charge-limit stop now reports asPARTIAL:; a lookback expansion beyond the default 365-day window is disclosed in the status message; status counts now report rows scanned per source and rows emitted separately. -
v0.1 (2026-10-31): Initial release supporting
ZIP_DAMAGEandDECLARATIONSmodes via OpenFEMA API v2 with schema validation, automatic lookback window expansion for default state runs, and pay-per-event spending limit protection.