# BuildZoom Scraper (`actums/buildzoom-scraper`) Actor

Extract data from BuildZoom, a remodeling platform that aggregates information from building permits to contractors' licenses. Crawl properties and contractors based on location and scrape descriptions, photos, and page details. Export acquired data into datasets of HTML, JSON, Excel, or CSV.

- **URL**: https://apify.com/actums/buildzoom-scraper.md
- **Developed by:** [Actums](https://apify.com/actums) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 58 total users, 7 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

$49.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

This Apify actor is a powerful **BuildZoom scraper** designed to extract comprehensive contractor and permit data directly from BuildZoom.com. It acts as a robust **BuildZoom API** alternative, providing structured data for market research, lead generation, and competitive analysis in the construction industry.

### What is the BuildZoom Scraper?

The BuildZoom Scraper is a specialized tool that navigates BuildZoom.com to collect detailed information about general contractors, their services, and their project history, including crucial **permit data**. This actor is ideal for anyone needing to programmatically access **BuildZoom data** for business intelligence or lead generation without relying on an official **BuildZoom API**.

### Why use the BuildZoom Scraper?

#### Comprehensive Contractor Data Extraction

Our **BuildZoom scraper** goes beyond basic contact information, providing a rich dataset for each contractor:

*   **Detailed Contractor Profiles**: Extract names, locations, phone numbers, and BuildZoom scores.
*   **License Verification**: Obtain detailed license information, including license numbers, statuses, cities, types, business types, verification dates, and links.
*   **Employee Details**: Get insights into a contractor's team, including employee names and titles.
*   **Services Offered**: Discover the full range of services provided by each contractor.
*   **Project Overviews**: Understand a contractor's activity with total permitted projects, projects over recent years, and typical permit values.

#### Unlock Valuable Permit Data

This **BuildZoom API** alternative excels at extracting in-depth **permit data**, offering unparalleled insights into a contractor's work history:

*   **Permit Details**: For each project, retrieve the permit header, address, date, detailed description, valuation, permit number, status, fee, permit type, and building type.
    *   **Enhanced Permit Collection**: Unlike the limited 40 permits available through a standard browser visit, this scraper can now extract up to **300 permits** per contractor directly from the BuildZoom API.
    *   **Custom Sorting**: Permits can be sorted by `effective_date`, `job_value`, or `score` via a user input, providing flexible data analysis.
*   **Project History**: Gain a clear understanding of past projects, their scope, and their outcomes.

#### Apify Platform Advantages

Leverage the power of the Apify platform for your **BuildZoom data extraction** needs:

*   **Scalability**: Run large-scale scraping operations efficiently.
*   **Reliability**: Benefit from automatic proxy rotation and error handling.
*   **Scheduling**: Automate your data collection with scheduled runs.
*   **Integrations**: Easily connect with tools like Zapier, Make, and other business applications.
*   **API Access**: Access your scraped **BuildZoom data** programmatically via Node.js and Python SDKs.

#### Use Cases for BuildZoom Data

*   **Lead Generation**: Identify potential clients or partners in the construction industry.
*   **Market Research**: Analyze trends, contractor activity, and project types in specific locations.
*   **Competitive Analysis**: Monitor competitors' project portfolios and service offerings.
*   **Due Diligence**: Verify contractor credentials and project history before hiring.
*   **Real Estate Development**: Gain insights into construction activity and property development.

### How to scrape BuildZoom data

Using the BuildZoom Scraper is straightforward. Simply provide your search criteria in the input form:

1.  **Go to the Input tab**: Here you will define your scraping parameters.
2.  **Enter a Search Term**: Specify keywords like "general contractor" or "plumber".
3.  **Provide a Location**: Use the format "City, ST" (e.g., "Dallas, TX").
4.  **Set Max Pages**: Define how many search result pages to crawl (0 for unlimited).
5.  **Set Max Requests per Crawl**: Limit the total number of requests (0 for unlimited).

For more detailed instructions and options, please refer to the **Input** tab of this actor.

### What data can the BuildZoom Scraper extract?

The **BuildZoom scraper** extracts a comprehensive set of data points for each contractor and their associated permits. Below is a summary of the key fields:

| Field Name             | Description                                                                 |
| :--------------------- | :-------------------------------------------------------------------------- |
| `url`                  | The URL of the contractor's profile page.                                   |
| `contractorName`       | The name of the contractor.                                                 |
| `description`          | A brief description of the contractor's business.                           |
| `location`             | The primary location of the contractor.                                     |
| `phoneNumber`          | The contact phone number for the contractor.                                |
| `bzScore`              | The BuildZoom score of the contractor.                                      |
| `numberOfProjects`     | The total number of projects listed for the contractor.                     |
| `fullAddress`          | The full street address of the contractor.                                  |
| `reviewsCount`         | The number of reviews the contractor has received.                          |
| `totalPermittedProjects`| Total number of permitted projects.                                         |
| `totalProjectsLastXYears`| Total projects in the last X years.                                         |
| `totalProjectsYears`   | The number of years considered for `totalProjectsLastXYears`.               |
| `typicalPermitValue`   | The typical value of permits obtained by the contractor.                    |
| `insurer`              | The contractor's insurance provider.                                        |
| `insuredAmount`        | The insured amount.                                                         |
| `licenses`             | An array of objects, each detailing a contractor's license (number, status, city, type, business type, verification date, link). |
| `employees`            | An array of objects, each detailing an employee (name, title).              |
| `servicesOffered`      | An array of strings, listing the services the contractor offers.            |
| `permits`              | An array of objects, each detailing a building permit (header, address, date, description, valuation, permit number, status, fee, permit type, building type). |

### How much will it cost to scrape BuildZoom?

Web scraping costs can vary based on the complexity of the website and the volume of data extracted. The **BuildZoom Scraper** operates on the Apify platform, which charges based on [Compute Unit (CU) consumption](https://apify.com/pricing). A Compute Unit is a measure of the processing power required for your scraping task.

To give you an idea, a typical run extracting data for a few hundred contractors might consume a small number of CUs. Apify offers a [free plan](https://apify.com/pricing) that includes a certain amount of free CUs each month, allowing you to test the **BuildZoom scraper** and extract a significant amount of data without any cost. For larger-scale operations, you can easily scale up your plan. You can monitor your CU consumption in the Apify Console to manage your costs effectively.

### Input and Output Examples

For a detailed overview of the input options, please refer to the **Input** tab of this actor. You'll find fields for `searchTerm`, `locationQuery`, `maxPages`, and `maxRequestsPerCrawl`.

Here's a simplified JSON example of the output data you can expect from the **BuildZoom scraper**:

```json
[
  {
    "url": "https://www.buildzoom.com/contractor/example-contractor",
    "contractorName": "Example Construction Inc.",
    "location": "Dallas, TX",
    "phoneNumber": "(123) 456-7890",
    "bzScore": "150",
    "numberOfProjects": 120,
    "licenses": [
      {
        "licenseNumber": "LIC12345",
        "licenseStatus": "Active",
        "licenseCity": "Dallas",
        "licenseType": "General Contractor",
        "licenseBusinessType": "Corporation",
        "licenseVerificationDate": "October 2025",
        "licenseVerificationLink": "https://example.com/license-verify"
      }
    ],
    "servicesOffered": [
      "New Home Construction",
      "Kitchen Remodel"
    ],
    "permits": [
      {
        "header": "Residential Repair Permit",
        "address": "123 Main St, Dallas, TX",
        "date": "2025-01-15",
        "description": "Interior remodel, drywall repair, paint.",
        "valuation": "$10,000",
        "permitNumber": "REP-25-001",
        "status": "Issued",
        "fee": "$150",
        "permitType": "Residential",
        "buildingType": "Single Family"
      }
    ]
  }
]
````

### FAQ, Disclaimers, and Support

#### Is it legal to scrape BuildZoom?

Our **BuildZoom scraper** is designed to extract only publicly available information from BuildZoom.com. We adhere to ethical web scraping practices and do not extract any private user data. While we believe our scrapers are safe when used for ethical purposes, you should be aware that the extracted data might contain personal information that is publicly accessible. Always consult with legal professionals if you have concerns about your specific use case, especially regarding data privacy regulations like GDPR.

#### What is the "BuildZoom API"?

BuildZoom does not offer a public API for direct data access. This **BuildZoom scraper** acts as a powerful alternative, allowing users to programmatically extract structured data from BuildZoom.com, effectively serving as a custom **BuildZoom API** for your data needs.

#### Troubleshooting and Support

If you encounter any issues or have questions about using the **BuildZoom scraper**, please check the **Issues** tab on the actor's page. We welcome your feedback and are open to creating custom solutions based on your specific requirements. Feel free to contact us for further assistance.

# Actor input Schema

## `searchTerm` (type: `string`):

Keyword to search for (e.g., general contractor, plumber).

## `locationQuery` (type: `string`):

Location to search for properties and contractors. For best results, use 'City, ST' format (e.g., 'Dallas, TX').

## `permitSortBy` (type: `string`):

Choose the sorting order for building permits.

## `maxPages` (type: `integer`):

Maximum number of pages to crawl. Set to 0 for unlimited. (Note: Each page contains 25 results).

## Actor input object example

```json
{
  "searchTerm": "general contractor",
  "locationQuery": "New York, NY",
  "permitSortBy": "effective_date",
  "maxPages": 1
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("actums/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 = {}

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call actums/buildzoom-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=actums/buildzoom-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "BuildZoom Scraper",
        "description": "Extract data from BuildZoom, a remodeling platform that aggregates information from building permits to contractors' licenses. Crawl properties and contractors based on location and scrape descriptions, photos, and page details. Export acquired data into datasets of HTML, JSON, Excel, or CSV.",
        "version": "0.0",
        "x-build-id": "rICug5kF7xaVrZxPl"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/actums~buildzoom-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-actums-buildzoom-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/actums~buildzoom-scraper/runs": {
            "post": {
                "operationId": "runs-sync-actums-buildzoom-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/actums~buildzoom-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-actums-buildzoom-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchTerm",
                    "locationQuery"
                ],
                "properties": {
                    "searchTerm": {
                        "title": "Search Term",
                        "type": "string",
                        "description": "Keyword to search for (e.g., general contractor, plumber).",
                        "default": "general contractor"
                    },
                    "locationQuery": {
                        "title": "Location",
                        "type": "string",
                        "description": "Location to search for properties and contractors. For best results, use 'City, ST' format (e.g., 'Dallas, TX').",
                        "default": "New York, NY"
                    },
                    "permitSortBy": {
                        "title": "Sort Permits By",
                        "enum": [
                            "effective_date",
                            "job_value",
                            "score"
                        ],
                        "type": "string",
                        "description": "Choose the sorting order for building permits.",
                        "default": "effective_date"
                    },
                    "maxPages": {
                        "title": "Max Pages",
                        "type": "integer",
                        "description": "Maximum number of pages to crawl. Set to 0 for unlimited. (Note: Each page contains 25 results).",
                        "default": 1
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
