> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pingintel.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Ping Hazard v2

**Code: PH2**

Ping Hazard is a curated collection of key property
exposure information, purpose-built for driving US property insurance. It collects,
organizes, and scores the most relevant perils that drive underwriting and rating decisions — flood, hurricane,
earthquake, wildfire, severe convective storm, crime, and more. Each peril uses the measurement best suited to its
source data, with supporting attributes providing context and detail.

[Vendor website](https://www.pingintel.com) · [Vendor API documentation](https://docs.pingintel.com/ping-hazard-v2) · [Data dictionary (.xlsx)](https://data-api-dev.sovfixer.com/api/v1/datasources/PH2/data_dictionary.xlsx)

**Required input:** `latitude`, `longitude`

<Note>
  When Ping.Extraction fetches this data on your behalf, the Ping JSON format
  makes these payloads available under the `external_data[PH2]` key of each building.
</Note>

## Location

Geospatial and address information for this result, used for further data lookups. If the `geocode.match_level` and `confidence` are too low/imprecise, certain data fields won't be available.

| **Data Element** | **Description** |
| :- | :- |
| address | Postal address components. `object` |
|   <span style={{ opacity: 0.45 }}>address.</span>formatted | Single-line formatted address. `text` *e.g. `123 Main St, Miami, FL 33101`* |
|   <span style={{ opacity: 0.45 }}>address.</span>line\_1 | First address line (street number and street name). `text` |
|   <span style={{ opacity: 0.45 }}>address.</span>line\_2 | Second address line (unit, suite, or apartment). `text` |
|   <span style={{ opacity: 0.45 }}>address.</span>city | City or locality name. `text` |
|   <span style={{ opacity: 0.45 }}>address.</span>county | County name. `text` |
|   <span style={{ opacity: 0.45 }}>address.</span>state | Two-letter U.S. state code. `text` |
|   <span style={{ opacity: 0.45 }}>address.</span>postal\_code | Postal (ZIP) code. `text` |
|   <span style={{ opacity: 0.45 }}>address.</span>country | Two-letter ISO country code. `text` |
| geocode | Resolved coordinates and geocode quality indicators. `object` |
|   <span style={{ opacity: 0.45 }}>geocode.</span>latitude | Location latitude in WGS84 decimal degrees. `number` *e.g. `25.7743`* |
|   <span style={{ opacity: 0.45 }}>geocode.</span>longitude | Location longitude in WGS84 decimal degrees. `number` *e.g. `-80.1937`* |
|   <span style={{ opacity: 0.45 }}>geocode.</span>match\_level | Match-quality tier for this geocode. `text` *e.g. `point`* <details><summary>Values</summary>**point**: Matched to a specific rooftop/parcel-point location.<br />**street\_imputed**: Matched by interpolating position along a street segment's address range.<br />**route**: Matched to a street/route without a specific address-range interpolation.<br />**postal\_code**: Matched to a postal code (ZIP) centroid.<br />**city**: Matched to a city/place centroid.<br />**county**: Matched to a county centroid.<br />**country\_subdivision\_name**: Matched to a state/province centroid.<br />**country**: Matched to a country centroid.</details> |
| confidence | Geocode confidence, 0.0-1.0. Higher means higher confidence in the match. `number` *e.g. `0.98`* **Values:** 0.0-1.0 |
| result | 'success' when this section populated, otherwise why it is absent. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**no\_data**: The source has no record for this location.</details> |

## Site

Information about the immediate surroundings of the property location, such as elevation, distance to coast, population density, and county identity.

*Source: Google Elevation; EASI (population density); U.S. Census Bureau (county FIPS code).*

| **Data Element** | **Description** |
| :- | :- |
| elevation\_feet | Ground elevation above sea level, in feet. `number` *e.g. `12.3`* **Note:** Opt-in: returned only when requested via `include_fields`. |
| distance\_to\_coast\_miles | Measured distance to the nearest oceanic shoreline, in miles. Gauges exposure to tropical cyclone impacts. `number` *e.g. `0.91`* **Note:** Only available in the coastal impact states: the Gulf and Atlantic seaboard states from Texas to Maine, plus Hawaii, Puerto Rico, the U.S. Virgin Islands, and Guam. Absent everywhere else, including the Pacific-coast states and Alaska. |
| coast\_nearest\_point | Coordinates of the nearest point on the oceanic shoreline. `object` **Note:** Only available in the coastal impact states: the Gulf and Atlantic seaboard states from Texas to Maine, plus Hawaii, Puerto Rico, the U.S. Virgin Islands, and Guam. Absent everywhere else, including the Pacific-coast states and Alaska. |
|   <span style={{ opacity: 0.45 }}>coast\_nearest\_point.</span>latitude | Latitude in WGS84 decimal degrees. `number` |
|   <span style={{ opacity: 0.45 }}>coast\_nearest\_point.</span>longitude | Longitude in WGS84 decimal degrees. `number` |
| population\_per\_sqmi | Population density of the area, in persons per square mile. `number` *e.g. `4820.0`* |
| fips\_code | U.S. Census Bureau 5-digit state+county FIPS code for the location. `text` *e.g. `12086`* |
| result | 'success' or 'partial\_data' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**partial\_data**: The section has real data, but at least one of its underlying sources failed to fetch (as opposed to a plain `success`, where any null fields are null because there's genuinely nothing there for this location).<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

## Property

Physical building attributes.

*Source: US Tax Record Data*

| **Data Element** | **Description** |
| :- | :- |
| owner\_name | Primary owner name of record. `text` *e.g. `Acme Holdings LLC`* |
| year\_built | Year the primary building was originally constructed. `year` *e.g. `1998`* |
| year\_updated | Year of the most recent major renovation or update. `year` *e.g. `2015`* |
| occupancy\_code | Building use/occupancy classification using the Ping COPE taxonomy. See [https://taxonomy.pingintel.com/?taxonomy=Occupancy](https://taxonomy.pingintel.com/?taxonomy=Occupancy) for valid codes and names. `text` *e.g. `O2.2.1.2`* |
| occupancy\_desc | Human-readable name for `occupancy_code`. `text` *e.g. `Single-family detached dwellings`* |
| occupancy\_confidence | Confidence backing `occupancy_code`, 0.0-1.0. `number` *e.g. `0.7`* **Note:** Estimate of the reliability of this code, based on analysis of the reliability of the underlying data. **Values:** 0.0-1.0 |
| construction\_group | Coarse construction type. `text` *e.g. `MAS`* <details><summary>Values</summary>**WF**: Wood Frame<br />**MAS**: Masonry<br />**SF**: Steel Frame<br />**LM**: Light Metal<br />**RC**: Reinforced Concrete<br />**POD**: Podium<br />**TU**: Tilt-up<br />**MOB**: Mobile Homes and Portables<br />**NON**: Non-Building<br />**UNK**: Unknown</details> |
| material\_code | Construction material classification using the Ping COPE taxonomy. See [https://taxonomy.pingintel.com/?taxonomy=Material+composition](https://taxonomy.pingintel.com/?taxonomy=Material+composition) for valid codes and names. `text` *e.g. `C3`* |
| material\_desc | Human-readable name for `material_code`. `text` *e.g. `Masonry`* |
| material\_confidence | Confidence backing `material_code`, 0.0-1.0. `number` *e.g. `0.74`* **Note:** Estimate of the reliability of this code, based on analysis of the reliability of the underlying data. Many construction descriptions describe surface/cladding rather than structural frame (e.g. brick veneer over wood framing), so a moderate or low value is common. **Values:** 0.0-1.0 |
| risk\_type\_code | Risk-type classification using the Ping COPE taxonomy — what kind of physical structure this is (e.g. enclosed structure, bridge, tank, vehicle). See [https://taxonomy.pingintel.com/?taxonomy=Risk+type](https://taxonomy.pingintel.com/?taxonomy=Risk+type) for valid codes and names. `text` *e.g. `R2`* |
| risk\_type\_desc | Human-readable name for `risk_type_code`. `text` *e.g. `Enclosed Structures`* |
| num\_stories | Number of above-grade stories. `number` *e.g. `3`* |
| num\_stories\_below\_grade | Number of below-grade stories. `number` *e.g. `0`* |
| num\_buildings | Number of buildings on the parcel. `number` *e.g. `1`* |
| building\_area\_sqft | Total building floor area, in square feet. `number` *e.g. `24000`* |
| lot\_size\_sqft | Parcel/lot area, in square feet. `number` *e.g. `43560`* |
| has\_basement | Whether the building has a basement. `boolean` *e.g. `false`* **Values:** True, False |
| roof | Roof characteristics. `object` |
|   <span style={{ opacity: 0.45 }}>roof.</span>covering\_desc | Roof covering material, from the Ping roof taxonomy. `text` *e.g. `Composition (Fiberglass, Asphalt, etc)`* <details><summary>Values</summary>Aluminium, Asbestos shakes, Built Up, Composition (Fiberglass, Asphalt, etc), Concrete, Concrete/Clay Tiles, Copper, Felt, Fiberglass, Foam, Hurricane Rated Covering, Metal, Metal Roof Standing Seams, Metal w/ Concealed Fasteners, Metal w/ Exposed Fasteners, Plastic, Plywood, Reinforced concrete, Rubber, Shingles, Shingles (> 110 mph), Shingles (> 110 mph) w/ SWR, Shingles (55 mph), Shingles (55 mph) w/ SWR, Shingles w/ SWR, Single Ply, Single Ply Ballasted, Slate, Steel, Thatch, Tin, TPO, Unknown/Default, Wood, Zinc</details> |
|   <span style={{ opacity: 0.45 }}>roof.</span>covering\_confidence | Confidence backing `covering_desc`, 0.0-1.0. `number` *e.g. `0.6`* **Note:** Estimate of the reliability of this code, based on analysis of the reliability of the underlying data. **Values:** 0.0-1.0 |
|   <span style={{ opacity: 0.45 }}>roof.</span>shape\_desc | Roof shape/geometry, from the Ping roof taxonomy. `text` *e.g. `Hip`* <details><summary>Values</summary>Unknown/Default, Complex Mixed, Dome Curved, Flat w/ Parapets, Flat w/ Unknown Parapets, Flat without Parapets, Gable (Braced Unknown), Gable Braced, Gable Unbraced, Gambrel, Hip, Mansard, Pitch (exact angle unknown), Pyramid, Shed-Monoslope, Stepped, Butterfly, Saltbox</details> |
|   <span style={{ opacity: 0.45 }}>roof.</span>shape\_confidence | Confidence backing `shape_desc`, 0.0-1.0. `number` *e.g. `0.57`* **Note:** Statistical, not a per-property score: the share of real classification outcomes for properties sharing this reported roof type that actually agreed with `shape_desc`, from a prior analysis of production data. **Values:** 0.0-1.0 |
| result | 'success' when this section populated, otherwise why it is absent. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).</details> |

## Perils

Hazard measurements use the form appropriate to each peril: normalized scores where available, FEMA flood-zone categories, USDA wildfire burn probability, and area-normalized tornado/hail event density. Normalized scores are calibrated within their own peril and are not comparable across perils.

*Source: FEMA National Risk Index; FEMA NFHL; NOAA SLOSH; USDA/USFS wildfire; AAIS; EASI crime; Florida sinkhole dataset; Ping county lookups.*

| **Data Element** | **Description** |
| :- | :- |
| result | Always `success` — this section is always present; the sections nested under it may not be. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.</details> |

### Flood

Flood perils: FEMA flood zone, inland (riverine) flood, coastal flood, and watershed (HUC12).

*Source: FEMA National Flood Hazard Layer (flood zone); FEMA National Risk Index (riverine, coastal); USGS Watershed Boundary Dataset (HUC12).*

| **Data Element** | **Description** |
| :- | :- |
| fema\_zone | FEMA flood zone designation and subtype. `object` |
|   <span style={{ opacity: 0.45 }}>fema\_zone.</span>zone | FEMA flood zone designation. `text` *e.g. `AE`* <details><summary>Values</summary>**A**: SFHA with no detailed hydraulic study — no Base Flood Elevation (BFE) shown.<br />**AE**: SFHA with a detailed hydraulic study — BFE shown. Used in place of the older numbered A1-A30 designation on newer maps.<br />**A1–A30**: SFHA with a detailed hydraulic study and numbered BFE contour — the older-map equivalent of Zone AE.<br />**AO**: SFHA subject to shallow sheet-flow flooding, 1-3 feet deep; average flood depth shown instead of a BFE.<br />**AR**: SFHA behind a flood-control system (levee/dam) that was previously accredited and is being restored to base-flood protection.<br />**A99**: SFHA behind a federal flood-control system under construction that has reached sufficient statutory progress to be treated as complete for insurance rating; no BFE shown.<br />**V**: Coastal SFHA subject to storm-induced wave action in addition to flooding — no BFE shown.<br />**VE**: Coastal SFHA subject to storm-induced wave action — BFE shown. Used in place of the older numbered V1-V30 designation on newer maps.<br />**V1–V30**: Coastal SFHA with wave action and a numbered BFE contour — the older-map equivalent of Zone VE.<br />**B**: Area of moderate flood hazard (between the 100-year and 500-year flood limits) on older maps — superseded by Zone X (shaded) on modern FIRMs.<br />**C**: Area of minimal flood hazard (above the 500-year flood level) on older maps — superseded by Zone X (unshaded) on modern FIRMs.<br />**D**: Area where flood risk has not been determined; no flood hazard analysis has been done.<br />**X**: Area of moderate-to-minimal flood hazard, outside the SFHA — the modern-map replacement for both Zone B (moderate) and Zone C (minimal).</details> |
|   <span style={{ opacity: 0.45 }}>fema\_zone.</span>subtype | Sub-designation describing features within the primary FEMA flood zone. `text` *e.g. `FLOODWAY`* |
|   <span style={{ opacity: 0.45 }}>fema\_zone.</span>risk\_category | Flood-risk category derived from the FEMA zone and subtype. `text` *e.g. `SFHA`* <details><summary>Values</summary>**SFHA**: FEMA Zone A family Special Flood Hazard Area.<br />**Coastal High Risk**: FEMA Zone V family coastal high-hazard area.<br />**Moderate**: FEMA shaded Zone X / X500 or legacy Zone B.<br />**Low**: FEMA unshaded Zone X or legacy Zone C.<br />**None**: The FEMA lookup completed successfully but found no containing flood-zone polygon.</details> |
| riverine | Inland (riverine) flood exposure. `object` **Note:** Census-tract level: one rating covers the whole tract, not this specific point. |
|   <span style={{ opacity: 0.45 }}>riverine.</span>risk\_score | Normalized 0-100 exposure score for this peril, based on the FEMA National Risk Index annualized building loss rate. Higher means greater expected annual loss. `number` *e.g. `96.2`* **Note:** Per-peril-relative: reflects this peril's own loss-rate distribution and is not comparable across perils. A hurricane 50 and a wildfire 50 are not the same expected loss — compare a score only against the same peril at other locations, never across perils. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>riverine.</span>risk\_level | Exposure band for `risk_score`. `text` *e.g. `Very High`* <details><summary>Values</summary>**No Exposure**: Score is exactly 0.<br />**Negligible**: Score greater than 0 and less than 0.01.<br />**Low**: Score from 0.01 to less than 5.<br />**Moderate**: Score from 5 to less than 20.<br />**Elevated**: Score from 20 to less than 50.<br />**High**: Score from 50 to less than 80.<br />**Very High**: Score from 80 to less than 100.<br />**Maximum**: Score is exactly 100.</details> |
| coastal | Coastal flood exposure. `object` **Note:** Census-tract level: one rating covers the whole tract, not this specific point. |
|   <span style={{ opacity: 0.45 }}>coastal.</span>risk\_score | Normalized 0-100 exposure score for this peril, based on the FEMA National Risk Index annualized building loss rate. Higher means greater expected annual loss. `number` *e.g. `96.2`* **Note:** Per-peril-relative: reflects this peril's own loss-rate distribution and is not comparable across perils. A hurricane 50 and a wildfire 50 are not the same expected loss — compare a score only against the same peril at other locations, never across perils. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>coastal.</span>risk\_level | Exposure band for `risk_score`. `text` *e.g. `Very High`* <details><summary>Values</summary>**No Exposure**: Score is exactly 0.<br />**Negligible**: Score greater than 0 and less than 0.01.<br />**Low**: Score from 0.01 to less than 5.<br />**Moderate**: Score from 5 to less than 20.<br />**Elevated**: Score from 20 to less than 50.<br />**High**: Score from 50 to less than 80.<br />**Very High**: Score from 80 to less than 100.<br />**Maximum**: Score is exactly 100.</details> |
| huc12 | USGS 12-digit Hydrologic Unit Code (HUC12) identifying the watershed (sub-watershed) containing the location. `text` *e.g. `030902030805`* |
| nearest\_flood\_zone | Details of the nearest Special Flood Hazard Zone (SFHA). `object` |
|   <span style={{ opacity: 0.45 }}>nearest\_flood\_zone.</span>distance\_to\_sfha\_miles | Straight-line distance to the nearest Special Flood Hazard Zone (SFHA), in miles. `number` *e.g. `0.74`* |
|   <span style={{ opacity: 0.45 }}>nearest\_flood\_zone.</span>distance\_to\_sfha\_feet | Straight-line distance to the nearest Special Flood Hazard Zone (SFHA), in feet. `number` *e.g. `3907.2`* |
|   <span style={{ opacity: 0.45 }}>nearest\_flood\_zone.</span>sfha\_closest\_point\_longitude | Special Flood Hazard Zone (SFHA) longitude in WGS84 decimal degrees. `number` |
|   <span style={{ opacity: 0.45 }}>nearest\_flood\_zone.</span>sfha\_closest\_point\_latitude | Special Flood Hazard Zone (SFHA) latitude in WGS84 decimal degrees. `number` |
|   <span style={{ opacity: 0.45 }}>nearest\_flood\_zone.</span>nearest\_sfha\_zone | FEMA flood zone designation of the nearest Special Flood Hazard Area (SFHA). `text` <details><summary>Values</summary>A, AE, AH, AO, AR, A99, V, VE</details> |
| result | 'success' or 'partial\_data' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**partial\_data**: The section has real data, but at least one of its underlying sources failed to fetch (as opposed to a plain `success`, where any null fields are null because there's genuinely nothing there for this location).<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

### Hurricane

Hurricane exposure, county wind tier (Ping and AIG standard), and storm surge.

*Source: FEMA National Risk Index; NOAA SLOSH (storm surge); Ping county lookup (wind tier, AIG wind tier).*

| **Data Element** | **Description** |
| :- | :- |
| risk\_score | Normalized 0-100 exposure score for this peril, based on the FEMA National Risk Index annualized building loss rate. Higher means greater expected annual loss. `number` *e.g. `96.2`* **Note:** Per-peril-relative: reflects this peril's own loss-rate distribution and is not comparable across perils. A hurricane 50 and a wildfire 50 are not the same expected loss — compare a score only against the same peril at other locations, never across perils. **Values:** 0-100 |
| risk\_level | Exposure band for `risk_score`. `text` *e.g. `Very High`* <details><summary>Values</summary>**No Exposure**: Score is exactly 0.<br />**Negligible**: Score greater than 0 and less than 0.01.<br />**Low**: Score from 0.01 to less than 5.<br />**Moderate**: Score from 5 to less than 20.<br />**Elevated**: Score from 20 to less than 50.<br />**High**: Score from 50 to less than 80.<br />**Very High**: Score from 80 to less than 100.<br />**Maximum**: Score is exactly 100.</details> |
| wind\_tier | Ping's hurricane wind-exposure tier for the property's county. `text` *e.g. `Tier 1`* <details><summary>Values</summary>**Tier 1**: County borders the coastline (Florida and Hawaii are Tier 1 statewide).<br />**Tier 2**: County borders a Tier 1 county.</details> |
| aig\_wind\_tier | Hurricane wind-exposure tier for the property's county, per the AIG wind tier standard. `text` *e.g. `Tier 1`* **Note:** Computed independently of `wind_tier` and will not always agree for the same county. `wind_tier` is a coastal-adjacency rule (Tier 1 touches the coast, Tier 2 touches a Tier 1 county); `aig_wind_tier` is a fixed list of Tier 1 counties/states (plus Puerto Rico and the U.S. Virgin Islands) with no Tier 2 — every other location is untiered. <details><summary>Values</summary>**Tier 1**: County (or state/territory) is on AIG's Tier 1 hurricane-exposed list.</details> |
| storm\_surge | NOAA SLOSH modeled storm surge. `object` |
|   <span style={{ opacity: 0.45 }}>storm\_surge.</span>category | Lowest hurricane category (1-5) whose storm surge inundates the location. `number` *e.g. `3`* **Values:** 1-5 |
|   <span style={{ opacity: 0.45 }}>storm\_surge.</span>height\_feet | Storm surge height for the inundating category, in feet. `number` *e.g. `9.0`* |
| result | 'success' or 'partial\_data' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**partial\_data**: The section has real data, but at least one of its underlying sources failed to fetch (as opposed to a plain `success`, where any null fields are null because there's genuinely nothing there for this location).<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

### Severe Convective Storm

Severe convective storm perils: tornado, hail, and lightning.

*Source: FEMA National Risk Index (tract event frequency and area; lightning risk score).*

| **Data Element** | **Description** |
| :- | :- |
| tornado | Area-normalized tornado event density and fixed-threshold category. `object` |
|   <span style={{ opacity: 0.45 }}>tornado.</span>event\_density | Annualized event frequency per square kilometre of census-tract area. `number` *e.g. `0.00031`* |
|   <span style={{ opacity: 0.45 }}>tornado.</span>risk\_category | Exposure category assigned from fixed peril-specific event-density thresholds. `text` *e.g. `High`* <details><summary>Values</summary>Negligible, Low, Moderate, High, Extreme</details> |
| hail | Area-normalized hail event density and fixed-threshold category. `object` |
|   <span style={{ opacity: 0.45 }}>hail.</span>event\_density | Annualized event frequency per square kilometre of census-tract area. `number` *e.g. `0.00031`* |
|   <span style={{ opacity: 0.45 }}>hail.</span>risk\_category | Exposure category assigned from fixed peril-specific event-density thresholds. `text` *e.g. `High`* <details><summary>Values</summary>Negligible, Low, Moderate, High, Extreme</details> |
| lightning | Lightning exposure. `object` |
|   <span style={{ opacity: 0.45 }}>lightning.</span>risk\_score | Normalized 0-100 exposure score for this peril, based on the FEMA National Risk Index annualized building loss rate. Higher means greater expected annual loss. `number` *e.g. `96.2`* **Note:** Per-peril-relative: reflects this peril's own loss-rate distribution and is not comparable across perils. A hurricane 50 and a wildfire 50 are not the same expected loss — compare a score only against the same peril at other locations, never across perils. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>lightning.</span>risk\_level | Exposure band for `risk_score`. `text` *e.g. `Very High`* <details><summary>Values</summary>**No Exposure**: Score is exactly 0.<br />**Negligible**: Score greater than 0 and less than 0.01.<br />**Low**: Score from 0.01 to less than 5.<br />**Moderate**: Score from 5 to less than 20.<br />**Elevated**: Score from 20 to less than 50.<br />**High**: Score from 50 to less than 80.<br />**Very High**: Score from 80 to less than 100.<br />**Maximum**: Score is exactly 100.</details> |
| result | 'success' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

### Earthquake

Earthquake exposure, seismic zone/subzone, and tsunami.

*Source: FEMA National Risk Index; Ping county lookup (seismic zone/subzone).*

| **Data Element** | **Description** |
| :- | :- |
| risk\_score | Normalized 0-100 exposure score for this peril, based on the FEMA National Risk Index annualized building loss rate. Higher means greater expected annual loss. `number` *e.g. `20.0`* **Note:** Per-peril-relative: reflects this peril's own loss-rate distribution and is not comparable across perils. A hurricane 50 and a wildfire 50 are not the same expected loss — compare a score only against the same peril at other locations, never across perils. **Values:** 0-100 |
| risk\_level | Exposure band for `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**No Exposure**: Score is exactly 0.<br />**Negligible**: Score greater than 0 and less than 0.01.<br />**Low**: Score from 0.01 to less than 5.<br />**Moderate**: Score from 5 to less than 20.<br />**Elevated**: Score from 20 to less than 50.<br />**High**: Score from 50 to less than 80.<br />**Very High**: Score from 80 to less than 100.<br />**Maximum**: Score is exactly 100.</details> |
| zone | Broad seismic zone the location falls in, if any. `text` *e.g. `CA`* <details><summary>Values</summary>**CA**: California statewide seismic zone.<br />**PacNW**: Pacific Northwest seismic zone (Oregon, Washington).<br />**New Madrid**: New Madrid Seismic Zone (Arkansas, Illinois, Indiana, Kentucky, Missouri, Mississippi, Tennessee).<br />**AK**: Alaska statewide seismic zone.<br />**HI**: Hawaii statewide seismic zone.<br />**PR**: Puerto Rico seismic zone.</details> |
| subzone | Finer subdivision of California counties within zone 'CA', grouping counties by earthquake exposure. Not assigned for any other zone. `text` *e.g. `B3`* <details><summary>Values</summary>A1, A2, A3, B1, B2, B3, C, D, E, F, G, H</details> |
| tsunami | Tsunami exposure. `object` |
|   <span style={{ opacity: 0.45 }}>tsunami.</span>risk\_score | Normalized 0-100 exposure score for this peril, based on the FEMA National Risk Index annualized building loss rate. Higher means greater expected annual loss. `number` *e.g. `96.2`* **Note:** Per-peril-relative: reflects this peril's own loss-rate distribution and is not comparable across perils. A hurricane 50 and a wildfire 50 are not the same expected loss — compare a score only against the same peril at other locations, never across perils. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>tsunami.</span>risk\_level | Exposure band for `risk_score`. `text` *e.g. `Very High`* <details><summary>Values</summary>**No Exposure**: Score is exactly 0.<br />**Negligible**: Score greater than 0 and less than 0.01.<br />**Low**: Score from 0.01 to less than 5.<br />**Moderate**: Score from 5 to less than 20.<br />**Elevated**: Score from 20 to less than 50.<br />**High**: Score from 50 to less than 80.<br />**Very High**: Score from 80 to less than 100.<br />**Maximum**: Score is exactly 100.</details> |
| result | 'success' or 'partial\_data' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**partial\_data**: The section has real data, but at least one of its underlying sources failed to fetch (as opposed to a plain `success`, where any null fields are null because there's genuinely nothing there for this location).<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

### Fire

Wildfire exposure and structure-fire protection.

*Source: USDA/USFS; AAIS; Ping distance datasets.*

| **Data Element** | **Description** |
| :- | :- |
| wildfire | Wildfire exposure and burn probability. `object` |
|   <span style={{ opacity: 0.45 }}>wildfire.</span>burn\_probability | Annual probability of a wildfire burning the location, 0.0-1.0. `percentage` *e.g. `0.008`* **Values:** 0.0-1.0 |
|   <span style={{ opacity: 0.45 }}>wildfire.</span>risk\_category | Wildfire exposure category derived from annual burn probability. `text` *e.g. `High`* <details><summary>Values</summary>**Low**: Annual burn probability below 0.0008.<br />**Medium**: Annual burn probability from 0.0008 to below 0.0030.<br />**High**: Annual burn probability from 0.0030 to below 0.0120.<br />**Very High**: Annual burn probability of 0.0120 or greater.</details> |
|   <span style={{ opacity: 0.45 }}>wildfire.</span>risk\_category\_numeric | Ordinal wildfire exposure category, from 1 (Low) through 4 (Very High). `number` *e.g. `3`* <details><summary>Values</summary>1, 2, 3, 4</details> |
| protection | Structure-fire suppression capability. `object` |
|   <span style={{ opacity: 0.45 }}>protection.</span>fire\_protection\_class | Ping Fire Protection Class, 1-10. Lower values indicate better fire protection. `number` *e.g. `4`* **Values:** 1-10 |
|   <span style={{ opacity: 0.45 }}>protection.</span>aais\_classification | Fire-protection classification AAIS code, computed from distance to the nearest fire station and water source. `text` *e.g. `P2`* <details><summary>Values</summary>**P1**: Fire station within 1 mile and water source within 1,000 ft.<br />**P2**: Fire station within 2 miles and water source within 1,000 ft.<br />**P3**: Fire station within 3 miles and water source within 1,000 ft.<br />**P4**: Fire station within 4 miles and water source within 1,000 ft.<br />**P5**: Fire station within 5 miles and water source within 1,000 ft.<br />**PP1**: Fire station within 1 mile; water source beyond 1,000 ft (or none).<br />**PP2**: Fire station within 2 miles; water source beyond 1,000 ft (or none).<br />**PP3**: Fire station within 3 miles; water source beyond 1,000 ft (or none).<br />**PP4**: Fire station within 4 miles; water source beyond 1,000 ft (or none).<br />**PP5**: Fire station within 5 miles; water source beyond 1,000 ft (or none).<br />**U6**: Fire station within 6 miles (no qualifying water source proximity).<br />**U7**: Fire station within 7 miles.<br />**U8**: Fire station within 8 miles.<br />**U9**: Fire station within 9 miles.<br />**U10**: Fire station within 10 miles.<br />**U15**: Fire station within 15 miles.<br />**U20**: Fire station within 20 miles.<br />**U25**: Fire station within 25 miles.<br />**U30**: Fire station within 30 miles.<br />**U35**: Fire station within 35 miles.<br />**U40**: Fire station within 40 miles.<br />**U45**: Fire station within 45 miles.<br />**U45+**: Fire station more than 45 miles away.</details> |
|   <span style={{ opacity: 0.45 }}>protection.</span>distance\_to\_fire\_station\_feet | Distance to the nearest fire station, in feet. `number` *e.g. `3200`* |
|   <span style={{ opacity: 0.45 }}>protection.</span>nearest\_fire\_station | Details of the nearest fire station. `object` |
|     <span style={{ opacity: 0.45 }}>protection.nearest\_fire\_station.</span>name | Fire station name. `text` *e.g. `Station 12`* |
|     <span style={{ opacity: 0.45 }}>protection.nearest\_fire\_station.</span>address | Fire station street address. `text` |
|     <span style={{ opacity: 0.45 }}>protection.nearest\_fire\_station.</span>latitude | Fire station latitude in WGS84 decimal degrees. `number` |
|     <span style={{ opacity: 0.45 }}>protection.nearest\_fire\_station.</span>longitude | Fire station longitude in WGS84 decimal degrees. `number` |
|     <span style={{ opacity: 0.45 }}>protection.nearest\_fire\_station.</span>is\_volunteer | Whether the station is staffed by volunteers. `boolean` *e.g. `false`* **Values:** True, False |
|   <span style={{ opacity: 0.45 }}>protection.</span>distance\_to\_fire\_hydrant\_feet | Distance to the nearest fire hydrant, in feet. `number` *e.g. `250`* |
| result | 'success' or 'partial\_data' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**partial\_data**: The section has real data, but at least one of its underlying sources failed to fetch (as opposed to a plain `success`, where any null fields are null because there's genuinely nothing there for this location).<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

### Sinkhole

Nearest recorded sinkhole. Present for Florida only; omitted elsewhere.

*Source: Florida state sinkhole dataset.*

| **Data Element** | **Description** |
| :- | :- |
| distance\_to\_nearest\_feet | Distance to the nearest recorded sinkhole, in feet. `number` *e.g. `18500`* |
| nearest | Details of the nearest recorded sinkhole. `object` |
|   <span style={{ opacity: 0.45 }}>nearest.</span>latitude | Nearest sinkhole latitude in WGS84 decimal degrees. `number` |
|   <span style={{ opacity: 0.45 }}>nearest.</span>longitude | Nearest sinkhole longitude in WGS84 decimal degrees. `number` |
|   <span style={{ opacity: 0.45 }}>nearest.</span>event\_date | Recorded date of the nearest sinkhole event. `date` *e.g. `2013-03-01`* |
| result | 'success' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `no_regional_exposure`* <details><summary>Values</summary>**success**: The section populated normally.<br />**no\_regional\_exposure**: The peril does not apply to this region (e.g. sinkhole outside FL).<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

### Crime

Overall and per-crime exposure.

*Source: EASI crime.*

| **Data Element** | **Description** |
| :- | :- |
| risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
| risk\_level | Exposure band for the overall crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
| grade | EASI A-F overall crime grade for the area. `text` *e.g. `B`* **Values:** A-F |
| murder | Murder/homicide crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>murder.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>murder.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>murder.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| rape | Rape/sexual assault crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>rape.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>rape.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>rape.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| robbery | Robbery crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>robbery.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>robbery.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>robbery.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| assault | Aggravated assault crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>assault.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>assault.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>assault.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| burglary | Burglary crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>burglary.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>burglary.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>burglary.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| larceny | Larceny/theft crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>larceny.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>larceny.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>larceny.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| vehicle\_theft | Motor vehicle theft crime exposure. `object` |
|   <span style={{ opacity: 0.45 }}>vehicle\_theft.</span>risk\_score | Approximate national percentile (0-100) of crime exposure. Higher means more crime. `number` *e.g. `41.0`* **Note:** Like every peril, this score is per-peril-relative and not comparable across perils — compare only within crime, across locations. **Values:** 0-100 |
|   <span style={{ opacity: 0.45 }}>vehicle\_theft.</span>risk\_level | Exposure band for the crime `risk_score`. `text` *e.g. `Elevated`* <details><summary>Values</summary>**Low**: Score from 0 to less than 20.<br />**Moderate**: Score from 20 to less than 40.<br />**Elevated**: Score from 40 to less than 60.<br />**High**: Score from 60 to less than 80.<br />**Very High**: Score from 80 to 100.</details> |
|   <span style={{ opacity: 0.45 }}>vehicle\_theft.</span>grade | EASI A-F crime grade for the area. `text` *e.g. `B`* **Note:** `grade` (EASI percentile cutoffs) and `risk_level` (quintile of the score) are computed independently and will not always agree one-to-one. **Values:** A-F |
| result | 'success' when this section populated, otherwise why it is absent. 'insufficient\_precision' can also mark a present section missing some fields. `text` *e.g. `success`* <details><summary>Values</summary>**success**: The section populated normally.<br />**no\_data**: The source has no record for this location.<br />**fetch\_failed**: The underlying source errored or timed out.<br />**not\_available**: The source was not consulted (not licensed or not requested).<br />**insufficient\_precision**: The geocode is not precise enough to trust some or all of this section's data (e.g. a city-level match cannot support a point-level result). If the section is still present, the fields that need a more precise geocode are omitted.</details> |

## Meta

Identifies the output schema version.

| **Data Element** | **Description** |
| :- | :- |
| schema\_version | Ping Hazard output schema version. `text` *e.g. `2.0`* |

<Note>A previous version of this datasource, Ping Hazard v1 (`PH`), remains available for existing integrations — see [Ping Hazard v1](/ping-hazard-v1).</Note>

## Concepts and Interpretation

This section explains how to interpret the Ping Hazard v2 model in practice.

### Risk Scoring

Every peril under `perils` reports risk the same way: a `risk_score` (0-100) and a bucketed
`risk_level` label.

```jsonc theme={null}
{ "risk_score": 96.2, "risk_level": "Very High" }
```

### NRI-derived perils

Hurricane, Earthquake, Tsunami, Tornado, Hail, Lightning, Riverine Flood, Coastal Flood, and
Wildfire derive `risk_score` from the FEMA National Risk Index's annualized loss rate to
buildings for that peril, normalized onto a 0-100 scale. `risk_level` buckets the `risk_score`:

| **Score range** | **`risk_level`** |
| :- | :- |
| exactly 0 | No Exposure |
| greater than 0 and less than 0.01 | Negligible |
| 0.01 – less than 5 | Low |
| 5 – less than 20 | Moderate |
| 20 – less than 50 | Elevated |
| 50 – less than 80 | High |
| 80 – less than 100 | Very High |
| exactly 100 | Maximum |

### Crime

For crime perils, the risk\_score is an approximate national percentile, computed
from the EASI crime index (US average = 100). `risk_level` uses its own 5-band scale instead of
the NRI table above, since a roughly-uniform percentile has no meaningful "No Exposure" /
"Negligible" low end:

| **Score range** | **`risk_level`** |
| :- | :- |
| 0 – less than 20 | Low |
| 20 – less than 40 | Moderate |
| 40 – less than 60 | Elevated |
| 60 – less than 80 | High |
| 80 – 100 | Very High |

Crime also carries `grade`, EASI's own A-F letter grade, computed independently — `risk_level`
and `grade` won't always agree 1:1.

### Absent sections

A section or peril that doesn't apply to the location, has no data, or couldn't be fetched is
never omitted and never `null`. It's replaced by a single-key object naming the reason:

```jsonc theme={null}
{ "result": "no_regional_exposure" }
```

| **`result`** | **Meaning** |
| :- | :- |
| `no_regional_exposure` | The peril doesn't apply to this region (e.g. `sinkhole` outside Florida). |
| `no_data` | The source has no record for this location. |
| `fetch_failed` | The underlying source errored or timed out. |
| `not_available` | The source wasn't consulted (not licensed or not requested). |
| `insufficient_precision` | The geocode isn't precise enough to trust this section's data. |

Check for the `result` key to distinguish an absent section from a populated one.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.