BuildZoom Contractor & Permit Scraper
BuildZoom Contractor & Permit Scraper
Scrape contractor profiles from BuildZoom, the database that aggregates US contractor licenses and building permits from 150+ municipal jurisdictions. Returns license registry, recent permits with project addresses, BZ Score, specialties, contact info, and project-value statistics across ~1.2M general and specialty contractors.
BuildZoom Contractor & Permit Scraper Features
- Extracts 25+ structured fields per contractor profile.
- Returns the full license registry — every county, city, or state license attached to a contractor, with issuer, license type, and identifier.
- Captures recent building permits with project address, work category, issuer, validFrom date, and the original permit description.
- Surfaces BuildZoom's proprietary BZ Score (0–200), which weights license status, permit volume, and consumer-feedback signals.
- Pulls the contractor's published lifetime permit count and total dollar value (the headline "$8M across 116 permits" stat) straight from the page metadata.
- Sitemap-driven discovery walks BuildZoom's 131 contractor sitemaps. You set
maxItems, the scraper handles the rest. - Cloudflare-resistant. Uses Apify Residential US proxies with session rotation, so you don't get the "Sorry, you have been blocked" page.
- Clean JSON output with consistent field names. Arrays are flattened to pipe-delimited strings so downstream tools don't need nested-object handling.
Who Uses BuildZoom Contractor Data?
- Construction software vendors — Build target lists for Procore, ServiceTitan, Jobber, and similar GTM motions, segmented by trade specialty and permit volume.
- Tool & material manufacturers — Identify high-volume contractors in specific trades (roofing, masonry, electrical) for wholesale program outreach.
- Building-supply distributors — Feed contractor profiles into pro-account acquisition pipelines, qualified by recent permit activity.
- Insurance underwriters — Score contractor risk with license registry coverage, jurisdictional reach, and permit-value history.
- Market researchers — Map the US construction trades by specialty mix, jurisdictional concentration, and permit-value distribution. The data is also useful for the consumer-facing question of whether the contractor knocking on your door is real.
How BuildZoom Contractor & Permit Scraper Works
- Set
maxItemsto the number of contractor profiles you want. - The scraper fetches BuildZoom's sitemap index, walks the contractor sub-sitemaps, and queues profile URLs until your target count is in range.
- For each profile it parses the embedded JSON-LD (HomeAndConstructionBusiness + GovernmentPermit array), the inline contractor metadata block, and the page's pricing histogram.
- Records flush to the dataset as they're scraped. You can stop the run early — anything already saved stays saved.
Input
{
"maxItems": 50,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
maxItems |
integer | 15 | Maximum number of contractor profiles to scrape. The default is 15 because Apify's tester run has a 5-minute hard timeout. Set higher for production runs. |
proxyConfiguration |
object | Apify Residential US | Proxy configuration. Residential US is required — BuildZoom blocks datacenter IPs at the edge. |
BuildZoom Contractor & Permit Scraper Output Fields
{
"profileUrl": "https://www.buildzoom.com/contractor/a-horn-inc",
"slug": "a-horn-inc",
"contractorName": "A. Horn, Inc",
"businessName": "A. Horn, Inc",
"bzScore": 102,
"streetAddress": "125 Harrison St",
"city": "Barrington",
"state": "IL",
"zip": "60010",
"country": "US",
"phone": "(847) 382-4170",
"email": "",
"website": "",
"logoUrl": "https://media.buildzoom.com/filestack/image/oYQNIgSZuZ11Cwa5N4Cw",
"about": "",
"specialties": ["Custom Home Build", "New Home Construction", "Multi-Room Remodel", "Kitchen Remodel", "Roofing", "..."],
"licensesCount": 11,
"licenses": [
"Mason Contractor | 4845 | Cook County Department of Building and Zoning | Cook County",
"Masonry Contractor Registration | CON-008814-2025 | Village of Palatine Registered Contractors | Palatine",
"..."
],
"permitsRecentCount": 20,
"permitsLastYear": 3,
"permitsRecent": [
"2025-04-22 | 101006981 | New Construction | Chicago Department of Buildings | 1954 W 115th St, Chicago, IL | Spr 2019 cbrc - b3-1/rs-3. Replacement of existing train station with two warming shelters...",
"..."
],
"totalPermitsLifetime": 116,
"totalPermitValueLifetime": 8004000,
"pricingRangeMin": 1000,
"pricingRangeMax": 10000000,
"pricingHistogram": [
"1 project | $100k-$250k",
"3 projects | $1mil+"
],
"title": "A Horn | Barrington IL | Read Reviews + Get a Free Estimate | BuildZoom",
"metaDescription": "A. Horn, Inc in Barrington, IL | Photos | Reviews | 116 building permits for $8,004,000. Recent work: ...",
"lastmod": "2025-05-15",
"scrapedAt": "2026-05-02T01:43:09.123Z"
}
| Field | Type | Description |
|---|---|---|
profileUrl |
string | Canonical contractor profile URL on buildzoom.com. |
slug |
string | URL slug (the path segment after /contractor/). |
contractorName |
string | Display name. |
businessName |
string | Business name from the embedded contractor JSON. Usually identical to contractorName. |
bzScore |
number | BZ Score (0–200). Combines license status, permit volume, and consumer-feedback signals. 0 means BuildZoom hasn't computed one yet. |
streetAddress |
string | Office street address. |
city |
string | Office city. |
state |
string | Office state (US 2-letter code). |
zip |
string | Office ZIP. |
country |
string | Always "US" for BuildZoom contractors. |
phone |
string | Primary phone from the JSON-LD telephone field. May be empty for self-claimed profiles. |
email |
string | Always empty — BuildZoom gates email behind its lead-capture flow. |
website |
string | Always empty — same reason as email. |
logoUrl |
string | Contractor logo image URL (Cloudinary-hosted). |
about |
string | Free-text company description. Empty for unclaimed profiles. |
specialties |
array of strings | Service offerings the contractor advertises (from hasOfferCatalog). |
licensesCount |
number | Number of license/registration records on the profile. |
licenses |
array of strings | License records, each formatted Type | Number | Issuer | Area. |
permitsRecentCount |
number | Number of permits surfaced in the JSON-LD on the profile. BuildZoom ships ~20 most-recent permits per profile, regardless of total. |
permitsLastYear |
number | Permits with validFrom in the last 365 days, computed from permitsRecent. |
permitsRecent |
array of strings | Recent permits, each formatted YYYY-MM-DD | identifier | category | issuer | project address | description (description truncated to 250 chars). |
totalPermitsLifetime |
number | Lifetime permit count as published in the page meta description (e.g., the "116" in "116 building permits for $8M"). |
totalPermitValueLifetime |
number | Lifetime total permit value in USD. 0 when the page omits it (small contractors). |
pricingRangeMin |
number | Minimum project value the contractor handles (USD), parsed from the pricing meta tag. |
pricingRangeMax |
number | Maximum project value the contractor handles (USD). |
pricingHistogram |
array of strings | Project-value histogram entries, each formatted count | range (e.g. "3 projects | $1mil+"). |
title |
string | Page <title> tag. |
metaDescription |
string | Page meta description — a one-line BuildZoom-authored summary. |
lastmod |
string | Last modified timestamp from the sitemap entry (ISO date or empty). |
scrapedAt |
string | ISO timestamp when the record was scraped. |
FAQ
How do I scrape BuildZoom contractor profiles?
BuildZoom Contractor & Permit Scraper does it for you. Set maxItems to your target record count, run the actor, and pull the dataset. The actor handles sitemap discovery, Cloudflare-friendly proxy rotation, and JSON-LD extraction in one step.
How much does BuildZoom Contractor & Permit Scraper cost to run?
BuildZoom Contractor & Permit Scraper bills $0.10 per actor start and $0.002 per record. A 1,000-profile run costs about $2.10 in actor charges. Apify's residential proxy bandwidth is billed separately by the platform.
What data can I get from BuildZoom?
BuildZoom Contractor & Permit Scraper returns 25+ fields per profile: name, address, phone, BZ Score, full license registry, recent building permits with project addresses, lifetime permit count and dollar value, project-value pricing histogram, and the contractor's specialty mix. Email and external website are gated by BuildZoom and come back empty.
Does BuildZoom Contractor & Permit Scraper need proxies?
BuildZoom Contractor & Permit Scraper requires Apify Residential US proxies. BuildZoom is fronted by Cloudflare and blocks datacenter IPs at the edge. Residential traffic passes the WAF cleanly without any CAPTCHA solving.
How do I get a contractor's email or website?
BuildZoom Contractor & Permit Scraper does not return either. Both are hidden behind BuildZoom's lead-capture flow (sign-up + project request) and aren't present in the public profile HTML. The scraper surfaces the fields anyway as empty strings so the dataset shape stays consistent.
Does BuildZoom Contractor & Permit Scraper return all permits a contractor has pulled?
BuildZoom Contractor & Permit Scraper returns the most-recent permits BuildZoom embeds in the page (~20 per profile). The full lifetime count and total dollar value come from the page's meta description and are stored in totalPermitsLifetime and totalPermitValueLifetime.
Need More Features?
Need extra fields, geographic filters, or a different target site? File an issue or get in touch.
Why Use BuildZoom Contractor & Permit Scraper?
- Affordable — $0.10/start + $0.002/record.
- Comprehensive output — 25+ fields per profile including the full multi-jurisdiction license registry and recent permits with project addresses, which together are the unique signal BuildZoom adds on top of generic contractor directories.
- Production-ready — Cloudflare bypass via Apify Residential US, session rotation, and a tuned 30 req/min throttle that survives BuildZoom's per-IP rate limit so you can walk away from a 50K-profile run.