Skip to main content
Documentation

API Reference

Base URL: https://wildfirecost-api.smarttechinvest.com

Authentication

Pass your API key via the X-API-Key header on every request (except /v1/signup and /v1/login).

GET/v1/risk/county/:fips

Get wildfire risk and hardening ROI for a U.S. county by FIPS code.

Parameters

NameTypeRequiredDescription
fipspathrequired5-digit county FIPS code (e.g., 06037)

Response

{
  "success": true,
  "data": {
    "county_name": "Los Angeles County, CA",
    "state_abbr": "CA",
    "risk": {
      "burn_probability": 0.010482155,
      "likelihood_rank_national": 0.97,
      "risk_rank_national": 0.99,
      "risk_to_homes": 0.99,
      "risk_percentile": 99,
      "buildings_fraction_minimal_exposure": 0.8034,
      "wui_class": null,
      "fhsz_tier": null
    },
    "total_cost": 119025,
    "money_status": "computed",
    "total_annual_savings": "<computed from your inputs>",
    "package_roi_percentage": "<computed from your inputs>"
  }
}
// burn_probability is a probability: the county's mean annual chance of burning, across its
// wildfire-exposed land (USFS Wildfire Risk to Communities, 2026). likelihood_rank_national and
// risk_rank_national are percentile RANKS from 0 to 1 (0.97 = at or above 97% of U.S. counties),
// not probabilities and not dollars. When no supported probability exists, burn_probability is null,
// money_status is "unavailable", and every dollar figure that depends on it is null (never 0).

Error Codes

  • 400 Invalid FIPS code format
  • 404 No data found for FIPS code
  • 429 Rate limit exceeded
GET/v1/risk/zip/:zip

Get wildfire risk by ZIP code (auto-resolves to county).

Parameters

NameTypeRequiredDescription
zippathrequired5-digit U.S. ZIP code

Response

{
  "success": true,
  "data": {
    "county_name": "San Diego County, CA",
    "state_abbr": "CA",
    "risk": {
      "burn_probability": 0.026927942,
      "likelihood_rank_national": 1,
      "risk_rank_national": 1,
      "risk_to_homes": 1,
      "risk_percentile": 100,
      "wui_class": null,
      "fhsz_tier": null
    }
  }
}

Error Codes

  • 400 Invalid ZIP code
  • 404 ZIP not found
  • 429 Rate limit exceeded
GET/v1/risk/compare

Compare wildfire hardening costs and ROI across multiple counties.

Parameters

NameTypeRequiredDescription
fipsqueryrequired2-5 county FIPS codes, repeated: ?fips=06037&fips=06073

Response

{
  "success": true,
  "data": {
    "comparisons": [
      { "county_name": "Los Angeles County, CA", "risk": { "burn_probability": 0.010482155, "likelihood_rank_national": 0.97, "risk_percentile": 99 }, "total_cost": 119025, "money_status": "computed" },
      { "county_name": "San Diego County, CA", "risk": { "burn_probability": 0.026927942, "likelihood_rank_national": 1, "risk_percentile": 100 }, "total_cost": 119025, "money_status": "computed" }
    ],
    "count": 2,
    "risk_field_notes": { "burn_probability": "Annual burn probability as a fraction ..." }
  }
}

Error Codes

  • 400 Invalid request body
  • 401 API key required
  • 429 Rate limit exceeded
GET/v1/measures

List all available hardening measures with cost estimates and effectiveness.

Response

{
  "success": true,
  "data": [
    { "id": "class_a_roof", "name": "Class A Roof", "category": "Structure", "avg_cost": 12000, "effectiveness": 0.85 },
    { "id": "ember_vents", "name": "Ember-Resistant Vents", "category": "Structure", "avg_cost": 2500, "effectiveness": 0.72 },
    { "id": "defensible_space", "name": "Defensible Space (Zone 0-1)", "category": "Landscape", "avg_cost": 3500, "effectiveness": 0.68 },
    { "id": "fire_resistant_siding", "name": "Fire-Resistant Siding", "category": "Structure", "avg_cost": 15000, "effectiveness": 0.78 }
  ]
}
POST/v1/signup

Create an account and receive an API key.

Parameters

NameTypeRequiredDescription
namebodyrequiredUser display name
emailbodyrequiredEmail address
passwordbodyrequiredPassword (min 8 characters)

Response

{
  "success": true,
  "data": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "tier": "free",
    "apiKey": "wfc_abc123..."
  }
}

Error Codes

  • 400 Invalid input
  • 409 Email already registered
POST/v1/login

Authenticate with email and password.

Parameters

NameTypeRequiredDescription
emailbodyrequiredEmail address
passwordbodyrequiredPassword

Response

{
  "success": true,
  "data": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "tier": "free"
  }
}

Error Codes

  • 401 Invalid credentials
GET/v1/account

Get current account information and tier.

Response

{
  "success": true,
  "data": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "tier": "pro",
    "usage": { "today": 12, "month": 340 }
  }
}

Error Codes

  • 401 API key required
GET/v1/account/keys

List all API keys for the authenticated user.

Response

{
  "success": true,
  "data": {
    "keys": [
      { "id": 1, "prefix": "wfc_abc...", "lastUsed": "2026-03-01T12:00:00Z" }
    ]
  }
}

Error Codes

  • 401 API key required
POST/v1/account/keys/rotate

Rotate API key -- generates a new key and invalidates the old one.

Response

{
  "success": true,
  "data": {
    "apiKey": "wfc_new_key..."
  }
}

Error Codes

  • 401 API key required
DELETE/v1/account/keys/:id

Revoke a specific API key.

Parameters

NameTypeRequiredDescription
idpathrequiredAPI key ID

Response

{
  "success": true,
  "data": { "message": "Key revoked" }
}

Error Codes

  • 401 API key required
  • 404 Key not found
DELETE/v1/account

Permanently delete your account and all data.

Response

{
  "success": true,
  "data": { "message": "Account deleted" }
}

Error Codes

  • 401 API key required
POST/v1/forgot-password

Request a password reset email. Returns 200 regardless of email existence.

Parameters

NameTypeRequiredDescription
emailbodyrequiredEmail address

Response

{
  "success": true,
  "data": { "message": "If an account exists, a reset email was sent." }
}
POST/v1/reset-password

Reset password using a token from the reset email.

Parameters

NameTypeRequiredDescription
tokenbodyrequiredReset token from email
passwordbodyrequiredNew password (min 8 characters)

Response

{
  "success": true,
  "data": { "message": "Password updated" }
}

Error Codes

  • 400 Invalid or expired token

Rate Limiting

Requests that exceed your plan limit return 429 Too Many Requests with a Retry-After header indicating seconds until the limit resets.

PlanRequests/DayHardening ROI
Free1No
Single Report ($9.99)5Yes
Buyer Pack ($14.99/mo)10Yes
Pro ($19.99/mo)100Yes
Lifetime ($99)100Yes