# BuildZoom Scraper | Contractors | Permits | Licenses (`ahmed_jasarevic/buildzoom-scraper`) Actor

Extract BuildZoom contractor profiles with licenses, permits, and insurance data for construction leads

- **URL**: https://apify.com/ahmed\_jasarevic/buildzoom-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## BuildZoom Scraper

Extract contractor profiles, license data, permit histories, and insurance details from BuildZoom — the largest database of licensed construction professionals in the U.S. Scrape general contractors, remodelers, and specialty trade leads with full contact info, surety bond status, and project portfolios in seconds.

### Main Use Cases

- **Construction Lead Generation** — Build targeted lists of licensed contractors with phone, email, and license status for cold outreach and sales pipelines.
- **Construction Market Intelligence** — Analyze permit volumes, project values, and contractor activity to spot growth trends across U.S. markets.
- **Contractor License Verification** — Cross-reference license numbers, insurance coverage, and surety bond status for compliance checks.
- **Real Estate Investment Research** — Track remodeling and construction activity in target neighborhoods to gauge market heat.
- **Competitive Analysis** — Monitor competitor contractor portfolios, review counts, and project histories to benchmark performance.
- **Bond & Insurance Underwriting** — Pull contractor financial data (surety bonds, GL coverage, workers comp) for risk assessment.

### How It Works

1. Provide one or more BuildZoom category or profile URLs as start points.
2. The actor crawls each URL, following pagination up to `maxPagesPerCategory` levels deep.
3. For each contractor profile found, it extracts contact details, license info, insurance status, bond data, and ratings.
4. If `includePermits` is enabled, it visits each contractor's permit history page and collects up to `maxPermitsPerContractor` permit records.
5. All data is pushed to a structured dataset. Pay-per-result billing: **$0.0035 per contractor record**.

### Input Parameters

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `startUrls` | `array` | Yes | — | Array of BuildZoom category or profile URLs to scrape |
| `maxItems` | `integer` | No | `50` | Maximum number of contractor profiles to return |
| `maxPagesPerCategory` | `integer` | No | `2` | Number of paginated listing pages to follow per category |
| `includePermits` | `boolean` | No | `true` | Whether to scrape permit and project history for each contractor |
| `maxPermitsPerContractor` | `integer` | No | `20` | Maximum permit records to collect per contractor profile |
| `maxRequestsPerCrawl` | `integer` | No | `200` | Hard cap on total HTTP requests for the entire run |
| `maxConcurrency` | `integer` | No | `4` | Number of concurrent browser pages; lower if hitting rate limits |
| `proxyConfiguration` | `object` | No | — | Apify proxy settings (residential recommended for large crawls) |

### Output

Each dataset item represents one contractor with the following fields:

| Field | Description |
|-------|-------------|
| `name` | Company or individual contractor name |
| `url` | BuildZoom profile URL |
| `phone` | Primary phone number |
| `email` | Contact email (if available) |
| `licenseNumber` | State-issued contractor license number |
| `licenseState` | State where the license is registered |
| `licenseType` | Classification (General Contractor, Remodeler, Specialty, etc.) |
| `insurance` | Object with `generalLiability` and `workersComp` booleans |
| `suretyBond` | Whether the contractor carries a surety bond |
| `rating` | Average review rating (0–5 scale) |
| `reviewCount` | Total number of customer reviews |
| `yearsInBusiness` | Years actively operating on BuildZoom |
| `specialties` | Array of specialty categories (e.g., "Kitchen Remodeling", "Roofing") |
| `location` | City, state of primary operations |
| `permits` | Array of permit records (if `includePermits` is true) |
| `permits[].permitNumber` | Unique permit identifier |
| `permits[].address` | Property address for the permit |
| `permits[].permitType` | Type of work permitted (Remodel, New Construction, etc.) |
| `permits[].value` | Estimated project value in USD |
| `permits[].status` | Permit status (Issued, Closed, Expired, etc.) |
| `permits[].dateIssued` | Date the permit was issued (ISO 8601) |

### Example Input JSON

```json
{
  "startUrls": [
    "https://www.buildzoom.com/austin-tx/general-contractors",
    "https://www.buildzoom.com/dallas-tx/remodeling-contractors"
  ],
  "maxItems": 100,
  "maxPagesPerCategory": 3,
  "includePermits": true,
  "maxPermitsPerContractor": 15,
  "maxRequestsPerCrawl": 300,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Example Output JSON

```json
{
  "name": "ABC General Contractors",
  "url": "https://www.buildzoom.com/contractors/abc-general-contractors",
  "phone": "(512) 555-1234",
  "email": "info@abcgc.com",
  "licenseNumber": "ABC123456",
  "licenseState": "TX",
  "licenseType": "General Contractor",
  "insurance": {
    "generalLiability": true,
    "workersComp": true
  },
  "suretyBond": true,
  "rating": 4.8,
  "reviewCount": 127,
  "yearsInBusiness": 15,
  "specialties": ["Residential Remodeling", "Kitchen Remodeling"],
  "location": "Austin, TX",
  "permits": [
    {
      "permitNumber": "BP2024-001234",
      "address": "123 Main St, Austin, TX",
      "permitType": "Remodel",
      "value": 85000,
      "status": "Issued",
      "dateIssued": "2024-03-15"
    },
    {
      "permitNumber": "BP2023-098765",
      "address": "456 Oak Ave, Austin, TX",
      "permitType": "New Construction",
      "value": 250000,
      "status": "Closed",
      "dateIssued": "2023-11-02"
    }
  ]
}
```

### Integrations & Automation

- **Google Sheets** — Push contractor leads directly into a shared spreadsheet for your sales team using Apify's Google Sheets integration.
- **HubSpot / Salesforce** — Export dataset items via webhooks or the Apify API to auto-create contacts in your CRM.
- **Slack / Email Alerts** — Set up webhooks to notify your team when a run completes with new leads.
- **Scheduled Runs** — Create a saved Actor task and schedule it weekly to monitor new contractors entering your target markets.
- **Zapier / Make** — Connect dataset output to 5,000+ apps for automated lead routing and follow-up sequences.
- **Custom Pipelines** — Use the Apify API (`GET /v2/datasets/{datasetId}/items`) to pull results into any data pipeline or warehouse.

### Related Actors

- [Google Maps Scraper](https://apify.com/capstone/google-maps-scraper) — Extract local business data including reviews and contact info from Google Maps.
- [Apify Web Scraper](https://apify.com/apify/web-scraper) — Generic web scraper for any website with CSS selector or regex extraction.
- [HomeAdvisor Scraper](https://apify.com/apify/homeadvisor-scraper) — Scrape contractor listings from HomeAdvisor for cross-platform lead comparison.
- [Yelp Scraper](https://apify.com/apify/yelp-scraper) — Pull business listings, reviews, and ratings from Yelp by category and location.

### FAQ

#### Why use this actor instead of the official API?

BuildZoom does not offer a public API for bulk contractor data extraction. This actor scrapes publicly available profile pages and permit records directly from the BuildZoom website, giving you structured data without API access restrictions, rate limits, or partnership requirements.

#### What are alternatives?

Alternatives include manually visiting each BuildZoom profile, using general-purpose web scrapers (which require custom configuration), or purchasing contractor data from third-party data brokers. This actor automates the entire process with pre-built extraction logic, proxy rotation, and structured output — saving hours of manual work.

#### Can I scrape contractors in specific cities or states?

Yes. Provide BuildZoom category URLs for any city or region (e.g., `https://www.buildzoom.com/portland-or/general-contractors`). You can include multiple URLs in `startUrls` to cover several markets in a single run.

#### How accurate is the permit data?

Permit data is scraped directly from BuildZoom's public permit records. Values and statuses reflect what BuildZoom has collected from municipal sources. For official verification, always cross-check with the issuing city or county building department.

#### Does this work for specialty contractors (electricians, plumbers, etc.)?

Yes. BuildZoom covers all licensed construction trades. Provide category URLs for the specific trade and location you need, and the actor will extract matching profiles and their permit histories.

### SEO Keywords

BuildZoom scraper, contractor data, construction leads, contractor license data, permit data, building permits, general contractor leads, construction market data, contractor insurance data, surety bond data, construction intelligence, contractor lead generation, build permits analysis, construction company data, remodel contractor data, licensed contractor database, construction project leads, contractor contact information

### For AI Agents & LLM Apps

**Purpose:** Scrape structured contractor profiles, license info, insurance status, and building permit histories from BuildZoom.

**Minimal input:**

```json
{
  "startUrls": ["https://www.buildzoom.com/austin-tx/general-contractors"],
  "maxItems": 10
}
```

**Output fields:** `name`, `url`, `phone`, `email`, `licenseNumber`, `licenseState`, `licenseType`, `insurance`, `suretyBond`, `rating`, `reviewCount`, `yearsInBusiness`, `specialties`, `location`, `permits` (array of permit records with `permitNumber`, `address`, `permitType`, `value`, `status`, `dateIssued`).

**Agent behaviors:**

- Always provide at least one valid BuildZoom URL in `startUrls` or the run will fail.
- Set `includePermits: false` to skip permit scraping and reduce cost and run time.
- Lower `maxConcurrency` if encountering HTTP 429 rate limit errors.
- Use `maxItems` to cap spend; billing is $0.0035 per contractor record returned.

**Billing:** $0.0035 per result (per contractor record extracted).

### Legal & Compliance Disclaimer

This Actor is an independent web scraping tool and is **not affiliated with, endorsed by, or connected to BuildZoom, Inc.** in any way. It accesses only publicly available web pages on buildzoom.com. Users are solely responsible for ensuring their use of this Actor complies with BuildZoom's Terms of Service, applicable laws, and regulations in their jurisdiction. The developer assumes no liability for misuse of scraped data. Always verify contractor license and insurance information through official state licensing boards before making business decisions.

# Actor input Schema

## `startUrls` (type: `array`):

BuildZoom category pages (e.g. https://www.buildzoom.com/austin-tx/general-contractors) and/or individual contractor profile URLs (https://www.buildzoom.com/contractor/<slug>).

## `maxItems` (type: `integer`):

Maximum number of contractor profiles to scrape in one run.

## `maxPagesPerCategory` (type: `integer`):

How many listing pages to follow per category URL (pagination via ?page=N).

## `includePermits` (type: `boolean`):

Include the pulled-permits portfolio (project history) for each contractor.

## `maxPermitsPerContractor` (type: `integer`):

Cap on permit records stored per contractor.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on total HTTP requests for the whole run (category + profile pages).

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Keep modest to stay gentle on the target.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. Requests are routed through Apify proxy by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.buildzoom.com/austin-tx/general-contractors"
    }
  ],
  "maxItems": 50,
  "maxPagesPerCategory": 2,
  "includePermits": true,
  "maxPermitsPerContractor": 20,
  "maxRequestsPerCrawl": 200,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.buildzoom.com/austin-tx/general-contractors"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/buildzoom-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.buildzoom.com/austin-tx/general-contractors" }] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/buildzoom-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.buildzoom.com/austin-tx/general-contractors"
    }
  ]
}' |
apify call ahmed_jasarevic/buildzoom-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/buildzoom-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yELeSzP4wPH0loTOg/builds/L8YjD6dgeT9Nuhmkr/openapi.json
