Building Permits Scraper - National Permit Aggregator
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 proxies, 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. |
proxyConfiguration |
object | (off) | Optional Apify proxy. Not needed for any supported portal. |
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.
Does Building Permits Aggregator need proxies?
No. All supported portals (Socrata, CARTO) are public open-data services designed for third-party consumption. The actor defaults to direct requests — no proxy configuration needed.
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.