# Houzz Pro Scraper (`parsebird/houzz-scraper`) Actor

Scrape Houzz professional directory listings by category, location, keyword, or URL across all 14 Houzz country sites: ratings, reviews, contact info, services, and photos. Export to JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/houzz-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.89 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### Houzz Pro Scraper

Extract professional listings from **[Houzz](https://www.houzz.com/professionals)**'s directory of architects, interior designers, contractors, and 70+ other home-service categories — across all 14 Houzz country sites. Search by category and location, run a free-text keyword search, deep-fetch specific pros for full profile details, or paste any Houzz directory URL.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any Houzz category + location, or paste a Houzz URL directly, and get ratings, review counts, contact info, services, service areas, and photos as clean, ready-to-use JSON, CSV, or Excel rows.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Use the Apify actor `parsebird/houzz-scraper` via `ApifyClient` — example: `client.actor("parsebird/houzz-scraper").call(run_input={"mode":"search","site":"houzz.com","category":"interior-designers","locations":["New-York--NY"],"maxPages":5,"maxListings":100})` — key inputs are `mode` (search/keyword/review/url), `site` (one of 14 Houzz country domains), `category`, `locations` (array of "City--State" strings), `queries` (free-text keywords for keyword mode), `proUrls`/`urls` (for review/url modes), `minRating`, `minReviewCount`, `verifiedOnly`, `sortBy`, `maxPages`, `maxListings`, and `fetchDetails` (richer per-pro fields) — output rows have `displayName`, `userName`, `proTypeDisplayName`, `city`/`state`/`country`, `latitude`/`longitude`, `formattedPhone`, `website`, `numReviews`, `reviewRating`, `featuredReview`/`mostRecentReview`, `verified`, `awards`, `aboutMe`, `servicesProvided`, `areasServed`, `socialFacebook`/`socialInstagram`/`socialLinkedin`, and `url` — full API spec at `https://apify.com/parsebird/houzz-scraper/api` and get a token at `https://console.apify.com/account/integrations`.

### What does Houzz Pro Scraper do?

**Houzz Pro Scraper** pulls structured data out of Houzz's professional directory — the same directory home-owners browse to find architects, interior designers, general contractors, kitchen & bath remodelers, landscape architects, and 70+ other trade categories. It works as a **Houzz API alternative**, and covers all 14 Houzz country sites: houzz.com, houzz.com.au, houzz.co.nz, houzz.co.uk, houzz.ie, houzz.de, houzz.fr, houzz.it, houzz.es, houzz.dk, houzz.se, houzz.com.sg, houzz.in, and houzz.jp.

- 🔍 **Search mode** — pick a category and one or more locations (`New-York--NY`, `Sydney--NSW`), and the actor pages through every matching pro.
- ⌨️ **Keyword mode** — narrow a category/location search with free-text keywords (matched against each pro's name, about-me text, and category, since Houzz's directory has no server-side keyword search).
- 👤 **Review mode** — deep-fetch specific pros by profile URL or username, always pulling the richer profile-page fields (services, areas served, cost estimate, rating breakdown).
- 🔗 **URL mode** — paste any Houzz professional-directory URL (or a single pro's profile URL) and scrape it directly.
- ⭐ **Post-fetch filters** — `minRating`, `minReviewCount`, and `verifiedOnly` narrow results after fetching; `sortBy` reorders by rating, review count, name, or newest.
- 🔁 **Resume & Incremental mode** — continue an interrupted run with `resumeFromRunId`, or track a scheduled search over time with `incrementalMode`, which classifies every pro as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED between runs.
- ⏱️ **Automation-ready** — run it on a schedule, trigger it via the Apify API, or wire it into Make, Zapier, or n8n.
- 📤 **Export anywhere** — download results as JSON, CSV, Excel, or HTML straight from the Apify Console, or pull them via API/webhook.

### What data can you extract from Houzz?

| Field | Description |
|-------|-------------|
| `displayName`, `userName` | Business/pro name and Houzz username |
| `proTypeDisplayName` | Category, e.g. "Interior Designers & Decorators" |
| `city`, `state`, `country`, `zip`, `latitude`, `longitude` | Location |
| `formattedAddress`, `formattedPhone`, `website` | Contact info |
| `numReviews`, `reviewRating` | Review aggregate (0-5 scale) |
| `aspectCommunication`, `aspectOnTime`, `aspectQuality`, `aspectValue` | Rating breakdown by aspect (requires `fetchDetails`) |
| `featuredReview`, `mostRecentReview` | Sample reviews with author, text, and rating |
| `verified`, `hasVerifiedLicense` | Paid/claimed business profile and license verification flags |
| `awards`, `badges`, `merits` | Best of Houzz awards and profile badges |
| `aboutMe` | Full about-me / bio text |
| `servicesProvided`, `areasServed`, `costEstimate` | Requires `fetchDetails` |
| `socialFacebook`, `socialInstagram`, `socialLinkedin` | Social profile links |
| `url` | Canonical Houzz profile URL |

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mode | string | No | search | search / keyword / review / url |
| site | string | No | houzz.com | One of 14 Houzz country domains |
| category | string | No | interior-designers | Service category (search/keyword modes) |
| locations | array | No | \[] (all) | "City--State" strings |
| queries | array | Keyword mode | — | Free-text keywords |
| proUrls | array | Review mode | — | Pro profile URLs or usernames |
| urls | array | URL mode | — | Any Houzz directory URLs |
| minRating | integer | No | 0 | Minimum rating (0-5), applied after fetching |
| minReviewCount | integer | No | 0 | Minimum review count, applied after fetching |
| verifiedOnly | boolean | No | false | Only paid/claimed profiles |
| sortBy | string | No | default | default / rating-desc / review-count-desc / newest / name-asc |
| maxPages | integer | No | 5 | Max result pages per search (15 pros/page) |
| maxListings | integer | No | 0 (unlimited) | Total cap across all searches |
| fetchDetails | boolean | No | false | Visit each pro's own page for richer fields |
| resumeFromRunId | string | No | — | Continue a previous interrupted run |
| incrementalMode | boolean | No | false | Track a scheduled search across runs |
| emitUnchanged / emitExpired | boolean | No | false | Also emit UNCHANGED / EXPIRED rows (Incremental mode) |
| proxy | object | No | Apify default | Works for all 14 sites; Residential optional |

### Output example

```json
{
    "id": "5208",
    "userId": 16380,
    "professionalId": 5208,
    "displayName": "Ruthie Staalsen Interiors",
    "userName": "ruthiedesigner",
    "proTypeDisplayName": "Interior Designers & Decorators",
    "country": "US",
    "state": "TX",
    "city": "Grapevine",
    "zip": "76051",
    "latitude": 32.9328,
    "longitude": -97.0808,
    "formattedPhone": "(817) 592-8379",
    "website": "http://www.ruthiestaalsen.com",
    "numReviews": 109,
    "reviewRating": 5.0,
    "aspectQuality": 5.0,
    "aspectCommunication": 5.0,
    "aspectValue": 5.0,
    "verified": true,
    "servicesProvided": ["Interior Design", "Kitchen Design", "Bathroom Design"],
    "areasServed": ["Fort Worth", "Irving", "Grapevine"],
    "costEstimate": "$5,000 - 500,000",
    "socialFacebook": "https://www.facebook.com/ruthiedesigner",
    "url": "https://www.houzz.com/professionals/interior-designers-and-decorators/ruthie-staalsen-interiors-pfvwus-pf~1199665728",
    "mode": "search",
    "category": "interior-designers",
    "location": "New-York--NY"
}
```

### Use cases

- **Lead generation** — build a list of interior designers, contractors, or architects in a target city with phone/website contact info.
- **Competitive research** — compare ratings, review counts, and services across pros in the same category and market.
- **Market monitoring** — schedule a search with Incremental mode to catch new pros and rating changes as they happen.
- **CRM / lead-scoring pipelines** — pipe structured JSON straight into your own database via the Apify API.

### How to scrape Houzz

1. Pick a **Mode**: search (category + location), keyword, review (specific pros), or URL.
2. For search/keyword mode, set **Category** and **Locations** (e.g. `interior-designers` + `New-York--NY`).
3. Set **Max pages** and **Max listings** to control run size.
4. Optionally turn on **Fetch pro detail pages** for services, areas served, cost estimate, and rating breakdown.
5. Click **Start** and download results as JSON, CSV, or Excel once the run finishes.

### How much does it cost to scrape Houzz?

This actor uses **pay-per-event (PPE)** pricing — you pay only for what you get.

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| Result | $0.00149 | **$1.49** |
| Enrichment (optional, `fetchDetails`) | $0.00079 | **$0.79** |

`Result` fires once per pro row saved. `Enrichment` fires in addition, once per pro, only when `fetchDetails` is on (always on in Review mode). Scraping 1,000 pros without detail enrichment costs about **$1.49**; with it, about **$2.28**.

### Resume & recurring updates

**Resume** (`resumeFromRunId`) continues one specific interrupted run: paste the run ID (or its dataset ID) and this run skips every pro already collected there, picking up only what's still missing.

**Incremental mode** (`incrementalMode`) is for a search you run on a schedule (daily/weekly) against the same category/location/query. It remembers what the search returned last time and classifies every pro as **NEW**, **UPDATED** (with a `changedFields` list), **UNCHANGED**, **REAPPEARED** (was gone, is back), or **EXPIRED** (tracked before, no longer found — only after a run that scanned every page of every search without being cut short by Max pages/Max listings). By default only NEW/UPDATED/REAPPEARED/EXPIRED rows are pushed; `emitUnchanged`/`emitExpired` also push the others (billing extra rows). `stateKey` names the saved baseline — leave it empty and the actor derives one automatically from mode/site/category/locations/queries/filters.

### Is it legal to scrape Houzz?

Yes — this actor only collects publicly available directory data that Houzz itself shows to any visitor, without logging in or bypassing any paywall. You're responsible for how you use the extracted data; review [Houzz's Terms of Service](https://www.houzz.com/terms) before republishing personal contact information. See Apify's [guide on the legality of web scraping](https://www.apify.com/blog/is-web-scraping-legal) for more detail.

### FAQ

**Which Houzz sites are supported?**
All 14: houzz.com, houzz.com.au, houzz.co.nz, houzz.co.uk, houzz.ie, houzz.de, houzz.fr, houzz.it, houzz.es, houzz.dk, houzz.se, houzz.com.sg, houzz.in, and houzz.jp. Categories differ by site — an unavailable category stops the run with the list of categories that site actually has.

**Why do some fields come back null unless I turn on Fetch pro detail pages?**
`servicesProvided`, `areasServed`, `costEstimate`, and the per-aspect rating breakdown only appear on a pro's own profile page, not in directory search results — turning on `fetchDetails` (or using Review mode, where it's always on) fetches that page for each pro.

**Does keyword search happen on Houzz's servers?**
No — Houzz's public directory has no server-side keyword search endpoint, so Keyword mode fetches a category/location search and matches your keyword client-side against each pro's name, about-me text, and category. A broad search with a higher Max pages gives it more to search through.

**Can I schedule recurring runs?**
Yes — use Apify's built-in [Scheduler](https://docs.apify.com/platform/schedules), and combine it with Incremental mode to only get charged for pros that are new or changed since the last run.

**Something looks wrong or missing — how do I report it?**
Open an issue on the actor's **Issues** tab in Apify Console, including the input you used and the run ID.

# Actor input Schema

## `mode` (type: `string`):

search: browse a category + location. keyword: free-text search within a category/location. review: deep-fetch specific pros by URL or username. url: scrape any pasted Houzz directory URL.

## `site` (type: `string`):

Which Houzz country site to search. All 14 work on the default proxy setting.

## `category` (type: `string`):

Service category, mapped to that country site's own Houzz category (used in modes search and keyword). Bathroom remodels are under kitchen-and-bath-remodelers. Asking for a category a site does not have stops the run and lists the ones it does.

## `locations` (type: `array`):

Format: City--State, City--Country, or just a State/Region (e.g. New-York--NY, Sydney--NSW). Empty = all locations for the category.

## `queries` (type: `array`):

Free-text keywords for mode 'keyword'. Each one runs as its own search, matched client-side against each pro's name, about-me text, and category (Houzz has no server-side keyword search for the directory, so this narrows results after fetching — a broad category/location with a high Max pages gives keyword matching more to search through).

## `proUrls` (type: `array`):

For mode 'review': full Houzz pro profile URLs, or bare Houzz usernames (the part after houzz.com/pro/ in a profile's public link). Fetches full profile details for each.

## `urls` (type: `array`):

For mode 'url': any Houzz professional-directory search URL, or a single pro profile URL.

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

Maximum number of result pages to fetch per search/location/keyword combination. 15 pros per page.

## `maxListings` (type: `integer`):

Total cap across all searches (still bounded by Max pages too). 0 = unlimited. This is the number of billed 'Result' events.

## `minRating` (type: `integer`):

Only keep pros with a review rating at or above this (0-5). Applied after fetching, since Houzz's directory has no server-side rating filter.

## `minReviewCount` (type: `integer`):

Only keep pros with at least this many reviews. Applied after fetching.

## `verifiedOnly` (type: `boolean`):

Only keep pros with a paid/claimed Houzz business profile.

## `sortBy` (type: `string`):

Reorders results after a full scan of Max pages (applied client-side; Houzz's own result order is used when left as default).

## `fetchDetails` (type: `boolean`):

Visit each pro's own profile page for richer fields: services provided, areas served, cost estimate, and rating breakdown by aspect. Always on in Review mode. Triggers the optional Enrichment billing event per pro.

## `resumeFromRunId` (type: `string`):

Paste a previous run's ID (or its dataset ID) to continue it — this run skips every pro already collected there and only fetches what's still missing.

## `incrementalMode` (type: `boolean`):

For a search you run on a schedule against the same category/location/query: remembers what the search returned last time and classifies each pro as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED. Off by default, so existing scheduled runs are unaffected.

## `stateKey` (type: `string`):

Optional name for the Incremental mode baseline. Leave empty to auto-derive one from mode/site/category/locations/queries/filters, so two differently-configured searches never share a baseline by accident.

## `emitUnchanged` (type: `boolean`):

Also push rows for pros that are unchanged since the last Incremental mode run. Bills an extra Result event (plus Enrichment if Fetch pro detail pages is on) per unchanged row pushed.

## `emitExpired` (type: `boolean`):

Push a synthetic row for pros that dropped out of a fully-scanned search (only possible after a run that scanned every page of every search with nothing capping or interrupting it). Bills an extra Result event per expired row pushed.

## `requestDelayMs` (type: `integer`):

Delay between requests, in milliseconds.

## `maxRequestRetries` (type: `integer`):

Retries per request on network errors.

## `proxy` (type: `object`):

The default works on any plan for all 14 country sites. Residential is optional and recommended only for very large runs.

## Actor input object example

```json
{
  "mode": "search",
  "site": "houzz.com",
  "category": "interior-designers",
  "locations": [
    "New-York--NY"
  ],
  "maxPages": 2,
  "maxListings": 20,
  "minRating": 0,
  "minReviewCount": 0,
  "verifiedOnly": false,
  "sortBy": "default",
  "fetchDetails": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "requestDelayMs": 300,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "mode": "search",
    "site": "houzz.com",
    "category": "interior-designers",
    "locations": [
        "New-York--NY"
    ],
    "maxPages": 2,
    "maxListings": 20,
    "requestDelayMs": 300,
    "maxRequestRetries": 5,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/houzz-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 = {
    "mode": "search",
    "site": "houzz.com",
    "category": "interior-designers",
    "locations": ["New-York--NY"],
    "maxPages": 2,
    "maxListings": 20,
    "requestDelayMs": 300,
    "maxRequestRetries": 5,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/houzz-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 '{
  "mode": "search",
  "site": "houzz.com",
  "category": "interior-designers",
  "locations": [
    "New-York--NY"
  ],
  "maxPages": 2,
  "maxListings": 20,
  "requestDelayMs": 300,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/houzz-scraper --silent --output-dataset

```

## MCP server setup

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