---
title: "Risk score (paid, priced per assessment) — with a FREE preview"
method: GET
path: "/api/v1/parcels/{id}/risk-score"
tags: ["Parcels"]
---

# Risk score (paid, priced per assessment) — with a FREE preview

`GET /api/v1/parcels/{id}/risk-score`

## Request

- Base URL: `https://propraven.com`
- URL: `https://propraven.com/api/v1/parcels/{id}/risk-score`
- Auth: one of:
  - HTTP bearer
  - none

The Machine Storefront's risk score: a multi-hazard risk assessment for one parcel, anchored on FEMA's National Risk Index COMPOSITE (nri_risk_score 0-100 + rating) with the flood / seismic / windstorm / wildfire / air-quality / crime breakdown that supports it. Answers "what could go wrong with this asset?". The headline is FEMA's own methodology, not an invented weighting.

Reuses the SAME panel the free GET /api/v1/parcels/{id}/risks route serves (getParcelRisksData) plus the NRI composite + flood detail from parcels_serving.

PRICE: per assessment = clamp($0.60 x V(asset value) x C(hazard coverage), $0.20, $20). C ramps on how many independent hazard layers resolved. A parcel with ZERO layers is returned free, never charged. The cheapest paid SKU. The exact price is in the 402's accepts[0].maxAmountRequired (USDC atomic units).

FREE PREVIEW: add preview=true for the subject, WHICH hazard layers resolved, and the exact price. The precise NRI score and the hazard breakdown are the paid product.

PAID ACCESS: (a) x402 via a base64 signed PaymentPayload in `X-PAYMENT` (receipt in `X-PAYMENT-RESPONSE`); (b) a genuine PAID subscription entitlement; (c) else HTTP 402 with the exact requirements.

## Path parameters

- `id` string, required

## Query parameters

- `preview` boolean

## Headers

- `X-PAYMENT` string

## Response `200`

The risk assessment (paid or entitled), or — with preview=true — the free preview, or a free $0 result when no hazard layers resolved.

- object
  - `subject` object, required
    - `canonical_id` string, required
    - `parcel_id` string, required
    - `state_fips` string, required
    - `county_fips` string, required
    - `total_assessed_value` integer, required
  - `hazard_layers` string[], required
  - `hazard_layer_count` integer, required
  - `quote` object, required
    - `price` object, required
      - `amount` string, required
      - `currency` string, required
    - `price_usd` number, required
    - `price_atomic_usdc` string, required
    - `asset` string, required
    - `hazard_layers` number, required
    - `breakdown` object, required
      - `base` number, required
      - `V` number, required
      - `C` number, required
      - `price_raw` number, required
      - `capped` boolean, required
    - `pay` string[], required
    - `note` string, required
  - `preview` boolean, required
  - `note` string, required

## Other responses

- `400`: A query or body parameter is invalid. Nothing was read or charged.
- `401`: A present-but-invalid API key.
- `402`: Payment required. accepts[0].maxAmountRequired carries this assessment's exact price (asset value x hazard coverage, floor $0.20, cap $20) in USDC atomic units.
- `404`: Unknown parcel.
- `405`: The endpoint exists but does not support this method. `Allow` lists the methods it does.
- `500`: Unexpected server error. The body never carries database or driver text.

---

[API](https://skmtc.dev/propraven/apis/propraven-api.md) · [All operations](https://skmtc.dev/propraven/apis/propraven-api/llms.txt) · [OpenAPI document](https://skmtc.dev/propraven/apis/propraven-api/revisions/37f8158c4eda?raw)
