BYTETOOLS

OpenFEMA API

Free OpenFEMA API with no key: every US federal disaster declaration since 1953 with county-level detail, plus assistance, claims and shelter datasets. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the OpenFEMA API?

OpenFEMA is the Federal Emergency Management Agency's public data API, free and needing no key. Its Disaster Declarations Summaries dataset covers every US federal disaster declaration since 1953, one row per designated county, with incident type, dates and which assistance programmes were activated.

The disaster declarations dataset is the backbone of most FEMA analysis, and its shape catches people out: it is one row per declared county, not per disaster. A hurricane affecting sixty counties produces sixty rows sharing a `disasterNumber`, each with its own `designatedArea` and FIPS codes. Group by `disasterNumber` when you want events and leave it ungrouped when you want geographic exposure — conflating the two is how you end up reporting sixty hurricanes.

OpenFEMA uses OData-style query parameters — `$top`, `$skip`, `$filter`, `$select`, `$orderby` — and returns a `metadata` block echoing exactly what it applied, which makes debugging a filter much easier than usual. Note that `metadata.count` is 0 unless you pass `$inlinecount=allpages`, so do not read it as a total by default. The four boolean programme flags (`iaProgramDeclared`, `paProgramDeclared`, `ihProgramDeclared`, `hmProgramDeclared`) tell you what was actually authorised: individual assistance, public assistance, individual and households, and hazard mitigation.

Quick facts

Base URL
https://www.fema.gov/api/open/v2
Authentication
No API key or registration for any OpenFEMA dataset. There is no authenticated tier.
Rate limit
No published request limit; responses are capped at 1,000 records per page. Page with `$skip`.
Pricing
Free. US government works are in the public domain.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the OpenFEMA API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch the most recent FEMA disaster declaration

GET https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1

curl
curl 'https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1'
JavaScript (fetch)
const res = await fetch("https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "metadata": {
    "skip": 0,
    "select": null,
    "rundate": "2026-08-21T07:59:36.096Z",
    "top": 1,
    "filter": "",
    "format": "json",
    "metadata": true,
    "orderby": "",
    "entityname": "DisasterDeclarationsSummaries",
    "version": "v2",
    "url": "/api/open/v2/DisasterDeclarationsSummaries?$top=1",
    "count": 0
  },
  "DisasterDeclarationsSummaries": [
    {
      "femaDeclarationString": "FM-5672-AK",
      "disasterNumber": 5672,
      "state": "AK",
      "declarationType": "FM",
      "declarationDate": "2026-08-18T00:00:00.000Z",
      "fyDeclared": 2026,
      "incidentType": "Fire",
      "declarationTitle": "MUKLUK FIRE",
      "ihProgramDeclared": false,
      "iaProgramDeclared": false,
      "paProgramDeclared": true,
      "hmProgramDeclared": false,
      "incidentBeginDate": "2026-08-17T00:00:00.000Z",
      "incidentEndDate": null,
      "disasterCloseoutDate": null,
      "tribalRequest": false,
      "fipsStateCode": "02",
      "fipsCountyCode": "240",
      "placeCode": "99240",
      "designatedArea": "Southeast Fairbanks (Census Area)",
      "declarationRequestNumber": "26140",
      "declarationRequestDate": "2026-08-17T00:00:00.000Z",
      "lastIAFilingDate": null,
      "incidentId": "2026081802",
      "region": 10,
      "designatedIncidentTypes": "R",
      "lastRefresh": "2026-08-20T20:50:08.994Z",
      "hash": "608a749843b5ff3e0033264b77220e1f58aac816",
      "id": "5f3cd139-146c-4b95-be63-f0e4f19e02af"
    }
  ]
}

Parameters

ParameterTypeRequiredDescription
$topqueryOptionalRecords to return, up to 1,000. 1
$skipqueryOptionalPagination offset. 1000
$filterqueryOptionalOData filter over any field. state eq 'CA' and incidentType eq 'Fire'
$selectqueryOptionalFields to return, which cuts response size sharply. disasterNumber,state,incidentType
$orderbyqueryOptionalSort clause. declarationDate desc
$inlinecountqueryOptionalSet to `allpages` to populate `metadata.count` with the true total. allpages

Response fields

metadataobject
Echo of the query applied, plus `count` — which stays 0 unless you request `$inlinecount=allpages`.
DisasterDeclarationsSummariesarray
The records, named after the entity rather than a generic `data` key.
femaDeclarationStringstring
Composite identifier such as `FM-5672-AK`, combining type, number and state.
disasterNumberinteger
The event identifier. Repeated across every county row for the same disaster.
declarationTypestring
`DR` major disaster, `EM` emergency, `FM` fire management assistance.
incidentTypestring
`Fire`, `Hurricane`, `Flood`, `Severe Storm` and similar.
designatedAreastring
The county or equivalent designated in that row.
fipsStateCode / fipsCountyCodestring
Zero-padded FIPS codes — keep them as strings or you lose the leading zero.
iaProgramDeclared / paProgramDeclared / ihProgramDeclared / hmProgramDeclaredboolean
Which assistance programmes were authorised.

What you can build with the OpenFEMA API

  • Map US disaster declarations by county and incident type
  • Count disasters per state per year for trend analysis
  • Check whether a specific county has an active declaration
  • Correlate declarations with climate or insurance data
  • Build an emergency management dashboard

Common errors and how to fix them

Disaster counts are far too high

One row per designated county, not per event.

Fix: Group by `disasterNumber` when counting events; leave rows ungrouped only when measuring geographic extent.

metadata.count is 0

Counting is opt-in.

Fix: Add `$inlinecount=allpages` to get the true total for your filter.

FIPS codes lose their leading zero

They were parsed as integers.

Fix: Keep them as strings — `02` for Alaska becomes `2` and stops matching any shapefile.

400 on a filter

OData syntax error.

Fix: String literals use single quotes and field names are camelCase, matching the response exactly.

OpenFEMA API — frequently asked questions

Does OpenFEMA require an API key?

No. Every OpenFEMA dataset is open and unauthenticated, and there is no paid or registered tier to upgrade to.

Why are there multiple rows with the same disaster number?

Because the dataset records one row per designated county. A large hurricane covering sixty counties yields sixty rows sharing a `disasterNumber`, which is what makes county-level analysis possible.

How far back does the data go?

To 1953, the first year of the modern federal declaration process. That makes it one of the longest continuous US federal datasets available without a key.

What do the programme flags mean?

They record which assistance was authorised: `ia` individual assistance, `pa` public assistance, `ih` individuals and households, and `hm` hazard mitigation. A declaration can activate any combination, and the flags are the fastest way to filter by severity of response.

Tools that pair with this API

OpenFEMA is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.