---
title: "Get parcel deed history"
method: GET
path: "/api/v1/parcels/{id}/deeds"
tags: ["Parcels"]
---

# Get parcel deed history

`GET /api/v1/parcels/{id}/deeds`

## Request

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

Retrieve deed transactions and transfer history for a parcel.

## Path parameters

- `id` string, required

## Query parameters

- `shape` 'envelope'

## Response `200`

Deeds returned. By default the body is a BARE ARRAY of deed rows (empty when the parcel's only deed signal is the frozen parcels_serving.deed_count — a count is never turned into a null-filled event). With `?shape=envelope` the body is the typed envelope `{ data, status, known_deed_count, known_deed_count_basis, note? }`, where `status` is one of per_deed | rollup_events | summary_only | none.

- union
  - Deed[]: Default shape (no `shape` parameter): the deed rows.
    - `document_number` string, nullable, required
    - `recording_date` string, date, nullable, required
    - `sale_date` string, date, nullable, required
    - `document_type` string, nullable, required
    - `sale_price` number, nullable, required
    - `consideration` number, nullable, required
    - `grantor_name` string, nullable, required
    - `grantee_name` string, nullable, required
    - `grantor_name_2` string, nullable, required
    - `grantee_name_2` string, nullable, required
    - `grantor_address` string, nullable, required
    - `grantee_address` string, nullable, required
    - `grantor_type` string, nullable, required
    - `grantee_type` string, nullable, required
    - `book` string, nullable, required
    - `page` string, nullable, required
    - `instrument_number` string, nullable, required
    - `transfer_tax` number, nullable, required
    - `excise_tax` number, nullable, required
    - `sale_type` string, nullable, required
    - `is_arm_length` boolean, nullable, required
    - `legal_description` string, nullable, required
    - `lot` string, nullable, required
    - `block` string, nullable, required
    - `subdivision` string, nullable, required
    - `source_url` string, nullable, required
    - `property_address` string, nullable, required
    - `property_city` string, nullable, required
    - `property_state` string, nullable, required
    - `deed_type` string, nullable
  - object: Returned only when `shape=envelope`.
    - `data` Deed[], required
      - `document_number` string, nullable, required
      - `recording_date` string, date, nullable, required
      - `sale_date` string, date, nullable, required
      - `document_type` string, nullable, required
      - `sale_price` number, nullable, required
      - `consideration` number, nullable, required
      - `grantor_name` string, nullable, required
      - `grantee_name` string, nullable, required
      - `grantor_name_2` string, nullable, required
      - `grantee_name_2` string, nullable, required
      - `grantor_address` string, nullable, required
      - `grantee_address` string, nullable, required
      - `grantor_type` string, nullable, required
      - `grantee_type` string, nullable, required
      - `book` string, nullable, required
      - `page` string, nullable, required
      - `instrument_number` string, nullable, required
      - `transfer_tax` number, nullable, required
      - `excise_tax` number, nullable, required
      - `sale_type` string, nullable, required
      - `is_arm_length` boolean, nullable, required
      - `legal_description` string, nullable, required
      - `lot` string, nullable, required
      - `block` string, nullable, required
      - `subdivision` string, nullable, required
      - `source_url` string, nullable, required
      - `property_address` string, nullable, required
      - `property_city` string, nullable, required
      - `property_state` string, nullable, required
      - `deed_type` string, nullable
    - `status` 'per_deed' | 'rollup_events' | 'summary_only' | 'none', required
    - `known_deed_count` integer, nullable, required: parcels_serving.deed_count when the parcel carries one; NOT a count of the returned rows.
    - `known_deed_count_basis` string, nullable, required: Where known_deed_count comes from: the frozen 2026-04 weld, or the identity gate's reason when the parcel_id collides across counties — parcel_id_collides_bare_id_joined (rollup withheld, count null), parcel_id_collides_unmeasured (served with the doubt visible), collision_check_unavailable (withheld under DQ_IDENTITY_GATE_FAIL_CLOSED=1).
    - `note` string
    - `join_key_basis` 'state_county_parcel_id' | 'parcel_id_collides' | 'unchecked': The identity probe's verdict on the rollup (present on rollup-derived envelopes; absent on the county-scoped per_deed branch).
    - `rollup_probe` 'deeds_relation': Present when the rollup was withheld on the deeds-relation probe: the parcel_id is unique in parcels_serving (join_key_basis state_county_parcel_id) but parcel_deeds carries rows for it under another (state, county), so the frozen rollup was welded on the bare id from another parcel's deeds.

## Other responses

- `400`: A query or body parameter is invalid. Nothing was read or charged.
- `401`: Missing, malformed or invalid credential.
- `404`: The resource (or the endpoint) does not exist.
- `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)
