---
title: "Zoning coverage per jurisdiction"
method: GET
path: "/api/v1/zoning/coverage"
tags: ["Zoning"]
---

# Zoning coverage per jurisdiction

`GET /api/v1/zoning/coverage`

## Request

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

One row per registered zoning body with its honest `servingStatus` (served / partial / no_zoning / failed / registered) and reason, parcels matched against a measured denominator, distinct codes, overlays, and how many codes have parsed ordinance attributes (zeros included). Account required; the same table is on https://propraven.com/coverage.

## Query parameters

- `state_fips` string
- `jurisdiction_id` string

## Response `200`

Coverage rows and totals.

- object
  - `coverage` ZoningCoverageRow[], required
    - `jurisdictionId` string, required
    - `jurisdictionName` string, required
    - `jurisdictionType` string
    - `stateFips` string
    - `countyFips` string[]
    - `servingStatus` 'served' | 'partial' | 'no_zoning' | 'failed' | 'registered', required: served = codes on parcels AND parsed ordinance attributes; partial = codes on parcels, attributes missing or incomplete; no_zoning = the body has no zoning ordinance; failed = could not be collected; registered = not yet attempted.
    - `statusReason` string, nullable
    - `statusAsOf` string, nullable
    - `parcelsInJurisdiction` integer, nullable
    - `denominatorMethod` 'boundary_centroid' | 'publisher_count' | 'unknown'
    - `parcelsMatched` integer, required
    - `parcelsUnmatched` integer
    - `matchRate` number, nullable, required
    - `distinctCodes` integer, required
    - `overlaysAvailable` boolean
    - `distinctOverlays` integer
    - `parcelsWithOverlay` integer
    - `parcelsSplitZoned` integer, nullable
    - `parcelsWithAttributes` integer
    - `parcelAttributeRate` number, nullable
    - `codesWithAttributes` integer, required
    - `codesMissingAttributes` integer
    - `dictionaryCompleteness` number, nullable, required
    - `primarySourceUrl` string, nullable
    - `lastHarvestedAt` string, nullable
  - `totals` object, required

## Other responses

- `401`: Missing, malformed or invalid credential.
- `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)
