ZBA decisions
Search zoning board of appeals decisions across U.S. jurisdictions — filter by case status, variance type, and decision date for civic intelligence research.
The ZBA Decisions dashboard is a cross-jurisdiction search surface over Locus's normalized Zoning Board of Appeals catalog. Use it to find variance and special-permit outcomes by jurisdiction, case number, address, decision date, or outcome — and to pull a filtered set as CSV for entitlement, due-diligence, or land-use research.
The page lives at /zba-decisions inside the Locus app and is backed by GET /api/zba-decisions/search.
Coverage
The catalog covers four ZBA jurisdictions, ingested from a mix of structured open-data portals and PDF-based agendas.
| Jurisdiction slug | Source | Ingestion type |
|---|---|---|
nyc | NYC Open Data (Socrata) | Structured API |
philly | OpenDataPhilly (Carto) | Structured API |
chicago | Curated jurisdictional feeds | Structured + PDF |
boston | Curated jurisdictional feeds | Structured + PDF |
NYC and Philadelphia run on dedicated upstream API collectors so refresh cadence matches the underlying portals — typically daily for NYC Socrata and several times per week for Philly Carto. Chicago and Boston are sourced from a mix of structured feeds and PDF-decision parsers, so cadence varies by hearing schedule.
When to use it
Reach for this dashboard when you need to:
- Triage entitlement risk for a target site by reviewing recent variances on adjacent parcels.
- Track outcome rates (Approved / Denied / Granted with Conditions) for a specific variance type or jurisdiction.
- Pull a date-bounded set of decisions into a CSV for diligence binders or model training.
- Click through to the original decision document on the source jurisdiction's portal.
Filters
Every filter narrows the result set on the server side and resets pagination to the first page.
| Filter | Description |
|---|---|
| Jurisdiction | One or more of chicago, boston, nyc, philly. Multi-select. |
| Case # or address | Substring match (ILIKE) against either case_number or address — use the same input to search by either. |
| Outcome | Exact match — one of Approved, Denied, Granted, Granted with Conditions, Pending, Withdrawn. |
| Variance type | Substring match against variance_type (for example, use, bulk, setback, parking). |
| Date from / Date to | Inclusive bounds on decision_date. Either bound is optional. |
A Reset filters link clears every active filter; it appears only when at least one is set.
Sorting and pagination
| Column | Default | Notes |
|---|---|---|
Decision Date (decision_date) | Descending | The default sort — most recent decisions first. |
Occurred At (occurred_at) | — | Upstream event timestamp. |
Jurisdiction (jurisdiction_slug) | — | Alphabetical. |
Click any column header to sort by it; click again to flip direction. Results paginate at 50 per page.
Result columns
Each row corresponds to one ZBA decision:
- Case # — the upstream case or docket number.
- Jurisdiction — normalized jurisdiction slug.
- Address — subject-property address as reported.
- Variance type — truncated to 40 characters in the table; full text available via the API.
- Outcome — color-coded badge (green for
Approved/Granted, red forDenied, amber forGranted with Conditions, blue forPending). - Decision Date — locale-formatted.
- External-link icon — opens the decision's
source_url(the original portal record or PDF) in a new tab. Shown only when a source URL is present.
Export
Click Export CSV to download the currently visible page as zba-decisions.csv. The export honors active filters and sort, and includes: Case Number, Jurisdiction, Address, Variance Type, Outcome, Decision Date, Conditions (conditions truncated to 200 characters).
API
GET /api/zba-decisions/search
Returns a page of normalized ZBA decisions, plus the total count for the active filter set.
Query parameters
| Parameter | Type | Description |
|---|---|---|
jurisdictions | string | Comma-separated jurisdiction slugs (e.g. nyc,philly). |
case_q | string | Substring matched against either case_number or address. |
outcome | string | Exact match — see allowed values above. |
variance_type | string | Substring match against variance_type. |
date_from | string | Inclusive lower bound on decision_date (YYYY-MM-DD). |
date_to | string | Inclusive upper bound on decision_date (YYYY-MM-DD). |
sort_by | string | One of decision_date (default), occurred_at, jurisdiction_slug. |
sort_dir | string | asc or desc (default). |
limit | number | Page size. Default 50, capped at 200. |
offset | number | Zero-based offset. Default 0. |
Response shape
{
"decisions": [
{
"source_key": "nyc:2024-0123",
"jurisdiction_slug": "nyc",
"source": "nyc-socrata",
"source_url": "https://data.cityofnewyork.us/...",
"case_number": "2024-0123-BZ",
"decision_date": "2026-04-12",
"variance_type": "Use variance — eating and drinking establishment",
"outcome": "Granted with Conditions",
"conditions_text": "Subject to operating hours of 7 AM–11 PM…",
"address": "123 W 14TH ST",
"decision_text": "The Board grants the application…",
"occurred_at": "2026-04-12T00:00:00Z",
"ingested_at": "2026-04-13T05:00:00Z"
}
],
"total": 312,
"limit": 50,
"offset": 0
}Example
curl 'https://app.axiomlocus.io/api/zba-decisions/search?jurisdictions=nyc,philly&outcome=Denied&date_from=2026-01-01&limit=100' \
-H 'Cookie: <your session cookie>'The endpoint requires an authenticated Locus session; unauthenticated calls return 401 Unauthorized.
Related
Business licenses
Search and export normalized business licenses across U.S. metros from the Locus dashboard — filter by NAICS, jurisdiction, and issue date.
MCP server
Connect LLMs and AI agents to Axiom Locus and Overwatch using the Model Context Protocol — query scores, signals, and entities without writing API code.