# FEMA Flood Zone & Property Risk API - Zillow/Redfin Enricher (`centorprat/fema-flood-zone-property-risk`) Actor

FEMA flood zone and property risk for US addresses or a whole Zillow/Redfin dataset: flood zone + SFHA, FEMA National Risk Index (18 hazards), census income, home value and rent, elevation, and a low-to-high risk verdict per property. Keyless, bulk.

- **URL**: https://apify.com/centorprat/fema-flood-zone-property-risk.md
- **Developed by:** [Centor Prat](https://apify.com/centorprat) (community)
- **Categories:** Real estate, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.25 / 1,000 property enricheds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🏠 FEMA Flood Zone & Property Risk API: Zillow/Redfin Enricher

**Any US address in, a property risk dossier out.** Give it street addresses, or the dataset of a
**Zillow / Redfin / Realtor scraper run**, and every property comes back with its **FEMA flood zone**,
the **FEMA National Risk Index** profile for 18 natural hazards, **neighborhood demographics**,
**ground elevation**, and one **low / moderate / elevated / high** verdict with plain-English reasons.

Bulk · **keyless** (no API keys, no logins) · official US federal data · structured JSON · built for AI agents.

### ⚡ Why it's different

- **Chains onto the scrapers you already use.** Pick your Zillow/Redfin run's dataset: addresses and
  coordinates are auto-detected, and each listing's ID, URL and price ride along in `sourceRecord`.
- **Five federal sources fused into one record:** you don't need to stitch the Census geocoder, FEMA flood
  maps, FEMA NRI, the ACS and USGS together yourself.
- **A verdict, not just a data dump.** It flags Special Flood Hazard Areas, coastal V zones, top-percentile
  hurricane / wildfire / earthquake / tornado / flood loss rates and low elevation, and tells you why.
- **Property-level hazard math.** Besides FEMA's community rating, you get the exposure-normalized
  **building loss rate**: *expected natural-hazard loss per $100k of building value per year*, comparable
  across the whole country.
- **Bulk-priced:** a fraction of single-address report tools. Unmatched addresses are free.

### 📋 What you get (per property)

| Field | Meaning |
|---|---|
| `matchedAddress`, `latitude`, `longitude` | Standardized address + coordinates (US Census Geocoder) |
| `county`, `place`, `tractFips`, `countyFips` | County, city, census tract and county FIPS codes |
| `floodZone.zone`, `.zoneSubtype` | FEMA flood zone (A, AE, AO, VE, X, D...) and subtype |
| `floodZone.inSpecialFloodHazardArea` | **true** = 1% annual chance flood area (flood insurance usually mandatory with a federal mortgage) |
| `floodZone.baseFloodElevationFt`, `.firmPanel`, `.firmEffectiveDate` | Base flood elevation, FIRM panel number and its effective date |
| `hazardIndex.propertyLossRatePercentile` | Where this tract's building loss rate ranks among all US tracts (0–100) |
| `hazardIndex.expectedAnnualLossPer100kUsd` | Expected natural-hazard loss per $100k of building value per year |
| `hazardIndex.topHazards`, `.hazards` | 18 hazards with FEMA rating, loss-rate percentile and building loss rate |
| `hazardIndex.communityRiskRating`, `.socialVulnerabilityRating`, `.communityResilienceRating` | FEMA's official tract-level ratings |
| `neighborhood.medianHomeValue`, `.medianGrossRent`, `.grossRentYieldPct` | Tract home value, rent and the implied gross rent yield |
| `neighborhood.medianHouseholdIncome`, `.ownerOccupiedPct`, `.vacancyRatePct`, `.medianYearBuilt`, `.population`, `.medianAge` | Tract demographics (ACS 5-year) |
| `elevationFt` | Ground elevation in feet (USGS 3DEP) |
| `verdict`, `flags`, `reasons`, `isFlagged` | low / moderate / elevated / high + machine flags + human reasons |
| `verdictComplete` | `false` if a source couldn't be reached and the verdict is partial (flagged `*_unavailable`) |
| `sourceRecord` | `id`, `url`, `price` of the listing when enriching another actor's dataset |

### 📥 Input

| Field | Type | Meaning |
|---|---|---|
| `addresses` | array | US street addresses, one per line, or `"lat,lon"` points |
| `datasetId` | string | The dataset of a Zillow / Redfin / Realtor / any real-estate actor run to enrich |
| `addressField` | string | Optional dotted path if auto-detection misses (e.g. `listingAddress.full`) |
| `maxItems` | integer | Safety cap per run (default 500) |
| `includeFloodZone` / `includeHazardIndex` ($) / `includeDemographics` / `includeElevation` | boolean | Add-ons, all on by default |
| `onlyFlagged` | boolean | Return (and bill) only elevated/high properties: screen a big list cheaply |
| `webhookUrl` | string | POST flagged properties to Zapier / Make / n8n / your API |

**Example input: addresses**

```json
{
  "addresses": [
    "2100 Collins Ave, Miami Beach, FL 33139",
    "350 Fifth Avenue, New York, NY 10118",
    "29.9511,-90.0715"
  ]
}
```

**Example input: enrich a Zillow scraper run, keep only risky listings**

```json
{ "datasetId": "<your Zillow run's dataset ID>", "onlyFlagged": true, "maxItems": 2000 }
```

### 📤 Output (one row per property)

Real output for a Miami Beach listing chained from a Zillow-style dataset (hazard list shortened):

```json
{
  "input": "1500 Bay Rd, Miami Beach, FL, 33139",
  "matched": true,
  "matchedAddress": "1500 BAY RD, MIAMI BEACH, FL, 33139",
  "latitude": 25.787224, "longitude": -80.143605,
  "geocoder": "US Census Geocoder",
  "county": "Miami-Dade County", "place": "Miami Beach city",
  "tractFips": "12086004207", "countyFips": "12086",
  "sourceRecord": { "id": "44143364", "price": 1250000 },
  "floodZone": {
    "mapped": true, "zone": "AE", "inSpecialFloodHazardArea": true, "riskLevel": "high",
    "label": "High risk: 1% annual chance flood (Special Flood Hazard Area)",
    "baseFloodElevationFt": 8, "dfirmId": "12086C",
    "firmPanel": "12086C0317L", "firmEffectiveDate": "2009-09-11",
    "insuranceNote": "In a Special Flood Hazard Area: flood insurance is generally mandatory for federally backed mortgages."
  },
  "elevationFt": 2.9,
  "hazardIndex": {
    "nriVersion": "December 2025",
    "propertyLossRatePercentile": 55.2,
    "expectedAnnualLossPer100kUsd": 162,
    "communityRiskRating": "Very Low",
    "socialVulnerabilityRating": "Relatively Low",
    "topHazards": [
      { "hazard": "hurricane", "lossRatePercentile": 84, "rating": "Relatively Moderate" },
      { "hazard": "coastalFlooding", "lossRatePercentile": 82.1, "rating": "Relatively Moderate" }
    ],
    "hazards": {
      "hurricane": { "rating": "Relatively Moderate", "lossRatePercentile": 84,
                     "buildingLossRatePct": 0.0784, "tractExpectedAnnualLossUsd": 175775 }
    }
  },
  "neighborhood": {
    "population": 1823, "medianAge": 39.7, "medianHouseholdIncome": 125024,
    "medianHomeValue": 786800, "medianGrossRent": 2854, "grossRentYieldPct": 4.35,
    "medianYearBuilt": 1968, "housingUnits": 1771,
    "ownerOccupiedPct": 7.5, "renterOccupiedPct": 92.5, "vacancyRatePct": 45.1,
    "source": "ACS 2024 5-year (US Census Bureau, via Census Reporter)"
  },
  "verdict": "high",
  "isFlagged": true,
  "flags": ["special_flood_hazard_area", "low_elevation"],
  "reasons": [
    "FEMA flood zone AE: High risk: 1% annual chance flood (Special Flood Hazard Area)",
    "ground elevation 2.9 ft"
  ],
  "sources": ["US Census Geocoder", "FEMA National Flood Hazard Layer (NFHL)",
              "FEMA National Risk Index (December 2025)",
              "ACS 2024 5-year (US Census Bureau, via Census Reporter)",
              "USGS 3DEP Elevation Point Query Service"],
  "capturedAt": "2026-10-13T14:04:50+00:00"
}
```

#### How the verdict works

| Verdict | When |
|---|---|
| **high** | In a FEMA Special Flood Hazard Area (A/V zones), or building loss rate in the top 5% of US tracts |
| **elevated** | Loss rate above the 80th percentile, or a key hazard (flood, hurricane, wildfire, earthquake, tornado, landslide, tsunami) in the top 3% |
| **moderate** | Shaded Zone X (0.2% flood), loss rate above the 60th percentile, a key hazard above the 90th, or elevation under 10 ft |
| **low** | None of the above |

### 💰 Pricing (pay-per-event menu)

- **`property-enriched`**: base, per matched property (geocode + flood zone + demographics + elevation).
- **`hazard-profile`** ($ add-on): premium, per property with a FEMA National Risk Index profile.
- Unmatched addresses are **not billed**. With `onlyFlagged`, only the flagged properties returned are billed.

### 💡 Use cases

- **Real-estate investors & wholesalers:** run your Zillow/Redfin pull through it and drop (or price in) flood-zone and high-hazard deals before you call.
- **Insurance agents & brokers:** pre-qualify flood/wind/wildfire exposure for a book of addresses before quoting.
- **Lenders & due diligence:** SFHA status + FIRM panel for every collateral address in one bulk run.
- **Proptech & AI agents:** one call answers "is this address risky, and why?" with sources.
- **Rental analysis:** tract median rent, home value and gross yield next to the risk picture.
- **Portfolio screening:** score thousands of properties and alert only on elevated/high via webhook.

### 🤖 For AI agents (MCP)

One call, structured JSON, every field described. Ideal as a tool for real-estate, insurance and
due-diligence agents. Example MCP server config:

```json
{
  "mcpServers": {
    "property-risk": {
      "url": "https://mcp.apify.com/?tools=actors,docs,centorprat/fema-flood-zone-property-risk"
    }
  }
}
```

**Claude Code:** `claude mcp add --transport http apify "https://mcp.apify.com/?tools=actors,docs,centorprat/fema-flood-zone-property-risk" --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"`

No extra setup: this Actor is callable from Claude, Cursor, ChatGPT or any MCP client through the Apify MCP server, and agents can find it on their own with the server's `search-actors` tool.

Call it from code:

```bash
curl -X POST "https://api.apify.com/v2/acts/centorprat~fema-flood-zone-property-risk/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"addresses":["2100 Collins Ave, Miami Beach, FL 33139"]}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("centorprat/fema-flood-zone-property-risk").call(run_input={"addresses": ["2100 Collins Ave, Miami Beach, FL 33139"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["matchedAddress"], item["verdict"], item["floodZone"]["zone"])
```

### 🔗 Chain it after a scraper (integrations)

1. Run any real-estate actor (Zillow Search, Zillow Detail, Redfin, Realtor...).
2. Open this actor, pick that run's dataset in **🔗 Enrich a Zillow / Redfin / Realtor dataset**, and start.
3. Or automate it: add an **Apify integration** on the scraper ("run actor after success") that passes
   `{"datasetId": "{{resource.defaultDatasetId}}"}` to this actor.

### 🚀 Ready-made tasks (one click)

Pre-configured runs for the most common jobs. Open one, change the input, run:

- [Flood Zone Lookup by Address (FEMA)](https://apify.com/centorprat/fema-flood-zone-property-risk/examples/flood-zone-lookup-by-address): Look up the FEMA flood zone, SFHA status, base flood elevation and FIRM panel for any US address, in bulk, with a risk verdict per property.
- [Zillow & Redfin Listings: Flood and Hazard Risk](https://apify.com/centorprat/fema-flood-zone-property-risk/examples/zillow-redfin-flood-hazard-risk): Add FEMA flood zone, hurricane/wildfire/earthquake risk and neighborhood data to every Zillow or Redfin listing you scraped. Bulk, per-property pricing.
- [Hurricane, Wildfire & Earthquake Risk by Address](https://apify.com/centorprat/fema-flood-zone-property-risk/examples/hurricane-wildfire-risk-by-address): FEMA natural hazard risk for any US address: hurricane, wildfire, earthquake, tornado, flood. Loss percentiles, expected annual loss and a verdict.
- [Neighborhood Income, Rent & Home Value by Address](https://apify.com/centorprat/fema-flood-zone-property-risk/examples/neighborhood-income-rent-home-value): Median income, home value, rent, rent yield, vacancy and owner-occupancy for the census tract of any US address. Official ACS data, bulk.

### ❓ FAQ

- **Do I need an API key?** No. Every source is a keyless public US federal service.
- **Which countries?** United States only (50 states + DC; territories where FEMA/Census data exists). Points outside the US are returned as unmatched and not billed.
- **How accurate is the flood zone?** It's the effective FEMA flood map (NFHL) polygon at the geocoded point, the same data FEMA's Map Service Center shows. For a lender-grade determination, order an official Standard Flood Hazard Determination (SFHDF).
- **What if the community has no digital flood map?** `floodZone.mapped` is `false` with a note. Some rural counties still only have paper FIRMs.
- **Is the hazard data per house?** FEMA's National Risk Index is published per **census tract**, so properties in the same tract share it. The flood zone and elevation are per point.
- **What's `expectedAnnualLossPer100kUsd`?** FEMA's annualized building loss rate across all 18 hazards, expressed per $100k of building value. Multiply by the structure value (not land) for a rough annual expected loss.
- **Why can `communityRiskRating` be high while the verdict is low?** FEMA's community rating grows with how much is built in a tract (exposure). The verdict uses the exposure-normalized loss rate, which is what matters for one building.
- **Some addresses didn't match?** The US Census geocoder misses some new builds, campuses and PO boxes. Pass `"lat,lon"` for those, or use a dataset that has coordinates. Unmatched addresses are free.
- **How fresh is the data?** Flood zones are the live FEMA layer; NRI is the latest FEMA release (shown in `nriVersion`); ACS is the latest 5-year release (shown in `neighborhood.source`).
- **How fast is it?** Typically 30–120 properties per minute at the default settings, depending on how loaded FEMA's public flood service is (40 properties took 20–80 s in our tests). Tract-level data is cached within a run.
- **What if a federal service is down?** Failed lookups are retried automatically. If one still can't be checked, the record says so (`flags: ["flood_zone_unavailable"]`, `verdictComplete: false`) instead of silently giving a safer-looking verdict.
- **Can I use it commercially?** Yes. All sources are US federal government works in the public domain; please keep the attribution in `sources`.
- **Is it a substitute for an inspection, appraisal or insurance quote?** No. It's screening data for decisions and prioritization.

### 📜 Data & attribution

US Census Bureau (Geocoder, American Community Survey 5-year; read via the official Census API or the
open-source Census Reporter API) · FEMA National Flood Hazard Layer · FEMA National Risk Index ·
USGS 3D Elevation Program. Public-domain federal data, fetched live, composed and returned; nothing stored.

### 🔗 Related actors

Part of one suite of keyless, agent-ready composers by the same developer:

- [Shopify Store Leads + App Audit (Reviews, Email, Pixels)](https://apify.com/centorprat/shopify-store-leads-app-audit): Shopify stores by niche, verified and audited for missing apps (reviews, email/SMS, upsell, loyalty, chat, subscriptions), pixels and theme: scored leads with emails.
- [Google Maps Leads + Website Audit for Agencies](https://apify.com/centorprat/google-maps-leads-website-audit): local businesses from Google Maps audited for website, Google profile, reviews, booking and tracking gaps: scored, explained leads with phone and emails.
- [Domain Lookup API - DNS, MX, SPF, Tech & Contact Emails](https://apify.com/centorprat/domain-lookup-dns-mx-email): DNS + live homepage → IPs, MX/SPF, tech, socials and public contacts per domain.
- [Wikipedia & Wikidata API - Entity Facts, Summary & Pageviews](https://apify.com/centorprat/wikipedia-wikidata-api): Wikipedia + Wikidata + pageviews → one structured brief per company, person or place.
- [Country Economic Data API - World Bank GDP, FX & Holidays](https://apify.com/centorprat/world-bank-country-economic-data): World Bank + FX + public holidays → one market brief per country.
- [Weather, Air Quality & Earthquake Risk API by Location](https://apify.com/centorprat/weather-air-quality-earthquake-api): live weather + air quality + earthquakes → one clear/caution/hazard verdict per point, worldwide.
- [Aircraft Tracker API (ADS-B) - Approach & Military Alerts](https://apify.com/centorprat/aircraft-tracker-adsb): aircraft approaching a point with CPA/ETA + military/unidentified flags and alerts.
- [NARA Catalog Extractor](https://apify.com/centorprat/nara-catalog-extractor): US National Archives catalog search → digital-object download URLs + metadata.

# Actor input Schema

## `addresses` (type: `array`):

One property per line. Full street addresses work best ("2100 Collins Ave, Miami Beach, FL 33139"). You can also give coordinates as "29.9511,-90.0715". Billed per matched property; unmatched addresses are free.

## `datasetId` (type: `string`):

Pick (or paste the ID of) the dataset of any real-estate actor run you did: Zillow Search Scraper, Zillow Detail, Redfin, Realtor, Crexi... Each row's address and coordinates are auto-detected, and the listing ID, URL and price are carried into the output as sourceRecord. Read-only access.

## `addressField` (type: `string`):

Only if auto-detection misses: the dotted path of the address field in that dataset, e.g. "listingAddress.full" or "address".

## `maxItems` (type: `integer`):

Safety cap on how many properties are enriched (addresses + dataset rows).

## `includeFloodZone` (type: `boolean`):

FEMA National Flood Hazard Layer: zone (A, AE, VE, X...), Special Flood Hazard Area yes/no, base flood elevation, FIRM panel and effective date.

## `includeHazardIndex` (type: `boolean`):

FEMA National Risk Index for the property's census tract: 18 natural hazards (hurricane, wildfire, earthquake, tornado, flooding...) with loss-rate percentiles, expected annual loss per $100k of building value, social vulnerability and community resilience. Billed as the premium 'hazard-profile' event.

## `includeDemographics` (type: `boolean`):

Census tract snapshot from the American Community Survey (5-year): median household income, median home value, median rent, gross rent yield, owner-occupied %, vacancy %, median year built, population, median age.

## `includeElevation` (type: `boolean`):

USGS 3DEP ground elevation in feet at the property point.

## `onlyFlagged` (type: `boolean`):

Output (and bill) only properties whose verdict is elevated or high. Useful to screen a big list for risk.

## `webhookUrl` (type: `string`):

If set, flagged (elevated/high) properties are POSTed here as JSON (Zapier / Make / n8n / custom).

## `concurrency` (type: `integer`):

How many properties are looked up at once (max 8). The default of 6 is the fastest setting that stays within the public FEMA service's limits.

## Actor input object example

```json
{
  "addresses": [
    "2100 Collins Ave, Miami Beach, FL 33139",
    "350 Fifth Avenue, New York, NY 10118",
    "29.9511,-90.0715"
  ],
  "maxItems": 500,
  "includeFloodZone": true,
  "includeHazardIndex": true,
  "includeDemographics": true,
  "includeElevation": true,
  "onlyFlagged": false,
  "concurrency": 6
}
```

# Actor output Schema

## `properties` (type: `string`):

One record per property: geocode + census tract, FEMA flood zone (SFHA, BFE, FIRM panel), FEMA National Risk Index hazard profile (18 hazards, loss-rate percentiles, expected annual loss per $100k), ACS neighborhood snapshot (income, home value, rent, yield, owner-occupancy, vacancy), elevation, and a low/moderate/elevated/high verdict with flags and reasons.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "addresses": [
        "2100 Collins Ave, Miami Beach, FL 33139",
        "350 Fifth Avenue, New York, NY 10118",
        "29.9511,-90.0715"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("centorprat/fema-flood-zone-property-risk").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "addresses": [
        "2100 Collins Ave, Miami Beach, FL 33139",
        "350 Fifth Avenue, New York, NY 10118",
        "29.9511,-90.0715",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("centorprat/fema-flood-zone-property-risk").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "addresses": [
    "2100 Collins Ave, Miami Beach, FL 33139",
    "350 Fifth Avenue, New York, NY 10118",
    "29.9511,-90.0715"
  ]
}' |
apify call centorprat/fema-flood-zone-property-risk --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,centorprat/fema-flood-zone-property-risk"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/g1jfJ6CCJN5Wy4erP/builds/FLeIbAR1sBI9lw9l3/openapi.json
