PermitMap API
Query 84,000+ NYC building permits programmatically. Filter by ZIP, BIN, or recency — get JSON back. Read-only, 1,000 requests/day per Pro account.
Base URL
permitmap.co/api/v1
Auth
Bearer token
Rate limit
1,000 / day
Format
JSON
Authentication
Every request requires a Bearer token in the Authorization header.
- 1
Generate a token from your profile (Pro accounts only).
- 2
Copy the token once — it won't be shown again. Treat it like a password.
- 3
Send it as a Bearer token on every request:
Authorization: Bearer pm_live_a1b2c3d4e5f6g7h8i9j0...Rate limit: 1,000 requests / 24 hours
Exceeding the limit returns 429 Too Many Requests. Counter resets 24 hours after your first request in the window.
/api/v1/permits/zip/{zip}Returns recent permits in a ZIP code, sorted newest first. Useful for monitoring activity in a neighborhood you cover.
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| zip | path | string | — | 5-digit NYC ZIP code. Required. |
| days | query | integer | 30 | Look back N days. Max 90. |
| limit | query | integer | 50 | Max results to return. Max 200. |
Example request
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://permitmap.co/api/v1/permits/zip/10001?days=30&limit=100"Example response
{
"data": [
{
"permit_number": "FEAT-123456",
"work_type": "SH",
"permit_type": "SH - Supported Scaffold",
"house_number": "1755",
"street_name": "STORY AVENUE",
"borough": "BRONX",
"zip_code": "10473",
"owner_name": "1755 STORY AVE LLC",
"permittee_name": "ACME CONSTRUCTION INC",
"issued_date": "2026-04-15",
"expiration_date": "2026-10-15",
"estimated_job_cost": 4750000,
"latitude": 40.8267,
"longitude": -73.8649,
"bin_number": "2034567",
"address_slug": "bronx-1755-story-avenue"
}
],
"count": 1
}/api/v1/permits/bin/{bin}Returns the full permit history for a single building, identified by its NYC BIN. Capped at the 100 most recent permits, sorted newest first.
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| bin | path | string | — | NYC Building Identification Number. Required. |
Example request
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://permitmap.co/api/v1/permits/bin/2034567"Example response
{
"data": [
{
"permit_number": "FEAT-123456",
"work_type": "SH",
"permit_type": "SH - Supported Scaffold",
"house_number": "1755",
"street_name": "STORY AVENUE",
"borough": "BRONX",
"zip_code": "10473",
"owner_name": "1755 STORY AVE LLC",
"permittee_name": "ACME CONSTRUCTION INC",
"issued_date": "2026-04-15",
"expiration_date": "2026-10-15",
"estimated_job_cost": 4750000,
"latitude": 40.8267,
"longitude": -73.8649,
"bin_number": "2034567",
"address_slug": "bronx-1755-story-avenue"
},
{
"permit_number": "FEAT-098765",
"permit_type": "EQ - Construction Equipment",
"issued_date": "2025-11-02",
"expiration_date": "2026-05-02",
"estimated_job_cost": 1250000,
"...": "..."
}
],
"count": 2
}/api/v1/permits/recentReturns the most recently issued permits across all of NYC, optionally filtered by borough. Use this to monitor city-wide permit flow.
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| days | query | integer | 7 | Look back N days. Max 30. |
| limit | query | integer | 50 | Max results to return. Max 200. |
| borough | query | string | — | Filter to one borough. One of: MANHATTAN, BROOKLYN, QUEENS, BRONX, STATEN ISLAND. |
Example request
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://permitmap.co/api/v1/permits/recent?days=7&limit=50&borough=BROOKLYN"Example response
{
"data": [
{
"permit_number": "BKL-998877",
"permit_type": "NB - New Building",
"house_number": "412",
"street_name": "BERGEN STREET",
"borough": "BROOKLYN",
"zip_code": "11217",
"owner_name": "BERGEN HOLDINGS LLC",
"issued_date": "2026-04-30",
"estimated_job_cost": 88000000,
"...": "..."
}
],
"count": 1
}Response fields
Every endpoint returns the same permit object shape — 16 fields per record.
| Field | Type | Notes |
|---|---|---|
| permit_number | string | NYC DOB permit identifier |
| work_type | string | DOB work type code (e.g. A1, A2, NB) |
| permit_type | string | Human-readable type (e.g. "SH - Supported Scaffold") |
| house_number | string | Street number, e.g. "1755" |
| street_name | string | Uppercase street name |
| borough | string | MANHATTAN | BROOKLYN | QUEENS | BRONX | STATEN ISLAND |
| zip_code | string | 5-digit ZIP |
| owner_name | string | Property owner full legal name (Pro-only data point) |
| permittee_name | string | Person/entity that filed the permit |
| issued_date | date | YYYY-MM-DD |
| expiration_date | date | YYYY-MM-DD |
| estimated_job_cost | integer | In cents — divide by 100 for dollars |
| latitude | float | WGS84 |
| longitude | float | WGS84 |
| bin_number | string | NYC Building Identification Number |
| address_slug | string | URL-safe address slug, e.g. "bronx-1755-story-avenue" |
Wrapper: every response is shaped { "data": [...permits], "count": N }.
Errors
All errors return JSON. Check the HTTP status code.
Unauthorized
No token provided, or the token is invalid/revoked.
Forbidden
Token is valid but the account is not on Pro.
Too Many Requests
Rate limit exceeded — 1,000 requests per 24 hours.
Code examples
Complete working examples for the ZIP endpoint.
curl -H "Authorization: Bearer $PERMITMAP_TOKEN" \
"https://permitmap.co/api/v1/permits/zip/10001?days=30&limit=50" \
| jq '.data[] | {permit: .permit_number, owner: .owner_name, cost: (.estimated_job_cost / 100)}'