Building Permits Scraper — Construction Leads & Permit Data
Pricing
from $3.00 / 1,000 building permit leads
Building Permits Scraper — Construction Leads & Permit Data
Export recent building permits from Chicago, Austin, Seattle, NYC and San Francisco as construction leads with value, address and contractor. USD 5 per 1,000.
Pricing
from $3.00 / 1,000 building permit leads
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
37 minutes ago
Last modified
Categories
Share
Building Permits Scraper turns recent public building permits from city open-data portals into construction leads: permit number, type, status, issue date, work description, project value, address, coordinates, and the contractor, architect, applicant or owner named on the permit. It is built for roofing, solar, HVAC, electrical and plumbing contractors, building-material suppliers, insurers and real-estate researchers, and it costs USD 5 per 1,000 permit leads on the FREE tier (USD 3 per 1,000 on GOLD).
Ready-made sources cover Chicago, San Francisco, Austin, Seattle and New York City, and you can add up to ten other public Socrata building permit datasets by URL. No login, cookies or API key are needed.
What building permit data does it return?
Each dataset item is one permit lead. Every field is always present; a value the city does not publish is null.
| Field | What it contains |
|---|---|
leadId, permitNumber | Stable deduplication key (city:permit) and the city's permit or job number |
jurisdiction | Source city, for example Chicago, IL |
permitType, permitStatus | Permit classification and status in the city's own words |
issueDate, applicationDate, expirationDate | Dates normalized to YYYY-MM-DD |
workDescription, propertyUse, housingUnits | Scope of work and use indicators |
projectValue, fees | Reported or estimated job value and permit fees in USD |
address, city, state, postalCode | Project location |
latitude, longitude | Published coordinates |
contactName, contactCompany, contactRole, contactPhone | Contractor, architect, permittee or applicant named on the permit |
ownerName | Property owner or owner organization when published |
sourceDatasetId, sourceDatasetName, sourceUrl, scrapedAt | Provenance and collection time |
rawData | The original source row, only when Include original source row is on |
Which cities' building permits can I search?
Five presets are built in, and each city publishes different columns:
| Preset | Contact fields you can expect | Notes |
|---|---|---|
| Chicago, IL | Contact name and role (contractor, architect or engineer preferred), owner name | The permit rows carry no ZIP column, so postalCode comes from the city's official ZIP boundaries for the permit location; the ZIP filter works |
| San Francisco, CA | None in the main permit dataset | Address, ZIP, value and status are published |
| Austin, TX | Contractor or applicant name, company, trade and phone | The richest contact data of the five |
| Seattle, WA | Contractor company name | Value and ZIP published |
| New York City, NY | Permittee name, business, license type and phone; owner name | Issue dates are stored as text and filtered after download |
Custom Socrata dataset URLs accept any public HTTPS /resource/, /api/views/ or /d/ URL with an ID such as abcd-1234. The dataset needs a recognizable issue-date column; common column names are mapped automatically, and Include original source row shows anything the normalized fields miss.
How do I get construction leads from building permits?
Pick the cities, set a date window, then narrow by keyword, permit type or value.
- Supported cities: one or more presets (default Chicago).
- Recent permit window (days): a rolling window ending today (default 30, up to 3,650), or a fixed Start date and End date in
YYYY-MM-DD. - Project keywords: keep permits whose description, type, address, company, contact or use contains any term, such as
roof,solarorremodel. - Permit types and Permit statuses: contains-filters in each city's vocabulary, such as
electricalorissued. - Minimum project value: keep permits at or above a USD amount; any value above zero drops permits with no published value.
- Maximum leads: 1 to 5,000 per run (default 100). Results are sorted newest issue date first across all cities.
Roofing and solar leads over USD 25,000 in Austin and Seattle:
{"jurisdictions": ["austin-tx", "seattle-wa"],"lookbackDays": 60,"keywords": ["roof", "solar"],"minProjectValue": 25000,"maxResults": 200}
A fixed month from a custom public dataset:
{"jurisdictions": [],"customDatasetUrls": ["https://data.example.gov/resource/abcd-1234.json"],"startDate": "2026-08-01","endDate": "2026-08-31","maxResults": 50}
When should I use Building Permits Scraper, and when not?
Use it when you want fresh, permit-backed project signals in the five preset cities or another Socrata city: who is building what, where, and for how much.
Use another Actor when:
- You need Chicago building code violations by address rather than permits: Chicago Building Violations Scraper.
- You want contractor businesses with emails and websites rather than projects: Contractor Leads Scraper.
- You need state contractor license records: Colorado Contractor License Lookup or CT Contractor License Lookup.
It is not a national permit database, not proof of a permit's legal status, and it does not read planning applications or permit portals that are not published as Socrata datasets.
Use it from an AI assistant
Building Permits Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add it with https://mcp.apify.com/?tools=muhammadafzal/building-permit-lead-scraper, then ask, for example: "Find roofing permits issued in Austin in the last 30 days with a project value over USD 50,000, and list the contractor and phone for each."
Run it with the API
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/building-permit-lead-scraper').call({jurisdictions: ['austin-tx'],lookbackDays: 30,keywords: ['solar'],maxResults: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((p) => `${p.issueDate} | ${p.address} | ${p.contactCompany} | ${p.projectValue}`));
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("muhammadafzal/building-permit-lead-scraper").call(run_input={"jurisdictions": ["new-york-city-ny"], "lookbackDays": 90, "maxResults": 50},)for permit in client.dataset(run.default_dataset_id).iterate_items():print(permit["issueDate"], permit["address"], permit["contactName"], permit["contactPhone"])
What does the output look like?
Two leads (the Chicago one is from a 2026-10-26 run; the Austin one shows that city's contact fields with sample values):
[{"leadId": "chicago-il:101087278","permitNumber": "101087278","jurisdiction": "Chicago, IL","permitType": "PERMIT - RENOVATION/ALTERATION","permitStatus": "ACTIVE","issueDate": "2026-10-23","applicationDate": "2026-08-14","workDescription": "NEW AT GRADE MUDROOM ADDITION AND BACK OF HOUSE RENOVATION AT AN EXISTING 3-STORY FRAMED SINGLE FAMILY HOME ...","projectValue": 370000,"fees": 1132.5,"address": "4437 N KOSTNER AVE","city": "Chicago","state": "IL","postalCode": "60630","latitude": 41.9619,"longitude": -87.7383,"contactName": "BASSETT-DILLEY, THOMAS R","contactCompany": null,"contactRole": "ARCHITECT","contactPhone": null,"ownerName": "NICHOLAS L SHEA","sourceDatasetId": "ydr8-5enu","sourceUrl": "https://data.cityofchicago.org/d/ydr8-5enu","rawData": null},{"leadId": "austin-tx:2026-012345 BP","jurisdiction": "Austin, TX","permitType": "Building Permit","permitStatus": "Active","issueDate": "2026-09-03","workDescription": "Interior remodel of commercial tenant space","projectValue": 250000,"address": "500 CONGRESS AVE","postalCode": "78701","contactName": "Alex Builder","contactCompany": "Example Construction LLC","contactRole": "General Contractor","contactPhone": "512-555-0100","sourceUrl": "https://data.austintexas.gov/d/3syk-w9eu"}]
A SUMMARY record in the key-value store reports the outcome (data, partial, empty, rejected or blocked), rows scanned, per-city status and warnings. It is never mixed into the lead dataset.
How much does building permit data cost?
Pay per event; Apify platform usage is included in the prices.
| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM / DIAMOND |
|---|---|---|---|---|---|
| Building permit lead (one dataset item) | USD 0.005 | USD 0.0045 | USD 0.004 | USD 0.003 | USD 0.003 |
| Actor start (per started GB of allocated memory) | USD 0.005 | USD 0.005 | USD 0.005 | USD 0.005 | USD 0.005 |
The default memory is 256 MB, so a run normally has one start event. Worked totals on the FREE tier:
- Console prefill (Chicago, last 30 days, 100 leads): 100 × USD 0.005 + USD 0.005 = USD 0.505
- 1,000 leads: 1,000 × USD 0.005 + USD 0.005 = USD 5.005
A run that matches nothing pays only the start event. The Actor checks your maximum cost per run before each lead and stops cleanly when the next lead would exceed it.
How fast is it, and what are the limits?
- Speed: the 100-lead Chicago prefill finished in about 19 seconds on 2026-10-26.
- Scan bound: at most 10,000 rows (10 pages of 1,000) per city per run. Very selective filters over a long window can stop at that bound;
SUMMARYthen carries a warning. - Partial failures: if one city's portal fails, leads from the other cities are kept and the run is marked
partial. - Freshness: each city updates its portal on its own schedule; the newest permits can be a few days old.
FAQ
Is there a free way to get building permit leads?
You can run the Actor on Apify's free plan and pay only the per-lead price, with no subscription. The city portals themselves are free to browse one permit at a time.
Does it include contractor phone numbers?
Only where the city publishes them. Austin and New York City include phones; Chicago and Seattle give names or companies; San Francisco's main dataset has no contacts.
Can I filter by ZIP code?
Yes, with ZIP/postal codes, for all five cities. Chicago publishes no ZIP column, so its ZIP comes from the city's official ZIP boundaries for the permit location; a Chicago permit without a mapped location has postalCode null and does not match a ZIP filter.
Can I add a city that is not in the list?
Yes, if the city publishes its permits as a public Socrata dataset. Paste its dataset URL into Custom Socrata dataset URLs.
How far back can I search?
Up to 3,650 days with the rolling window, or any range with Start date and End date, within the 10,000-row scan bound per city.
Can I turn off personal names?
Yes. Switch off Include public contact details and the contact, company and owner fields are returned as null.
Related Actors
- Chicago Building Violations Scraper for code violations by address
- Colorado Contractor License Lookup for licensed electrical and plumbing contractors
- CT Contractor License Lookup for Connecticut contractor credentials
- Contractor Leads Scraper for trades businesses with emails and phones
Legal and compliance
Permit records are public government data, but names and phone numbers on them can identify individuals. Use them only for lawful, relevant outreach: honor Do Not Call, TCPA, CAN-SPAM and state rules, check each portal's terms, and verify a permit on the city's own site before relying on it. The Actor does not log in, solve CAPTCHAs or use private systems.
Last verified: 2026-10-27