US Building Permits – 93 Cities, Contractor/Construction Leads avatar

US Building Permits – 93 Cities, Contractor/Construction Leads

Pricing

Pay per event

Go to Apify Store
US Building Permits – 93 Cities, Contractor/Construction Leads

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

justin cruz

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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):

CityPermitsNew constructionRoofingHVACSolarDemolition
Los Angeles3,418167352895538
New York City2,9681207436010682
Austin1,37015310269140
Seattle887382244012
Chicago5838244132419
Total9,2265604821,781136191

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):

citypermit_numberissue_datecategoryproperty_classdescriptionzipvaluationcontractor_normalized
Chicago, ILB2005171152026-10-27solarresidentialINSTALL SOLAR PANELS ON ROOF OF PRINCIPAL BUILDING…6062014006Sunrun Installation Services
Seattle, WA7164089-ME2026-10-27hvaccommercialFURNISH AND INSTALL (3) NEW VAV BOXES AND ASSOCIATED DUCTWORK…9810148790Macdonald Miller Facility Solutions
Seattle, WA7169407-BP2026-10-27hvacresidentialBOILER REPLACEMENT9810815475Carlson Mechanical
New York City, NYB01325256-I1-GC2026-10-26new_constructionresidentialPROPOSED NEW 7 STORY BUILDING WITH 26 RESIDENTIAL UNITS…11230Brookstone 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

  1. 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.
  2. Pick your cities (or "All supported cities") and a date window – leave dates empty for the last 7 days.
  3. Optionally add filters: work category (e.g. roofing), trade, residential/commercial, job value, ZIP codes or a radius around your shop.
  4. 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.
  5. 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", with previous_status and changed_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[] + primary trade, property_class (residential / commercial / mixed) with property_class_basis (which signal decided it: occupancy field, permit type, description, address unit, zoning, contractor or valuation), is_new_construction, status_std, cleaned valuation, and contractor_normalized (in the test week "SUNRUN INSTALLATION SVC" in NYC, "SUNRUN INSTALLATION SERVICES INC" in Chicago and "Sunrun Installation Services" in Rockford all become Sunrun 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_source tell 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_STATS with error / stale flags.
  • 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

WhoWhat they pullSuggested input
Roofers, window/siding and remodel contractorsNew residential exterior jobs near the shop, every morningcategories: ["roofing","windows_doors","siding"], propertyClass: "residential", radius 30 mi, incremental: true
Solar, HVAC, electrical and plumbing installersTrade permits pulled by competitors, by ZIPtrades: ["solar"] (or hvac, electrical, plumbing), zipCodes
Building-material suppliers and distributorsWhich contractors are most active where, for sales prospectingonlyWithContractor: true, then SUMMARY.top_contractors
Real estate investors and developersNew-construction and demolition activity by ZIP, as a leading indicatornewConstructionOnly: true or categories: ["demolition"]
Market researchers, analysts and journalistsPermit counts and valuations by city, category and monthcities: ["all"], monthly dateFrom/dateTo, SUMMARY.csv
Proptech and data teamsA normalized feed instead of 116 different city APIsAPI 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).

IDCity / countyPortalLicense / termsPermits issued 2026-10-26..11-01Newest issue date (health check 2026-11-03)
eloyEloy, AZArcGISCity of Eloy open GIS data12026-10-28
maricopa_countyMaricopa County (unincorporated), AZArcGISMaricopa County GIS open data terms1622026-10-30
mesaMesa, AZSocrataCity of Mesa Open Data terms892026-11-01
scottsdaleScottsdale, AZArcGISCity of Scottsdale open data52026-10-30
tempeTempe, AZArcGISCity of Tempe Open Data (CC BY 4.0)642026-10-30
tucsonTucson, AZArcGISCity of Tucson open data1742026-11-01
atascaderoAtascadero, CAArcGISCity of Atascadero open GIS data232026-10-30
campbellCampbell, CAArcGISCity of Campbell open GIS data452026-10-30
citrus_heightsCitrus Heights, CAArcGISCity of Citrus Heights open data1312026-11-02
coronaCorona, CASocrataCity of Corona CorStat open data02026-10-15
los_angeles_county_rebuildLos Angeles County (fire rebuild), CAArcGISLA County Public Works open GIS data (EPIC-LA)542026-11-02
los_angelesLos Angeles, CASocrataLA Open Data Terms of Use34182026-10-31
marin_countyMarin County, CASocrataOpen Data Commons ODbL752026-11-01
placentiaPlacentia, CAArcGISCity of Placentia open data02026-10-21
sacramento_countySacramento County (unincorporated), CAArcGISSacramento County open data5722026-10-31
san_diego_countySan Diego County (unincorporated), CASocrataCounty of San Diego Open Data Terms1882026-11-01
san_franciscoSan Francisco, CASocrataDataSF Open Data (PDDL)3342026-10-30
san_joseSan Jose, CACKANCreative Commons Zero (CC0)5042026-10-31
boulderBoulder, COArcGISCity of Boulder Open Data terms1792026-10-30
denverDenver, COArcGISDenver Open Data (CC BY 3.0)1402026-10-31
douglas_county_coDouglas County, COArcGISDouglas County open data2022026-10-30
washington_dcWashington, DCArcGISOpen Data DC (CC BY 4.0)8412026-10-29
alachua_countyAlachua County (unincorporated), FLArcGISAlachua County open data2052026-11-02
broward_countyBroward County (unincorporated), FLArcGISBroward County GIS open data102026-10-29
miamiMiami, FLArcGISCity of Miami Open Data terms6242026-11-01
miami_dade_countyMiami-Dade County, FLArcGISMiami-Dade County Open Data terms14512026-11-01
orlandoOrlando, FLSocrataCity of Orlando Open Data Terms5862026-11-02
port_st_luciePort St. Lucie, FLArcGISCity of Port St. Lucie open GIS data4912026-10-31
westonWeston, FLArcGISCity of Weston open GIS data722026-10-30
atlantaAtlanta, GAArcGISCity of Atlanta open GIS data (Accela building permits)2122026-10-29
boiseBoise (high-impact, new housing & demolition permits), IDArcGISCity of Boise open data22026-10-30
chicagoChicago, ILSocrataCity of Chicago Data Portal Terms of Use5832026-11-01
cook_county_demolitionCook County (suburban asbestos & demolition permits), ILSocrataPublic Domain (Cook County Open Data)1002026-11-02
rockford_ilRockford, ILSocrataIllinois EDP open data (City of Rockford)2302026-10-31
st_charles_ilSt. Charles, ILArcGISCity of St. Charles, IL open GIS data472026-11-02
wheatonWheaton, ILArcGISCity of Wheaton open data02026-10-22
overland_parkOverland Park, KSArcGISCity of Overland Park open data652026-10-29
louisvilleLouisville (Metro), KYArcGISLouisville Metro Open Data terms3332026-11-02
baton_rougeBaton Rouge (East Baton Rouge Parish), LASocrataPublic Domain1592026-10-30
new_orleansNew Orleans, LASocrataCC0 1.0 (Public Domain Dedication)3212026-11-02
bostonBoston, MACKANOpen Data Commons PDDL8192026-11-02
cambridge_maCambridge, MASocrataODC Public Domain Dedication and License1222026-10-31
somervilleSomerville, MASocrataOpen Data Commons ODbL1212026-10-29
worcesterWorcester, MAArcGISCity of Worcester open data3782026-10-31
baltimore_county_mdBaltimore County, MDArcGISBaltimore County Government open GIS data1932026-11-02
baltimoreBaltimore, MDArcGISOpen Baltimore terms6502026-11-01
montgomery_county_mdMontgomery County, MDSocrataPublic Domain3252026-10-28
detroitDetroit, MIArcGISDetroit Open Data Portal terms4852026-11-01
minneapolisMinneapolis, MNArcGISOpen Minneapolis terms9452026-11-01
kansas_city_moKansas City, MOSocrataCity of Kansas City, MO Open Data terms of use8762026-11-02
raymoreRaymore, MOArcGISCity of Raymore open data542026-10-30
brunswick_county_ncBrunswick County, NCArcGISBrunswick County open data8102026-10-30
caryCary, NCOpenDataSoftCC0 1.0 Universal1852026-10-30
charlotteCharlotte / Mecklenburg County, NCArcGISMecklenburg County open GIS data7542026-11-01
greensboroGreensboro, NCArcGISCity of Greensboro open GIS data772026-11-02
raleighRaleigh, NCArcGISCity of Raleigh Open Data terms1462026-10-29
wake_countyWake County (unincorporated & contract towns), NCArcGISWake County open data1092026-10-30
new_jerseyNew Jersey (statewide, municipality level), NJSocrataPublic Domain (NJ DCA)02026-10-19
hendersonHenderson, NVArcGISCity of Henderson open data382026-10-29
new_york_cityNew York City, NYSocrataNYC Open Data Terms of Use29682026-10-30
cincinnatiCincinnati, OHSocrataPublic Domain2012026-10-30
clevelandCleveland, OHArcGISCity of Cleveland Open Data terms2992026-10-31
columbusColumbus, OHArcGISCity of Columbus Open Data terms8982026-10-31
bendBend, ORArcGISCity of Bend Open Data terms1092026-11-01
jackson_county_orJackson County, ORArcGISJackson County, OR open GIS data762026-11-02
portland_orPortland, ORArcGISCity of Portland open data (PortlandMaps)22026-10-28
salemSalem, ORArcGISCity of Salem open data242026-10-30
philadelphiaPhiladelphia, PACARTOOpenDataPhilly / City of Philadelphia terms9642026-11-02
pittsburghPittsburgh, PACKANWPRDC (CC BY 4.0 / ODC)1752026-10-30
bluffton_scBluffton, SCArcGISTown of Bluffton open GIS data232026-10-30
charleston_scCharleston (new construction only), SCArcGISCity of Charleston open data02026-10-22
memphisMemphis / Shelby County, TNArcGISMemphis Data Hub terms1542026-10-30
nashvilleNashville (Metro Davidson County), TNArcGISNashville Open Data terms2082026-11-01
austinAustin, TXSocrataPublic Domain U.S. Government13702026-11-01
college_stationCollege Station, TXSocrataCity of College Station Open Data Terms1172026-10-30
collin_countyCollin County (Collin CAD, all cities), TXSocrataTexas Open Data Portal terms132026-10-31
dallasDallas, TXSocrataDallas OpenData Terms of Use14992026-11-01
fort_worthFort Worth, TXArcGISCity of Fort Worth open data terms11092026-11-02
harris_county_txHarris County (unincorporated), TXArcGISHarris County Engineering open GIS data (ePermits)6962026-11-03
san_antonioSan Antonio, TXCKANCity of San Antonio Open Data terms13002026-10-30
san_marcosSan Marcos, TXArcGISCity of San Marcos open data632026-10-31
tyler_txTyler, TXArcGISCity of Tyler open GIS data02026-10-09
arlington_county_vaArlington County, VAArlington Open Data APIArlington County Open Data policy3042026-11-01
charlottesvilleCharlottesville, VAArcGISCity of Charlottesville open data822026-11-01
norfolkNorfolk, VASocrataNorfolk Open Data Terms of Use2682026-11-01
virginia_beachVirginia Beach, VAArcGISCity of Virginia Beach Open Data terms5842026-10-30
bellevueBellevue, WAArcGISCity of Bellevue Open Data terms1892026-11-01
edgewood_waEdgewood, WAArcGISCity of Edgewood, WA open GIS data32026-10-30
everettEverett, WASocrataCity of Everett Open Data Terms2282026-10-30
pierce_countyPierce County (unincorporated), WASocrataPierce County Open Data Terms1392026-10-28
puyallupPuyallup, WAArcGISCity of Puyallup open GIS data292026-10-30
seattleSeattle, WASocrataPublic Domain8872026-10-31
tacomaTacoma, WAArcGISCity of Tacoma open data1392026-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_url links 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_class uses the source's occupancy/use field first, then permit type and description, then address unit, zoning, known residential installers and very large valuations; it is null when 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). The propertyClass filter drops those.
  • Derived ZIPs (zip_source: zcta_derived) use Census ZIP Code Tabulation Areas, which approximate USPS ZIPs.
  • contractor_normalized is 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 codes completed / no_match / failed and 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 to null; 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.