FEMA Disaster Recovery Tracker: All 50 States avatar

FEMA Disaster Recovery Tracker: All 50 States

Pricing

from $4.25 / 1,000 fema records

Go to Apify Store
FEMA Disaster Recovery Tracker: All 50 States

FEMA Disaster Recovery Tracker: All 50 States

Track FEMA disaster recovery money in all 50 states, DC, and US territories: Public Assistance projects, obligations, and applicants, Hazard Mitigation grants, and Individual Assistance. Filter by state, county, disaster, date, incident type, and amount, or monitor for new and changed records.

Pricing

from $4.25 / 1,000 fema records

Rating

0.0

(0)

Developer

ManiGinaM

ManiGinaM

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Get a feed of new FEMA disaster recovery money as it is obligated, in all 50 states, DC, and US territories. Pick a state, a disaster, or a type of disaster, turn on monitor mode, and schedule the Actor: each run delivers only the Public Assistance projects, obligations, applicants, Hazard Mitigation grants, and housing assistance totals that are new or changed since the last run, and you pay only for those records.

Monitor mode

Set onlyNewOrChanged to true and add a schedule, for example every weekday at 7 AM Central. The Actor keeps a history for that exact search in a named key-value store, fema-disaster-recovery-tracker-monitor. The first run delivers every matching record as new. Later runs deliver only records FEMA added (new) and records whose FEMA data changed (changed). Unchanged records are skipped and never charged.

A record counts as changed when its sourceHash moves. That is FEMA's own row hash where FEMA publishes one, and otherwise a SHA-256 of every field in the row except FEMA's bookkeeping id and refresh time. So a new obligation, a revised project amount, a status change, or a new closeout date all show up, while FEMA's nightly refresh of an unchanged row does not.

Good to know before you rely on it:

  • History is keyed on the dataset and every filter: states, counties, disaster numbers, declaration dates, incident types, and minimum amount. Order and letter case do not matter, and neither does maxResults. Change any filter, including a declaration date you move forward, and the Actor starts a fresh history and reports every matching record as new again. Keep the filters fixed for a monitor.
  • Each run stops after delivering maxResults records, so set it high enough for a busy week after a major disaster.
  • Grant award activities are one row per obligation, so in this dataset every row is a new event and only ever shows up as new.
  • Two schedules running the same search at the same time share one history, and the run that finishes last wins.
  • Each search's history holds the 100,000 records delivered most recently. Past that, the record delivered longest ago is forgotten and would be reported as new if it ever came back.
  • If the saved history ever becomes unreadable, the run fails with a message naming the record to delete, instead of charging you again for every record.

What does it do?

The Actor reads FEMA's free OpenFEMA API and returns one clean record per row in the same shape for every dataset: disaster number and name, declaration date, incident type, state, county, city and ZIP when FEMA has them, recipient, project title, category, status, approved and obligated dollars, the key dates, a link to the disaster on fema.gov, and every original FEMA field under details.

datasetWhat one record isRows at OpenFEMA (October 2026)
paFundedProjectsA Public Assistance project (project worksheet) with its approved and obligated dollarsabout 851,000
paAwardActivitiesOne Public Assistance obligation, including negative amounts when FEMA reduces oneabout 1,227,000
paApplicantsA state, local, tribal, or nonprofit applicant for Public Assistance, with its addressabout 200,000
hmaSubapplicationsA Hazard Mitigation Assistance subapplication (HMGP, BRIC, FMA, and others)about 64,000
ihpHouseholdsOne Individuals and Households Program registration, with no names or addressesabout 26,250,000
housingOwnersHousing assistance to homeowners, totaled by disaster, county, city, and ZIP codeabout 161,000
housingRentersHousing assistance to renters, totaled by disaster, county, city, and ZIP codeabout 148,000

Public Assistance projects carry only an applicant id, so the Actor fills in recipientName from FEMA's applicants dataset. Every record gets its disaster name, declaration date, and incident type from FEMA's disaster declarations catalog, so the incident type wording is the same in every dataset. There is no browser, no proxy, no login, and no API key.

Who is it for?

  • Disaster restoration, debris, roofing, and rebuilding contractors looking for funded projects and the parishes, counties, and agencies receiving them.
  • Grant writers and Hazard Mitigation consultants tracking obligations, subapplications, and closeouts for clients.
  • Insurers, reinsurers, and lenders measuring federal assistance by ZIP code after a storm.
  • Journalists, researchers, and watchdog groups following where recovery money goes.
  • Emergency management and public finance consultants benchmarking one disaster against another.

How to use

  1. Open the Actor in Apify Console and pick a FEMA dataset, such as Public Assistance funded projects.
  2. Pick one or more states and, if you know them, disaster numbers.
  3. Optionally narrow the search under Filters by county, declaration date, incident type, or amount.
  4. Click Start and wait for the run to finish.
  5. Open the Output tab to preview records, then export them as JSON, CSV, Excel, or XML.
  6. To watch for new and changed records, turn on monitor mode and add a schedule.

Input

FieldTypeDescription
datasetdatasetOne of the seven datasets above. Default paFundedProjects.
stateslist of statesTwo-letter state or territory codes, for example TX, FL, LA, or PR. Empty means the whole country.
countieslist of namesCounty, parish, or borough names such as Jefferson Parish or Harris. The word County, Parish, or Borough is optional and St. matches Saint. Records with no county, or marked Statewide, are left out when this is set. Not available for paApplicants. Up to 100.
disasterNumberslist of textFEMA disaster numbers written as text, for example "4673" for Hurricane Ian in Florida or "4332" for Hurricane Harvey in Texas. Up to 200.
declaredSincedateEarliest disaster declaration date, YYYY-MM-DD.
declaredUntildateLatest disaster declaration date, YYYY-MM-DD, inclusive.
incidentTypeslist of incident typesFEMA incident types such as Hurricane, Flood, Severe Storm, or Fire.
minAmountnumberKeep only records with at least this many dollars: obligated for Public Assistance and Hazard Mitigation, approved for household and housing assistance. Not available for paApplicants.
maxResultsnumberMost records to deliver in one run. Default 1000, maximum 500,000.
onlyNewOrChangedtrue or falseMonitor mode. Delivers only records that are new or changed since the previous run of the same search.

Records come newest disaster first. Declaration dates and incident types are matched against FEMA's disaster declarations catalog first, then the dataset is searched for those disasters. Hazard Mitigation subapplications that are not tied to a disaster (for example BRIC and Flood Mitigation Assistance grants) have no disaster number, so they are left out when you filter by disaster, declaration date, or incident type.

Sample input:

{
"dataset": "paFundedProjects",
"states": ["FL", "GA", "SC", "NC"],
"incidentTypes": ["Hurricane"],
"declaredSince": "2020-01-01",
"minAmount": 1000000,
"maxResults": 5000,
"onlyNewOrChanged": true
}

Output

Each record is one dataset item. This is a real Public Assistance project from Hurricane Ida in Louisiana:

{
"dataset": "paFundedProjects",
"recordKey": "paFundedProjects:4611|000-U04A1-00|430",
"disasterNumber": 4611,
"disasterTitle": "HURRICANE IDA",
"declarationDate": "2021-08-29",
"incidentType": "Hurricane",
"state": "LA",
"county": "Statewide",
"city": null,
"zipCode": null,
"recipientId": "000-U04A1-00",
"recipientName": "Louisiana Department of Transportation and Development",
"title": "OPER100 / Emergency Protective Measures",
"category": "B - Emergency Protective Measures",
"status": "Eligible",
"amountApproved": 15005039.37,
"amountObligated": 15005039.37,
"firstObligatedDate": "2022-05-16",
"lastObligatedDate": "2022-05-16",
"appliedDate": null,
"sourceLastRefresh": "2026-07-23T18:44:06.680Z",
"sourceHash": "1e522f99b16705eba33918b571d1d20ae4c48968",
"femaDisasterUrl": "https://www.fema.gov/disaster/4611",
"suspectDates": null,
"details": {
"disasterNumber": 4611,
"declarationDate": "2021-08-29T00:00:00.000Z",
"incidentType": "Hurricane",
"pwNumber": 430,
"applicationTitle": "OPER100 / Emergency Protective Measures",
"applicantId": "000-U04A1-00",
"damageCategoryCode": "B",
"damageCategoryDescrip": "Emergency Protective Measures",
"projectStatus": "Eligible",
"projectProcessStep": "Obligated",
"projectSize": "Large",
"county": "Statewide",
"countyCode": "33",
"stateAbbreviation": "LA",
"stateNumberCode": "22",
"projectAmount": 15005039.37,
"federalShareObligated": 15005039.37,
"totalObligated": 15005039.37,
"lastObligationDate": "2022-05-16T00:00:00.000Z",
"firstObligationDate": "2022-05-16T00:00:00.000Z",
"mitigationAmount": 0,
"gmProjectId": 667369,
"gmApplicantId": 127405
},
"changeType": "notTracked"
}

You can download results as JSON, CSV, Excel, or XML, or read them through the Apify API.

  • recordKey identifies a record within its dataset and is what monitor mode remembers.
  • amountApproved is the project amount for Public Assistance projects, the federal share for Hazard Mitigation, and the approved assistance for households and housing. amountObligated is what FEMA has obligated, and is empty for datasets that do not report it.
  • county reads like Jefferson Parish or Harris County across datasets. Public Assistance records for a whole state read Statewide. Hazard Mitigation records list the benefiting counties as FEMA spells them, separated by semicolons.
  • details keeps every field FEMA published for the row, so nothing is lost.
  • Dates are calendar days, YYYY-MM-DD. Any date later than tomorrow in Central time is not credible, so it is published as null and its raw value is kept in suspectDates under the field name.
  • changeType is new or changed in monitor mode and notTracked otherwise.

Pricing

This Actor uses pay-per-event pricing.

  • FEMA record: $5.00 per 1,000 records delivered to your dataset ($0.005 each).
  • Actor start: Apify's standard start event ($0.00005).
  • There is no separate charge per dataset item.

Every Public Assistance project for Hurricane Harvey in Texas is about 6,600 records, or about $33, and Hurricane Ida in Louisiana is about 3,650 records, or about $18. A weekly monitor of one state's Public Assistance projects often delivers a few dozen new or changed records, so it costs well under a dollar a week. You can cap any run with maxResults or Apify's maximum charge setting, and Apify may apply a default maximum charge to runs started without one, so raise it for a full pull. The Actor stops cleanly at your limit, and you are charged only for records that actually reach your dataset.

Estimated compute cost

Default memory is 512 MB. The Actor reads up to 10,000 rows per request (2,000 for the larger household and Hazard Mitigation rows) with at least one second between requests. Measured on Apify at 512 MB, 100 Hurricane Ida project records took 8 seconds and about $0.001 in platform usage, and 1,586 records took 6 seconds and about $0.008. Most of that is dataset storage writes, about $0.005 per 1,000 records, while compute is a fraction of a cent per run. Searches that filter by county read rows they do not deliver, so a county search across a very large dataset such as household registrations can take a few minutes, still only cents in compute.

Data source and freshness

Data comes from OpenFEMA, FEMA's public data API at https://www.fema.gov/api/open/. FEMA updates each dataset on its own schedule, from daily to monthly, and sourceLastRefresh shows FEMA's refresh time when the dataset has one.

  • Public Assistance Funded Projects Details: v2/PublicAssistanceFundedProjectsDetails
  • Public Assistance Grant Award Activities: v2/PublicAssistanceGrantAwardActivities
  • Public Assistance Applicants: v1/PublicAssistanceApplicants
  • Hazard Mitigation Assistance Subapplications: v2/HmaSubapplications, which replaced the older Hazard Mitigation project datasets FEMA retired in October 2026
  • Individuals and Households Program Valid Registrations: v2/IndividualsAndHouseholdsProgramValidRegistrations
  • Housing Assistance Program Data, Owners and Renters: v2/HousingAssistanceOwners and v2/HousingAssistanceRenters
  • Disaster names and declarations: v1/FemaWebDisasterDeclarations

The Actor pages with OData $top and $skip, waits at least a second between requests, retries server errors politely, and honors Retry-After. If OpenFEMA asks the run to wait more than a minute, or stays down after several retries, the run stops with a short message and keeps every record it already delivered. Run it again later. If FEMA inserts rows while a long run is paging, a row can shift onto a later page; the Actor remembers the most recent deliveries so a shifted row is not delivered or charged twice.

OpenFEMA is a public API that FEMA publishes for anyone to use, and works of the U.S. federal government are generally not subject to copyright. Household registration data has no names or addresses. The data is provided as is, without any guarantee that it is complete or current. Confirm anything important with FEMA or the grant recipient. This Actor is an independent tool and is not affiliated with or endorsed by FEMA or the U.S. Department of Homeland Security.

API and integrations

You can start this Actor and read its results with the Apify API, the Apify Python and JavaScript clients, or the Apify CLI. The API returns each run's dataset in the same formats as the Console.

Apify integrations can pass results on when a run finishes, for example to Google Sheets, Slack, Zapier, Make, or your own webhook. Set them up on the Actor's Integrations tab, and pair them with a schedule for a hands-off feed.

FAQ

Do I need an OpenFEMA account or API key? No. OpenFEMA is free and open.

How do I find a disaster number? Search the disaster on https://www.fema.gov/disaster/declarations. The number is in the page address, for example 4673 for Hurricane Ian in Florida. You can also filter by incidentTypes and declaredSince instead of naming disasters.

Why does a county filter miss some Public Assistance projects? FEMA records statewide projects, often the largest ones, as Statewide instead of under a county. Run without counties to include them.

Why are some Hazard Mitigation amounts missing? FEMA reports an obligated amount only once money is obligated, so subapplications still under review show an empty or zero amountObligated. amountApproved carries the federal share FEMA lists for the subapplication.

Feedback and custom requests

Found a bug, a wrong value, or a source that changed? Open an issue in the Issues tab on this Actor's page. Need another field, filter, or source, or a version built for your team? Describe it in the Issues tab as a custom request.