Flood Zone API Get a free key

API reference: GET /api/v1/flood/zone

One endpoint. It takes an address or a point and returns the FEMA flood zone, SFHA flag, static base flood elevation and FIRM panel at that point.

Endpoint
GET https://api.floodzoneapi.com/api/v1/flood/zone

Authentication

Send your key as a bearer token: Authorization: Bearer fza_.... A ?key= query parameter also works, but URLs end up in logs, so prefer the header. Keys belong to your account and work only on this API. Create and revoke them on your account page; up to five at a time.

Parameters

Send exactly one of: address, or lat with lon.

NameTypeDescription
addressstring, 5 to 300 charactersA US street address with a house number. City and state, or a ZIP, make the match more reliable. Geocoded with the US Census Geocoder (Public_AR_Current benchmark); if Census has no match, an OpenStreetMap result is used only when it carries the same house number.
latnumber, -90 to 90Latitude, WGS84 decimal degrees.
lonnumber, -180 to 180Longitude, WGS84 decimal degrees. Longitudes in the continental US are negative.

Response fields

Every successful answer is HTTP 200 with Content-Type: application/json, including points FEMA has not mapped ("mapped": false). Within v1, fields may be added; existing fields are not renamed or removed.

queryobject
Echo of your input: {"address": ...} or {"lat": ..., "lon": ...}.
location.lat, location.lonnumber
The point looked up, to 6 decimal places.
location.geocoderstring or null
"census" (US Census Geocoder), "openstreetmap" (fallback, used only when its result has the same house number as your address) or null when you sent coordinates.
location.precisionstring
"address_range": interpolated along the street segment's address range (Census). "address_point": an OpenStreetMap building or address point. "input_coordinates": your lat and lon.
location.matched_addressstring or null
The address the geocoder matched. Compare it with what you sent.
location.candidatesinteger or null
How many matches the geocoder returned. We use the first; more than 1 means the address was ambiguous.
location.county, location.county_fips, location.statestring or null
County name, 5-digit county FIPS and 2-letter state code, when the geocoder supplies them (null for coordinate lookups).
flood_zone.mappedboolean
false when FEMA's digital map has no flood hazard area at the point. All other flood_zone fields are then null or empty.
flood_zone.zonestring or null
FEMA's FLD_ZONE, for example "AE", "X", "VE". See the zone table below.
flood_zone.subtypestring or null
FEMA's ZONE_SUBTY, for example "FLOODWAY" or "AREA OF MINIMAL FLOOD HAZARD".
flood_zone.descriptionstring or null
A one-line definition from the FIRM legend.
flood_zone.sfhaboolean or null
FEMA's SFHA_TF: in a Special Flood Hazard Area or not. null when unmapped or AREA NOT INCLUDED.
flood_zone.static_bfeobject or null
{elevation, unit, datum} from STATIC_BFE, LEN_UNIT and V_DATUM. null where FEMA stores -9999 (no single elevation for the zone). Datums vary (NGVD29, NAVD88 and others).
flood_zone.depthobject or null
{value, unit} for AO zones, from DEPTH; otherwise null.
flood_zone.dfirm_idstring or null
The digital FIRM database the zone polygon belongs to, for example "12086C". IDs ending in C are countywide.
flood_zone.polygon_idstring or null
FEMA's FLD_AR_ID for the polygon. Useful for spotting when the polygon at a point changes.
flood_zone.at_zone_boundaryboolean
true when the point touches polygons with different zones. We return the most hazardous: V zones, then other SFHA zones, then shaded X (0.2%, shallow or small-basin 1%, future conditions, levee-protected), then other X, then D.
flood_zone.other_zonesarray
The other zones at a boundary: [{zone, subtype, sfha}].
firm_panelobject or null
null when no FIRM panel covers the point.
firm_panel.panelstring
The FIRM panel number, for example "12086C0317L" (the final letter is the panel's revision suffix).
firm_panel.effective_datestring or null
The panel's effective date, YYYY-MM-DD. null where FEMA's record holds a placeholder such as 9999-09-09.
firm_panel.panel_type, firm_panel.dfirm_idstring
FEMA's PANEL_TYP (for example "Countywide, Panel Printed") and the panel's DFIRM ID.
firm_panel.other_panelsarray
Other panels covering the point, at county lines. The main panel is the one from the same DFIRM as the zone polygon, then the latest effective date.
source.dataset, source.service, source.layersstring, string, array
FEMA National Flood Hazard Layer, the map service URL, and the layers queried: 28 (Flood Hazard Zones) and 3 (FIRM Panels).
source.query_pointobject
The point sent to FEMA: your point rounded to 5 decimal places (about 1.1 m), which is also the cache key.
source.queried_atstring
When FEMA answered, ISO 8601 UTC. On a cached answer this is the original time.
source.cached, source.cache_ttl_secondsboolean, integer
Whether this answer came from the cache, and the cache lifetime (86400 seconds).
noticestring
The informational notice. Show it, or its substance, wherever you show the zone to end users.

Example: a point where two counties' panels overlap

This New Orleans point sits where Orleans Parish (22071C) and Jefferson Parish (22051C) panels overlap. The zone polygon belongs to 22071C, so that panel comes first even though the other took effect later.

Request
curl -sG https://api.floodzoneapi.com/api/v1/flood/zone \
  -H "Authorization: Bearer $FZA_KEY" \
  -d lat=29.9511 -d lon=-90.0715
Response 200, recorded September 29, 2026
{
  "query": {
    "lat": 29.9511,
    "lon": -90.0715
  },
  "location": {
    "lat": 29.9511,
    "lon": -90.0715,
    "geocoder": null,
    "precision": "input_coordinates",
    "matched_address": null,
    "candidates": null,
    "county": null,
    "county_fips": null,
    "state": null
  },
  "flood_zone": {
    "mapped": true,
    "zone": "X",
    "subtype": "0.2 PCT ANNUAL CHANCE FLOOD HAZARD",
    "description": "0.2% annual chance flood hazard. Outside the Special Flood Hazard Area.",
    "sfha": false,
    "static_bfe": null,
    "depth": null,
    "dfirm_id": "22071C",
    "polygon_id": "22071C_10245",
    "at_zone_boundary": false,
    "other_zones": []
  },
  "firm_panel": {
    "panel": "22071C0229F",
    "effective_date": "2016-09-30",
    "panel_type": "Countywide, Panel Printed",
    "dfirm_id": "22071C",
    "other_panels": [
      {
        "panel": "22051C0225F",
        "effective_date": "2018-02-02",
        "panel_type": "Countywide, Panel Printed",
        "dfirm_id": "22051C"
      }
    ]
  },
  "source": {
    "dataset": "FEMA National Flood Hazard Layer (NFHL)",
    "service": "https://hazards.fema.gov/arcgis/rest/services/public/NFHL/MapServer",
    "layers": [
      {
        "id": 28,
        "name": "Flood Hazard Zones"
      },
      {
        "id": 3,
        "name": "FIRM Panels"
      }
    ],
    "query_point": {
      "lat": 29.9511,
      "lon": -90.0715
    },
    "queried_at": "2026-09-29T02:02:26Z",
    "cached": true,
    "cache_ttl_seconds": 86400
  },
  "notice": "Informational. This is the zone shown on FEMA's effective flood map (NFHL) at this point. It is not a Standard Flood Hazard Determination (FEMA Form 086-0-32), a prediction of flood risk, or an insurance quote, and it does not reflect a Letter of Map Amendment issued for a single structure."
}

Zone values

zone (subtype)sfhaMeaning (FIRM legend)
AYes1% annual chance flood hazard. No base flood elevations determined.
AEYes1% annual chance flood hazard. Base flood elevations determined.
AHYes1% annual chance shallow flooding, usually areas of ponding, with depths of 1 to 3 feet. Base flood elevations determined.
AOYes1% annual chance shallow flooding, usually sheet flow on sloping terrain, with depths of 1 to 3 feet. Flood depths determined.
ARYes1% annual chance flood hazard in an area where a decertified flood protection system is being restored.
A99Yes1% annual chance flood hazard in an area to be protected by a federal flood protection system under construction.
VYesCoastal 1% annual chance flood hazard with wave action. No base flood elevations determined.
VEYesCoastal 1% annual chance flood hazard with wave action. Base flood elevations determined.
X (0.2 PCT ANNUAL CHANCE FLOOD HAZARD)No0.2% annual chance flood hazard. FEMA also writes this subtype with a suffix such as "IN COASTAL ZONE".
X (1 PCT DEPTH LESS THAN 1 FOOT)No1% annual chance flood hazard with average depths of less than 1 foot.
X (1 PCT DRAINAGE AREA LESS THAN 1 SQUARE MILE)No1% annual chance flood hazard with a drainage area of less than 1 square mile.
X (1 PCT FUTURE CONDITIONS)NoFuture-conditions 1% annual chance flood hazard.
X (AREA WITH REDUCED FLOOD RISK DUE TO LEVEE)NoArea with reduced flood risk due to a levee.
X (AREA OF MINIMAL FLOOD HAZARD)NoArea of minimal flood hazard.
DNoPossible but undetermined flood hazard. No flood hazard analysis has been done.
OPEN WATERAs FEMA marks itOpen water.
AREA NOT INCLUDEDnullNot included in this flood map study, so no zone is determined here.
Subtypes such as FLOODWAY can accompany A and AE zones; the description then adds "Regulatory floodway."

Response headers

HeaderMeaning
X-Quota-LimitCalls your plan includes this calendar month (UTC).
X-Quota-RemainingCalls left this month after this one.
X-RateLimit-Limit, X-RateLimit-RemainingThe per-second limit (5) and what is left of it.
Retry-AfterOn 503 and 429 rate-limit answers: seconds to wait before retrying.

What counts as a call

Caching

FEMA's answer for a point is cached for 24 hours, keyed by the point rounded to 5 decimal places (about 1.1 m), and FEMA is queried at that rounded point. Address geocodes are cached for 24 hours. Unmapped answers are never cached, because FEMA occasionally returns an empty answer for a mapped point and a second try gets the zone. source.cached and source.queried_at tell you exactly what you got.

Known limits of a zone lookup

OpenAPI

The machine-readable description is at /openapi.json (OpenAPI 3.1), for client generators and API tools.