US Building Permit Scraper
Pricing
from $2.00 / 1,000 results
US Building Permit Scraper
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
Actor stats
0
Bookmarked
1
Total users
1
Monthly active users
10 days ago
Last modified
Categories
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:
| Platform | Cities | US Pop Coverage | Keyword Search |
|---|---|---|---|
| Accela | 163 | 32.1% | ✅ |
| EnerGov | 37 | 6.1% | ✅ |
| Socrata | 6 (NYC, LA, Chicago…) | 11.7% | ✅ |
| ArcGIS FeatureServer | 10 | 3.7% | ✅ |
| Phoenix PDD (custom) | 1 | 1.1% | ✅ |
| DC DCGIS | 1 | 0.5% | ✅ |
| Portland MapServer | 1 | 0.4% | ✅ |
| City-specific scrapers | 70+ | ~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
| Field | Type | Default | Description |
|---|---|---|---|
city | string | — | City name (e.g. "Chicago") |
state | string | — | State name or 2-letter abbreviation |
cities | array | — | Batch mode: [{city, state}, ...] |
startDate | string | 7 days ago | Start date YYYY-MM-DD |
endDate | string | today | End date YYYY-MM-DD |
maxPermits | integer | 0 (unlimited) | Max permits returned per city |
keyword | string | — | Filter permits by keyword (e.g. "solar", "HVAC", "demolition") |
searchAllCities | boolean | false | Search all 287+ supported cities. Best used with keyword. |
includePlaywright | boolean | false | When searchAllCities is true, also include Accela/EnerGov cities (163+ more, browser-based, slower). Auto-enabled when keyword is set. |
maxCitiesPerRun | integer | 0 (unlimited) | Cap cities when using searchAllCities |
concurrencyApi | integer | 8 | Parallel scrapers for API-based cities |
concurrencyBrowser | integer | 3 | Parallel browser instances for Accela/EnerGov |
proxyConfig | object | — | Apify 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.
| State | Cities |
|---|---|
| AK | Anchorage |
| AL | Birmingham, Montgomery, Mobile, Huntsville |
| AR | Little Rock |
| AZ | Phoenix, Tucson, Mesa, Chandler, Gilbert, Scottsdale, Tempe, Yuma, Avondale, Goodyear |
| CA | Los 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 |
| CO | Denver, Colorado Springs, Aurora, Fort Collins, Lakewood, Westminster, Boulder, Greeley, Longmont, Loveland |
| CT | Stamford, Hartford |
| DC | Washington |
| FL | Jacksonville, 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 |
| GA | Atlanta, Columbus, Albany |
| HI | Honolulu |
| IA | Des Moines |
| ID | Boise, Meridian |
| IL | Chicago, Aurora, Naperville, Springfield, Arlington Heights, Evanston |
| IN | Indianapolis, Fort Wayne, South Bend, Carmel |
| KS | Wichita, Kansas City, Olathe, Topeka, Lawrence |
| KY | Louisville |
| LA | New Orleans |
| MA | Boston, Worcester, Springfield, Cambridge |
| MD | Baltimore |
| ME | Portland |
| MI | Detroit, Grand Rapids, Rochester Hills |
| MN | Minneapolis, St. Paul, Rochester, St. Cloud |
| MO | Kansas City, St. Louis, Independence, St. Joseph |
| MT | Missoula |
| NC | Charlotte, Raleigh, Greensboro, Durham, Fayetteville, Cary, Wilmington, High Point, Concord |
| ND | Fargo |
| NE | Omaha, Lincoln |
| NJ | Paterson, Elizabeth |
| NM | Albuquerque, Las Cruces |
| NV | Las Vegas, Henderson, Reno, North Las Vegas, Sparks |
| NY | New York, Rochester, Syracuse, Albany |
| OH | Columbus, Cleveland, Cincinnati, Dayton |
| OK | Oklahoma City, Tulsa |
| OR | Portland, Salem, Eugene, Gresham, Hillsboro |
| PA | Philadelphia, Pittsburgh, Reading |
| SC | Charleston |
| SD | Sioux Falls |
| TN | Memphis, Nashville, Knoxville, Clarksville, Franklin |
| TX | Dallas, 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 |
| UT | Salt Lake City |
| VA | Virginia Beach, Norfolk, Chesapeake, Richmond, Newport News, Alexandria |
| WA | Seattle, Spokane, Tacoma, Yakima, Pasco |
| WI | Milwaukee, Madison |
| WV | Charleston |
Running Locally
# Install dependenciespip install -r requirements.txtplaywright install chromium# Single citypython src/main.py --city Chicago --state IL --start 2025-01-01 --end 2025-01-31# Keyword search across all API citiespython src/main.py --keyword solar --all --start 2025-01-20 --end 2025-01-27# With concurrency tuningpython 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.jsonecho '{"city":"Dallas","state":"TX","startDate":"2025-01-01","endDate":"2025-01-31"}' > INPUT.jsonpython 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 REST — NYC, LA, Chicago, Seattle, NOLA, more (keyword: $q)├── arcgis_scraper.py httpx REST — DC, 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 scrapersdata/└── 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=0means no limit — use with caution on large date ranges for major cities.- Some fields (contractor, owner, value) are not available from all city portals.
