Building Permits Scraper - National Permit Aggregator
Independent tool. Trademarks referenced on this page are the property of their respective owners and are used only to identify the public website this tool reads. No affiliation or endorsement.
Building Permits Scraper - National Construction Permit Aggregator
Aggregate US building and construction permits across 15 major jurisdictions — NYC, LA, Chicago, Austin, San Francisco, Seattle, Dallas, Philadelphia, and more — into one normalized dataset. Returns permit type, valuation, geocoded address, contractor, owner, and large-project / new-construction flags drawn from roughly 10 million public records.
Building Permits Aggregator Features
- Covers 15 US jurisdictions out of the box, spanning every major region from the Northeast to the Pacific. The registry grows by adding one entry per city.
- Normalizes disparate open-data schemas (Socrata SODA v2, CARTO SQL) into a single 25-field output model. No per-city post-processing.
- Round-robin pagination distributes results across jurisdictions — you see permits from every requested metro before any one dominates the budget.
- Filters by issue date range, minimum valuation, new-construction-only, and state. Tags large projects above a configurable threshold.
- Geocoded output: latitude/longitude on every record that the source portal publishes them on.
- Pure API access — no browser, no CAPTCHA. Just JSON.
What Can You Do With National Permit Data?
- Construction lead generation — Pull issued residential or commercial permits by metro, filter by valuation, and feed them into a CRM the same day.
- Contractor sales (roofing, solar, HVAC) — Target homeowners whose permit descriptions reference re-roofing, solar installation, or HVAC replacement. The raw description field makes this easy.
- PropTech and real-estate intelligence — Track building-activity trends by ZIP, by contractor, or by owner across metros without maintaining 15 separate ETL pipelines.
- Commercial GC market intel — Use the
is_large_projectflag andminValuationUsdfilter to isolate commercial-scale permits in a region. - Insurance and appraisal workflows — Pair permit history with property records to validate improvements, flag unpermitted work, or score risk.
How the Aggregator Works
- Pick a set of jurisdictions by slug (
nyc,los-angeles,chicago,austin, ...) or by state (CA,TX,NY) — or leave both empty to pull from every supported metro. - Optionally set an
issuedAfter/issuedBeforedate range. The aggregator adds the appropriate$whereclause per jurisdiction. - It round-robins through the jurisdictions, fetching a page of permits from each in turn. Pagination, rate limiting, and per-city transformation all happen automatically.
- Records come back in a single flat schema, ready for a warehouse, a CRM, or a CSV export.
Input
{
"jurisdictions": ["nyc", "los-angeles", "chicago"],
"issuedAfter": "2025-01-01",
"minValuationUsd": 50000,
"maxItems": 500
}
| Field | Type | Default | Description |
|---|---|---|---|
jurisdictions |
array[string] | (all) | City/metro slugs. See supported list below. |
states |
array[string] | — | 2-letter state codes. Expands to every supported metro in the state. |
issuedAfter |
string | 2025-01-01 |
YYYY-MM-DD lower bound on issue date. |
issuedBefore |
string | "" |
YYYY-MM-DD upper bound on issue date. Empty = no upper bound. |
minValuationUsd |
integer | 0 |
Drop permits with declared valuation below this. |
onlyNewConstruction |
boolean | false |
Keep only permits normalized as new (excludes repairs, alterations, demolitions). |
largeProjectThresholdUsd |
integer | 100000 |
Sets the is_large_project tag threshold. Does not filter. |
maxItems |
integer | 100 |
Maximum records to return across all jurisdictions. |
Supported Jurisdictions
| Slug | Metro | State |
|---|---|---|
nyc |
New York City (DOB NOW Approved Permits) | NY |
los-angeles |
Los Angeles | CA |
chicago |
Chicago | IL |
austin |
Austin | TX |
san-francisco |
San Francisco | CA |
seattle |
Seattle | WA |
dallas |
Dallas | TX |
philadelphia |
Philadelphia (CARTO SQL API) | PA |
new-orleans |
New Orleans | LA |
baton-rouge |
Baton Rouge | LA |
cincinnati |
Cincinnati | OH |
mesa |
Mesa | AZ |
san-diego-county |
San Diego County | CA |
montgomery-county-md |
Montgomery County | MD |
fort-collins |
Fort Collins | CO |
Example: pull one metro, high-value projects only
{
"jurisdictions": ["los-angeles"],
"issuedAfter": "2024-01-01",
"minValuationUsd": 500000,
"maxItems": 1000
}
Example: sweep every California jurisdiction
{
"states": ["CA"],
"issuedAfter": "2025-01-01",
"maxItems": 5000
}
Building Permits Output Fields
{
"permit_id": "M01370970-S1-PL",
"source_jurisdiction": "nyc",
"source_url": "https://data.cityofnewyork.us/Housing-Development/DOB-NOW-Build-Approved-Permits/rbx6-tga4",
"permit_type": "alteration",
"permit_type_raw": "Plumbing",
"sub_type": "",
"work_class": "Plumbing",
"description": "PLUMBING WORK IN CONJUNCTION WITH INTERIOR RENOVATION OF APARTMENT 15CD.",
"status": "Permit Issued",
"issued_date": "2026-04-17",
"application_date": "2026-04-12",
"finaled_date": "2026-05-19",
"valuation_usd": 18000,
"address": "400 WEST 12 STREET",
"city": "New York",
"state": "NY",
"zip": "10014",
"lat": 40.7371,
"lng": -74.009934,
"parcel_apn": "640-7501",
"owner_name": "Justin Minskoff",
"applicant_name": "EDUART KULLA",
"contractor_name": "AQUEDUCT MECHANICAL CORP",
"contractor_license": "002532",
"is_new_construction": false,
"is_large_project": false
}
| Field | Type | Description |
|---|---|---|
permit_id |
string | Jurisdiction-assigned permit number (primary key within source). |
source_jurisdiction |
string | Slug of the jurisdiction that produced this record (nyc, los-angeles, etc.). |
source_url |
string | Human-readable URL for the source dataset on the city portal. |
permit_type |
string | Normalized type: new, addition, alteration, demolition, repair, or other. |
permit_type_raw |
string | Raw permit-type string from the source (useful when you need the original city taxonomy). |
sub_type |
string | commercial, residential, or mixed when the source exposes it. |
work_class |
string | Work-class / scope category straight from the source. |
description |
string | Free-text description of the work. |
status |
string | Permit status (issued, finaled, expired, etc.) as reported by the source. |
issued_date |
string | Date the permit was issued (YYYY-MM-DD). |
application_date |
string | Date the permit was filed / applied for. |
finaled_date |
string | Date the permit reached final status, when available. |
valuation_usd |
number | Declared project valuation in USD. 0 if the source doesn't publish it. |
address |
string | Street address of the project. |
city |
string | City of the project. |
state |
string | Two-letter state code. |
zip |
string | ZIP / postal code. |
lat |
number | Latitude (WGS84). |
lng |
number | Longitude (WGS84). |
parcel_apn |
string | Parcel / APN / tax-assessor ID when available. |
owner_name |
string | Property owner name when published. |
applicant_name |
string | Permit applicant name when published. |
contractor_name |
string | General contractor / business name when published. |
contractor_license |
string | Contractor state license number when published. |
is_new_construction |
boolean | true when permit_type normalizes to new. |
is_large_project |
boolean | true when valuation_usd meets or exceeds largeProjectThresholdUsd. |
FAQ
How do I scrape building permits across multiple US cities?
Building Permits Aggregator ships with a registry of 15 jurisdictions and normalizes them into a single schema. Pick jurisdictions by slug, by state, or leave both empty to hit every supported metro in a single run.
How much does Building Permits Aggregator cost to run?
Building Permits Aggregator runs on pay-per-event pricing: $0.10 per actor start plus $0.001 per record. A 10K-permit metro sweep is about $10 including start. A 500K-permit national pull is about $500.
Can I filter by valuation or project type?
Yes. minValuationUsd drops records below a threshold. onlyNewConstruction restricts to permits normalized as new construction. largeProjectThresholdUsd controls the is_large_project tag that commercial-GC users typically filter on downstream.
What's the difference between permit_type and permit_type_raw?
permit_type is the normalized value — one of new, addition, alteration, demolition, repair, or other — so you can query consistently across cities. permit_type_raw is whatever the source portal shipped, for when you need the original taxonomy.
Which cities are coming next?
The most-requested additions are Boston, Houston, San Jose, Miami, and Denver. Boston is currently blocked by Cloudflare on its CKAN endpoint; the rest depend on per-city API research. File a request for the metro you need.
Need More Features?
Need a city that isn't in the registry, contractor-license cross-references, or a custom field? File an issue or get in touch.
Why Use the Building Permits Aggregator?
- One schema, fifteen cities — You write one query and get normalized results from NYC, LA, Chicago, and a dozen more. No per-city ETL.
- Cheap to run — $0.001 per record. A full metro sweep is coffee money, not a budget line item.
- Built for the lead-gen workflow —
is_new_construction,is_large_project,minValuationUsd, and geocoded addresses cover the filters that construction, roofing, solar, and insurance vendors ask for.
Further reading: Building Permit Data and Property Records: Where to Get Them in Bulk