US Building Permits Scraper - 38 City Sources
Pricing
from $4.00 / 1,000 permits
US Building Permits Scraper - 38 City Sources
Building permits from 38 official US city and county open-data portals in one schema, no API key. Each record: permit number, type, trade, issued date, address, valuation, contractor name, geocodes. Filter by trade, date or valuation, export CSV or JSON, schedule a daily feed. Pay per record.
Pricing
from $4.00 / 1,000 permits
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
US Building Permits Scraper - 38 City Sources
This building permits scraper pulls fresh permits from 38 official US city and county open-data sources, normalized into one schema, classified by trade, and exported as JSON, CSV or Excel. Built for contractor lead generation (roofing, solar, HVAC, plumbing, pools), construction and real-estate market intelligence, and AI agents that need structured permit data.
Every record comes straight from the jurisdiction's official public portal (Socrata, ArcGIS, CKAN, Carto, or published city files). No third-party middlemen, no stale mirrors. Most sources update daily.
Quick start
- Pick your cities (or
all). - Set the date window, for example permits issued in the last 14 days (
issuedAfter). - Optionally filter by trade (
roofing,solar), minimum valuation (minValuation) or search text. - Click Start. Export JSON, CSV or Excel from the dataset, or run it on a schedule, through the API, or as an MCP tool for your AI agents.
Example: roofing leads in Texas metros
{"cities": ["austin", "san-antonio", "arlington-tx"],"issuedAfter": "2026-08-04","trades": ["roofing"],"maxRecordsTotal": 500}
Example: high-value commercial activity in Chicago
{"cities": ["chicago"],"issuedAfter": "2026-07-01","minValuation": 1000000}
What you get
One normalized record per permit:
{"city": "Denver","state": "CO","jurisdiction": "Denver, CO","permit_number": "2026-RESCON-0001780","permit_type": "Alteration/Tenant Finish","permit_subtype": "Residential","trade": "building","description": null,"status": null,"issued_date": "2026-08-10","applied_date": "2026-06-02","expires_date": null,"finaled_date": null,"address": "599 S Dale CT","zipcode": null,"latitude": 39.69,"longitude": -104.99,"valuation": 8000,"contractor_name": "SENNETT WINDOWS","contractor_license": null,"contractor_phone": null,"applicant_name": null,"owner_name": null,"source": "Denver Open Data — construction permits","source_dataset_url": "https://opendata-geospatialdenver.hub.arcgis.com"}
Fields a jurisdiction does not publish come back as null. See the coverage table for exactly what each city provides. We never invent or "enrich" data that is not in the official record.
Why this Actor
- One schema for 38 jurisdictions. Every city publishes permits differently: different portals, field names and date formats. This Actor refines them into a single normalized record, so
contractor_namemeans the same thing in Seattle as it does in Miami-Dade. - Trade classification built in. Each permit is classified as
roofing,solar,electrical,plumbing,mechanical,pool,demolition,fence,sign,fire,grading,buildingorother, so you can filter to exactly the leads you sell to. - Honest pricing. You pay per permit record delivered. Zero results, a broken city source or an invalid input means no per-record charges, ever.
- Fresh. Verified update cadence: most sources publish within 1 to 3 days of issuance. The few that lag are flagged in the coverage table.
Coverage (verified live)
| Jurisdiction | Address | Valuation | Contractor | Lat/Lon | Notes |
|---|---|---|---|---|---|
| Atlanta, GA | ✓ | ✓ | no | ✓ | recent-activity window (about 1 year) |
| Austin, TX | ✓ | partial | ✓ +phone | partial | |
| Baltimore, MD | ✓ | partial | no | ✓ | 2019 to present |
| Arlington, TX | no | ✓ | no | ✓ | no street address published |
| Baton Rouge, LA | ✓ | ✓ | ✓ | ✓ | |
| Boston, MA | ✓ | ✓ | no | ✓ | applicant published |
| Chicago, IL | ✓ | ✓ | ✓ | ✓ | |
| Cincinnati, OH | ✓ | ✓ | ✓ | ✓ | |
| Cleveland, OH | ✓ | ✓ | ✓ +license | ✓ | |
| Columbus, OH | ✓ | ✓ | no | ✓ | applicant business published |
| Denver, CO | ✓ | ✓ | ✓ | ✓ | no work description |
| Las Vegas, NV | ✓ | ✓ | ✓ | no | no work description |
| Detroit, MI | ✓ | ✓ | no | ✓ | |
| Los Angeles, CA | ✓ | ✓ | no | ✓ | permits issued 2020+ |
| Louisville, KY | ✓ | ✓ | partial | ✓ | active/recent permits |
| Maricopa County, AZ | ✓ | no | no | ✓ | unincorporated Phoenix metro |
| Marin County, CA | ✓ | ✓ | ✓ +license | ✓ | |
| Memphis, TN | ✓ | ✓ | no | ✓ | |
| Mesa, AZ | ✓ | ✓ | ✓ +license | ✓ | |
| Miami, FL (city) | ✓ | ✓ | ✓ | ✓ | |
| Miami-Dade County, FL | ✓ | ✓ | ✓ +phone | no | |
| Minneapolis, MN | ✓ | ✓ | ✓ | ✓ | |
| Montgomery County, MD | ✓ | ✓ | no | ✓ | residential permits |
| Nashville, TN | ✓ | ✓ | ✓ | ✓ | |
| New Jersey (statewide) | no | ✓ | no | no | municipality-level, huge volume |
| New Orleans, LA | ✓ | ✓ | ✓ | ✓ | |
| New York City, NY | ✓ | ✓ | no | ✓ | DOB NOW; applicant + owner published |
| Philadelphia, PA | ✓ | no | ✓ | ✓ | |
| Pittsburgh, PA | ✓ | ✓ | partial | ✓ | owner published |
| Raleigh, NC | ✓ | ✓ | ✓ +phone | ✓ | past 180 days |
| Sacramento, CA | ✓ | ✓ | ✓ | no | source lags 1 to 2 weeks; current year |
| San Antonio, TX | partial | no | no | no | applicant published |
| San Diego, CA | ✓ | partial | ✓ | ✓ | current year |
| San Francisco, CA | ✓ | ✓ | no | ✓ | |
| Seattle, WA | ✓ | ✓ | no | ✓ | |
| Tempe, AZ | ✓ | ✓ | partial +phone | ✓ | |
| Tucson, AZ | ✓ | ✓ | no | ✓ | |
| Washington, DC | ✓ | no | no | ✓ | current calendar year |
"partial" means the official source populates the field on some records only, and "no" means the jurisdiction does not publish it at all. Contractor phone numbers come through on Austin, Raleigh, Tempe and Miami-Dade.
What this Actor CAN do
- Pull permits issued in a date window across any of the 38 covered jurisdictions
- Normalize official records into one schema with ISO dates and numeric valuations
- Classify permits by trade and filter by trade, valuation or free text
- Return contractor names, plus licenses and phones where the city publishes them
- Feed spreadsheets, CRMs, dashboards or AI agents (works as an MCP tool via Apify)
What this Actor does NOT do
- No jurisdictions beyond the coverage table. If a city is not listed, it is not covered yet. Coverage grows; suggest cities in the Issues tab.
- No data the city does not publish. Fields marked "no" are null for that city. We do not buy, scrape or guess contact details from elsewhere.
- No permit applications (except where noted). This is issued and approved permits.
- No guarantee of same-day data where the official source itself lags (flagged in the table).
- No historical backfill beyond each source's own window. DC is the current year, Raleigh is 180 days, most others go back years.
How much does it cost to scrape building permits?
Pay per event. Current prices:
| Event | Free and Bronze | Silver (10% off) | Gold and above (20% off) |
|---|---|---|---|
Permit record (permit-record) | $0.005 | $0.0045 | $0.004 |
Actor Start (apify-actor-start) | $0.0001 | $0.0001 | $0.0001 |
The Actor Start event is charged once per run, one event per GB of memory, minimum one event, and carries no Store discount. So 1,000 fresh permit leads cost about $5 on Free and Bronze, $4.50 on Silver and $4 on Gold and above. Compare that with permit lead services at $79 to $249 per ZIP code per month, or permit data APIs starting at $599 a month. No subscription, no seat licenses, no sales call.
- Zero matching permits means $0 in record charges. You only pay the start fee.
- A city source being down means $0 for that city, and the run reports it in a status record.
Input
| Field | Type | What it does |
|---|---|---|
cities | array | Which jurisdictions to pull, or all |
issuedAfter | string | Only permits issued on or after this date (YYYY-MM-DD) |
issuedBefore | string | Only permits issued on or before this date (YYYY-MM-DD) |
trades | array | Trade filter, for example ["roofing", "solar"] |
minValuation | integer | Minimum declared project valuation in USD |
searchText | string | Free-text match on permit description and type |
maxRecordsPerCity | integer | Cap per jurisdiction |
maxRecordsTotal | integer | Cap for the whole run |
includeRaw | boolean | Attach the untouched source record to each row |
socrataAppToken | string | Optional Socrata app token for higher rate limits |
FAQ
Where does the building permit data come from?
Directly from each jurisdiction's official open-data portal: Socrata (Chicago, NYC, LA, SF, Seattle), ArcGIS (Denver, DC, Miami, Nashville), CKAN (Boston, San Antonio, Pittsburgh), Carto (Philadelphia) and official published files (San Diego). Every record carries its own source_dataset_url so you can trace it back.
Which cities and counties are covered?
38 jurisdictions, all named in the coverage table above, from Atlanta to Washington DC, including county sources such as Miami-Dade, Maricopa, Marin and Montgomery County, plus New Jersey statewide. If a city is not in the table it is not covered, and requests go in the Issues tab.
How fresh are the permits?
Most sources update daily, so the newest permits are typically 1 to 3 days old. Sacramento and a few others lag 1 to 2 weeks, and every lagging source is flagged in the coverage table.
Is it legal to scrape building permits?
Building permits are public records, published by the jurisdictions themselves on their own open-data portals specifically for public reuse. This Actor only reads those official public datasets.
How do I turn permit data into contractor leads?
Filter by trades to the work you sell (roofing, solar, mechanical, pool) and by minValuation to the job size you want, then work the address, contractor_name and, where the city publishes them, contractor_phone and contractor_license. Austin, Raleigh, Tempe and Miami-Dade publish contractor phone numbers, so a large share of those rows arrive ready to call.
Can I schedule a daily permit feed into my CRM?
Yes. Schedule the Actor in Apify Console with issuedAfter set to yesterday, and pipe new permits to Google Sheets, a webhook, Make, Zapier or your CRM.
Why does this Actor run with limited permissions?
Least privilege. It only reads and writes its own run storages, the dataset and key-value store Apify creates for each run, so it never needs access to the rest of your account. Everything it fetches comes from public official portals.
More data tools by Automation Craft
- US New Business Registrations Scraper - LLC Leads
- UK Food Hygiene Ratings Scraper - FSA Register
- UK EPC Register Scraper - Energy Certificates
- ATS Jobs Scraper & API - Greenhouse, Lever, Ashby
- LinkedIn Jobs Scraper - No Login, Real Dates
- Meta Ad Library Scraper - All Placements, Filters
- Google Trends Scraper - Compare and Trending Now
- Airbnb Scraper: Prices, Calendar, Reviews