Pro plan required

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. 1

    Generate a token from your profile (Pro accounts only).

  2. 2

    Copy the token once — it won't be shown again. Treat it like a password.

  3. 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.

GET/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

NameInTypeDefaultDescription
zippathstring5-digit NYC ZIP code. Required.
daysqueryinteger30Look back N days. Max 90.
limitqueryinteger50Max 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
}
GET/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

NameInTypeDefaultDescription
binpathstringNYC 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
}
GET/api/v1/permits/recent

Returns the most recently issued permits across all of NYC, optionally filtered by borough. Use this to monitor city-wide permit flow.

Parameters

NameInTypeDefaultDescription
daysqueryinteger7Look back N days. Max 30.
limitqueryinteger50Max results to return. Max 200.
boroughquerystringFilter 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.

FieldTypeNotes
permit_numberstringNYC DOB permit identifier
work_typestringDOB work type code (e.g. A1, A2, NB)
permit_typestringHuman-readable type (e.g. "SH - Supported Scaffold")
house_numberstringStreet number, e.g. "1755"
street_namestringUppercase street name
boroughstringMANHATTAN | BROOKLYN | QUEENS | BRONX | STATEN ISLAND
zip_codestring5-digit ZIP
owner_namestringProperty owner full legal name (Pro-only data point)
permittee_namestringPerson/entity that filed the permit
issued_datedateYYYY-MM-DD
expiration_datedateYYYY-MM-DD
estimated_job_costintegerIn cents — divide by 100 for dollars
latitudefloatWGS84
longitudefloatWGS84
bin_numberstringNYC Building Identification Number
address_slugstringURL-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.

401

Unauthorized

No token provided, or the token is invalid/revoked.

403

Forbidden

Token is valid but the account is not on Pro.

429

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)}'