# Houzz Professionals Scraper - Contractor Leads & Phones (`scrapersdelight/houzz-pro-scraper`) Actor

Scrape Houzz professionals by trade and city - business name, phone, street address, lat/long, review count and rating, licence-verified flag, budget band, Best of Houzz badges, business description and social links. No login, no browser. JSON/CSV/Excel.

- **URL**: https://apify.com/scrapersdelight/houzz-pro-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 1,000 per professional returneds

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/platform/actors/running/actors-in-store#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

## Houzz Professionals Scraper — contractor & design-pro leads

Scrape the **Houzz professionals directory** by trade and city and get a clean, structured lead row
for every listed business: name, **phone**, street address, ZIP, latitude/longitude, review count and
star rating, licence-verification flag, typical project budget, Best of Houzz badges, the full
business description, and social profile links.

No login, no browser, no CAPTCHA-solving service — Houzz ships the whole listing as structured JSON
inside the page, so this Actor reads named JSON fields instead of guessing at HTML.

### What you get (one row per professional)

| Field | Notes |
|---|---|
| `professionalId`, `userId` | Stable Houzz ids — the dedupe key |
| `businessName`, `houzzUserName`, `profileUrl` | Canonical Houzz profile link |
| `phone` | Public listed phone, e.g. `(737) 200-2853` — ~100% filled |
| `fullAddress`, `streetAddress`, `city`, `state`, `zip`, `country` | |
| `latitude`, `longitude` | ~79% filled (Houzz does not geocode every pro) |
| `serviceArea` | e.g. "Serves Austin" |
| `proType`, `proTypeLabels` | e.g. `General Contractors`, `["General Contractors","Home Remodeling"]` |
| `description` | Full "About me" business write-up — great for AI qualification |
| `reviewRating` (0–5), `numReviews` | Normalised from Houzz's internal 0–50 scale |
| `mostRecentReview`, `mostRecentReviewer`, `featuredReview` | Review text shown on the card |
| `costEstimate`, `budgetLevels` | e.g. `"$50,000 - 5 million"`, `["$$","$$$","$$$$"]` |
| `badges`, `isBestOfHouzz`, `yearsInBusiness`, `languages` | Parsed from the pro's own badge objects |
| `hasVerifiedLicense`, `isProVerified`, `hasVerifiedKyc`, `isInactivePro` | Trust / KYC flags |
| `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `pinterest`, `tiktok`, `socialLinks` | ~72% of pros list at least one |
| `isSponsored` | `true` for Houzz paid placements (see below) |
| `searchTrade`, `searchTradeId`, `searchLocation`, `searchRegionId`, `resultRank`, `sourceUrl`, `scrapedAt` | Provenance |

### Input

```json
{
  "trade": "general-contractor",
  "location": "Austin, TX",
  "maxItems": 100,
  "includeSponsored": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

- **trade** — any Houzz category, e.g. `general-contractor`, `painters`, `roofing-and-gutter`,
  `landscape-contractors`, `interior-designer`, `kitchen-and-bath-remodelers`, `home-builders`,
  `cabinets`, `pools-and-spas`, `windows`, `fencing-and-gates`, `decks-and-patios`. The category list
  is read live off houzz.com, so anything on the site works — a wrong value fails with the full list.
- **location** — `"Austin, TX"`, `"Seattle, WA"`, `"Toronto, ON"`. Leave blank for the nationwide list.
- **startUrls** *(advanced)* — paste Houzz directory URLs directly, e.g.
  `https://www.houzz.com/professionals/painters/chicago-il-us-probr0-bo~t_27105~r_4887398`.
- **includeSponsored** — Houzz mixes paid placements into the results. They are real, in-area pros
  that also carry the searched trade in `proTypeLabels`, and every one is flagged `isSponsored: true`.
  Set `false` for organic-only.

### Two things worth knowing

**1. Houzz silently ignores an unknown city.** Ask for an area id it doesn't recognise and it returns
HTTP 200 with a *nationwide, geo-defaulted* page — same shape, wrong city. This Actor never guesses:
trade ids and area ids are harvested from Houzz's own links, and every fetched page is checked against
the filters the server reports it actually applied. If they don't match, the run fails instead of
handing you the wrong city's leads.

**2. Houzz caps a single trade + city scope at ~1,500 listings.** For deeper coverage, run several
nearby cities (e.g. Austin + Round Rock + Cedar Park) or several trades and merge on `professionalId`.

### Pricing

Pay per result — you are charged only for professionals actually delivered to your dataset.

### Legal

This Actor reads only publicly visible Houzz directory listings. You are responsible for complying
with Houzz's Terms of Service and with any privacy law (GDPR, CCPA, …) that applies to how you store
and use the output — some fields are business-contact data about identifiable people.

# Actor input Schema

## `trade` (type: `string`):

Houzz trade category, e.g. "general-contractor", "painters", "roofing-and-gutter", "landscape-contractors", "interior-designer", "kitchen-and-bath-remodelers", "home-builders", "cabinets", "pools-and-spas", "windows", "fencing-and-gates", "decks-and-patios". The Actor reads the live category list off Houzz, so any category shown on houzz.com/professionals works.

## `location` (type: `string`):

City to search, e.g. "Austin, TX", "Seattle, WA", "Toronto, ON". The Actor resolves it against Houzz's own area links (a guessed area is silently ignored by Houzz, so unresolvable cities fail loudly instead of returning the wrong city). Leave blank to scrape the nationwide list.

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

Cap on professionals returned this run (cost/speed guard). Houzz lists at most ~1,500 pros per trade + city. Set 0 for the whole scope.

## `includeSponsored` (type: `boolean`):

Houzz shows paid placements alongside organic results. They are real, in-area professionals with the same fields and are flagged with isSponsored=true. Turn off to keep organic results only.

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

Optional. Paste Houzz directory URLs to scrape instead of the trade + city above, e.g. https://www.houzz.com/professionals/general-contractor/austin-tx-us-probr0-bo~t\_11786~r\_4671654

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

Proxy settings. Houzz serves plain datacenter requests, so Apify datacenter proxy is the default and is the cheapest option that works.

## Actor input object example

```json
{
  "trade": "general-contractor",
  "location": "Austin, TX",
  "maxItems": 20,
  "includeSponsored": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `records` (type: `string`):

The dataset of scraped Houzz professionals (one item per professional).

# 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 = {
    "trade": "general-contractor",
    "location": "Austin, TX",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/houzz-pro-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 = {
    "trade": "general-contractor",
    "location": "Austin, TX",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/houzz-pro-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 '{
  "trade": "general-contractor",
  "location": "Austin, TX",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapersdelight/houzz-pro-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/houzz-pro-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/LuYiGKDBeC2buq3Vk/builds/aMqSMagR5BdQL5gdY/openapi.json
