US Building Permits – 93 Cities, Contractor/Construction Leads
Pricing
Pay per event
US Building Permits – 93 Cities, Contractor/Construction Leads
Building permit data from 93 US cities & counties in one clean table: new construction, roofing, solar, HVAC & remodel permits with contractor, valuation, ZIP & coordinates. Construction leads from official open data, no logins.
Pricing
Pay per event
Rating
0.0
(0)
Developer
justin cruz
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
US Building Permits Data – 93 Cities & Counties, Contractor & Construction Leads
Fresh building permit data from 93 US cities, counties and states in one clean table – with the work type, trade, residential/commercial class, contractor, ZIP and coordinates already filled in. Find roofing, window, solar, HVAC and remodel jobs the week they are permitted, see which contractors are busiest in your area, or track construction activity by ZIP.
What it does: queries 122 official government open-data feeds in 27 states + Washington, DC, and returns one normalized row per permit. Who it's for: contractors and installers looking for leads, building-material suppliers, real-estate investors and market researchers. Why: every city publishes permits differently; this Actor gives you one schema, one set of filters and an optional "only new / only changed since last run" feed, without logins or scraping private portals.
Measured, not promised (test run over permits issued 2026-10-26 to 2026-11-01, all sources): 33,811 permits from 81 jurisdictions that had activity that week; 96.4 % have a ZIP, 87.8 % coordinates, 91.3 % a specific work category, 79.7 % a residential/commercial class and 42.8 % a contractor name. The whole run took about 2–5 minutes (4.4 minutes on the Apify platform).
What one week looks like (real numbers)
Permits issued Oct 26 – Nov 1, 2026 in five big cities (run on Nov 3, 2026):
| City | Permits | New construction | Roofing | HVAC | Solar | Demolition |
|---|---|---|---|---|---|---|
| Los Angeles | 3,418 | 167 | 352 | 895 | 5 | 38 |
| New York City | 2,968 | 120 | 74 | 360 | 106 | 82 |
| Austin | 1,370 | 153 | 10 | 269 | 1 | 40 |
| Seattle | 887 | 38 | 2 | 244 | 0 | 12 |
| Chicago | 583 | 82 | 44 | 13 | 24 | 19 |
| Total | 9,226 | 560 | 482 | 1,781 | 136 | 191 |
59 % of those permits name a contractor, 99.9 % have a ZIP and 97 % have coordinates. At $5 per 1,000 permits, the whole week for these five cities costs about $46; a filtered list (for example only residential roofing in LA: 341 permits) costs about $1.70.
Sample output (CSV preview)
Real rows from that week (selected columns; the full record is shown further down):
| city | permit_number | issue_date | category | property_class | description | zip | valuation | contractor_normalized |
|---|---|---|---|---|---|---|---|---|
| Chicago, IL | B200517115 | 2026-10-27 | solar | residential | INSTALL SOLAR PANELS ON ROOF OF PRINCIPAL BUILDING… | 60620 | 14006 | Sunrun Installation Services |
| Seattle, WA | 7164089-ME | 2026-10-27 | hvac | commercial | FURNISH AND INSTALL (3) NEW VAV BOXES AND ASSOCIATED DUCTWORK… | 98101 | 48790 | Macdonald Miller Facility Solutions |
| Seattle, WA | 7169407-BP | 2026-10-27 | hvac | residential | BOILER REPLACEMENT | 98108 | 15475 | Carlson Mechanical |
| New York City, NY | B01325256-I1-GC | 2026-10-26 | new_construction | residential | PROPOSED NEW 7 STORY BUILDING WITH 26 RESIDENTIAL UNITS… | 11230 | Brookstone Developers |
Coverage at a glance
AZ Eloy, Maricopa County, Mesa, Scottsdale, Tempe, Tucson · CA Atascadero, Campbell, Citrus Heights, Corona, Los Angeles, Marin County, Placentia, Sacramento County, San Diego County, San Francisco, San Jose · CO Boulder, Denver, Douglas County · DC Washington · FL Alachua County, Broward County, Miami, Miami-Dade County, Orlando, Port St. Lucie, Weston · ID Boise · IL Chicago, Cook County (demolition), Rockford, Wheaton · KS Overland Park · KY Louisville · LA Baton Rouge, New Orleans · MA Boston, Cambridge, Somerville, Worcester · MD Baltimore, Baltimore County, Montgomery County · MI Detroit · MN Minneapolis · MO Kansas City, Raymore · NC Brunswick County, Cary, Charlotte/Mecklenburg, Greensboro, Raleigh, Wake County · NJ statewide · NV Henderson · NY New York City · OH Cincinnati, Cleveland, Columbus · OR Bend, Portland, Salem · PA Philadelphia, Pittsburgh · SC Bluffton, Charleston · TN Memphis/Shelby County, Nashville · TX Austin, College Station, Collin County, Dallas, Fort Worth, San Antonio, San Marcos, Tyler · VA Arlington County, Charlottesville, Norfolk, Virginia Beach · WA Bellevue, Everett, Pierce County, Puyallup, Seattle, Tacoma. Full table with source IDs, licenses and freshness: see Supported sources below.
How to use it
- Click Try for free (or Start). The form is prefilled with 5 big cities, the last 7 days and 100 results – that run takes under a minute.
- Pick your cities (or "All supported cities") and a date window – leave dates empty for the last 7 days.
- Optionally add filters: work category (e.g. roofing), trade, residential/commercial, job value, ZIP codes or a radius around your shop.
- Set Max results to cap your cost, then run. Download the results as Excel, CSV or JSON, or connect them to Google Sheets, Zapier, Make or your CRM.
- For a lead feed, schedule it daily or weekly with Only new permits switched on so each run returns only permits you haven't seen.
Why this Actor
- Breadth: 93 jurisdictions, including big cities (NYC, LA, Chicago, Dallas, Seattle, Philadelphia…), fast-growing suburbs/counties and statewide New Jersey. Every source passed a freshness check (newest record within 30 days) on 2026-11-03.
- Only new permits, or status changes (incremental modes): schedule it daily or weekly and get only permits you have not seen before (
new), only permits whose status changed since the last run (changes, e.g. "In review" → "Issued", withprevious_statusandchanged_at), or both (new_and_changes). The first run just records what exists (outputs and charges nothing). - Enrichment on every record:
category(new construction, addition, alteration/remodel, roofing, windows/doors, siding, HVAC, electrical, plumbing, solar, demolition, pool, fence, sign, other),trades[]+ primarytrade,property_class(residential / commercial / mixed) withproperty_class_basis(which signal decided it: occupancy field, permit type, description, address unit, zoning, contractor or valuation),is_new_construction,status_std, cleanedvaluation, andcontractor_normalized(in the test week "SUNRUN INSTALLATION SVC" in NYC, "SUNRUN INSTALLATION SERVICES INC" in Chicago and "Sunrun Installation Services" in Rockford all becomeSunrun Installation Services). - ZIP + coordinates filled in: a missing ZIP is taken from the address or derived offline from the coordinates (US Census ZCTA boundaries, 96.4 % agreement with the ZIP the city publishes, tested on 18,409 permits). Missing coordinates are geocoded with the free US Census Bureau geocoder (exact matches only).
zip_source/geo_sourcetell you where each value came from. - Real filters: category, trade, status, residential/commercial, valuation range, ZIP list (or 3-digit prefixes), radius around a point, states, keywords, contractor-present.
- Reliable: per-source timeouts and retries; a source that fails is skipped (the rest of the run continues) and reported in
RUN_STATSwitherror/staleflags. - Analyst extras: per-city
SUMMARY(JSON + CSV) with counts by category/status, total and average valuation and top contractors (grouped by normalized name, with the sources and name variants each covers); optional summary rows in the dataset; CSV-friendly flat output.
Use cases
| Who | What they pull | Suggested input |
|---|---|---|
| Roofers, window/siding and remodel contractors | New residential exterior jobs near the shop, every morning | categories: ["roofing","windows_doors","siding"], propertyClass: "residential", radius 30 mi, incremental: true |
| Solar, HVAC, electrical and plumbing installers | Trade permits pulled by competitors, by ZIP | trades: ["solar"] (or hvac, electrical, plumbing), zipCodes |
| Building-material suppliers and distributors | Which contractors are most active where, for sales prospecting | onlyWithContractor: true, then SUMMARY.top_contractors |
| Real estate investors and developers | New-construction and demolition activity by ZIP, as a leading indicator | newConstructionOnly: true or categories: ["demolition"] |
| Market researchers, analysts and journalists | Permit counts and valuations by city, category and month | cities: ["all"], monthly dateFrom/dateTo, SUMMARY.csv |
| Proptech and data teams | A normalized feed instead of 116 different city APIs | API or scheduled runs into your warehouse, flatOutput: true |
For AI assistants
Set "mode": "agent" to use every filter and get a machine-readable coverage record. Permits come first in the dataset; the last item is a record_type: "coverage" record (not charged), also saved in the key-value store as COVERAGE. Each queried jurisdiction gets a status: completed (ran, returned ≥1 permit), no_match (ran, 0 permits matched), or failed (source error or timeout, see error). Jurisdictions not queried are listed under skipped with a reason. Counts are only what the official sources returned; nothing is estimated.
Example input:
{ "mode": "agent", "cities": ["seattle", "denver", "nowhere_city", "chicago"], "states": ["WA", "CO"],"trades": ["solar"], "dateFrom": "2026-10-01", "dateTo": "2026-11-01", "maxItems": 25 }
Coverage item from that run (shortened, real test output):
{ "record_type": "coverage", "mode": "agent", "run_status": "completed", "total_results": 25, "limit_reached": true,"jurisdictions_queried": 2, "completed_count": 1, "no_match_count": 1, "failed_count": 0,"queried": [{ "source_id": "seattle", "state": "WA", "status": "completed", "result_count": 25, "truncated_by_limit": true, "error": null },{ "source_id": "denver", "state": "CO", "status": "no_match", "result_count": 0, "truncated_by_limit": false, "error": null } ],"skipped": [{ "source_id": "nowhere_city", "reason": "unknown jurisdiction id (not one of the supported sources)" },{ "source_id": "chicago", "reason": "not in selected states (WA, CO)" } ] }
If the input itself is invalid (e.g. dateFrom after dateTo), agent mode still writes a coverage record with run_status: "failed" and the error, then the run fails. Human mode (the default, and any input without mode) behaves exactly as before.
Input examples
Weekly lead list: residential exterior work within 40 miles of Chicago, $5k–$100k
{"cities": ["all"],"lastNDays": 7,"categories": ["roofing", "windows_doors", "siding"],"propertyClass": "residential","minValuation": 5000,"maxValuation": 100000,"centerLat": "41.8781", "centerLon": "-87.6298", "radiusMiles": 40}
Scheduled monitoring – only new permits each day
{"cities": ["austin", "dallas", "san_antonio"],"lastNDays": 10,"incremental": true,"incrementalStateKey": "texas-daily","trades": ["hvac", "electrical"]}
Create a schedule (e.g. every morning) with this input. Run 1 records the current permits and outputs nothing. Every later run outputs only permits that were not returned before. Use a look-back (lastNDays) a bit longer than the schedule interval, because some cities post permits a few days late; already-seen permits are never returned twice. In our test, run 1 (Oct 26–29) recorded 2,974 permits and output 0; run 2 (Oct 26–Nov 1) output only the 776 new permits (all dated Oct 30–Nov 1); run 3 with the same input output 0.
Daily status-change feed (permits that moved from review to issued, finaled, expired…)
{"cities": ["kansas_city_mo", "charlottesville"],"lastNDays": 60,"incremental": true,"incrementalMode": "changes","incrementalStateKey": "status-watch"}
Run 1 stores each permit's current status and outputs nothing. Later runs output only permits whose status differs from the stored one, with change_type: "status_changed", previous_status, previous_status_std and changed_at (the run date the change was detected). new_and_changes combines both feeds (change_type is new or status_changed). Use a long look-back for changes, since a status can change weeks after issue. Older incremental state from v1.2 keeps working.
By ZIP, flat CSV output with per-city summary rows
{ "cities": ["chicago", "los_angeles"], "dateFrom": "2026-10-01", "dateTo": "2026-10-31", "zipCodes": ["606", "90026"], "flatOutput": true, "pushSummaryRecords": true }
If you leave out the dates, the run covers the last 7 days. cities: ["all"] queries every source; with states you can limit it to some states.
Output example (real record from a test run)
{"record_type": "permit","source_id": "brunswick_county_nc","city": "Brunswick County","state": "NC","permit_number": "693780-1006","issue_date": "2026-10-30","application_date": null,"status": "Active","permit_type": "Commercial - ELECTRICAL","work_class": "Trades","description": "Elect per code/pool","address": "7310 WILBUR MCKEITHAN WAY NE","zip": "28451","lat": 34.18943706,"lon": -78.08322261,"valuation": 349351,"contractor_name": "REEVES ELECTRIC","contractor_license": null,"source_url": "https://www.brunswickcountync.gov/","data_source": "ArcGIS: https://services1.arcgis.com/W6gamXPYQeLXrdAd/arcgis/rest/services/Permit_Locations/FeatureServer/0","date_basis": "issued","category": "electrical","trades": ["electrical", "pool"],"trade": "electrical","property_class": "commercial","property_class_basis": "permit_type","is_new_construction": false,"status_std": "issued","contractor_normalized": "Reeves Electric","zip_source": "source","geo_source": "source"}
Other fields: distance_miles (radius searches), raw (optional, sanitized source row), and in change modes change_type, previous_status, previous_status_std, changed_at. Dataset views: Permits, Contractor leads, Locations, Status changes. Download as JSON, CSV, Excel or XML.
Key-value store outputs: SUMMARY / SUMMARY.csv (per city), RUN_STATS (per-source scanned / matched / pushed counts, newest date seen, stale, error, geocoder use, incremental state) and contractor stats (unique raw vs normalized names, multi-source contractors, top contractors).
Supported sources (93)
Permit counts are from the local test run over issue dates 2026-10-26..2026-11-01 (33,811 permits) and change week to week. A 0 means the source published nothing with an issue date in that week (it was still fresh within 30 days; Tyler, TX publishes about monthly).
| ID | City / county | Portal | License / terms | Permits issued 2026-10-26..11-01 | Newest issue date (health check 2026-11-03) |
|---|---|---|---|---|---|
eloy | Eloy, AZ | ArcGIS | City of Eloy open GIS data | 1 | 2026-10-28 |
maricopa_county | Maricopa County (unincorporated), AZ | ArcGIS | Maricopa County GIS open data terms | 162 | 2026-10-30 |
mesa | Mesa, AZ | Socrata | City of Mesa Open Data terms | 89 | 2026-11-01 |
scottsdale | Scottsdale, AZ | ArcGIS | City of Scottsdale open data | 5 | 2026-10-30 |
tempe | Tempe, AZ | ArcGIS | City of Tempe Open Data (CC BY 4.0) | 64 | 2026-10-30 |
tucson | Tucson, AZ | ArcGIS | City of Tucson open data | 174 | 2026-11-01 |
atascadero | Atascadero, CA | ArcGIS | City of Atascadero open GIS data | 23 | 2026-10-30 |
campbell | Campbell, CA | ArcGIS | City of Campbell open GIS data | 45 | 2026-10-30 |
citrus_heights | Citrus Heights, CA | ArcGIS | City of Citrus Heights open data | 131 | 2026-11-02 |
corona | Corona, CA | Socrata | City of Corona CorStat open data | 0 | 2026-10-15 |
los_angeles_county_rebuild | Los Angeles County (fire rebuild), CA | ArcGIS | LA County Public Works open GIS data (EPIC-LA) | 54 | 2026-11-02 |
los_angeles | Los Angeles, CA | Socrata | LA Open Data Terms of Use | 3418 | 2026-10-31 |
marin_county | Marin County, CA | Socrata | Open Data Commons ODbL | 75 | 2026-11-01 |
placentia | Placentia, CA | ArcGIS | City of Placentia open data | 0 | 2026-10-21 |
sacramento_county | Sacramento County (unincorporated), CA | ArcGIS | Sacramento County open data | 572 | 2026-10-31 |
san_diego_county | San Diego County (unincorporated), CA | Socrata | County of San Diego Open Data Terms | 188 | 2026-11-01 |
san_francisco | San Francisco, CA | Socrata | DataSF Open Data (PDDL) | 334 | 2026-10-30 |
san_jose | San Jose, CA | CKAN | Creative Commons Zero (CC0) | 504 | 2026-10-31 |
boulder | Boulder, CO | ArcGIS | City of Boulder Open Data terms | 179 | 2026-10-30 |
denver | Denver, CO | ArcGIS | Denver Open Data (CC BY 3.0) | 140 | 2026-10-31 |
douglas_county_co | Douglas County, CO | ArcGIS | Douglas County open data | 202 | 2026-10-30 |
washington_dc | Washington, DC | ArcGIS | Open Data DC (CC BY 4.0) | 841 | 2026-10-29 |
alachua_county | Alachua County (unincorporated), FL | ArcGIS | Alachua County open data | 205 | 2026-11-02 |
broward_county | Broward County (unincorporated), FL | ArcGIS | Broward County GIS open data | 10 | 2026-10-29 |
miami | Miami, FL | ArcGIS | City of Miami Open Data terms | 624 | 2026-11-01 |
miami_dade_county | Miami-Dade County, FL | ArcGIS | Miami-Dade County Open Data terms | 1451 | 2026-11-01 |
orlando | Orlando, FL | Socrata | City of Orlando Open Data Terms | 586 | 2026-11-02 |
port_st_lucie | Port St. Lucie, FL | ArcGIS | City of Port St. Lucie open GIS data | 491 | 2026-10-31 |
weston | Weston, FL | ArcGIS | City of Weston open GIS data | 72 | 2026-10-30 |
atlanta | Atlanta, GA | ArcGIS | City of Atlanta open GIS data (Accela building permits) | 212 | 2026-10-29 |
boise | Boise (high-impact, new housing & demolition permits), ID | ArcGIS | City of Boise open data | 2 | 2026-10-30 |
chicago | Chicago, IL | Socrata | City of Chicago Data Portal Terms of Use | 583 | 2026-11-01 |
cook_county_demolition | Cook County (suburban asbestos & demolition permits), IL | Socrata | Public Domain (Cook County Open Data) | 100 | 2026-11-02 |
rockford_il | Rockford, IL | Socrata | Illinois EDP open data (City of Rockford) | 230 | 2026-10-31 |
st_charles_il | St. Charles, IL | ArcGIS | City of St. Charles, IL open GIS data | 47 | 2026-11-02 |
wheaton | Wheaton, IL | ArcGIS | City of Wheaton open data | 0 | 2026-10-22 |
overland_park | Overland Park, KS | ArcGIS | City of Overland Park open data | 65 | 2026-10-29 |
louisville | Louisville (Metro), KY | ArcGIS | Louisville Metro Open Data terms | 333 | 2026-11-02 |
baton_rouge | Baton Rouge (East Baton Rouge Parish), LA | Socrata | Public Domain | 159 | 2026-10-30 |
new_orleans | New Orleans, LA | Socrata | CC0 1.0 (Public Domain Dedication) | 321 | 2026-11-02 |
boston | Boston, MA | CKAN | Open Data Commons PDDL | 819 | 2026-11-02 |
cambridge_ma | Cambridge, MA | Socrata | ODC Public Domain Dedication and License | 122 | 2026-10-31 |
somerville | Somerville, MA | Socrata | Open Data Commons ODbL | 121 | 2026-10-29 |
worcester | Worcester, MA | ArcGIS | City of Worcester open data | 378 | 2026-10-31 |
baltimore_county_md | Baltimore County, MD | ArcGIS | Baltimore County Government open GIS data | 193 | 2026-11-02 |
baltimore | Baltimore, MD | ArcGIS | Open Baltimore terms | 650 | 2026-11-01 |
montgomery_county_md | Montgomery County, MD | Socrata | Public Domain | 325 | 2026-10-28 |
detroit | Detroit, MI | ArcGIS | Detroit Open Data Portal terms | 485 | 2026-11-01 |
minneapolis | Minneapolis, MN | ArcGIS | Open Minneapolis terms | 945 | 2026-11-01 |
kansas_city_mo | Kansas City, MO | Socrata | City of Kansas City, MO Open Data terms of use | 876 | 2026-11-02 |
raymore | Raymore, MO | ArcGIS | City of Raymore open data | 54 | 2026-10-30 |
brunswick_county_nc | Brunswick County, NC | ArcGIS | Brunswick County open data | 810 | 2026-10-30 |
cary | Cary, NC | OpenDataSoft | CC0 1.0 Universal | 185 | 2026-10-30 |
charlotte | Charlotte / Mecklenburg County, NC | ArcGIS | Mecklenburg County open GIS data | 754 | 2026-11-01 |
greensboro | Greensboro, NC | ArcGIS | City of Greensboro open GIS data | 77 | 2026-11-02 |
raleigh | Raleigh, NC | ArcGIS | City of Raleigh Open Data terms | 146 | 2026-10-29 |
wake_county | Wake County (unincorporated & contract towns), NC | ArcGIS | Wake County open data | 109 | 2026-10-30 |
new_jersey | New Jersey (statewide, municipality level), NJ | Socrata | Public Domain (NJ DCA) | 0 | 2026-10-19 |
henderson | Henderson, NV | ArcGIS | City of Henderson open data | 38 | 2026-10-29 |
new_york_city | New York City, NY | Socrata | NYC Open Data Terms of Use | 2968 | 2026-10-30 |
cincinnati | Cincinnati, OH | Socrata | Public Domain | 201 | 2026-10-30 |
cleveland | Cleveland, OH | ArcGIS | City of Cleveland Open Data terms | 299 | 2026-10-31 |
columbus | Columbus, OH | ArcGIS | City of Columbus Open Data terms | 898 | 2026-10-31 |
bend | Bend, OR | ArcGIS | City of Bend Open Data terms | 109 | 2026-11-01 |
jackson_county_or | Jackson County, OR | ArcGIS | Jackson County, OR open GIS data | 76 | 2026-11-02 |
portland_or | Portland, OR | ArcGIS | City of Portland open data (PortlandMaps) | 2 | 2026-10-28 |
salem | Salem, OR | ArcGIS | City of Salem open data | 24 | 2026-10-30 |
philadelphia | Philadelphia, PA | CARTO | OpenDataPhilly / City of Philadelphia terms | 964 | 2026-11-02 |
pittsburgh | Pittsburgh, PA | CKAN | WPRDC (CC BY 4.0 / ODC) | 175 | 2026-10-30 |
bluffton_sc | Bluffton, SC | ArcGIS | Town of Bluffton open GIS data | 23 | 2026-10-30 |
charleston_sc | Charleston (new construction only), SC | ArcGIS | City of Charleston open data | 0 | 2026-10-22 |
memphis | Memphis / Shelby County, TN | ArcGIS | Memphis Data Hub terms | 154 | 2026-10-30 |
nashville | Nashville (Metro Davidson County), TN | ArcGIS | Nashville Open Data terms | 208 | 2026-11-01 |
austin | Austin, TX | Socrata | Public Domain U.S. Government | 1370 | 2026-11-01 |
college_station | College Station, TX | Socrata | City of College Station Open Data Terms | 117 | 2026-10-30 |
collin_county | Collin County (Collin CAD, all cities), TX | Socrata | Texas Open Data Portal terms | 13 | 2026-10-31 |
dallas | Dallas, TX | Socrata | Dallas OpenData Terms of Use | 1499 | 2026-11-01 |
fort_worth | Fort Worth, TX | ArcGIS | City of Fort Worth open data terms | 1109 | 2026-11-02 |
harris_county_tx | Harris County (unincorporated), TX | ArcGIS | Harris County Engineering open GIS data (ePermits) | 696 | 2026-11-03 |
san_antonio | San Antonio, TX | CKAN | City of San Antonio Open Data terms | 1300 | 2026-10-30 |
san_marcos | San Marcos, TX | ArcGIS | City of San Marcos open data | 63 | 2026-10-31 |
tyler_tx | Tyler, TX | ArcGIS | City of Tyler open GIS data | 0 | 2026-10-09 |
arlington_county_va | Arlington County, VA | Arlington Open Data API | Arlington County Open Data policy | 304 | 2026-11-01 |
charlottesville | Charlottesville, VA | ArcGIS | City of Charlottesville open data | 82 | 2026-11-01 |
norfolk | Norfolk, VA | Socrata | Norfolk Open Data Terms of Use | 268 | 2026-11-01 |
virginia_beach | Virginia Beach, VA | ArcGIS | City of Virginia Beach Open Data terms | 584 | 2026-10-30 |
bellevue | Bellevue, WA | ArcGIS | City of Bellevue Open Data terms | 189 | 2026-11-01 |
edgewood_wa | Edgewood, WA | ArcGIS | City of Edgewood, WA open GIS data | 3 | 2026-10-30 |
everett | Everett, WA | Socrata | City of Everett Open Data Terms | 228 | 2026-10-30 |
pierce_county | Pierce County (unincorporated), WA | Socrata | Pierce County Open Data Terms | 139 | 2026-10-28 |
puyallup | Puyallup, WA | ArcGIS | City of Puyallup open GIS data | 29 | 2026-10-30 |
seattle | Seattle, WA | Socrata | Public Domain | 887 | 2026-10-31 |
tacoma | Tacoma, WA | ArcGIS | City of Tacoma open data | 139 | 2026-10-30 |
Some fields simply aren't published by some sources: for example Philadelphia, Maricopa County, Washington DC and Virginia Beach publish no valuation, and New Jersey publishes no street address (municipality and block/lot only, and its newest dates lag 2–4 weeks). Where a feed mixes company and private-person names in its contractor field, only business-looking names are returned. Missing values come back as null; nothing is invented. date_basis is approved for Cook County (approval date) and issued elsewhere.
Pricing
You pay only for results: one charge per permit returned (event permit-result). Price: $5 per 1,000 permits ($0.005 each) – so the prefilled 100-permit example costs about $0.50, and a 1,000-permit weekly lead list about $5. The current price is always shown on the Pricing tab. There is no separate charge for compute or proxies.
- Summary rows and the first "record only" monitoring run are free.
- Set Max results and/or a maximum cost per run in the run options; the Actor stops cleanly at that limit, so you never pay more than you chose.
- Apify's free plan includes monthly platform credits you can use to try the Actor.
Notes and limits
- Accuracy and freshness depend on each government feed.
source_urllinks the original. - Category, trade and property class are derived from the permit type and description text with rules, so they are very good but not perfect.
property_classuses the source's occupancy/use field first, then permit type and description, then address unit, zoning, known residential installers and very large valuations; it isnullwhen nothing gives a clear signal (20.3 % of records in the test week, down from 34.1 % in v1.2 on the same sources; most remaining blanks are NYC sidewalk sheds/scaffolds, San Antonio and Fort Worth trade permits and right-of-way work). ThepropertyClassfilter drops those. - Derived ZIPs (
zip_source: zcta_derived) use Census ZIP Code Tabulation Areas, which approximate USPS ZIPs. contractor_normalizedis a rules-based clean-up (case, punctuation, legal suffixes such as LLC/Inc. dropped, DBA, trailing license numbers, abbreviations such as Svc/Plbg/Elec, placeholders); some acronyms written in capitals may come out title-cased; it never merges different companies on fuzzy similarity, and personal-looking names are still dropped.- Multi-row permits are deduplicated (one result per permit, date and filing).
FAQ
How fresh is the data? Each run queries the government feeds live, so you get whatever the city has published at that moment. Most cities publish daily; some lag a few days, and New Jersey lags 2–4 weeks. On 2026-11-03 every one of the 87 sources had a record from the last 30 days. Each run's RUN_STATS record shows the newest date per source and flags stale sources.
Which areas are covered? The 93 jurisdictions in the table above. Coverage is limited to places that publish permits through a public open-data API, so many cities (and most rural counties) are not available. Some fields aren't published everywhere, for example valuation or contractor name – see "Notes and limits".
Is this legal? The Actor only reads official open-data APIs that governments publish for public reuse. It does not log in, bypass CAPTCHAs or scrape private portals. Each source has its own license (linked in the table); see "Data sources and attribution" below.
Does it return personal data? No owner, applicant, phone, email or staff fields are returned, and they are stripped even from the optional raw record. Contractor fields are limited to business names and license numbers; names that look like private individuals are dropped. If you combine this data with other sources, you are responsible for complying with privacy and marketing laws (e.g. CAN-SPAM, TCPA, CCPA).
Why are some fields empty? If a city doesn't publish a value, it comes back as null – nothing is guessed or invented. Derived values (category, trade, property class, derived ZIP, geocoded coordinates) are labeled in property_class_basis, zip_source and geo_source.
How much does a typical run cost? $5 per 1,000 permits returned. Examples from the Oct 26 – Nov 1, 2026 week: all of Chicago (583 permits) ≈ $2.90; all of Los Angeles (3,418) ≈ $17; LA residential roofing only (341) ≈ $1.70. Filters are applied before you are charged, so narrow filters cost less. Set Max results or a maximum cost per run to cap spend.
Does it include homeowner names, phone numbers or emails? No. You get the permit, address, work description, valuation and the contractor's business name (where the city publishes it). Owner and applicant fields are removed.
What counts as "new construction"? is_new_construction is true when the permit's category is new_construction, which the rules assign from the permit type, work class and description (for example "New Construction of a 2-Story Single Family Res."); additions and remodels have their own categories. In the sample week, 560 of 9,226 permits in five big cities were new construction.
Can I get only new permits every day? Yes: schedule the Actor with incremental: true. Each run returns only permits it hasn't returned before, so a daily schedule is a daily lead list.
How do I get the data into Google Sheets, a CRM or my own code? Download as CSV/Excel/JSON from the run, use Apify's Google Sheets, Zapier or Make integrations, or call the Actor from the Apify API / Python and JavaScript clients and read the dataset.
How is this different from scraping a city permit portal? It doesn't touch Accela/EnerGov web portals or log in anywhere; it reads the official open-data APIs (Socrata, ArcGIS, CKAN, CARTO, OpenDataSoft), so runs are fast (a week of 5 big cities takes well under a minute) and don't break when a portal redesigns.
Can you add my city? Open an issue on the Issues tab with the city name and, if you know it, the link to its open-data permit dataset. Only sources with a public open-data API can be added.
Data sources and attribution
Data is provided by the cities, counties and states listed in the table above, under each publisher's open-data license or terms of use (linked per source). Every record includes data_source (portal and dataset id) and source_url (the original record or dataset) for attribution. Some sources require attribution when you republish the data, for example CC BY (Tempe, Denver, Washington DC, Pittsburgh/WPRDC) and ODbL (Marin County, Somerville, which also requires share-alike for databases built from it). If you republish, credit the publisher, e.g. "Source: City of Denver Open Data, CC BY 3.0", and follow the linked terms. This Actor is not affiliated with or endorsed by any government agency.
Disclaimer
Permit data is provided "as is" from public sources and may be incomplete, delayed or contain errors made by the publisher. Derived fields (category, trade, property class, normalized contractor name, derived ZIP, geocoded coordinates) are produced by rules and can be wrong. A permit is evidence of a project, not an exclusive lead or a promise of work. Verify important details with the issuing agency before relying on them.
Support
Questions, a broken source or a city you'd like added? Open an issue on the Issues tab of this Actor.
Changelog
- 1.6 (Nov 2026) – Two input modes. Human mode (default): simpler form (place, permit type/trade, dates, max results) with advanced options in collapsed sections. AI/Agent mode (
"mode": "agent"): coverage record (COVERAGE) with per-jurisdiction status codescompleted/no_match/failedand skipped reasons. Existing inputs, output fields and pricing are unchanged. - 1.5 (Nov 2026) – 6 new sources (93 total): Atlanta GA, Harris County TX (unincorporated), St. Charles IL, Jackson County OR, Edgewood WA, LA County fire-rebuild permits. Week counts for the new rows are from a 2026-11-04 test of the same week.
- 1.4.6 – README: one-week sample numbers, CSV preview, coverage by state, more FAQ. No code changes.
- 1.4.5 – Added an Actor output schema (Output tab links to permits, contractor leads, per-source summary and run stats).
- 1.3 (Nov 2026) – 87 sources (116 datasets) in 26 states + DC; status-change monitoring (
changes,new_and_changes); better residential/commercial classification; consistent normalized contractor names; offline ZIP derivation from coordinates; null-like text values ("NA", "None") cleaned tonull; simpler input form with a quick prefilled example. - 1.2 (Nov 2026) – Expanded coverage and enrichment (more cities, normalized contractor names, location filters).
- 1.0 (Nov 2026) – First version: 22 cities in one normalized schema.