Building Permits Scraper — Construction Leads & Permit Data avatar

Building Permits Scraper — Construction Leads & Permit Data

Pricing

from $3.00 / 1,000 building permit leads

Go to Apify Store
Building Permits Scraper — Construction Leads & Permit Data

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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

37 minutes ago

Last modified

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.

FieldWhat it contains
leadId, permitNumberStable deduplication key (city:permit) and the city's permit or job number
jurisdictionSource city, for example Chicago, IL
permitType, permitStatusPermit classification and status in the city's own words
issueDate, applicationDate, expirationDateDates normalized to YYYY-MM-DD
workDescription, propertyUse, housingUnitsScope of work and use indicators
projectValue, feesReported or estimated job value and permit fees in USD
address, city, state, postalCodeProject location
latitude, longitudePublished coordinates
contactName, contactCompany, contactRole, contactPhoneContractor, architect, permittee or applicant named on the permit
ownerNameProperty owner or owner organization when published
sourceDatasetId, sourceDatasetName, sourceUrl, scrapedAtProvenance and collection time
rawDataThe original source row, only when Include original source row is on

Five presets are built in, and each city publishes different columns:

PresetContact fields you can expectNotes
Chicago, ILContact name and role (contractor, architect or engineer preferred), owner nameThe 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, CANone in the main permit datasetAddress, ZIP, value and status are published
Austin, TXContractor or applicant name, company, trade and phoneThe richest contact data of the five
Seattle, WAContractor company nameValue and ZIP published
New York City, NYPermittee name, business, license type and phone; owner nameIssue 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.

  1. Supported cities: one or more presets (default Chicago).
  2. 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.
  3. Project keywords: keep permits whose description, type, address, company, contact or use contains any term, such as roof, solar or remodel.
  4. Permit types and Permit statuses: contains-filters in each city's vocabulary, such as electrical or issued.
  5. Minimum project value: keep permits at or above a USD amount; any value above zero drops permits with no published value.
  6. 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:

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 ApifyClient
client = 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.

EventFREEBRONZESILVERGOLDPLATINUM / DIAMOND
Building permit lead (one dataset item)USD 0.005USD 0.0045USD 0.004USD 0.003USD 0.003
Actor start (per started GB of allocated memory)USD 0.005USD 0.005USD 0.005USD 0.005USD 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; SUMMARY then 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.

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.

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