Underwrite any parcel
like a certified survey.
Five underwriting vendors — parcel, elevation, flood, wildfire, demographics — plus a risk-adjusted NOI, fused into one cited call. The price is on this page, not behind a sales call. Every field carries the federal source it came from.


Sample determination · synthetic demonstration data, labeled throughout.
Five subscriptions, reconciled by hand.
Or one call, priced on this page.
Underwriting a parcel today means five vendors, five invoices, and a spreadsheet to reconcile them. Territas fuses the same federal layers behind one call — and recomputes the money on your deal numbers with no extra fetch. The enterprise data gateways sell these layers as separate calls behind a custom quote; here the whole fused object has a price on this page.
- Parcel & tractUS Census Geocoder
- Elevation & slopeUSGS 3DEP
- Flood zone & BFEFEMA NFHL
- Wildfire + 17 hazardsFEMA National Risk Index
- Income & home valueUS Census ACS 5-yr
The number shows its work.
A vendor score asks you to trust it. This asks you to check it. Territas runs the statutory flood-insurance test in 42 U.S.C. § 4012a(b) — the mandatory-purchase rule — then prices the risk from the NFIP policy file and the National Risk Index. Every line is arithmetic over a cited federal read, so your desk can reproduce it rather than take it on faith.
If FEMA is unreachable, the obligation still stands: the screen survives a pricing failure, because the statute does not depend on a rate.
Informational use only. Territas is not a FEMA-listed provider and this is not a substitute for a certified life-of-loan Standard Flood Hazard Determination. It screens the statutory test and shows the math; the regulated lender remains responsible for the determination of record.
Required coverage $250,000 at the median $4.25 per $1,000 for zone AE (state cohort, n=494) = $1,062; CRS 25% applied = $797; NRI non-flood annualised building-loss ratio 2.864e-04 on $300,000 = $86/yr. Deterministic, no LLM.
Nine federal reads, one lineage.
Every source is federal and public. No vendor scores, no proprietary models — which is exactly what a regulator or a credit committee asks you to name.
| Layer | Source of record | Endpoint |
|---|---|---|
| Geocode · tract · county FIPS | US Census Geocoder | geocoding.geo.census.gov |
| Elevation · slope | USGS 3DEP getSamples | elevation.nationalmap.gov |
| Flood zone · BFE | FEMA NFHL layer 28 | hazards.fema.gov |
| FIRM panel | FEMA NFHL layer 3 | hazards.fema.gov |
| NFIP community · CRS | OpenFEMA Community Status | fema.gov/api/open/v1 |
| Wildfire + 17 hazards | FEMA National Risk Index | services.arcgis.com |
| NFIP premium rates | OpenFEMA NfipPolicies v3 | fema.gov/api/open/v3 |
| Forecast · fire-weather zone | NOAA NWS | api.weather.gov |
| Income · home value | US Census ACS 5-yr | api.census.gov |
On wildfire. The USFS point services return 403 to unauthenticated clients, so the wildfire layer comes from the FEMA National Risk Index — tract-keyed, no raster processing, and the hazard dataset federal lenders and their regulators actually cite.
Cold in about a second.
Warm in about thirteen milliseconds.
Ten federal calls run as a single concurrent fan-out behind one geocode. Re-price the same address with new deal numbers and it reprices off cache — the money is always fresh, the federal reads never refetched.
NFIP rate + community status chain off flood (~77 ms), their only real dependency — not the whole batch.
Zero network. Every source metric — geocode included — served from cache; only the deal financials recompute.
Two tiers, one key. Redis (hot) → embedded DuckDB (durable), both on a 7-day window. User inputs never touch the key, so a second deal never inherits the first deal's numbers.
One determination, two integrations.
An MCP tool your agents call directly, or a REST endpoint for the lending backend. Same engine, same deterministic determination, same audit trail.
# Agent-native — Claude, Cursor, Windsurf call it directly
underwrite_parcel(
address="1300 Canyon Blvd, Boulder, CO 80302",
purchase_price=450000, annual_rent=36000,
annual_taxes=4000, annual_insurance_base=1200,
loan_amount=360000, structure_value=300000,
) -> dict # one deterministic determinationimport httpx
r = httpx.post("https://api.territas.com/v1/underwrite", json={
"address": "1300 Canyon Blvd, Boulder, CO 80302",
"purchase_price": 450000, "annual_rent": 36000,
"annual_taxes": 4000, "annual_insurance_base": 1200,
"loan_amount": 360000, "structure_value": 300000,
})
r.json()["flood_insurance_requirement"]["required"] # True"flood_insurance_requirement": {
"required": true,
"authority": "42 U.S.C. 4012a(b)",
"zone": "AE",
"min_coverage": 250000,
"crs_discount_pct": 25,
"binding_limb": "outstanding_principal"
},
"financials_risk_adjusted": {
"flood_premium": 796.88,
"expected_annual_loss_nonflood": 85.92,
"noi_risk_adjusted": 29917.20,
"cap_rate": 0.0665
}The flood_insurance_requirement block names the statute, the limb that bound the minimum, and the CRS discount the borrower is due. A lender can recompute the bottom line without trusting us.
Endpoint shown for illustration. API-key auth and metered billing are on the roadmap; today access is provisioned per engagement.
Read the response like a legend.
Eight blocks come back on every call, ordered here by how much each moves a decision. Open one to see the documented response beside a plain-language note on what each sub-field means for the loan.
- Example · Boulder, COdocumented
"flood_insurance_requirement": { "required": true, "sfha": true, "flood_zone": "AE", "citation": "42 U.S.C. 4012a(b); Fannie Mae B7-3-05; 44 C.F.R. 61.6", "nfip_community_name": "CITY OF BOULDER", "community_participating": true, "crs_class": "5", "crs_sfha_discount_pct": 25.0, "minimum_coverage": 250000.0, "coverage_basis": "nfip_maximum", "insurable_value_assumed": false }Sub-fields · what they mean for the loan- required
- Whether §4012a(b) compels flood insurance to close — the hard gate on the loan.
- reason
- Plain-English basis for the call, ready to paste into the loan file.
- citation
- The statutes and guides behind it (42 U.S.C. 4012a(b); Fannie Mae B7-3-05; 44 C.F.R. 61.6).
- sfha
- In a Special Flood Hazard Area — the trigger for mandatory purchase.
- flood_zone
- The FEMA zone that drove the determination.
- nfip_community_id / _name
- The NFIP community of record; policies are only sold where it participates.
- community_participating
- If false, NFIP coverage isn't available in this community — a serious closing flag.
- crs_class
- Community Rating System class (1–10); a lower class earns a larger premium discount.
- crs_sfha_discount_pct
- The premium discount the borrower is owed inside the SFHA.
- minimum_coverage
- Least coverage that satisfies the statute — the number that goes on the binder.
- coverage_basis
- Which limb bound the minimum: outstanding principal, insurable value, or the NFIP maximum.
- insurable_value_assumed
- Whether insurable value was assumed vs. supplied — an input worth confirming.
- Example · Boulder, COdocumented
"financials_risk_adjusted": { "noi_base": 30800.0, "noi_risk_adjusted": 29917.21, "required_flood_coverage": 250000.0, "nfip_rate_per_1k": 4.25, "nfip_sample_size": 494, "flood_premium_before_crs": 1062.5, "crs_discount_pct": 25.0, "flood_premium_estimate": 796.88, "nonflood_expected_annual_loss": 85.92, "cap_rate_base_pct": 6.8444, "cap_rate_adjusted_pct": 6.6483, "ruleset_version": "v2.0-ruleset-2026-08" }Sub-fields · what they mean for the loan- noi_base
- NOI before any hazard load — rent minus taxes and base insurance.
- noi_risk_adjusted
- NOI after flood premium and non-flood expected loss — the figure to underwrite to.
- required_flood_coverage
- Coverage the determination requires, carried into the premium math.
- nfip_rate_per_1k
- Median NFIP rate applied to that coverage.
- nfip_rate_scope / nfip_sample_size
- The cohort (state/national) and its n — your confidence in the rate.
- flood_premium_before_crs
- Modeled premium before the community discount.
- crs_discount_pct
- The CRS discount rate applied.
- flood_premium_estimate
- Modeled annual flood premium after CRS — the carrying-cost line item.
- nonflood_expected_annual_loss
- Expected loss from wildfire and 15 other perils, $/yr, from the NRI.
- wildfire_expected_annual_loss
- Wildfire's share of that expected loss, broken out.
- insurance_total_modeled
- Base + modeled flood + perils — full modeled insurance carrying cost.
- implied_insurance_multiplier
- Modeled insurance ÷ base; how much risk inflates carrying cost.
- cap_rate_base_pct → cap_rate_adjusted_pct
- Cap rate before and after the risk load — the number that moves the deal.
- rules_applied / rules_skipped
- Which deterministic pricing rules fired or were skipped — audit transparency.
- methodology
- The arithmetic, written out.
- ruleset_version
- Version of the ruleset, so any figure reproduces exactly.
- insurance_uplift_multiplier / insurance_adjusted
- Optional override hooks; null when unused.
- Example · Boulder, COdocumented
"flood": { "fema_zone": "AE", "zone_subtype": "FLOODWAY", "risk_label": "HIGH", "bfe_ft": null, "panel_id": "08013C0394K", "source": "FEMA NFHL MapServer 28 + 3 + 22" }Sub-fields · what they mean for the loan- fema_zone / zone_key
- The FEMA flood zone code (AE, VE, X, …).
- zone_subtype
- Sub-zone such as FLOODWAY — the most restrictive SFHA area; limits building and grading.
- risk_label
- Coarse HIGH / MODERATE / LOW band for quick triage.
- bfe_ft
- Base flood elevation; compare to ground to size fill or elevation cost. Null where FEMA sets none.
- panel_id
- The FIRM panel of record — the citable map behind the call.
- source
- Which FEMA NFHL layers answered (zones, panels, jurisdictions).
- Example · Boulder, COdocumented
"national_risk_index": { "tract_fips": "08013012204", "overall_risk_rating": "Relatively Moderate", "overall_risk_score": 68.36, "nonflood_alrb_total": 0.000286, "hazard_ratings": { "WFIR": "Very Low", "IFLD": "Relatively High", "HAIL": "Relatively High" }, "hazard_loss_ratios": { "WFIR": 9.0e-8, "IFLD": 0.000683, "HAIL": 0.000124 } }Sub-fields · what they mean for the loan- tract_fips
- Census tract the NRI figures key to.
- overall_risk_rating / _score
- FEMA's composite hazard rating and 0–100 score for the tract.
- nonflood_alrb_total
- Non-flood annualized building-loss ratio, summed — feeds the expected-loss charge.
- hazard_ratings
- Per-hazard qualitative ratings (WFIR wildfire, IFLD riverine flood, HAIL, …).
- hazard_loss_ratios
- Per-hazard annualized building-loss ratios — the quantitative input behind the charge.
- source
- FEMA National Risk Index, census-tract level.
- Example · Boulder, COdocumented
"climate_wildfire": { "wildfire_national_percentile": 40.79, "wildfire_risk_rating": "Very Low", "wildfire_annualized_loss_ratio": 9.02e-8, "noaa_forecast_zone": "COZ039", "noaa_fire_zone": "COZ239" }Sub-fields · what they mean for the loan- wildfire_national_percentile
- Where the parcel ranks nationally for wildfire (0–100).
- wildfire_risk_rating
- Qualitative wildfire class.
- wildfire_annualized_loss_ratio
- Expected wildfire building-loss ratio, used in the perils charge.
- noaa_forecast_zone
- NOAA public forecast zone — general weather context.
- noaa_fire_zone
- NOAA fire-weather zone — red-flag / fire-weather context.
- source
- NOAA NWS points API + FEMA NRI (census tract).
- Example · Boulder, COdocumented
"elevation": { "elevation_ft": 5341.77, "slope_pct": 0.51, "source": "USGS 3DEP ImageServer (1/3 arc-second DEM)" }Sub-fields · what they mean for the loan- elevation_ft
- Ground elevation; against the BFE it tells you flood exposure and fill needed.
- slope_pct
- Grade — drives drainage, gradability, and construction cost.
- source
- USGS 3DEP digital elevation model.
- Example · Boulder, COdocumented
"demographics": { "median_household_income": 49490, "median_home_value": 1227700, "source": "US Census ACS 2023 5-year" }Sub-fields · what they mean for the loan- median_household_income
- Tract income — rent support and market depth.
- median_home_value
- Tract home value — collateral context and a comp sanity check.
- source
- US Census ACS 5-year, by tract.
- Example · Boulder, COdocumented
"audit": [ { "field": "elevation_ft", "value": 5341.77, "source": "USGS 3DEP ImageServer (1/3 arc-second DEM)", "queried_at": "2026-08-07T17:17:18Z", "effective_date": null, "error": null } ]Sub-fields · what they mean for the loan- field
- Which response field this entry certifies.
- value
- The value returned for it.
- source
- The federal source of record.
- queried_at
- When it was read; on a cache hit the original read's timestamp is kept, so provenance never lies.
- effective_date
- The data's own effective date, where the source publishes one.
- error
- Populated when a read failed or degraded — how you know a layer is soft.
Priced on the page, not by quote.
The data gateways quote you privately; here every tier is on the page — and you can watch it pay for itself against your own desk. Every tier includes all layers, financials, batch, as_of versioning, MCP and REST.
the manual way — assembling five vendors by hand
fully loaded
flood or hazard zones a manual pass would overlook
an uninsured AE-zone loss runs ~$50k
Illustrative — time reclaimed assumes ~6 min review per sheet; loss avoided is your own count. Annual plans bill two months free.
One underwriting desk · 30–50 loans/mo
Get startedSmall fund · 100–200 leads/week
Get startedLender with 3+ desks
Get startedThe trial runs the full engine — all layers, financials, batch, as_of versioning, MCP and REST — and stops at 50 underwrites. Starter and up include unlimited seats on one shared usage limit — the whole desk works from a single account and a single bill. Annual plans bill up front for the year (two months free). Metered billing is on the roadmap; today paid accounts are invoiced per engagement, with no hidden per-layer charges.
Put a determination in front of your credit committee.
Bring one address. We'll survey it live, stamp the flood determination and the risk-adjusted NOI, and hand you the audit trail behind every field.


