Documentation menu
API reference

Ask about a place

Covers place, rule, conformance and parcel. 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
10
Tags
4
Need a credential
10
Public
0

place

2 operations

What is at a location and who governs it. Resolution, authority, district shares, special districts, context layers.

GET/placeAPI key

What is at a location, and who governs it

Resolve an address, point, geometry, APN or PLSS key.

Too coarse a location for the grain asked is not guessed at: it comes back as resolution.state: insufficient_precision with the answer at the grain we can defend and no district assignment (422 under strict=true).

Operation ID get_place_place_get

Parameters

query

subject"zoning" | "subdivision" | "building_code" | "fire_code"[]
Which authorities to resolve. Default zoning. Repeatable.
context_type"flood_zone" | "wetland" | "service_area" | "utility_territory"[]
Which context layers. Default all.
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: authority, parcel, property, assignment, special_district, context_layer, future_land_use, boundary.
fieldstring | null
Field selection: default,-geometry, all,-provenance. as_of, status, citation.id, effective_from and derivation cannot be suppressed.
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.

Responses

200
PlaceAnswer
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/place?as_of=2026-09-13&address=100+Main+St&point=35.225%2C-78.642' \
  -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>"
  },
  "resolution": {
    "state": "resolved",
    "grain": "structure",
    "grain_requested": "structure",
    "precision": "<Precision>",
    "location_token": "loc_01h455vb4pex5vsknk084sn02q",
    "token_expires_at": "2026-09-13T12:00:00Z",
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "parcel": "prc_01h455vb4pex5vsknk084sn02q",
    "parcel_key": "<envelope__ParcelKey>"
  },
  "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>"
  },
  "jurisdiction": {
    "id": "jur_01h455vb4pex5vsknk084sn02q",
    "name": "<Name>",
    "fips_key": "<Fips Key>",
    "slug": "<Slug>",
    "href": "<Href>",
    "legal_name": "string"
  },
  "authority": [
    {
      "subject": "zoning",
      "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
      "jurisdiction_key": "<Jurisdiction Key>",
      "jurisdiction_path": "<Jurisdiction Path>",
      "legal_name": "<Legal Name>",
      "governing_jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
      "basis": "home_rule",
      "resolution_basis": "boundary_match",
      "citation": "cit_01h455vb4pex5vsknk084sn02q",
      "id": "aut_01h455vb4pex5vsknk084sn02q",
      "relationship": "<Relationship>",
      "effective_from": "2026-09-13",
      "effective_through": "2026-09-13",
      "agency": "<AgencyRef>"
    }
  ]
}
GET/place/suggestionAPI key

Typeahead

Resolves PLACE > COUNTY > COUSUB, so 'Hartland' offers the township and not only the county.

Operation ID list_suggestion_place_suggestion_get

Parameters

query

qrequiredstring
What has been typed so far.
type"jurisdiction" | "address" | "parcel" | "district"[]
No description.
statestring | null
No description.
sizeinteger
No description.

Responses

200
SuggestionAnswer
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/place/suggestion?q=value' \
  -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": [
    {
      "label": "<Label>",
      "type": "jurisdiction",
      "query": {},
      "location_token": "loc_01h455vb4pex5vsknk084sn02q",
      "jurisdiction": "<JurisdictionRef>"
    }
  ],
  "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"
      ]
    }
  ]
}

rule

4 operations

The one-call answer: every rule at a location on a date, cited. Batch form for up to 500 locations.

GET/ruleAPI key

The zoning rules at a location, as of a date, every number cited

The authority, district shares, overlays composed into one binding answer per cell, controls, permissions, and every other layer that reaches this spot, with what we could not consult named.

Operation ID get_rule_rule_get

Parameters

query

usestring[]
Only permissions and controls for these uses. Repeatable.
control_type"dimensional.setback_front" | "dimensional.setback_side_interior" | "dimensional.setback_side_street" | "dimensional.setback_rear"[]
Only these controls. Repeatable.
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.
as_of_clampboolean
Answer from the earliest retained version instead of refusing as_of_before_retention.
includestring | null
Comma-separated: definition, moratorium, standalone_ordinance, special_district, context_layer, future_land_use, private_restriction, nonconformity, aggregate, provenance.
fieldstring | null
Field selection: default,-geometry, all,-provenance. as_of, status, citation.id, effective_from and derivation cannot be suppressed.
dry_runboolean
Price and scope the request without answering it.
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.

Responses

200
RuleAnswer
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/rule?use=townhome&as_of=2026-09-13&address=100+Main+St' \
  -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>"
  },
  "resolution": {
    "state": "resolved",
    "grain": "structure",
    "grain_requested": "structure",
    "precision": "<Precision>",
    "location_token": "loc_01h455vb4pex5vsknk084sn02q",
    "token_expires_at": "2026-09-13T12:00:00Z",
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "parcel": "prc_01h455vb4pex5vsknk084sn02q",
    "parcel_key": "<envelope__ParcelKey>"
  },
  "authority": [
    {
      "subject": "zoning",
      "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
      "jurisdiction_key": "<Jurisdiction Key>",
      "jurisdiction_path": "<Jurisdiction Path>",
      "legal_name": "<Legal Name>",
      "governing_jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
      "basis": "home_rule",
      "resolution_basis": "boundary_match",
      "citation": "cit_01h455vb4pex5vsknk084sn02q",
      "id": "aut_01h455vb4pex5vsknk084sn02q",
      "relationship": "<Relationship>",
      "effective_from": "2026-09-13",
      "effective_through": "2026-09-13",
      "agency": "<AgencyRef>"
    }
  ],
  "assignment": [
    {
      "district": "dst_01h455vb4pex5vsknk084sn02q",
      "district_code": "<District Code>",
      "overlap_fraction": 1.25,
      "overlap_status": "computed",
      "compute_method": "geos_intersection",
      "geometry_op": "intersect",
      "is_primary": true,
      "map_version": "ver_01h455vb4pex5vsknk084sn02q",
      "effective_from": "2026-09-13",
      "citation": "cit_01h455vb4pex5vsknk084sn02q",
      "overlap_area_sqft": 1.25,
      "subject_area_sqft": 1.25,
      "measure_crs": "string",
      "primary_basis": "largest_share",
      "parcel_version": "ver_01h455vb4pex5vsknk084sn02q"
    }
  ],
  "district": [
    {
      "id": "dst_01h455vb4pex5vsknk084sn02q",
      "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
      "kind": "base",
      "code_raw": "<Code Raw>",
      "code_normalized": "<Code Normalized>",
      "local_label": "<Local Label>",
      "type": "<Type>",
      "version": "ver_01h455vb4pex5vsknk084sn02q",
      "effective_from": "2026-09-13",
      "href": "<Href>",
      "subtype": "string",
      "purpose": "<Purpose>",
      "section_ref": "<SectionRef>",
      "effective_through": "2026-09-13",
      "map": "<MapRef>"
    }
  ],
  "composition": [
    {
      "cell": "<CompositionCell>",
      "effective_from": "2026-09-13",
      "rule": "highest_precedence_then_most_restrictive",
      "binding": "<CompositionRow>",
      "overlay_consulted": "<OverlayConsulted>",
      "derivation": "quoted",
      "effective_through": "2026-09-13",
      "displaced": [
        "<CompositionRow>"
      ],
      "contributing": [
        "<Contributing>"
      ],
      "precedence_basis": "stated_in_code",
      "precedence_citation": "cit_01h455vb4pex5vsknk084sn02q"
    }
  ],
  "permission": [
    {
      "constant": true,
      "data_horizon": "2026-09-13",
      "horizon_basis": "measured",
      "id": "prm_01h455vb4pex5vsknk084sn02q",
      "use": "<UseRef>",
      "binds": true,
      "segment": [
        "<PermissionSegment>"
      ],
      "supersession_risk": "<SupersessionRisk>",
      "district": "dst_01h455vb4pex5vsknk084sn02q",
      "overlay": "dst_01h455vb4pex5vsknk084sn02q",
      "private_restriction": "pvr_01h455vb4pex5vsknk084sn02q",
      "filter_outcome": "match"
    }
  ]
}
POST/ruleAPI key

The same answer for up to 500 locations

Also the POST twin of GET /rule for a geometry too long for a URL. The matches are kept as a batch you can review and correct at GET /rule/batch/{id}, then re-ask at another as_of.

Operation ID post_rule_rule_post

Parameters

query

dry_runboolean
Price and scope the request without answering it.

header

Idempotency-Keystring | null
No description.

Responses

200
RuleBatchAnswer
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 POST 'http://localhost:8000/rule' \
  -H 'X-API-Key: $PLACESTACK_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "as_of": "string",
  "known_as_of": "string",
  "use": [
    "string"
  ],
  "include": [
    "string"
  ],
  "location": [
    {
      "ref": "<Ref>",
      "address": "string",
      "point": "string",
      "parcel": "prc_01h455vb4pex5vsknk084sn02q",
      "apn": "string",
      "fips": "string"
    }
  ]
}'

Request body

RuleBatchRequest

{
  "as_of": "string",
  "known_as_of": "string",
  "use": [
    "string"
  ],
  "include": [
    "string"
  ],
  "location": [
    {
      "ref": "<Ref>",
      "address": "string",
      "point": "string",
      "parcel": "prc_01h455vb4pex5vsknk084sn02q",
      "apn": "string",
      "fips": "string"
    }
  ]
}

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>"
  },
  "batch": "brs_01h455vb4pex5vsknk084sn02q",
  "item": [
    {
      "ref": "<Ref>",
      "outcome": "resolved",
      "authority": [
        "<Authority>"
      ],
      "assignment": [
        "<Assignment>"
      ],
      "district": [
        "<District>"
      ],
      "composition": [
        "<Composition>"
      ],
      "permission": [
        "<Permission>"
      ]
    }
  ],
  "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"
      ]
    }
  ]
}
GET/rule/batch/{batch}API key

What each location in a batch resolved to

Operation ID get_rule_batch_rule_batch__batch__get

Parameters

path

batchrequiredstring
A brs_ id.

query

format"json" | "csv"
No description.

Responses

200
BatchAnswer
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/rule/batch/batch_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": {
    "id": "brs_01h455vb4pex5vsknk084sn02q",
    "state": "resolving",
    "requested_grain": "parcel",
    "as_of": "2026-09-13",
    "known_as_of": "2026-09-13T12:00:00Z",
    "row_count": 1,
    "answer": "ans_01h455vb4pex5vsknk084sn02q",
    "created_at": "2026-09-13T12:00:00Z",
    "expires_at": "2026-09-13T12:00:00Z",
    "item": [
      "<BatchItem>"
    ]
  },
  "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"
      ]
    }
  ]
}
PATCH/rule/batch/{batch}/item/{ref}API key

Override one match in a batch

Operation ID patch_rule_batch_item_rule_batch__batch__item__ref__patch

Parameters

path

batchrequiredstring
A brs_ id.
refrequiredstring
Your ref for the location.

header

If-Matchstring | null
No description.

Responses

200
BatchAnswer
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 PATCH 'http://localhost:8000/rule/batch/batch_123/item/ref_123' \
  -H 'X-API-Key: $PLACESTACK_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "basis": "<Basis>",
  "parcel": "prc_01h455vb4pex5vsknk084sn02q",
  "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
  "district": "dst_01h455vb4pex5vsknk084sn02q",
  "outcome": "not_found",
  "evidence_url": "string"
}'

Request body

BatchOverride

{
  "basis": "<Basis>",
  "parcel": "prc_01h455vb4pex5vsknk084sn02q",
  "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
  "district": "dst_01h455vb4pex5vsknk084sn02q",
  "outcome": "not_found",
  "evidence_url": "string"
}

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": "brs_01h455vb4pex5vsknk084sn02q",
    "state": "resolving",
    "requested_grain": "parcel",
    "as_of": "2026-09-13",
    "known_as_of": "2026-09-13T12:00:00Z",
    "row_count": 1,
    "answer": "ans_01h455vb4pex5vsknk084sn02q",
    "created_at": "2026-09-13T12:00:00Z",
    "expires_at": "2026-09-13T12:00:00Z",
    "item": [
      "<BatchItem>"
    ]
  },
  "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"
      ]
    }
  ]
}

conformance

2 operations

Rule application: is what stands here legal, would this proposal be allowed.

GET/conformanceAPI key

Is what stands here legal

The standing structure and use against the rules in force, from parcel records.

Operation ID get_conformance_conformance_get

Parameters

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: nonconformity, violation, private_restriction.
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.

Responses

200
ConformanceAnswer
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/conformance?as_of=2026-09-13&address=100+Main+St&point=35.225%2C-78.642' \
  -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>"
  },
  "conformance_state": "conforming",
  "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>"
  },
  "resolution": {
    "state": "resolved",
    "grain": "structure",
    "grain_requested": "structure",
    "precision": "<Precision>",
    "location_token": "loc_01h455vb4pex5vsknk084sn02q",
    "token_expires_at": "2026-09-13T12:00:00Z",
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "parcel": "prc_01h455vb4pex5vsknk084sn02q",
    "parcel_key": "<envelope__ParcelKey>"
  },
  "permission": {
    "level": "by_right",
    "status": "stated",
    "citation": "cit_01h455vb4pex5vsknk084sn02q"
  }
}
POST/conformanceAPI key

Would this proposal be allowed

Which control binds first, by how much, with the citation on both sides.

Any binding control at silent, unknown, illegible or conflicting makes the whole answer indeterminate, which is an answer, not a failure.

Operation ID post_conformance_conformance_post

Parameters

query

includestring | null
Comma-separated: nonconformity, violation, private_restriction.
dry_runboolean
Price and scope the request without answering it.

Responses

200
ConformanceAnswer
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 POST 'http://localhost:8000/conformance' \
  -H 'X-API-Key: $PLACESTACK_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "subject": {
    "parcel": "prc_01h455vb4pex5vsknk084sn02q",
    "jurisdiction": "string",
    "district": "string"
  },
  "as_of": "string",
  "known_as_of": "string",
  "proposal": {
    "use": "string",
    "height_ft": 1.25,
    "story_count": 1.25,
    "dwelling_unit_count": 1,
    "lot_area_sqft": 1.25
  }
}'

Request body

ConformanceRequest

{
  "subject": {
    "parcel": "prc_01h455vb4pex5vsknk084sn02q",
    "jurisdiction": "string",
    "district": "string"
  },
  "as_of": "string",
  "known_as_of": "string",
  "proposal": {
    "use": "string",
    "height_ft": 1.25,
    "story_count": 1.25,
    "dwelling_unit_count": 1,
    "lot_area_sqft": 1.25
  }
}

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>"
  },
  "conformance_state": "conforming",
  "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>"
  },
  "resolution": {
    "state": "resolved",
    "grain": "structure",
    "grain_requested": "structure",
    "precision": "<Precision>",
    "location_token": "loc_01h455vb4pex5vsknk084sn02q",
    "token_expires_at": "2026-09-13T12:00:00Z",
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "parcel": "prc_01h455vb4pex5vsknk084sn02q",
    "parcel_key": "<envelope__ParcelKey>"
  },
  "permission": {
    "level": "by_right",
    "status": "stated",
    "citation": "cit_01h455vb4pex5vsknk084sn02q"
  }
}

parcel

2 operations

Parcels, their addresses, district shares, private restrictions, nonconformities and violations.

GET/parcelAPI key

Find parcels

By address, point, geometry and buffer, APN and county FIPS, PLSS, or lot and block.

Sortable: apn_normalized (default), acreage, distance (point and geometry only).

Operation ID list_parcel_parcel_get

Parameters

query

jurisdictionstring | null
Every parcel in a jurisdiction. Use POST /extract past a few pages.
platstring | null
A plt_ id, with block and lot.
blockstring | null
No description.
lotstring | null
No description.
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: address, assignment, private_restriction, nonconformity, violation.
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_Parcel_
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/parcel?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": "prc_01h455vb4pex5vsknk084sn02q",
      "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
      "key": "<parcel__ParcelKey>",
      "part_count": 1,
      "stacked_count": 1,
      "stack_role": "sole",
      "centroid": "<envelope__Point>",
      "bbox": "<BBox>",
      "version": "ver_01h455vb4pex5vsknk084sn02q",
      "effective_from": "2026-09-13",
      "href": "<Href>",
      "plss": "<Plss>",
      "plat": "<PlatRef>",
      "legal": "<LegalText>",
      "lot_area": "<Measured>",
      "frontage": "<Measured>"
    }
  ],
  "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/parcel/{parcel}API key

One parcel

A parcel with its addresses, its district shares and, on request, what else binds it.

Operation ID get_parcel_parcel__parcel__get

Parameters

path

parcelrequiredstring
A prc_ 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: address, assignment, private_restriction, nonconformity, violation.
fieldstring | null
Field selection: default,-geometry, all,-provenance. as_of, status, citation.id, effective_from and derivation cannot be suppressed.

Responses

200
Single_Parcel_
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/parcel/parcel_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": "prc_01h455vb4pex5vsknk084sn02q",
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "key": "<parcel__ParcelKey>",
    "part_count": 1,
    "stacked_count": 1,
    "stack_role": "sole",
    "centroid": "<envelope__Point>",
    "bbox": "<BBox>",
    "version": "ver_01h455vb4pex5vsknk084sn02q",
    "effective_from": "2026-09-13",
    "href": "<Href>",
    "plss": "<Plss>",
    "plat": "<PlatRef>",
    "legal": "<LegalText>",
    "lot_area": "<Measured>",
    "frontage": "<Measured>"
  },
  "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

Public property records

4 operations: property, transaction.