US Building Permit Scraper avatar

US Building Permit Scraper

Under maintenance

Pricing

from $2.00 / 1,000 results

Go to Apify Store
US Building Permit Scraper

US Building Permit Scraper

Under maintenance

Search any keyword (solar, HVAC, demolition) across 248 US cities at once — or scrape by city + date range. 63%+ US population covered. Supports Accela, Socrata, ArcGIS, EnerGov + 70 city-specific scrapers.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

PaxIQ

PaxIQ

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

10 days ago

Last modified

Share

🏗️ US Building Permit Scraper

Search any keyword across 248 US cities at once — or scrape by city + date range. The only building permit actor with nationwide keyword search.

Overview

Search for "solar", "HVAC", "demolition", or any phrase and get every matching permit back from all 248 supported cities in a single run. Or target a specific city and date range for a full permit pull.

Covers 63%+ of the US population across Accela, Socrata, ArcGIS, EnerGov, and 70+ city-specific scrapers — no configuration needed. Drop in a city name and go.

Supported platforms:

PlatformCitiesUS Pop CoverageKeyword Search
Accela16332.1%
EnerGov376.1%
Socrata6 (NYC, LA, Chicago…)11.7%
ArcGIS FeatureServer103.7%
Phoenix PDD (custom)11.1%
DC DCGIS10.5%
Portland MapServer10.4%
City-specific scrapers70+~10%

Total: 248 cities, 88M+ people covered

Input

Single city

{
"city": "Chicago",
"state": "IL",
"startDate": "2025-01-01",
"endDate": "2025-01-31"
}

Batch mode — multiple cities

{
"cities": [
{"city": "New York", "state": "NY"},
{"city": "Los Angeles", "state": "CA"},
{"city": "Dallas", "state": "TX"}
],
"startDate": "2025-01-01",
"endDate": "2025-01-31"
}

Keyword search across all cities

{
"keyword": "solar",
"searchAllCities": true,
"startDate": "2025-01-20",
"endDate": "2025-01-27"
}

All input fields

FieldTypeDefaultDescription
citystringCity name (e.g. "Chicago")
statestringState name or 2-letter abbreviation
citiesarrayBatch mode: [{city, state}, ...]
startDatestring7 days agoStart date YYYY-MM-DD
endDatestringtodayEnd date YYYY-MM-DD
maxPermitsinteger0 (unlimited)Max permits returned per city
keywordstringFilter permits by keyword (e.g. "solar", "HVAC", "demolition")
searchAllCitiesbooleanfalseSearch all 287+ supported cities. Best used with keyword.
includePlaywrightbooleanfalseWhen searchAllCities is true, also include Accela/EnerGov cities (163+ more, browser-based, slower). Auto-enabled when keyword is set.
maxCitiesPerRuninteger0 (unlimited)Cap cities when using searchAllCities
concurrencyApiinteger8Parallel scrapers for API-based cities
concurrencyBrowserinteger3Parallel browser instances for Accela/EnerGov
proxyConfigobjectApify proxy config for Playwright scrapers

Output

Each record follows a normalized schema:

{
"permit_number": "B25-001234",
"city": "Chicago",
"state": "Illinois",
"address": "5139 S LECLAIRE AVE",
"permit_type": "PERMIT – EXPRESS PERMIT PROGRAM",
"description": "INSTALL SOLAR PANELS ON ROOF OF PRINCIPAL BUILDING",
"status": "COMPLETE",
"apply_date": "2025-01-02",
"issue_date": "2025-01-02",
"value": "18500",
"contractor": "SUNRUN INSTALLATION SERVICES INC",
"owner": "PROPERTY OWNER LLC",
"source_platform": "socrata",
"source_url": "https://data.cityofchicago.org/resource/ydr8-5enu.json",
"scraped_at": "2025-01-31T18:00:00+00:00"
}

Data is pulled live from city portals on each run — always current as of the moment the actor executes. Fields may be empty strings if not provided by the source portal.

Use Cases

  • Solar / roofing contractors — find recently permitted jobs in your market
  • Real estate & construction intel — track building activity by city, type, or contractor
  • Lead generation — new construction permits = new potential customers
  • Market research — permit volume trends by city or permit type
  • Compliance monitoring — track specific addresses or contractors

Supported Cities

248 cities across 40 states + DC. Sorted by population within each state. Don't see yours? Email daniel@paxiq.com to request it.

StateCities
AKAnchorage
ALBirmingham, Montgomery, Mobile, Huntsville
ARLittle Rock
AZPhoenix, Tucson, Mesa, Chandler, Gilbert, Scottsdale, Tempe, Yuma, Avondale, Goodyear
CALos Angeles, San Diego, San Jose, San Francisco, Fresno, Sacramento, Long Beach, Oakland, Bakersfield, Anaheim, Santa Ana, Riverside, Stockton, Chula Vista, Irvine, San Bernardino, Modesto, Fontana, Huntington Beach, Glendale, Santa Clarita, Ontario, Santa Rosa, Rancho Cucamonga, Elk Grove, Lancaster, Corona, Palmdale, Salinas, Escondido, Torrance, Pasadena, Thousand Oaks, Visalia, Roseville, Concord, Santa Clara, Berkeley, El Monte, Downey, Costa Mesa, Inglewood, Carlsbad, Fairfield, Richmond, Antioch, San Mateo, Jurupa Valley, Vista, Hesperia, Westminster, Santa Barbara, San Leandro, Whittier, Hawthorne, Citrus Heights, Livermore, Indio, Menifee, Chino, Napa, Chino Hills, Alameda, Pleasanton, Perris, Manteca, Yorba Linda, Walnut Creek, Pittsburg, Palo Alto, Davis, Yuba City
CODenver, Colorado Springs, Aurora, Fort Collins, Lakewood, Westminster, Boulder, Greeley, Longmont, Loveland
CTStamford, Hartford
DCWashington
FLJacksonville, Miami, Tampa, St. Petersburg, Hialeah, Tallahassee, Fort Lauderdale, Port St. Lucie, Cape Coral, Pembroke Pines, Hollywood, Miramar, Gainesville, Coral Springs, Clearwater, Plantation, Deltona, Largo, Melbourne, Weston, Fort Myers
GAAtlanta, Columbus, Albany
HIHonolulu
IADes Moines
IDBoise, Meridian
ILChicago, Aurora, Naperville, Springfield, Arlington Heights, Evanston
INIndianapolis, Fort Wayne, South Bend, Carmel
KSWichita, Kansas City, Olathe, Topeka, Lawrence
KYLouisville
LANew Orleans
MABoston, Worcester, Springfield, Cambridge
MDBaltimore
MEPortland
MIDetroit, Grand Rapids, Rochester Hills
MNMinneapolis, St. Paul, Rochester, St. Cloud
MOKansas City, St. Louis, Independence, St. Joseph
MTMissoula
NCCharlotte, Raleigh, Greensboro, Durham, Fayetteville, Cary, Wilmington, High Point, Concord
NDFargo
NEOmaha, Lincoln
NJPaterson, Elizabeth
NMAlbuquerque, Las Cruces
NVLas Vegas, Henderson, Reno, North Las Vegas, Sparks
NYNew York, Rochester, Syracuse, Albany
OHColumbus, Cleveland, Cincinnati, Dayton
OKOklahoma City, Tulsa
ORPortland, Salem, Eugene, Gresham, Hillsboro
PAPhiladelphia, Pittsburgh, Reading
SCCharleston
SDSioux Falls
TNMemphis, Nashville, Knoxville, Clarksville, Franklin
TXDallas, Austin, Fort Worth, El Paso, Arlington, Plano, Lubbock, Amarillo, Brownsville, Pasadena, McKinney, Mesquite, McAllen, Carrollton, Allen, Wichita Falls, Pharr, Coppell, Rosenberg, La Porte, Southlake, Princeton
UTSalt Lake City
VAVirginia Beach, Norfolk, Chesapeake, Richmond, Newport News, Alexandria
WASeattle, Spokane, Tacoma, Yakima, Pasco
WIMilwaukee, Madison
WVCharleston

Running Locally

# Install dependencies
pip install -r requirements.txt
playwright install chromium
# Single city
python src/main.py --city Chicago --state IL --start 2025-01-01 --end 2025-01-31
# Keyword search across all API cities
python src/main.py --keyword solar --all --start 2025-01-20 --end 2025-01-27
# With concurrency tuning
python src/main.py --keyword solar --all --start 2025-01-01 --end 2025-01-31 \
--concurrency-api 10 --concurrency-browser 3 --max-cities 50
# Via INPUT.json
echo '{"city":"Dallas","state":"TX","startDate":"2025-01-01","endDate":"2025-01-31"}' > INPUT.json
python src/main.py

Output is saved to output/<city>_permits.json.

Architecture

src/
├── main.py Apify entry point — reads input, routes, pushes results
├── router.py City → platform routing + scraper adapters
├── normalize.py Standardizes raw output to common 14-field schema
├── accela_scraper.py Playwright — 163 cities (keyword: form Description field)
├── energov_scraper.py Playwright + httpx — 37 cities
├── socrata_scraper.py httpx RESTNYC, LA, Chicago, Seattle, NOLA, more (keyword: $q)
├── arcgis_scraper.py httpx RESTDC, Nashville, Minneapolis, Baltimore, more (keyword: WHERE LIKE)
├── phoenix_scraper.py httpx CSV export — Phoenix, AZ
├── portland_scraper.py httpx ArcGIS MapServer — Portland, OR
├── dc_scraper.py httpx DCGIS multi-layer — Washington, DC
└── <city>_scraper.py 70+ city-specific scrapers
data/
└── cities_discovered.json 248 supported US cities with platform + portal URL

Concurrency model:

  • API scrapers (Socrata, ArcGIS, httpx): up to 8 parallel by default
  • Browser scrapers (Accela, EnerGov): up to 3 parallel (RAM-limited, ~300MB each)
  • Results stream to the dataset as each city completes — no waiting for all cities

Support & City Requests

Need a city that isn't listed? Email daniel@paxiq.com with the city name and state — new cities are added regularly and most can be turned around quickly.

Notes

  • Data is live — pulled directly from city permit portals on each run, not from a cached database. Results are always current as of the run time.
  • Playwright scrapers (Accela, EnerGov) run headless Chromium — slower but handle JS-heavy portals. Keyword search on Accela uses the portal's own Description field for server-side filtering.
  • API scrapers (Socrata, ArcGIS) push keyword filters to the server — only matching records are transferred.
  • maxPermits=0 means no limit — use with caution on large date ranges for major cities.
  • Some fields (contractor, owner, value) are not available from all city portals.