---
title: "Get coverage statistics"
method: GET
path: "/api/v1/coverage"
tags: ["Coverage"]
---

# Get coverage statistics

`GET /api/v1/coverage`

## Request

- Base URL: `https://propraven.com`
- URL: `https://propraven.com/api/v1/coverage`
- Auth: one of:
  - HTTP bearer
  - none

Retrieve parcel coverage statistics at the state or county level. API key optional: anonymous callers are rate-limited per IP; a present but invalid key is a 401; a valid key is rate-limited at its own tier and is not metered.

## Query parameters

- `state` string

## Response `200`

Coverage data returned.

- object
  - `data` object[], required
    - `state_fips` string, required
    - `county_fips` string
    - `county_name` string, nullable
    - `parcel_count` integer, nullable, required
    - `with_address` number, nullable, required
    - `with_geocode` number, nullable, required
    - `with_owner` number, nullable, required
    - `with_value` number, nullable, required
    - `last_updated` string, nullable, required: Kept for existing clients. Equals `data_as_of` when that is known (`last_updated_basis: data_as_of`); otherwise the coverage-summary refresh time (`last_updated_basis: summary_refreshed_at`). Before 2026-10-09 it was always the refresh time.
    - `population` number, nullable
    - `with_geometry` number, nullable, required
    - `state_abbr` string, nullable
    - `county_count` integer, nullable
    - `total_counties` integer, nullable
    - `total_population` integer, nullable
    - `covered_population` number, nullable
    - `population_coverage_pct` number, nullable
    - `state_name` string
    - `geocoded_pct` number, float
    - `owner_pct` number, float
    - `value_pct` number, float
    - `last_updated_basis` 'data_as_of' | 'summary_refreshed_at' | 'unknown': Which date `last_updated` holds.
    - `data_as_of` string, date, nullable: Date of the data the row's counts were measured from: the parcels_dedup snapshot version the coverage summary was built from (or, on the live fallback, the newest last_ingested_at counted). Not a refresh time.
    - `data_as_of_basis` 'parcels_dedup_snapshot_version' | 'max_last_ingested_at' | 'unknown': What `data_as_of` was read from.
    - `summary_refreshed_at` string, date-time, nullable: When the coverage summary job last rebuilt the row — a job clock, not a data date.
    - `coverage_status` 'covered' | 'stub' | 'none': County drill-down: `covered` when the county's parcel rows are at least `coverage_floor.min_parcels_per_capita` per resident (Census population), `stub` below that (we hold some parcels there, not the county; not counted as covered). Added 2026-10-10.
    - `parcels_per_capita` number, nullable: County drill-down: parcel rows per resident (Census population); null when the population is unknown.
    - `stub_county_count` integer, nullable: State summary: counties holding parcel rows below the parcels-per-capita floor. Not included in `county_count`.
    - `stub_population` integer, nullable: State summary: residents of the stub counties. Not included in `covered_population`.
  - `state` string
  - `total_counties` integer
  - `total_counties_us` integer
  - `total_population_us` integer
  - `covered_population_us` number
  - `population_coverage_pct` number
  - `national_counts` object
    - `parcel_counts_epoch` string, required
    - `parcels` number, required
    - `mapped_locations` number, required
    - `geocoded_parcels` number, required
    - `rows` number, required
    - `parcel_count_definitions` object, required
      - `parcels` string, required
      - `mapped_locations` string, required
      - `geocoded_parcels` string, required
      - `rows` string, required
  - `total_parcels` integer
  - `states_covered` integer
  - `date_fields` object: What each date field on a coverage row means (state summary only).
  - `coverage_floor` object: What `covered` means (2026-10-10): a county counts as covered only at or above this many parcel rows per resident.
    - `min_parcels_per_capita` number
    - `population_vintage` string
    - `definition` string
  - `counties_stub` integer: State drill-down: counties below the parcels-per-capita floor (listed in `data` with coverage_status `stub`).
  - `stub_county_codes` string[]: State drill-down: the stub counties' 3-digit codes.
  - `counties_stub_us` integer: National: stub counties (below the floor), not counted in counties_covered_us.
  - `stub_population_us` integer: National: residents of stub counties, not counted in covered_population_us.
  - `coverage_status` 'covered' | 'stub' | 'none': Single-county request (`county_fips`): covered, stub, or none.

## Other responses

- `400`: A query or body parameter is invalid. Nothing was read or charged.
- `401`: Missing, malformed or invalid credential.
- `405`: The endpoint exists but does not support this method. `Allow` lists the methods it does.
- `429`: Rate limit exceeded.
- `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)
