{"openapi":"3.1.0","info":{"title":"HazardOptics API","description":"Property-level climate & hazard screening from public datasets, with a fully published methodology. Screening only — see the disclaimer on every response.","version":"0.1.6"},"paths":{"/v1/risk":{"get":{"tags":["risk"],"summary":"Screen a U.S. property for flood, wildfire, heat, sea-level-rise, erosion, and storm-surge risk","description":"Provide either `address` (geocoded via the Census Bureau) or `lat`/`lon`. Returns a 0-100 score and confidence-banded rating for each hazard, a composite score, the raw data behind each score, and dataset version snapshots. Screening only — see `disclaimer` in the response. HEAD is supported for uptime monitors.","operationId":"get_risk_v1_risk_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"US street address, e.g. '123 Riverbend Rd, Norfolk, VA'. Geocoded via the Census Bureau. Use this or lat/lon, not both.","examples":["123 Riverbend Rd, Norfolk, VA"],"title":"Address"},"description":"US street address, e.g. '123 Riverbend Rd, Norfolk, VA'. Geocoded via the Census Bureau. Use this or lat/lon, not both."},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Latitude, decimal degrees (WGS84). Use with lon instead of address.","examples":[36.85],"title":"Lat"},"description":"Latitude, decimal degrees (WGS84). Use with lon instead of address."},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Longitude, decimal degrees (WGS84). Use with lat instead of address.","examples":[-76.29],"title":"Lon"},"description":"Longitude, decimal degrees (WGS84). Use with lat instead of address."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"tags":["risk"],"summary":"Screen a U.S. property for flood, wildfire, heat, sea-level-rise, erosion, and storm-surge risk","description":"Provide either `address` (geocoded via the Census Bureau) or `lat`/`lon`. Returns a 0-100 score and confidence-banded rating for each hazard, a composite score, the raw data behind each score, and dataset version snapshots. Screening only — see `disclaimer` in the response. HEAD is supported for uptime monitors.","operationId":"get_risk_v1_risk_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"US street address, e.g. '123 Riverbend Rd, Norfolk, VA'. Geocoded via the Census Bureau. Use this or lat/lon, not both.","examples":["123 Riverbend Rd, Norfolk, VA"],"title":"Address"},"description":"US street address, e.g. '123 Riverbend Rd, Norfolk, VA'. Geocoded via the Census Bureau. Use this or lat/lon, not both."},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Latitude, decimal degrees (WGS84). Use with lon instead of address.","examples":[36.85],"title":"Lat"},"description":"Latitude, decimal degrees (WGS84). Use with lon instead of address."},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Longitude, decimal degrees (WGS84). Use with lat instead of address.","examples":[-76.29],"title":"Lon"},"description":"Longitude, decimal degrees (WGS84). Use with lat instead of address."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/signup":{"post":{"tags":["signup"],"summary":"Signup","operationId":"signup_v1_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Signup V1 Signup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"tags":["meta"],"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/":{"get":{"tags":["meta"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root  Get"}}}}}}}},"components":{"schemas":{"ComponentScore":{"properties":{"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score","description":"0-100 hazard score; higher means greater concern."},"rating":{"type":"string","title":"Rating","description":"Confidence-banded rating: minimal | low | moderate | high | severe."},"details":{"additionalProperties":true,"type":"object","title":"Details","description":"Raw inputs behind the score (e.g. FEMA zone, HAND meters, wildfire percentile) so users can audit the result."}},"type":"object","required":["score","rating"],"title":"ComponentScore","description":"One hazard's score plus the raw inputs that produced it."},"CompositeScore":{"properties":{"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score","description":"0-100 composite across all scored hazards."},"rating":{"type":"string","title":"Rating","description":"Confidence-banded rating: minimal | low | moderate | high | severe."},"max_hazard":{"type":"string","title":"Max Hazard","description":"The single highest-scoring hazard."}},"type":"object","required":["score","rating","max_hazard"],"title":"CompositeScore"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Location":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude of the scored point, decimal degrees (WGS84)."},"lon":{"type":"number","title":"Lon","description":"Longitude of the scored point, decimal degrees (WGS84)."},"matched_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Address","description":"Geocoder-matched address, if the request was geocoded from ?address=."}},"type":"object","required":["lat","lon"],"title":"Location"},"RiskResponse":{"properties":{"query":{"type":"string","title":"Query","description":"The address or lat,lon string that was requested."},"location":{"$ref":"#/components/schemas/Location"},"scores":{"additionalProperties":{"$ref":"#/components/schemas/ComponentScore"},"type":"object","title":"Scores","description":"Per-hazard scores, keyed by flood, wildfire, heat, sea_level_rise, erosion, storm_surge."},"composite":{"$ref":"#/components/schemas/CompositeScore"},"data_versions":{"additionalProperties":{"type":"string"},"type":"object","title":"Data Versions","description":"Snapshot identifiers of every dataset used for this response."},"methodology_version":{"type":"string","title":"Methodology Version","description":"Version of docs/METHODOLOGY.md that produced these scores."},"methodology_url":{"type":"string","title":"Methodology Url","description":"Link to the published scoring methodology."},"disclaimer":{"type":"string","title":"Disclaimer","description":"Screening disclaimer that must accompany every response."},"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"UTC timestamp when this response was generated."}},"type":"object","required":["query","location","scores","composite","data_versions","methodology_version","methodology_url","disclaimer","generated_at"],"title":"RiskResponse"},"SignupRequest":{"properties":{"email":{"type":"string","title":"Email"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["email"],"title":"SignupRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}