Documentation menu
API reference

Public property records

Covers property and transaction. Every parameter, response and example below is generated from the contract.

The facts that belong to every operation rather than to this group, the refusal shape, the cursor rules, the filters and the credential each call accepts, are the other pages under API. What a field means is under Get started.

Operations
4
Tags
2
Need a credential
4
Public
0

property

2 operations

The public-record profile of a property, with assessments, tax bills, ownership history and structures.

GET/propertyAPI key

Find properties

By address, point, geometry and buffer, parcel, APN and county, or owner of record.

Sortable: label (default), land_area, year_built, distance (point and geometry only).

Operation ID list_property_property_get

Parameters

query

jurisdictionstring[]
A jur_ id or fips_key. Repeatable.
countystring | null
County FIPS, 5 digits.
owner_namestring | null
Exact public-record owner name. Every property held under it.
use_rawstring | null
The assessor's use or class code.
as_ofstring | null
Valid time: the law in force then. Default now, in the jurisdiction's timezone. 2024-06-30, 2024-06-30T14:00:00-04:00, from:2023-01-01 to:2024-12-31, or last 90 days. An interval returns segment[], never a winner.
known_as_ofstring | null
Knowledge time: the answer we would have given then. Default now. Same grammar as as_of.
includestring | null
Comma-separated: assessment, tax, ownership, structure, transaction.
fieldstring | null
Field selection: default,-geometry, all,-provenance. as_of, status, citation.id, effective_from and derivation cannot be suppressed.
sortstring | null
field or -field, comma-separated, at most three. Sortable fields are listed per operation.
cursorstring | null
From a previous page's page.next_cursor.
sizeinteger | null
Default 25.
totalboolean
Include page.total. First page only.
addressstring | null
Free text: 1420 County Road 12, Hartland Township, MI.
pointstring | null
lat,lon, in that order.
geometrystring | null
WKT or GeoJSON, Point through MultiPolygon. GeoJSON stays lon,lat. Use the POST form when long.
buffernumber | null
Distance around geometry or point.
buffer_unit"ft" | "mi" | "m" | "km"
No description.
parcelstring[]
A prc_ id. Repeat for an assemblage.
apnstring | null
Assessor parcel number, with fips.
fipsstring | null
County FIPS for apn.
plssstring | null
PLSS key: MI:21:T19N:R16E:S26:SW4SW4. Resolves to a candidate set.
location_tokenstring | null
A loc_ token from an earlier resolution.
strictboolean
Turn an ambiguous or too-coarse location into a 422 instead of a 200 that says so.
filterobject map
filter[<field>][<op>]=<value>. Operators: eq ne in nin lt lte gt gte between prefix contains is_null not_null any all permits forbids. AND across fields, OR within repeated values. A row whose status has no comparable value is returned as filter_outcome: indeterminate, never silently dropped; filter_indeterminate=exclude opts out. An unknown field, operator or value is a 422, never an empty result.
filter_indeterminate"include" | "exclude" | "only"
only is the audit query: which rows is the code silent on.

Responses

200
Collection_Property_
Successful Response
401
empty
No usable credential.
402
ErrorResponse
quota_exhausted: out of credit. Credit is prepaid and the balance cannot go below zero, so add credit rather than retrying.
403
ErrorResponse
entitlement_missing: the plan does not cover this operation.
404
ErrorResponse
No such id. The only meaning of 404.
422
ErrorResponse
The request cannot be answered as asked. The code says why.
429
ErrorResponse
rate_limited, with Retry-After.
501
ErrorResponse
not_available: this operation does not answer yet.

Example request

curl -X GET 'http://localhost:8000/property?jurisdiction=value&as_of=2026-09-13&size=50' \
  -H 'X-API-Key: $PLACESTACK_API_KEY'

Example response

{
  "request": {
    "path": "<Path>",
    "param": {},
    "dry_run": false
  },
  "meta": {
    "contract_date": "2026-09-13",
    "vocabulary_version": "<Vocabulary Version>",
    "request_id": "req_01h455vb4pex5vsknk084sn02q",
    "api_version": "v1",
    "answer_id": "ans_01h455vb4pex5vsknk084sn02q",
    "answer_through": 1,
    "unit": {
      "key": "string"
    },
    "cost": "<Cost>"
  },
  "item": [
    {
      "id": "pty_01h455vb4pex5vsknk084sn02q",
      "jurisdiction": "<JurisdictionRef>",
      "county_fips": "<County Fips>",
      "label": "<Label>",
      "parcel": [
        "prc_01h455vb4pex5vsknk084sn02q"
      ],
      "source_freshness": {
        "key": "2026-09-13"
      },
      "coverage": {
        "key": "<CoverageLayer>"
      },
      "href": "<Href>",
      "address": [
        "<Address>"
      ],
      "legal_summary": "string",
      "land_area": "<Measured>",
      "current_use": "<CurrentUse>",
      "assessor_zoning": "<AssessorZoning>"
    }
  ],
  "page": {
    "size": 1,
    "next_cursor": "string",
    "indeterminate": 0,
    "total": "<envelope__Total>"
  },
  "as_of": {
    "resolved": "<Interval>",
    "timezone": "<Timezone>",
    "basis": "requested",
    "known_as_of": "2026-09-13T12:00:00Z",
    "known_as_of_basis": "requested",
    "requested": "string",
    "earliest_retained": {
      "key": "2026-09-13"
    },
    "constant": true,
    "segment_count": 1
  },
  "notice": [
    {
      "code": "as_of_interval_spans_change",
      "severity": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}
GET/property/{property}API key

One property, with its public records

as_of selects the ownership, assessment and structures on record at that date.

Operation ID get_property_property__property__get

Parameters

path

propertyrequiredstring
A pty_ id.

query

as_ofstring | null
Valid time: the law in force then. Default now, in the jurisdiction's timezone. 2024-06-30, 2024-06-30T14:00:00-04:00, from:2023-01-01 to:2024-12-31, or last 90 days. An interval returns segment[], never a winner.
known_as_ofstring | null
Knowledge time: the answer we would have given then. Default now. Same grammar as as_of.
includestring | null
Comma-separated: assessment, tax, ownership, structure, transaction.
fieldstring | null
Field selection: default,-geometry, all,-provenance. as_of, status, citation.id, effective_from and derivation cannot be suppressed.

Responses

200
Single_Property_
Successful Response
401
empty
No usable credential.
402
ErrorResponse
quota_exhausted: out of credit. Credit is prepaid and the balance cannot go below zero, so add credit rather than retrying.
403
ErrorResponse
entitlement_missing: the plan does not cover this operation.
404
ErrorResponse
No such id. The only meaning of 404.
422
ErrorResponse
The request cannot be answered as asked. The code says why.
429
ErrorResponse
rate_limited, with Retry-After.
501
ErrorResponse
not_available: this operation does not answer yet.

Example request

curl -X GET 'http://localhost:8000/property/property_123?as_of=2026-09-13' \
  -H 'X-API-Key: $PLACESTACK_API_KEY'

Example response

{
  "request": {
    "path": "<Path>",
    "param": {},
    "dry_run": false
  },
  "meta": {
    "contract_date": "2026-09-13",
    "vocabulary_version": "<Vocabulary Version>",
    "request_id": "req_01h455vb4pex5vsknk084sn02q",
    "api_version": "v1",
    "answer_id": "ans_01h455vb4pex5vsknk084sn02q",
    "answer_through": 1,
    "unit": {
      "key": "string"
    },
    "cost": "<Cost>"
  },
  "item": {
    "id": "pty_01h455vb4pex5vsknk084sn02q",
    "jurisdiction": "<JurisdictionRef>",
    "county_fips": "<County Fips>",
    "label": "<Label>",
    "parcel": [
      "prc_01h455vb4pex5vsknk084sn02q"
    ],
    "source_freshness": {
      "key": "2026-09-13"
    },
    "coverage": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>",
    "address": [
      "<Address>"
    ],
    "legal_summary": "string",
    "land_area": "<Measured>",
    "current_use": "<CurrentUse>",
    "assessor_zoning": "<AssessorZoning>"
  },
  "as_of": {
    "resolved": "<Interval>",
    "timezone": "<Timezone>",
    "basis": "requested",
    "known_as_of": "2026-09-13T12:00:00Z",
    "known_as_of_basis": "requested",
    "requested": "string",
    "earliest_retained": {
      "key": "2026-09-13"
    },
    "constant": true,
    "segment_count": 1
  },
  "notice": [
    {
      "code": "as_of_interval_spans_change",
      "severity": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}

transaction

2 operations

Recorded sales, transfers, mortgages, assignments, releases and liens.

GET/transactionAPI key

Recorded sales, transfers and mortgages, across properties

Sales in a region are a filter here, not a comparables product: nothing is estimated.

Sortable: -recorded_on (default), sale_date, consideration, kind.

Operation ID list_transaction_transaction_get

Parameters

query

kind"sale" | "transfer" | "mortgage" | "assignment"[]
Repeatable.
propertystring[]
A pty_ id. Repeatable.
party_namestring | null
Any party of record: grantor, grantee, lender, borrower.
recorded[gte]string | null
No description.
recorded[lte]string | null
No description.
consideration[gte]integer | null
Cents.
consideration[lte]integer | null
Cents.
sortstring | null
field or -field, comma-separated, at most three. Sortable fields are listed per operation.
cursorstring | null
From a previous page's page.next_cursor.
sizeinteger | null
Default 25.
totalboolean
Include page.total. First page only.
dry_runboolean
Price and scope the request without answering it.
regionstring | null
A saved rgn_ region, or a statistical area such as a CBSA (sta_ id). Membership resolves at as_of.
jurisdictionstring[]
A jur_ id or fips_key. Repeatable.
statestring | null
Two-letter postal code or two-digit FIPS.
countystring | null
County FIPS, 5 digits, or a county's jur_ id.
geometrystring | null
WKT or GeoJSON. Jurisdictions that intersect it.
buffernumber | null
Feet around geometry.
filterobject map
filter[<field>][<op>]=<value>. Operators: eq ne in nin lt lte gt gte between prefix contains is_null not_null any all permits forbids. AND across fields, OR within repeated values. A row whose status has no comparable value is returned as filter_outcome: indeterminate, never silently dropped; filter_indeterminate=exclude opts out. An unknown field, operator or value is a 422, never an empty result.
filter_indeterminate"include" | "exclude" | "only"
only is the audit query: which rows is the code silent on.

Responses

200
Collection_Transaction_
Successful Response
401
empty
No usable credential.
402
ErrorResponse
quota_exhausted: out of credit. Credit is prepaid and the balance cannot go below zero, so add credit rather than retrying.
403
ErrorResponse
entitlement_missing: the plan does not cover this operation.
404
ErrorResponse
No such id. The only meaning of 404.
422
ErrorResponse
The request cannot be answered as asked. The code says why.
429
ErrorResponse
rate_limited, with Retry-After.
501
ErrorResponse
not_available: this operation does not answer yet.

Example request

curl -X GET 'http://localhost:8000/transaction?size=50&jurisdiction=value&state=NC' \
  -H 'X-API-Key: $PLACESTACK_API_KEY'

Example response

{
  "request": {
    "path": "<Path>",
    "param": {},
    "dry_run": false
  },
  "meta": {
    "contract_date": "2026-09-13",
    "vocabulary_version": "<Vocabulary Version>",
    "request_id": "req_01h455vb4pex5vsknk084sn02q",
    "api_version": "v1",
    "answer_id": "ans_01h455vb4pex5vsknk084sn02q",
    "answer_through": 1,
    "unit": {
      "key": "string"
    },
    "cost": "<Cost>"
  },
  "item": [
    {
      "source": "<Source>",
      "source_record_id": "<Source Record Id>",
      "citation": "cit_01h455vb4pex5vsknk084sn02q",
      "provenance": "prv_01h455vb4pex5vsknk084sn02q",
      "observed_at": "2026-09-13T12:00:00Z",
      "data_horizon": "2026-09-13",
      "id": "trn_01h455vb4pex5vsknk084sn02q",
      "kind": "sale",
      "jurisdiction": "<JurisdictionRef>",
      "recording": "<Recording>",
      "party": [
        "<envelope__Party>"
      ],
      "property": [
        "pty_01h455vb4pex5vsknk084sn02q"
      ],
      "document": "doc_01h455vb4pex5vsknk084sn02q",
      "href": "<Href>",
      "instrument_date": "2026-09-13",
      "sale_date": "2026-09-13",
      "consideration": "<Valued>",
      "loan": "<Loan>",
      "parcel": [
        "prc_01h455vb4pex5vsknk084sn02q"
      ]
    }
  ],
  "page": {
    "size": 1,
    "next_cursor": "string",
    "indeterminate": 0,
    "total": "<envelope__Total>"
  },
  "as_of": {
    "resolved": "<Interval>",
    "timezone": "<Timezone>",
    "basis": "requested",
    "known_as_of": "2026-09-13T12:00:00Z",
    "known_as_of_basis": "requested",
    "requested": "string",
    "earliest_retained": {
      "key": "2026-09-13"
    },
    "constant": true,
    "segment_count": 1
  },
  "notice": [
    {
      "code": "as_of_interval_spans_change",
      "severity": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}
GET/transaction/{transaction}API key

One recorded transaction

Operation ID get_transaction_transaction__transaction__get

Parameters

path

transactionrequiredstring
A trn_ id.

Responses

200
Single_Transaction_
Successful Response
401
empty
No usable credential.
402
ErrorResponse
quota_exhausted: out of credit. Credit is prepaid and the balance cannot go below zero, so add credit rather than retrying.
403
ErrorResponse
entitlement_missing: the plan does not cover this operation.
404
ErrorResponse
No such id. The only meaning of 404.
422
ErrorResponse
The request cannot be answered as asked. The code says why.
429
ErrorResponse
rate_limited, with Retry-After.
501
ErrorResponse
not_available: this operation does not answer yet.

Example request

curl -X GET 'http://localhost:8000/transaction/transaction_123' \
  -H 'X-API-Key: $PLACESTACK_API_KEY'

Example response

{
  "request": {
    "path": "<Path>",
    "param": {},
    "dry_run": false
  },
  "meta": {
    "contract_date": "2026-09-13",
    "vocabulary_version": "<Vocabulary Version>",
    "request_id": "req_01h455vb4pex5vsknk084sn02q",
    "api_version": "v1",
    "answer_id": "ans_01h455vb4pex5vsknk084sn02q",
    "answer_through": 1,
    "unit": {
      "key": "string"
    },
    "cost": "<Cost>"
  },
  "item": {
    "source": "<Source>",
    "source_record_id": "<Source Record Id>",
    "citation": "cit_01h455vb4pex5vsknk084sn02q",
    "provenance": "prv_01h455vb4pex5vsknk084sn02q",
    "observed_at": "2026-09-13T12:00:00Z",
    "data_horizon": "2026-09-13",
    "id": "trn_01h455vb4pex5vsknk084sn02q",
    "kind": "sale",
    "jurisdiction": "<JurisdictionRef>",
    "recording": "<Recording>",
    "party": [
      "<envelope__Party>"
    ],
    "property": [
      "pty_01h455vb4pex5vsknk084sn02q"
    ],
    "document": "doc_01h455vb4pex5vsknk084sn02q",
    "href": "<Href>",
    "instrument_date": "2026-09-13",
    "sale_date": "2026-09-13",
    "consideration": "<Valued>",
    "loan": "<Loan>",
    "parcel": [
      "prc_01h455vb4pex5vsknk084sn02q"
    ]
  },
  "as_of": {
    "resolved": "<Interval>",
    "timezone": "<Timezone>",
    "basis": "requested",
    "known_as_of": "2026-09-13T12:00:00Z",
    "known_as_of_basis": "requested",
    "requested": "string",
    "earliest_retained": {
      "key": "2026-09-13"
    },
    "constant": true,
    "segment_count": 1
  },
  "notice": [
    {
      "code": "as_of_interval_spans_change",
      "severity": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}

The document

Everything above is read from OpenAPI 3.1.0 version 0.0.0. When the contract changes, this page follows.

Download the OpenAPI document

Next

Jurisdictions and their law

14 operations: jurisdiction, district, code, process, region.