Building Permits Scraper: New Construction Leads by City
Pricing
from $4.00 / 1,000 permits
Building Permits Scraper: New Construction Leads by City
Returns newly issued building permits from 22 official US open-data portals (NYC, LA, Chicago and more) in one schema: type, value, address, ZIP, coordinates, business contractor and trade tags (solar, roofing, HVAC...). Filter by trade, value and ZIP; only new permits.
Pricing
from $4.00 / 1,000 permits
Rating
0.0
(0)
Developer
FedSignals Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
A building permit shows a project is about to happen, often weeks before a contractor is hired or materials are ordered. This Actor reads newly issued building permits from 22 official open-data portals, biggest metros first: New York City, Los Angeles, Chicago, San Antonio, San Jose, Austin, San Francisco, Columbus, Seattle, Washington DC, Boston, Raleigh, Minneapolis, Mesa, New Orleans, Pittsburgh, Cincinnati, Baton Rouge, Tempe, Cambridge MA, Montgomery County MD and New Jersey (statewide). It maps them into one common schema and tags each permit by trade (solar, roofing, HVAC, electrical, plumbing, EV charging, pool, ADU, demolition, new construction, and more). You can filter by trade, project value, property class, ZIP code or keyword. Incremental mode returns only permits you haven't seen before.
You don't need an API key. No personal data is collected. The Actor never reads owner or applicant names, contractor phone numbers or contractor addresses. For the newer portals it requests only the columns it maps, so those fields are never even downloaded. It returns a contractor name only when the name looks like a business, such as an LLC, Inc or a name containing "Roofing" or "Electric". A bare personal name, as sole proprietors often file under, is dropped.
Example input
{"cities": ["new-york", "los-angeles", "chicago", "austin", "columbus"],"daysBack": 7,"tradeTags": ["solar", "roofing", "hvac", "ev-charging"],"propertyClasses": ["Residential"],"minEstimatedCost": 5000,"onlyNew": true,"maxItems": 1000}
Example output
{"city": "San Francisco, CA","permitNumber": "S20260921748","propertyClass": "Residential", "proposedUse": "2 family dwelling","description": "solar permit: ... including 2 energy storage unit ... 13.5 kwh each ...","status": "issued", "appliedDate": "2026-09-21", "issuedDate": "2026-10-19","estimatedCost": 14000.0,"address": "738 El Camino Del Mar", "zip": "94121", "latitude": 37.7865, "longitude": -122.4913,"contractorCompany": null, "contractorTrade": null,"tradeTags": ["solar"],"url": "https://dbiweb02.sfgov.org/dbipts/default.aspx?page=Permit&PermitNumber=S20260921748","sourceDataset": "https://data.sfgov.org/Housing-and-Buildings/Building-Permits/i98e-djp9","licence": "ODC Public Domain Dedication and License (PDDL)"}
Every row has the same fields: city, cityKey, permitNumber, permitType, workClass, propertyClass, proposedUse, description, status, appliedDate, issuedDate, estimatedCost, address, zip, municipality, latitude, longitude, housingUnitsAdded, contractorCompany, contractorTrade, tradeTags, url, sourceDataset, licence, firstSeenAt. A field is null when the city doesn't publish it. For example, Boston has no applied date, Washington DC publishes no project value, Chicago has no ZIP, and New Jersey's statewide feed has no street address (only the municipality). municipality is filled for New York City (borough), Montgomery County MD and New Jersey.
If you don't choose cities, the Actor uses the original five (San Francisco, Seattle, Austin, New Orleans, Boston) so existing schedules keep the same cost. Select the others in the cities field.
Live test, Oct 29, 2026 (all 22 portals, permits issued Oct 22–29): 11,390 permit rows in about 34 seconds, with every portal answering. Rows by portal: New York City 3,494, Austin 1,315, Minneapolis 1,077, Washington DC 746, Columbus 720, San Antonio 702, Chicago 598, Los Angeles 559, San Jose 457, New Orleans 457, San Francisco 303, Cincinnati 190, Baton Rouge 173, Pittsburgh 141, Seattle 111, Raleigh 111, Tempe 61, Montgomery County MD 61, Mesa 52, Boston 45, Cambridge 17, New Jersey 0 (the state feed lags about 10 days; 7,000+ rows a week appear once processed). The earlier 5-city test (Oct 28) returned 2,123 permits, and the home-energy filter above returned 91.
Use cases
- Home-services lead lists. Roofers, solar and battery installers, HVAC, pool, fencing and remodel companies can find new projects (and competitors' jobs) by ZIP code.
- Suppliers and distributors. See where the work is: new construction, ADUs and commercial tenant improvements.
- Real-estate investors and analysts. Track new housing units, demolitions and renovation hot spots.
- Insurance, solar-finance and proptech teams. Feed permit activity into risk or propensity models.
Data source and terms
All data comes from official open-data APIs: Socrata SODA, CKAN DataStore and ArcGIS FeatureServer query endpoints. Only datasets whose published licence or terms allow commercial reuse are included, and each row carries its licence and sourceDataset. Licences and terms were checked on each portal on Oct 28–29, 2026:
| City / area | Dataset | Licence or terms |
|---|---|---|
| New York City, NY | rbx6-tga4 | NYC Open Data: public data, no restrictions on use (NYC Open Data Law; Terms of Use: as-is) |
| Los Angeles, CA | pi9x-tg5x | City of Los Angeles Open Data Terms of Use (no reuse restriction; as-is disclaimer) |
| Chicago, IL | ydr8-5enu | City of Chicago Data Portal Terms of Use (reuse allowed; apps must show the City's disclaimer, see README) |
| San Antonio, TX | c21106f9-3ef5-4f3a-8604-f992b4db7512 | Creative Commons Attribution (CC BY), City of San Antonio |
| San Jose, CA | 045b3678-e923-4002-b696-300955bc6d06 | Creative Commons CCZero (CC0) |
| Austin, TX | 3syk-w9eu | Public Domain (U.S. Government Works) |
| San Francisco, CA | i98e-djp9 | ODC Public Domain Dedication and License (PDDL) |
| Columbus, OH | FeatureServer layer | Creative Commons CC0 (public domain), City of Columbus |
| Seattle, WA | 76t5-zqzr | Public Domain |
| Washington, DC | FeatureServer layer | Creative Commons Attribution 4.0 (CC BY 4.0), District of Columbia |
| Boston, MA | 6ddcd912-32a0-43df-9908-63574f8c7e77 | ODC Public Domain Dedication and License (PDDL) |
| Raleigh, NC | FeatureServer layer | Open Raleigh Data Policy (terms of use: as-is; City may ask users to stop redistribution) |
| Minneapolis, MN | FeatureServer layer | CC0-style waiver: City of Minneapolis has waived all copyright and related rights |
| Mesa, AZ | dzpk-hxfb | City of Mesa open license (Management Policy 124: no restrictions on copying, distribution, modification or commercial use) |
| New Orleans, LA | 72f9-bi28 | CC0 1.0 Universal (Public Domain Dedication) |
| Pittsburgh, PA | f4d1177a-f597-4c32-8cbf-7885f56253f6 | Creative Commons Attribution (CC BY), City of Pittsburgh via WPRDC |
| Cincinnati, OH | uhjb-xac9 | Public Domain |
| Baton Rouge, LA | 7fq7-8j7r | Public Domain |
| Tempe, AZ | FeatureServer layer | Creative Commons Attribution 4.0 (CC BY 4.0), City of Tempe |
| Cambridge, MA | qu2z-8suj | ODC Public Domain Dedication and License (PDDL) |
| Montgomery County, MD | m88u-pqki | Public Domain |
| New Jersey (statewide) | w9se-dmra | Public Domain |
Sources with terms of use rather than a standard licence are labelled that way above (Los Angeles, New York City, Chicago, Raleigh); those cities may change their terms or ask users to stop.
Attribution (CC BY sources): contains data from the City of San Antonio, the City of Pittsburgh (via the Western Pennsylvania Regional Data Center), the District of Columbia (Open Data DC) and the City of Tempe, used under Creative Commons Attribution licences. The data has been reformatted into a common schema.
City of Chicago disclaimer (required by its terms of use): "This site provides applications using data that has been modified for use from its original source, www.cityofchicago.org, the official website of the City of Chicago. The City of Chicago makes no claims as to the content, accuracy, timeliness, or completeness of any of the data provided at this site. The data provided at this site is subject to change at any time. It is understood that the data provided at this site is being used at one's own risk."
Left out on purpose: portals with no stated licence, a non-commercial or share-alike licence, or a feed that stopped updating (for example Dallas, Houston, Detroit, Charlotte, Miami-Dade and Louisville). Trade tags and property class are keyword-based, best-effort labels. Always check the permit on the city's site before acting on it. Requests are rate-limited, retried with backoff on errors, and identified with a contact User-Agent. If one portal is down, the run continues with the others and the error is recorded in the SUMMARY record. An optional free Socrata app token raises rate limits.
Tips
- Add
excludeKeywordssuch as["revision", "extension"]to drop paperwork-only permits. - New York City and Austin are the largest feeds (over 1,000 a week each). Set
maxPerCityif you only want a sample. - New Jersey's statewide feed is processed monthly, so use
daysBack: 30or more for it. - New York City lists each work permit and its renewal sequence separately; incremental memory treats them as separate permits.
Scheduling
Run it daily with daysBack: 7 and onlyNew: true. Some cities post permits a few days late (Seattle's and New Orleans' feeds lagged 5–6 days in testing). The 7-day look-back catches late rows, and incremental memory keeps you from being charged twice. Use a separate stateKey for each saved task, for example one task per trade or territory, and connect the dataset to Google Sheets, a CRM or a webhook.
How much does it cost?
Pay per event: you pay only for the events below plus Apify's $0.00005 run-start fee. Platform compute is included in the price.
- $4 per 1,000 permits ($0.004 per permit delivered).
Real examples from our test runs:
- Quick-start input (10 permits): 10 × $0.004 = about $0.04.
- Every permit from the default five cities for a week: 2,123 permits in our Oct 28 test = about $8.49.
- Every permit from all 22 portals for a week: 11,390 permit rows in our Oct 29 local test = about $45.56. Use trade, value and ZIP filters to cut this down.
- Home-energy leads (solar, roofing, HVAC, EV charging; residential; $5k+; 14 days): 91 permits in our test = about $0.36.
Use maxItems and Apify's per-run spending limit to cap spend; the Actor stops cleanly when the limit is reached.
Limits
- Some city feeds post permits several days late; keep
daysBackat 7. - Trade tags and property class are keyword-based, best-effort labels.
- Redaction of free-text descriptions is pattern-based, so it is best effort.
FAQ
Which cities are covered?
22 portals: New York City, Los Angeles, Chicago, San Antonio, San Jose, Austin, San Francisco, Columbus, Seattle, Washington DC, Boston, Raleigh, Minneapolis, Mesa, New Orleans, Pittsburgh, Cincinnati, Baton Rouge, Tempe, Cambridge MA, Montgomery County MD and New Jersey (statewide). See the licence table under Data source and terms.
Can you add my city?
Open an issue with the city's open-data portal link. Cities with an open licence (public domain, PDDL, CC0 or similar) can be added.
Does it return homeowner names or phone numbers?
No. Owner and applicant names, phones and contractor addresses are never read, and emails and phone numbers in descriptions are redacted.
Why is the value or contractor empty?
Not every city publishes every field. A field is null when the portal doesn't provide it.
Reliability
Measured on Apify as of Oct 29, 2026: 4 of 4 of our own test runs succeeded (100%), with a median run time of 4 seconds (longest 7 s) on small test inputs. It is a small sample from a new Actor; we will update it as runs accumulate. Local test, Oct 29, 2026: 7 days from all 22 portals returned 11,390 permit rows in about 34 seconds with every portal answering; one failing portal never fails the run.
Use it from AI agents (MCP)
Add this Actor as a tool in Claude Desktop, Cursor or any MCP client through the Apify MCP server:
{"mcpServers": {"building-permits-monitor": {"url": "https://mcp.apify.com?tools=fedsignals/building-permits-monitor","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Use it from code (API)
One call runs the Actor and returns the dataset items. maxTotalChargeUsd caps what the run can charge.
Python:
import requestsitems = requests.post("https://api.apify.com/v2/acts/fedsignals~building-permits-monitor/run-sync-get-dataset-items",params={"maxTotalChargeUsd": 1},headers={"Authorization": "Bearer YOUR_APIFY_TOKEN"},json={"cities": ["san-francisco", "austin"], "daysBack": 7, "onlyNew": False, "maxItems": 10},timeout=300,).json()print(len(items), "items")
JavaScript (Node 18+):
const res = await fetch("https://api.apify.com/v2/acts/fedsignals~building-permits-monitor/run-sync-get-dataset-items?maxTotalChargeUsd=1",{method: "POST",headers: { Authorization: "Bearer YOUR_APIFY_TOKEN", "Content-Type": "application/json" },body: JSON.stringify({"cities": ["san-francisco", "austin"], "daysBack": 7, "onlyNew": false, "maxItems": 10}),});const items = await res.json();console.log(items.length, "items");
Related FedSignals Actors
- SAM.gov Scraper: Federal Contract Opportunities Monitor: new SAM.gov contract opportunities, filtered and deduplicated
- SEC Form D Scraper: New Startup Funding Rounds: new private funding rounds from SEC Form D filings
- Expiring Federal Contracts: Recompete Finder (USAspending): federal contracts expiring soon, with incumbents
- USAspending Scraper: Federal Spending Trends by Category: where federal contract spending is growing
Feedback
Found a bug or need a filter or source? Open an issue on the Issues tab or email fedsignals.alerts@gmail.com.
This Actor is not affiliated with or endorsed by any city government.