HAZUS Integration - Technical Guide
Complete technical documentation for FEMA HAZUS integration including API endpoints, data sources, damage functions, and implementation details
Overview
This guide provides comprehensive technical documentation for PublicRisk.ai's FEMA HAZUS integration. It covers all five implementation phases, API endpoints, data sources, and damage calculation methodologies.
Status: Production-ready as of December 2025. All phases (1-5) deployed and operational.
Architecture
Backend Services
Service Endpoints
The HAZUS service is deployed on Modal Cloud with auto-scaling containers:
Base URL: https://publicrisk--publicrisk-hazard-service-{endpoint}.modal.run
| Endpoint | Purpose | Cold Start | Cache TTL |
|---|---|---|---|
health | Service health check | ~30s | N/A |
assess-property | Full property risk assessment | ~45s | 300s |
realtime-all | Combined hazard data (flood+EQ+fire) | ~35s | 300s |
flood-risk | Flood zone only | ~25s | 600s |
earthquake-risk | Earthquake PGA only | ~25s | 600s |
wildfire-risk | Active wildfires only | ~20s | 60s |
Cold Start Behavior: Modal containers sleep after 5-10 minutes of inactivity. First request takes 30-60 seconds. Frontend displays "Initializing service..." message during cold starts.
API Reference
Health Check
Check service availability and version.
GET /healthResponse:
{
"status": "healthy",
"version": "1.0.0",
"data_sources": {
"flood": "FEMA NFHL Q4 2024",
"earthquake": "USGS NSHM 2023",
"wildfire": "NIFC Real-time"
},
"cache_enabled": true,
"uptime_seconds": 3847
}Property Assessment
Comprehensive risk assessment for a single property.
GET /assess-property?lat={latitude}&lng={longitude}&property_value={value}&year_built={year}Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
lat | float | Yes | Latitude (WGS84, -90 to 90) |
lng | float | Yes | Longitude (WGS84, -180 to 180) |
property_value | float | Yes | Property value in USD |
year_built | int | No | Year of construction (1800-2025) |
Example Request:
curl "https://publicrisk--publicrisk-hazard-service-assess-property.modal.run?lat=37.7749&lng=-122.4194&property_value=850000&year_built=1965"Response:
{
"location": {
"latitude": 37.7749,
"longitude": -122.4194,
"address": "San Francisco, CA"
},
"overall_risk": {
"score": 0.725,
"level": "HIGH",
"color": "#FF6B35"
},
"hazards": {
"flood": {
"zone": "X",
"risk_level": "Low",
"risk_score": 0.10,
"flood_depth_ft": 0,
"bfe_elevation_ft": null,
"annual_chance": "< 0.2%"
},
"earthquake": {
"pga_g": 0.846,
"risk_level": "Very High",
"risk_score": 0.95,
"mmi": "VIII (Severe)",
"fault_distance_km": 12.3,
"fault_name": "San Andreas"
},
"wildfire": {
"vhfhsz": true,
"risk_level": "High",
"risk_score": 0.80,
"active_fires_10mi": 2,
"nearest_fire": {
"name": "Park Fire",
"distance_miles": 8.2,
"acres": 4200,
"containment": "15%"
}
}
},
"damage_estimates": {
"flood": {
"damage_ratio": 0.03,
"expected_loss": 25500,
"confidence_interval": {
"p10": 5100,
"p50": 25500,
"p90": 51000
}
},
"earthquake": {
"damage_ratio": 0.35,
"expected_loss": 297500,
"structural_damage": "Major",
"confidence_interval": {
"p10": 170000,
"p50": 297500,
"p90": 425000
}
},
"wildfire": {
"damage_ratio": 0.15,
"expected_loss": 127500,
"ignition_probability": 0.08
},
"total_aal": 450500,
"total_aal_pct": 53.0
},
"mitigation_recommendations": [
{
"priority": 1,
"category": "Earthquake",
"recommendation": "Retrofit foundation with steel moment frames",
"cost_estimate": 45000,
"loss_reduction": 120000,
"roi": 2.67,
"payback_years": 8.5
},
{
"priority": 2,
"category": "Wildfire",
"recommendation": "Install Class A fire-rated roofing",
"cost_estimate": 18000,
"loss_reduction": 63000,
"roi": 3.50,
"payback_years": 6.0
},
{
"priority": 3,
"category": "Earthquake",
"recommendation": "Secure water heater and gas lines",
"cost_estimate": 800,
"loss_reduction": 12000,
"roi": 15.0,
"payback_years": 2.0
}
],
"data_sources": {
"flood": "FEMA NFHL Q4 2024",
"earthquake": "USGS NSHM 2023",
"wildfire": "NIFC ArcGIS (updated hourly)"
},
"cache_hit": false,
"processing_time_ms": 2847
}Combined Hazard Data
Retrieve all hazard data for map popups (lightweight response).
GET /realtime-all?lat={latitude}&lng={longitude}Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
lat | float | Yes | Latitude (WGS84) |
lng | float | Yes | Longitude (WGS84) |
Response:
{
"location": {
"latitude": 34.0522,
"longitude": -118.2437
},
"flood": {
"zone": "AE",
"risk_score": 0.65,
"bfe_elevation_ft": 52.0
},
"earthquake": {
"pga_g": 0.846,
"risk_score": 0.95,
"mmi": "VIII"
},
"wildfire": {
"vhfhsz": true,
"risk_score": 1.0,
"active_fires_10mi": 5,
"fires": [
{
"name": "LAC-420786",
"distance_miles": 4.35,
"acres": 1250,
"containment": "0%"
}
]
},
"overall_risk": 0.867,
"cache_hit": true
}HAZUS Damage Functions
Flood Damage Curves
PublicRisk.ai uses FEMA HAZUS MH 5.1 flood depth-damage functions.
Residential Buildings (Wood Frame, 1-2 stories):
| Flood Depth (ft) | Structure Damage % | Contents Damage % |
|---|---|---|
| 0-1 | 0% | 0% |
| 1-2 | 8% | 12% |
| 2-4 | 16% | 25% |
| 4-6 | 28% | 40% |
| 6-8 | 38% | 55% |
| 8+ | 50% | 70% |
Commercial Buildings (Masonry, Low-rise):
| Flood Depth (ft) | Structure Damage % | Contents Damage % |
|---|---|---|
| 0-1 | 0% | 0% |
| 1-2 | 5% | 10% |
| 2-4 | 12% | 22% |
| 4-6 | 22% | 35% |
| 6-8 | 32% | 48% |
| 8+ | 45% | 65% |
Calculation Example:
// Property: $500,000 home, wood frame, 2 stories
// Flood depth: 3.5 feet (Zone AE)
const structureValue = 500000 * 0.75; // 75% structure
const contentsValue = 500000 * 0.25; // 25% contents
// Interpolate damage ratio for 3.5 ft (between 2-4 ft)
const structureDamage = 0.16; // 16% from table
const contentsDamage = 0.25; // 25% from table
const totalLoss = (structureValue * structureDamage) +
(contentsValue * contentsDamage);
// = (375000 * 0.16) + (125000 * 0.25)
// = 60000 + 31250
// = $91,250
// With uncertainty (10% std dev)
const lossSIP = {
mean: 91250,
stdDev: 9125,
p10: 75500,
p50: 91250,
p90: 107000
};Earthquake Damage Functions
Based on HAZUS MH 2.1 spectral displacement and capacity curves.
Damage States by PGA (Peak Ground Acceleration):
| PGA (g) | MMI | Damage State | Residential Loss % | Commercial Loss % |
|---|---|---|---|---|
| < 0.02 | I-II | None | 0% | 0% |
| 0.02-0.10 | III-V | Slight | 0-5% | 0-3% |
| 0.10-0.25 | VI-VII | Moderate | 5-15% | 3-10% |
| 0.25-0.50 | VII-VIII | Extensive | 15-40% | 10-30% |
| > 0.50 | VIII-X | Complete | 40-80% | 30-70% |
Building Types (HAZUS Classifications):
| Code | Type | Vulnerability |
|---|---|---|
| W1 | Wood frame, less than 5 stories | High |
| W2 | Wood frame, more than 5 stories | Very High |
| S1 | Steel moment frame | Low |
| S2 | Steel braced frame | Moderate |
| S3 | Steel light frame | Moderate |
| C1 | Concrete moment frame | Low |
| C2 | Concrete shear wall | Very Low |
| C3 | Concrete frame w/ infill | Moderate |
| RM1 | Reinforced masonry | Moderate |
| RM2 | Unreinforced masonry | Very High |
Example Calculation:
// Property: $850,000, wood frame (W1), built 1965
// PGA: 0.35g (Extensive damage)
// Base damage ratio for W1 at 0.35g PGA
let damageRatio = 0.25; // 25% from table
// Age adjustment (pre-1980 = +30% vulnerability)
damageRatio *= 1.30; // = 0.325
// Soil type adjustment (soft soil = +15%)
damageRatio *= 1.15; // = 0.374
// Final loss estimate
const expectedLoss = 850000 * 0.374;
// = $317,900
// With SIPmath uncertainty
const lossSIP = {
mean: 317900,
stdDev: 63580, // 20% coefficient of variation
p10: 236000,
p50: 317900,
p90: 399800
};Wildfire Damage Functions
Based on HAZUS Wildfire Model and Californian Very High Fire Hazard Severity Zones (VHFHSZ).
Ignition Probability Factors:
| Factor | Low | Moderate | High | Very High |
|---|---|---|---|---|
| Vegetation | Sparse | Grass | Shrub | Dense forest |
| Slope | 0-10% | 10-20% | 20-30% | greater than 30% |
| Wind | less than 10 mph | 10-20 mph | 20-30 mph | greater than 30 mph |
| Humidity | greater than 60% | 40-60% | 20-40% | less than 20% |
Ignition Probability Formula:
P(ignition) = base_rate × vegetation_factor × slope_factor ×
wind_factor × humidity_factor × proximity_factor
# Example: Property in VHFHSZ
base_rate = 0.002 # 0.2% annual
vegetation = 2.5 # Dense shrub
slope = 1.8 # 25% slope
wind = 2.0 # 25 mph average
humidity = 1.5 # 35% humidity
proximity = 3.0 # less than 5 miles from active fire
P(ignition) = 0.002 × 2.5 × 1.8 × 2.0 × 1.5 × 3.0
= 0.081 (8.1% annual)Damage Given Ignition:
| Construction Type | Flame Impingement | Radiant Heat | Ember Cast |
|---|---|---|---|
| Non-combustible roof | 40% | 15% | 5% |
| Combustible roof | 90% | 50% | 30% |
| Defensible space less than 30ft | 60% | 25% | 10% |
| No defensible space | 95% | 70% | 50% |
Total Wildfire Loss:
// Property: $600,000, wood siding, tile roof, 20ft defensible space
// Active fire: 3.2 miles away, 2000 acres, 0% contained
const ignitionProb = 0.065; // 6.5% (from proximity calc)
// Damage given ignition (tile roof = non-combustible)
const flameImpingement = 0.40;
const radiantHeat = 0.15;
const emberCast = 0.05;
// Weighted by likelihood of each exposure type
const damageGivenIgnition =
(flameImpingement × 0.20) + // 20% chance of direct flame
(radiantHeat × 0.50) + // 50% chance of radiant heat
(emberCast × 0.30); // 30% chance of ember exposure
// = (0.40 × 0.20) + (0.15 × 0.50) + (0.05 × 0.30)
// = 0.08 + 0.075 + 0.015
// = 0.17 (17% loss given ignition)
// Annual expected loss
const AAL = 600000 × ignitionProb × damageGivenIgnition;
// = 600000 × 0.065 × 0.17
// = $6,630Data Sources
FEMA National Flood Hazard Layer (NFHL)
Update Frequency: Quarterly
API: FEMA Map Service Center REST API
Geometry: Polygons (GeoJSON, Shapefile)
Zone Classifications:
| Zone Code | Description | Annual Flood Chance | Base Flood Elevation |
|---|---|---|---|
| A | High risk, no BFE | 1% (100-year) | Not determined |
| AE | High risk with BFE | 1% (100-year) | Specified |
| AH | Shallow flooding (1-3 ft) | 1% (100-year) | Specified |
| AO | Sheet flow (1-3 ft) | 1% (100-year) | Specified |
| VE | Coastal high velocity | 1% (100-year) | Wave action |
| X (shaded) | Moderate risk | 0.2% (500-year) | N/A |
| X (unshaded) | Minimal risk | less than 0.2% | N/A |
API Example:
curl "https://hazards.fema.gov/gis/nfhl/rest/services/public/NFHL/MapServer/28/query?geometry=-122.4194,37.7749&geometryType=esriGeometryPoint&returnGeometry=true&f=json"USGS National Seismic Hazard Model (NSHM)
Update Frequency: Annual
Version: NSHM 2023
Resolution: 0.05° grid (~5.5 km)
Data Products:
- Peak Ground Acceleration (PGA)
- Spectral Acceleration (0.2s, 1.0s periods)
- Modified Mercalli Intensity (MMI)
- Fault proximity and slip rates
PGA Return Periods:
- 10% probability in 50 years (475-year return)
- 5% probability in 50 years (975-year return)
- 2% probability in 50 years (2,475-year return)
API Example:
curl "https://earthquake.usgs.gov/ws/designmaps/asce7-22.json?latitude=37.7749&longitude=-122.4194&riskCategory=II&siteClass=D&title=San%20Francisco"NIFC Wildfire Data
Update Frequency: Hourly (active fires), Daily (perimeters)
Source: National Interagency Fire Center ArcGIS Feature Services
Coverage: United States + Canada
Data Layers:
- Active Fire Perimeters: Current fire boundaries (polygons)
- Fire Incident Points: Fire locations with metadata
- Very High Fire Hazard Severity Zones: California state data
- Fire Weather Zones: Red flag warning areas
Attributes:
{
"incident_name": "Park Fire",
"incident_acres": 429603,
"containment_pct": 100,
"discovery_date": "2024-07-24",
"fire_cause": "Under Investigation",
"latitude": 39.87,
"longitude": -121.45,
"jurisdiction": "CAL FIRE",
"complex": false
}ArcGIS REST API:
curl "https://services3.arcgis.com/T4QMspbfLg3qTGWY/arcgis/rest/services/Current_WildlandFire_Perimeters/FeatureServer/0/query?where=1=1&outFields=*&f=json"Frontend Integration
React Components
RiskScoreCard
Displays overall risk score with color-coded visualization.
Usage:
import { RiskScoreCard } from '@/components/hazard/RiskScoreCard';
<RiskScoreCard
score={0.725}
level="HIGH"
hazardBreakdown={{
flood: 0.10,
earthquake: 0.95,
wildfire: 0.80
}}
/>Props:
interface RiskScoreCardProps {
score: number; // 0-1 scale
level: 'Low' | 'Moderate' | 'High' | 'Very High' | 'Extreme';
hazardBreakdown?: {
flood?: number;
earthquake?: number;
wildfire?: number;
hurricane?: number;
tsunami?: number;
};
loading?: boolean;
error?: string;
}HazardIcon
Emoji-based hazard type icons with risk-based coloring.
Usage:
import { HazardIcon } from '@/components/hazard/HazardIcon';
<HazardIcon
type="earthquake"
riskLevel="Very High"
size="large"
/>Icon Mapping:
const HAZARD_ICONS = {
flood: '🌊',
earthquake: '🏚️',
wildfire: '🔥',
hurricane: '🌀',
tsunami: '🌊',
tornado: '🌪️',
volcano: '🌋'
};
const RISK_COLORS = {
'Low': '#4CAF50',
'Moderate': '#FF9800',
'High': '#FF6B35',
'Very High': '#E53935',
'Extreme': '#B71C1C'
};MitigationList
Displays prioritized mitigation recommendations with ROI calculations.
Usage:
import { MitigationList } from '@/components/hazard/MitigationList';
<MitigationList
recommendations={[
{
priority: 1,
category: 'Earthquake',
recommendation: 'Retrofit foundation',
cost_estimate: 45000,
loss_reduction: 120000,
roi: 2.67,
payback_years: 8.5
}
]}
/>Custom Hooks
usePropertyAssessment
Fetches full property risk assessment with caching.
Usage:
import { usePropertyAssessment } from '@/hooks/useHazardData';
const PropertyDetails = ({ lat, lng, value }) => {
const { data, loading, error, refetch } = usePropertyAssessment({
latitude: lat,
longitude: lng,
propertyValue: value,
yearBuilt: 1985
});
if (loading) return <Skeleton />;
if (error) return <ErrorMessage error={error} />;
return (
<div>
<RiskScoreCard {...data.overall_risk} />
<MitigationList recommendations={data.mitigation_recommendations} />
</div>
);
};Hook Options:
interface UsePropertyAssessmentOptions {
latitude: number;
longitude: number;
propertyValue: number;
yearBuilt?: number;
enablePolling?: boolean; // Auto-refresh for wildfire updates
pollingInterval?: number; // Default: 60000ms (1 minute)
cacheTime?: number; // Default: 300000ms (5 minutes)
}useHazardData
Lightweight hook for map popups and quick previews.
Usage:
import { useHazardData } from '@/hooks/useHazardData';
const MapPopup = ({ lat, lng }) => {
const { data, loading } = useHazardData(lat, lng);
return (
<Popup>
<h4>Risk Summary</h4>
<p>Flood: {data?.flood.zone}</p>
<p>Earthquake: {data?.earthquake.pga_g}g</p>
<p>Overall: {data?.overall_risk}</p>
</Popup>
);
};Performance Optimization
Caching Strategy
Backend (Redis):
- TTL: 300 seconds (5 minutes) for most endpoints
- TTL: 60 seconds for wildfire data (real-time updates)
- Cache key:
hazus:{endpoint}:{lat}:{lng}:{params_hash}
Frontend:
- React Query cache: 5 minutes
- Stale-while-revalidate: Serve cached data, fetch fresh in background
- Debouncing: 500ms for map interactions
Cache Hit Rates:
// Typical production metrics
{
"property_assessment": {
"hit_rate": "78%",
"avg_response_cached": "45ms",
"avg_response_uncached": "2850ms"
},
"realtime_all": {
"hit_rate": "65%",
"avg_response_cached": "32ms",
"avg_response_uncached": "1200ms"
}
}Batch Operations
For analyzing multiple properties (e.g., portfolio risk assessment):
import { assessPropertyBatch } from '@/services/hazardService';
const properties = [
{ lat: 37.7749, lng: -122.4194, value: 850000 },
{ lat: 34.0522, lng: -118.2437, value: 650000 },
{ lat: 47.6062, lng: -122.3321, value: 720000 }
];
// Parallel requests with Promise.all
const results = await assessPropertyBatch(properties);
// results = [
// { property_id: 0, overall_risk: 0.725, ... },
// { property_id: 1, overall_risk: 0.867, ... },
// { property_id: 2, overall_risk: 0.420, ... }
// ]Rate Limiting:
- Max 100 requests per minute per IP
- Batch size limit: 50 properties per request
- Use
Promise.allSettled()to handle partial failures
Testing
Manual Test Locations
High-Risk Earthquake:
# San Francisco (PGA 0.85g)
lat=37.7749&lng=-122.4194
# Los Angeles (PGA 0.75g)
lat=34.0522&lng=-118.2437High-Risk Flood:
# Houston (Zone AE)
lat=29.7604&lng=-95.3698
# New Orleans (Zone VE)
lat=29.9511&lng=-90.0715High-Risk Wildfire:
# Paradise, CA (VHFHSZ)
lat=39.7596&lng=-121.6219
# Malibu, CA (VHFHSZ)
lat=34.0259&lng=-118.7798Low-Risk Control:
# Rural Kansas
lat=39.0119&lng=-98.4842E2E Test Suite
File: tests/hazus-integration.spec.ts
Coverage:
- ✅ PropertyRiskDashboard rendering (56 tests)
- ✅ API error handling and retries
- ✅ Cold start timeout behavior
- ✅ Cache hit verification
- ✅ Loading state transitions
- ✅ Mitigation recommendations display
- ✅ Data attribution footers
Run Tests:
npm run test:e2e -- hazus-integration.spec.tsTroubleshooting
Common Issues
Cold Start Timeouts
Symptom: "Service initializing..." message for 30-60 seconds
Cause: Modal container was sleeping, cold start in progress
Solution: Wait for container to warm up. Subsequent requests will be fast (less than 3 seconds).
Prevention:
// Pre-warm container on app load
useEffect(() => {
hazardService.healthCheck().catch(() => {});
}, []);Invalid Coordinates
Symptom: Error "Invalid coordinates provided"
Cause: Latitude/longitude out of range or reversed
Solution:
// Validate before API call
if (lat < -90 || lat > 90) throw new Error('Invalid latitude');
if (lng < -180 || lng > 180) throw new Error('Invalid longitude');
// Common mistake: reversed lat/lng
// ❌ Wrong: (lng, lat)
// ✅ Correct: (lat, lng)Missing Wildfire Data
Symptom: wildfire.active_fires_10mi = 0 during active fire season
Cause: NIFC data update delay (hourly refresh)
Solution:
- Check NIFC directly: https://inciweb.nwcg.gov/
- Use
enablePolling: trueoption for auto-refresh - Verify fire location is within 10-mile radius
High Loss Estimates
Symptom: Expected losses seem unrealistically high
Cause: Multiple hazards overlapping, cumulative risk calculation
Solution:
- Review
hazardBreakdownto identify primary drivers - Check
damage_estimatesfor per-hazard breakdown - Use confidence intervals (P10-P90) for uncertainty
- Consider mitigation ROI to reduce risk
Migration from Legacy System
If you have existing hazard assessment code, here's how to migrate:
Old API Pattern
// ❌ Legacy (deprecated)
const response = await fetch(`/api/hazard/property/${propertyId}`);
const data = await response.json();New API Pattern
// ✅ New HAZUS integration
import { usePropertyAssessment } from '@/hooks/useHazardData';
const { data, loading, error } = usePropertyAssessment({
latitude: property.lat,
longitude: property.lng,
propertyValue: property.value,
yearBuilt: property.yearBuilt
});Response Format Changes
| Old Format | New Format | Notes |
|---|---|---|
risk | overall_risk.score | Now 0-1 scale |
hazards | hazards.{type} | Nested by hazard type |
recommendations | mitigation_recommendations | Added ROI calculations |
| N/A | damage_estimates | New: Per-hazard loss breakdown |
| N/A | confidence_interval | New: P10/P50/P90 values |
Advanced Topics
SIPmath Integration
For portfolio-level uncertainty quantification:
import { generateSIPDistribution } from '@/services/sipmath';
// Single property with uncertainty
const propertyRisk = {
mean: 450500, // Expected annual loss
stdDev: 90100, // Standard deviation
distribution: 'lognormal'
};
// Generate 10,000 Monte Carlo trials
const trials = generateSIPDistribution(propertyRisk, 10000);
// Portfolio aggregation (preserving correlations)
const portfolioRisk = aggregatePortfolio([
{ property_id: 1, trials: trials1 },
{ property_id: 2, trials: trials2 },
{ property_id: 3, trials: trials3 }
], correlationMatrix);
// Results with percentiles
const results = {
P10: 2.8e6,
P50: 4.5e6,
P90: 7.2e6,
VaR_95: 8.1e6
};Multi-Hazard Correlation
Hazards are not independent. PublicRisk.ai uses correlation matrices:
# Correlation matrix (Pearson's r)
correlation = [
# Flood EQ Fire
[1.00, 0.15, 0.10], # Flood
[0.15, 1.00, 0.25], # Earthquake
[0.10, 0.25, 1.00] # Wildfire
]
# Why correlated?
# - Earthquake → Flooding (dam failure, tsunami)
# - Earthquake → Wildfire (gas line rupture)
# - Flood → Wildfire (vegetation stress)Sampling with Correlation:
import numpy as np
from scipy.stats import norm
# Cholesky decomposition
L = np.linalg.cholesky(correlation)
# Generate correlated samples
n_samples = 10000
Z = norm.rvs(size=(3, n_samples)) # Independent samples
X = L @ Z # Correlated samples
# X[0] = flood losses (correlated)
# X[1] = earthquake losses (correlated)
# X[2] = wildfire losses (correlated)Deployment
Environment Variables
# .env.production
VITE_HAZARD_SERVICE_BASE_URL=https://publicrisk--publicrisk-hazard-service
VITE_HAZARD_SERVICE_TIMEOUT=30000
VITE_HAZARD_CACHE_TTL=300000
VITE_WILDFIRE_POLL_INTERVAL=60000Health Monitoring
// Health check endpoint
const health = await hazardService.healthCheck();
if (health.status !== 'healthy') {
console.error('HAZUS service unhealthy:', health);
// Send alert to monitoring system
}Logging
// Backend logs (Modal)
console.log('[HAZUS] Property assessment', {
lat, lng, property_value,
cache_hit: true,
processing_time_ms: 2847
});
// Frontend logs
console.log('[HAZUS] API request', {
endpoint: 'assess-property',
params: { lat, lng },
response_time_ms: 3200
});Support & Resources
- Documentation: This guide +
HAZUS_FRONTEND_INTEGRATION_SUMMARY.md - API Status: https://publicrisk--publicrisk-hazard-service-health.modal.run
- FEMA HAZUS: https://www.fema.gov/flood-maps/products-tools/hazus
- USGS NSHM: https://www.usgs.gov/programs/earthquake-hazards/national-seismic-hazard-model
- NIFC Fires: https://www.nifc.gov/fire-information/statistics
- GitHub Issues: https://github.com/casouth/PRAI/issues
Production Ready: All HAZUS features are deployed and operational. For questions or issues, refer to the troubleshooting section or contact support.
Enterprise Architecture
Modern cloud architecture with Module Federation, Modal serverless backend, and enterprise security
PELICUN Loss Assessment - Technical Guide
Complete technical documentation for PELICUN probabilistic loss assessment including multi-hazard analysis, SIPmath integration, component damage, repair timelines, and casualty estimation