---
title: "Property-tax delinquency status of a parcel"
method: GET
path: "/api/v1/parcels/{id}/tax-status"
tags: ["Parcels"]
---

# Property-tax delinquency status of a parcel

`GET /api/v1/parcels/{id}/tax-status`

## Request

- Base URL: `https://propraven.com`
- URL: `https://propraven.com/api/v1/parcels/{id}/tax-status`
- Auth: HTTP bearer

Whether the parcel is on a treasurer's or tax collector's published property-tax delinquency, lien-sale or tax-sale list (pilot jurisdictions), with each record's status, amount (and what the amount is), tax years, sale, publisher, dates and the list's scope. People data (the owner on the tax bill, its mailing address, certificate holders). An ACCOUNT is served like the owner card: a response that serves records counts as one lookup against the account's monthly cap (included on paid plans) and is written to the people-data access log; at the cap the records are withheld with `people_fields.code: lookup_cap_reached` (nothing charged). A caller WITHOUT an account may pay per answer ($0.10, `maxAmountRequired` 100000) with an x402 `X-PAYMENT` header or an `X-CREDIT-TOKEN`: the answer (`paid_via: x402 | credits`) is returned only once the payment settles or the debit succeeds; `not_covered` and `unavailable` answers are free (`charged: false`). An UNPAID caller with no account gets 401 `code: account_required` and nothing else. Before the layer's first load `status` is `unavailable`.

## Path parameters

- `id` string, required

## Response `200`

The parcel's tax status.

- ParcelTaxStatus
  - `parcel_id` string, required
  - `status` 'listed' | 'not_listed' | 'not_covered' | 'unavailable', required: listed = on at least one unexpired list; not_listed = an unexpired list covers the county and this parcel is not on it (read `list_scope`: never proof of payment); not_covered = no list for the county; unavailable = the layer could not be read.
  - `coverage` TaxDelinquencyCoverage[], required
    - `source_id` string, required
    - `jurisdiction_name` string, required
    - `publisher` string, required
    - `dataset_kind` 'delinquency' | 'lien_sale_list' | 'tax_sale_list' | 'scavenger_list' | 'foreclosure_list', required
    - `list_scope` string, required
    - `publisher_as_of` string, date, required
    - `as_of` string, date, required
    - `expires_on` string, date, required
    - `source_url` string, required
  - `records` TaxDelinquencyRecord[], required: in_sale, delinquent, sold, redeemed, then amount_due descending; at most 50.
    - `record_uid` string, required
    - `source_id` string, required: ops.sources id (`tax_<st>_<jurisdiction>_<dataset>`).
    - `jurisdiction_name` string, required
    - `publisher` string, required
    - `publisher_parcel_id` string, required: The parcel id exactly as the publisher prints it.
    - `status` 'in_sale' | 'delinquent' | 'sold' | 'redeemed', required: Only in_sale and delinquent count as delinquent.
    - `status_raw` string, nullable, required
    - `payment_plan` boolean, nullable, required: Only where the publisher says so; null = not published.
    - `bankruptcy` boolean, nullable, required: Only where the publisher says so; null = not published.
    - `tax_years` integer[], nullable, required
    - `first_tax_year` integer, nullable, required
    - `last_tax_year` integer, nullable, required
    - `years_delinquent` integer, nullable, required
    - `amount_due` number, nullable, required: Null when the list publishes no amount; what it is is `amount_basis`.
    - `amount_basis` 'total_due' | 'principal' | 'lien_amount' | 'minimum_bid' | 'judgment' | 'null', nullable, required
    - `sale_kind` 'tax_lien_sale' | 'tax_deed_sale' | 'sheriff_sale' | 'scavenger_sale' | 'certificate_sale' | 'null', nullable, required
    - `sale_date` string, date, nullable, required
    - `publisher_as_of` string, date, required: The publisher's own date for the list.
    - `as_of` string, date, required: When PropRaven pulled the list.
    - `expires_on` string, date, required
    - `match_method` 'parcel_id_exact' | 'parcel_id_normalized' | 'address_exact', required
    - `match_confidence` number, required
    - `source_url` string, required
  - `truncated` boolean, required
  - `note` string, required
  - `people_fields` object: Present when the records were withheld by the lookup meter: `code` lookup_cap_reached or lookup_meter_unavailable (nothing charged).

## Other responses

- `400`: Malformed parcel id.
- `401`: No account and no payment (`code: "account_required"`, `reason: "people_data_requires_account"`), or an invalid API key.
- `402`: Monthly call cap reached (free tier, or a paid tier with the hard cap enabled).
- `404`: No served parcel has this identity.
- `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)
