Documentation menu
API reference

Zoning

Covers permission and law.

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.

permission

Where a use is allowed, across jurisdictions.

GET/permissionAPI key

Where a use is allowed, across jurisdictions

Every district in scope where the use is addressed, grouped by jurisdiction, cited and dated.

layer[] and the coverage rows name every jurisdiction in scope we cannot answer for, so a short list is never mistaken for a complete one. Sortable: jurisdiction.name (default), jurisdiction.population, district.code_normalized, level_rank, effective_from, coverage_tier.

Operation ID list_permission_permission_get

Parameters

query

userequiredstring[]
A use_ id or vocabulary slug (energy.storage.battery). Required, repeatable.
level"by_right" | "permitted_with_standards" | "administrative_approval" | "conditional_use"[]
Only these levels. 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.
includestring | null
Comma-separated: control, composition.
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.
include_unknownboolean
A row whose value for a filtered field is unknown, such as a district whose code sets no height limit, is returned and marked filter_outcome: indeterminate rather than dropped. false leaves those rows out.

Responses

200
Collection_RegionalPermission_
Successful Response
401
Problem
credential_missing, credential_invalid or credential_expired: send a live API key as Authorization: Bearer <key>.
402
Problem
quota_exhausted: out of credits. Add credits, then send the request again.
403
Problem
entitlement_missing: your plan doesn't include this operation.
404
Problem
no_such_resource: no record has that id.
422
Problem
The request can't be answered as sent. The code says why.
429
Problem
rate_limited: wait for Retry-After, then retry.
501
Problem
not_available: this operation doesn't answer yet.

Example request

curl -X GET 'https://api.placestack.com/permission?use=townhome' \
  -H 'Authorization: Bearer $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": [
    {
      "constant": true,
      "data_horizon": "2026-09-13",
      "horizon_basis": "measured",
      "id": "prm_01h455vb4pex5vsknk084sn02q",
      "use": "<UseRef>",
      "binds": true,
      "segment": [
        "<PermissionSegment>"
      ],
      "jurisdiction": "<JurisdictionRef>",
      "district_code": "<District Code>",
      "supersession_risk": "<SupersessionRisk>",
      "district": "dst_01h455vb4pex5vsknk084sn02q",
      "overlay": "dst_01h455vb4pex5vsknk084sn02q",
      "private_restriction": "pvr_01h455vb4pex5vsknk084sn02q",
      "filter_outcome": "match"
    }
  ],
  "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",
      "level": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}

law

Ordinances, code text and moratoriums, searchable across jurisdictions.

GET/lawAPI key

Ordinances, code text and moratoriums, across jurisdictions

Search the law across a scope. With q, every hit carries the passage and a citation ready to quote.

Sortable: -effective_from (default), adopted_on, jurisdiction.name.

Operation ID list_law_law_get

Parameters

query

qstring | null
Words or a phrase to find in the text.
mode"literal" | "regex"
How q is matched.
kind"ordinance" | "section" | "moratorium"[]
Only these kinds. Repeatable.
statusstring[]
adopted, proposed, in_force, expired. Repeatable.
subject"solar" | "wind" | "battery_storage" | "noise"[]
What it regulates. Repeatable.
usestring[]
Moratoriums that pause these uses. Repeatable.
adopted[gte]string | null
No description.
adopted[lte]string | 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.
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.
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.
include_unknownboolean
A row whose value for a filtered field is unknown, such as a district whose code sets no height limit, is returned and marked filter_outcome: indeterminate rather than dropped. false leaves those rows out.

Responses

200
Collection_Law_
Successful Response
401
Problem
credential_missing, credential_invalid or credential_expired: send a live API key as Authorization: Bearer <key>.
402
Problem
quota_exhausted: out of credits. Add credits, then send the request again.
403
Problem
entitlement_missing: your plan doesn't include this operation.
404
Problem
no_such_resource: no record has that id.
422
Problem
The request can't be answered as sent. The code says why.
429
Problem
rate_limited: wait for Retry-After, then retry.
501
Problem
not_available: this operation doesn't answer yet.

Example request

curl -X GET 'https://api.placestack.com/law?use=townhome&as_of=2026-09-13&size=50' \
  -H 'Authorization: Bearer $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": "<Id>",
      "kind": "ordinance",
      "jurisdiction": "<JurisdictionRef>",
      "title": "<Title>",
      "status": "string",
      "effective_from": "2026-09-13",
      "citation": "cit_01h455vb4pex5vsknk084sn02q",
      "snippet": "string",
      "ordinance": "<Ordinance>"
    }
  ],
  "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",
      "level": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}
GET/law/{law}API key

One ordinance, section or moratorium

Operation ID get_law_law__law__get

Parameters

path

lawrequiredstring
An ord_, sec_ or mor_ 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.

Responses

200
Single_Law_
Successful Response
401
Problem
credential_missing, credential_invalid or credential_expired: send a live API key as Authorization: Bearer <key>.
402
Problem
quota_exhausted: out of credits. Add credits, then send the request again.
403
Problem
entitlement_missing: your plan doesn't include this operation.
404
Problem
no_such_resource: no record has that id.
422
Problem
The request can't be answered as sent. The code says why.
429
Problem
rate_limited: wait for Retry-After, then retry.
501
Problem
not_available: this operation doesn't answer yet.

Example request

curl -X GET 'https://api.placestack.com/law/law_123?as_of=2026-09-13' \
  -H 'Authorization: Bearer $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": "<Id>",
    "kind": "ordinance",
    "jurisdiction": "<JurisdictionRef>",
    "title": "<Title>",
    "status": "string",
    "effective_from": "2026-09-13",
    "citation": "cit_01h455vb4pex5vsknk084sn02q",
    "snippet": "string",
    "ordinance": "<Ordinance>"
  },
  "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",
      "level": "info",
      "detail": "<Detail>",
      "count": 1,
      "subject": [
        "string"
      ]
    }
  ],
  "coverage": {
    "jurisdiction": "jur_01h455vb4pex5vsknk084sn02q",
    "layer": {
      "key": "<CoverageLayer>"
    },
    "href": "<Href>"
  }
}

Next

Activity

case, permit, meeting.