/zoning-analysis-nyc — Zoning Envelope Analysis (New York City)
Analyze building envelope rules for any lot in New York City using the PLUTO database (NYC Open Data) and the NYC Zoning Resolution.
Workflow
Step 1: Parse Input
Accept one of the following identifiers:
- Address + Borough/Zip — e.g., "123 Main St, Brooklyn 11201"
- BBL — 10-digit Borough-Block-Lot (e.g., 3012340056 = Brooklyn, Block 1234, Lot 56)
- BIN — Building Identification Number
Normalize to BBL format: [borough 1 digit][block 5 digits][lot 4 digits]
Borough codes:
| Code | Borough |
|---|---|
| 1 | Manhattan |
| 2 | Bronx |
| 3 | Brooklyn |
| 4 | Queens |
| 5 | Staten Island |
Step 2: Query PLUTO (tabular + polygon)
Fetch lot data from two NYC APIs in parallel:
2a. Tabular data (Socrata PLUTO)
Endpoint: https://data.cityofnewyork.us/resource/64uk-42ks.json
Query by BBL:
https://data.cityofnewyork.us/resource/64uk-42ks.json?bbl=XXXXXXXXXX
Query by address (fallback):
https://data.cityofnewyork.us/resource/64uk-42ks.json?$where=address='123 MAIN STREET' AND zipcode='10001'
No authentication required for basic queries.
Read zoning-rules/pluto-fields.md for the full field reference.
Extract these key fields:
bbl— Borough-Block-Lotaddress,zipcode— street addresszonedist1throughzonedist4— zoning district(s)overlay1,overlay2— commercial overlay districtsspdist1,spdist2,spdist3— special purpose districtsltdheight— limited height districtsplitzone— Y if lot is split across zoneslotarea— lot area in SFbldgarea— total building area in SFbuiltfar— as-built FARresidfar— maximum residential FARcommfar— maximum commercial FARfacilfar— maximum community facility FARnumfloors— existing number of floorslanduse— current land use categoryzonemap— zoning map numberlandmark— landmark designationhistdist— historic district nameborocode,block,lot— parsed BBL components
2b. Lot polygon (MapPLUTO ArcGIS Feature Service)
Endpoint: https://a841-dotweb01.nyc.gov/arcgis/rest/services/GAZETTEER/MapPLUTO/MapServer/0/query
Query by BBL:
https://a841-dotweb01.nyc.gov/arcgis/rest/services/GAZETTEER/MapPLUTO/MapServer/0/query?where=BBL='XXXXXXXXXX'&outFields=BBL&f=json&outSR=4326
This returns the exact tax lot polygon in WGS84 (lat/lon). No authentication required.
Convert to local feet:
- Extract the
features[0].geometry.rings[0]coordinate array (pairs of[lon, lat]) - Compute the centroid latitude for the cos correction factor:
cos(lat) - Convert to local feet using:
x_ft = (lon - lon_min) × 111320 × cos(lat) × 3.28084y_ft = (lat - lat_min) × 111320 × 3.28084
- Origin at the southernmost point (Y=0 at street/south side)
- Output a
LOT_POLYarray of[x, y]pairs in feet - Verify the computed area against PLUTO's
lotarea(expect ±5% due to projection)
Always use the real polygon for the 3D envelope viewer. Never fall back to a lotfront × lotdepth rectangle when polygon data is available.
If either query returns no results, inform the user and ask them to verify the address or BBL.
Step 3: Identify Zoning District
Map the zonedist1 value to its district type:
| Prefix | Type | Normativa File |
|---|---|---|
| R | Residential | zoning-rules/residential.md |
| C | Commercial | zoning-rules/commercial.md |
| M | Manufacturing | zoning-rules/manufacturing.md |
Check for:
- Split zones (
splitzone = Y): Analyze eachzonedist1–zonedist4separately. Pro-rate FAR by estimated area in each zone if lot dimensions are available, otherwise present both sets of controls. - Contextual suffixes (A, B, D, X): If the district code ends in a letter suffix (e.g., R7A, C6-2A), also load
zoning-rules/contextual-districts.md. - Commercial overlays (
overlay1/overlay2): If present (e.g., C1-4, C2-5), loadzoning-rules/commercial.mdfor overlay rules. - Special districts (
spdist1–spdist3): If present, loadzoning-rules/special-districts.md. - Limited height (
ltdheight): Note the height cap.
State your district identification and reasoning clearly.
Step 4: Load Normativa
Read the relevant regulation files from the skill's zoning-rules/ directory:
- Always read:
zoning-rules/overview.md— system primer - Primary district file: One of
residential.md,commercial.md, ormanufacturing.md - Conditionally read:
zoning-rules/contextual-districts.md— if district has A/B/D/X suffixzoning-rules/special-districts.md— ifspdist1–spdist3are populatedzoning-rules/use-groups.md— for permitted use analysiszoning-rules/parking.md— for parking requirementszoning-rules/city-of-yes.md— for recent reform impacts
Step 5: Determine Bulk Controls
Calculate the building envelope for the lot:
-
Floor Area Ratio (FAR):
- Residential FAR (from
residfaror district table) - Commercial FAR (from
commfaror district table) - Community Facility FAR (from
facilfaror district table) - Maximum zoning floor area = FAR × lot area
- Residential FAR (from
-
Building Height:
- Base height range (contextual districts)
- Maximum building height
- Sky exposure plane angle and setback distance
- Limited height district cap (if applicable)
-
Setbacks:
- Front: initial setback distance and sky exposure plane
- Side: narrow/wide street rules
- Rear: standard 30 ft for residential, varies for commercial
- Sky exposure plane: ratio and starting height
-
Lot Coverage:
- Maximum lot coverage percentage
- Open space ratio (for non-contextual R districts)
-
Yards:
- Front yard requirements
- Side yard requirements (corner lots, through lots)
- Rear yard: typically 30 ft or 20% of lot depth
Apply contextual district rules when suffix is present — these override standard height/setback rules with mandatory streetwall, base height, and setback requirements.
Step 6: Check Overlays & Special Districts
Layer additional regulations on top of base district controls:
-
Commercial overlays (C1-1 through C2-5 in residential districts):
- Additional commercial FAR (typically 1.0 or 2.0)
- Commercial use depth limit (typically 150 ft from street)
- Permitted commercial uses (Use Groups 5–9 for C1, 5–14 for C2)
-
Special purpose districts:
- Modified bulk controls, use restrictions, design requirements
- Check
zoning-rules/special-districts.mdfor the specific district
-
Inclusionary Housing:
- Bonus FAR available in designated areas
- Mandatory Inclusionary Housing (MIH) areas: must provide affordable units for bonus
-
Landmark / Historic District:
- If
landmarkorhistdistis populated, note that Landmarks Preservation Commission (LPC) review is required - Bulk controls still apply but modifications may need LPC approval
- If
-
City of Yes reforms:
- Check
zoning-rules/city-of-yes.mdfor applicable changes - Universal Affordability Preference (UAP): +20% FAR for affordable housing
- Town Center Zoning: ground-floor commercial in residential districts near transit
- Parking: most mandates eliminated citywide
- Check
Step 7: Present Analysis
Use the output format below to present a structured, comprehensive analysis.
Step 8: Save Report
Write the analysis to a markdown file in the current working directory:
- Filename:
zoning-analysis-[address-slug].md - Example:
zoning-analysis-123-main-st-brooklyn.md
Output Format
# Zoning Analysis — [Address], [Borough]
## Lot Summary
| Parameter | Value |
|-----------|-------|
| BBL | X-XXXXX-XXXX |
| Address | ... |
| Borough | ... |
| Lot Area | ... SF |
| Current Building Area | ... SF |
| Current FAR (built) | ... |
| Current Use | .