BuildZoom Contractor & Permit Scraper avatar

BuildZoom Contractor & Permit Scraper

Pricing

Pay per event

Go to Apify Store
BuildZoom Contractor & Permit Scraper

BuildZoom Contractor & Permit Scraper

Scrape contractor profiles from buildzoom.com — license registry across 150+ jurisdictions, recent building permits with project addresses + descriptions, BZ Score, specialties, contact info, and project value statistics. Sitemap-driven discovery across 1.2M+ US contractor profiles.

Pricing

Pay per event

Rating

0.0

(0)

Developer

BowTiedRaccoon

BowTiedRaccoon

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

1

Monthly active users

8 days ago

Last modified

Share

BuildZoom Contractor & Permit Scraper — Contractor License Lookup and Building Permit Data

Scrape contractor profiles from BuildZoom, the contractor directory and building permit database that aggregates US contractor licenses and building permits from 150+ municipal jurisdictions. Use it as a contractor license lookup and a building permit data export by city or state. 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. Runs on managed residential proxies and solves Cloudflare's managed challenge automatically, 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 This BuildZoom Contractor Directory and Permit 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

  1. Set maxItems to the number of contractor profiles you want.
  2. The scraper fetches BuildZoom's sitemap index, walks the contractor sub-sitemaps, and queues profile URLs until your target count is in range.
  3. For each profile it parses the embedded JSON-LD (HomeAndConstructionBusiness + GovernmentPermit array), the inline contractor metadata block, and the page's pricing histogram.
  4. Records flush to the dataset as they're scraped. You can stop the run early — anything already saved stays saved.

Input

{
"maxItems": 50
}
FieldTypeDefaultDescription
maxItemsinteger15Maximum 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.

Residential proxy and Cloudflare handling are fully managed — there is no proxy input to configure. BuildZoom is fronted by Cloudflare and blocks datacenter IPs at the edge, so the actor runs on managed residential exits and solves Cloudflare's managed challenge automatically when the site presents one.


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"
}
FieldTypeDescription
profileUrlstringCanonical contractor profile URL on buildzoom.com.
slugstringURL slug (the path segment after /contractor/).
contractorNamestringDisplay name.
businessNamestringBusiness name from the embedded contractor JSON. Usually identical to contractorName.
bzScorenumberBZ Score (0–200). Combines license status, permit volume, and consumer-feedback signals. 0 means BuildZoom hasn't computed one yet.
streetAddressstringOffice street address.
citystringOffice city.
statestringOffice state (US 2-letter code).
zipstringOffice ZIP.
countrystringAlways "US" for BuildZoom contractors.
phonestringPrimary phone from the JSON-LD telephone field. May be empty for self-claimed profiles.
emailstringAlways empty — BuildZoom gates email behind its lead-capture flow.
websitestringAlways empty — same reason as email.
logoUrlstringContractor logo image URL (Cloudinary-hosted).
aboutstringFree-text company description. Empty for unclaimed profiles.
specialtiesarray of stringsService offerings the contractor advertises (from hasOfferCatalog).
licensesCountnumberNumber of license/registration records on the profile.
licensesarray of stringsLicense records, each formatted Type | Number | Issuer | Area.
permitsRecentCountnumberNumber of permits surfaced in the JSON-LD on the profile. BuildZoom ships ~20 most-recent permits per profile, regardless of total.
permitsLastYearnumberPermits with validFrom in the last 365 days, computed from permitsRecent.
permitsRecentarray of stringsRecent permits, each formatted YYYY-MM-DD | identifier | category | issuer | project address | description (description truncated to 250 chars).
totalPermitsLifetimenumberLifetime permit count as published in the page meta description (e.g., the "116" in "116 building permits for $8M").
totalPermitValueLifetimenumberLifetime total permit value in USD. 0 when the page omits it (small contractors).
pricingRangeMinnumberMinimum project value the contractor handles (USD), parsed from the pricing meta tag.
pricingRangeMaxnumberMaximum project value the contractor handles (USD).
pricingHistogramarray of stringsProject-value histogram entries, each formatted count | range (e.g. "3 projects | $1mil+").
titlestringPage <title> tag.
metaDescriptionstringPage meta description — a one-line BuildZoom-authored summary.
lastmodstringLast modified timestamp from the sitemap entry (ISO date or empty).
scrapedAtstringISO 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?

Proxies are fully managed — you don't configure anything. BuildZoom is fronted by Cloudflare and blocks datacenter IPs at the edge, so the actor runs on managed residential exits and automatically solves Cloudflare's managed challenge whenever the site presents one.

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.

Can I look up contractors by state or city with this scraper?

Every record carries city and state (US 2-letter code), so you can filter the output to a contractor license lookup by state or a permit-data pull for a given city after the run. The scraper itself walks BuildZoom's sitemaps rather than a location search box, so you set maxItems and then segment the dataset by state, city, or zip downstream.


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 — managed residential proxy, automatic Cloudflare managed-challenge solving, and a polite request cadence that survives BuildZoom's per-IP rate limit so you can walk away from a 50K-profile run.