# Houzz Scraper — Professionals, Photos, Projects & Reviews (`crawloop/houzz-scraper`) Actor

Scrape Houzz professionals, photos, projects and reviews into JSON: phone, rating, badges, portfolio and design images. A Houzz API alternative for contractor leads and design research — Python, Node.js, and MCP.

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

## Pricing

from $1.99 / 1,000 houzz professionals

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 Scraper — Professionals, Photos, Projects & Reviews

> **Disclaimer:** Unofficial integration for publicly accessible sources. Trademarks belong to their respective owners. Provided for informational use only; users must comply with applicable platform terms and laws.

> **Crawloop directory suite** — home professionals, public reviews, and employer signals.

| Houzz (home pros) | Trustpilot (public reviews) | Glassdoor (employer) | ThomasNet (industrial) |
| :--- | :--- | :--- | :--- |
| **Houzz Scraper** ◄── you are here | [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) | [Glassdoor Scraper](https://apify.com/crawloop/glassdoor-scraper) | [ThomasNet Scraper](https://apify.com/crawloop/thomasnet-scraper) |

**Houzz Scraper** for Apify — scrape **Houzz professionals, design photos, projects, and reviews** into flat JSON without a public Houzz API. Extract **name, phone, website, rating, review count, badges, typical job cost, sponsored vs organic rank, photo URLs, project portfolios, and review text**.

Built for **contractor lead lists** (interior designers, architects, remodelers by city) and **design research** (kitchen/bath photo galleries, project portfolios). This Actor does **not** hunt emails on company websites. Run from the Console or with **Python**, **Node.js**, **cURL**, or **MCP** / AI assistants. A practical **Houzz API alternative**.

### When to use this Actor

- You need a **Houzz scraper** for a profession + city (interior designers in Austin, kitchen remodelers in London)
- You want **organic rank vs sponsored** directory cards
- You are pulling **Houzz photos** for styles, rooms, and owner pros (modern kitchen, farmhouse bath)
- You need **project portfolios** or **review rows** tied to a professional — not contact emails

### When not to use this Actor

- **Email enrichment / website crawling for inboxes** — out of scope on purpose
- **Houzz Shop / product SKUs** — the consumer marketplace is discontinued; use **photos** for product-in-room images
- **Posting jobs or messaging pros through Houzz** — read-only extraction
- **Datacenter-only high volume** — use Apify residential proxies for stable directory crawls

### Key features

- **Houzz API alternative** — structured dataset instead of nested raw Houzz objects
- **No pasted URL required** — profession + `Austin, TX` (or 14 country sites) builds the directory for you
- **Start URLs still work** — directory, `pf~` profiles, photo galleries, `pj-vj~` projects; type is auto-detected
- **Flat CRM fields** — phone, decoded website, socials, rating, badges, cost band, lat/long on profiles
- **Sponsored flag + listing position** — paid vs organic cards (15 pros per `?fi=` page)
- **Photos** — React Query galleries (`?pg=`) and classic SpaceStore pages; owner pro + image URL
- **Projects** — portfolio rows from a pro profile or a project URL
- **Reviews** — featured / listing reviews nested or as separate `recordType=review` rows
- **Filters** — `minRating`, `minReviewCount`, `verifiedOnly`, `excludeSponsored`
- **Monitor** — scheduled NEW/UPDATED vs last run (rating, reviews, phone, verified). Skip UNCHANGED.
- **HTTP** — `curl_cffi` (no browser). Residential recommended.

### Use cases

| Buyer | Job to be done |
| :--- | :--- |
| **Supplier / trade BD** | Build a city list of kitchen remodelers: phone, cost band, hire badges, organic rank |
| **Design / SEO research** | Scrape modern kitchen photos with owner pro and tags |
| **Market mapping** | Compare ratings and review volume for architects in a metro |
| **Reputation workflow** | Pull Houzz reviews, then run Trustpilot on the decoded website |

### Input parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | Austin interior designers | Directory, profile, photo, or project URLs. |
| `recordType` | Enum | `professionals` | `professionals` / `photos` / `projects` / `reviews`. |
| `site` | Enum | `houzz.com` | Country site when building from profession + location. |
| `profession` | Enum | `interior-designers` | Directory category slug. |
| `locations` | Array | `Austin, TX` | Cities (`Austin, TX` → `/c/Austin--TX`). |
| `searchQueries` | Array | | Photo keywords, or extra professional slugs × each location. |
| `fetchDetails` | Boolean | `false` | Open profiles for services, areas, aspect ratings, hires, website. |
| `includeReviews` | Boolean | `false` | Nest reviews on each professional row. |
| `emitReviewRows` | Boolean | `false` | Also push `recordType=review` rows. |
| `minRating` / `minReviewCount` | Number | | Shortlist floors. |
| `verifiedOnly` / `excludeSponsored` | Boolean | `false` | Trust and organic filters. |
| `maxItems` | Integer | `50` | Max primary rows (`0` = unlimited within `maxPages`). |
| `maxPages` | Integer | `5` | Max listing pages per start URL. |
| `incrementalMode` | Boolean | `false` | Emit NEW/UPDATED vs KV baseline. |
| `proxyConfiguration` | Object | US residential | **Residential recommended.** |

#### Example — Austin interior designers (no URL)

```json
{
  "recordType": "professionals",
  "profession": "interior-designers",
  "locations": ["Austin, TX"],
  "maxItems": 50,
  "maxPages": 3,
  "excludeSponsored": true,
  "minRating": 4.5
}
```

#### Example — modern kitchen photos

```json
{
  "recordType": "photos",
  "searchQueries": ["modern kitchen"],
  "maxItems": 40,
  "maxPages": 2
}
```

#### Example — profile + reviews

```json
{
  "startUrls": [{ "url": "https://www.houzz.com/professionals/upholstery/spruce-pfvwus-pf~1988573048" }],
  "fetchDetails": true,
  "includeReviews": true,
  "emitReviewRows": true
}
```

### Output

Each default row is a **professional**, **photo**, **project**, or **review** (`recordType`). Reviews can also nest on `reviews` when `includeReviews` is on.

| Field | Description |
| :--- | :--- |
| `professionalId` / `userId` / `url` | Stable Houzz ids and profile URL (`pf~`). |
| `displayName` / `profession` / `phone` / `website` | Identity and decoded website (unwraps Houzz `/trk/` redirects). |
| `rating` / `reviewCount` / `costEstimate` | Directory score (5.0 scale) and typical job cost. |
| `city` / `state` / `formattedAddress` / `latitude` | Geography. |
| `isSponsored` / `isProVerified` / `listingPosition` | Paid vs organic + verification. |
| `badges` / `hireCount` / `aspectQuality` | Best of Houzz, hires, aspect ratings (on profile fetch). |
| `photoId` / `imageUrl` / `ownerName` | Design photo rows. |
| `projectId` / `photoCount` / `professionalName` | Portfolio project rows. |

```json
{
  "recordType": "professional",
  "professionalId": "86143",
  "displayName": "Calming Spaces Interiors, Design & Remodeling",
  "profession": "Interior Decorators",
  "phone": "(512) 842-4664",
  "city": "Austin",
  "state": "TX",
  "rating": 4.8,
  "reviewCount": 50,
  "isSponsored": true,
  "listingPosition": 1,
  "url": "https://www.houzz.com/professionals/interior-decorators/calming-spaces-interiors-design-and-remodeling-pfvwus-pf~436247126"
}
```

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/houzz-scraper').call({
  profession: 'interior-designers',
  locations: ['Austin, TX'],
  maxItems: 25,
  excludeSponsored: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token="YOUR_TOKEN")
run = client.actor("crawloop/houzz-scraper").call(
    run_input={
        "profession": "interior-designers",
        "locations": ["Austin, TX"],
        "maxItems": 25,
        "excludeSponsored": True,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~houzz-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profession":"interior-designers","locations":["Austin, TX"],"maxItems":25}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store ID `crawloop/houzz-scraper`.

Example prompts:

- "Run Houzz Scraper for kitchen remodelers in Austin, TX, exclude sponsored listings, min rating 4.5, and return the top 20 rows as JSON"
- "Scrape modern kitchen photos with Houzz Scraper and summarize owner professionals and styles"
- "Chain Houzz Scraper then [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) on the decoded websites for public reputation"

### Suite next step

After a Houzz contractor shortlist, run [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) on the same websites for public reviews, or [Glassdoor Scraper](https://apify.com/crawloop/glassdoor-scraper) for employer/team signals.

### FAQ

**Is this a Houzz API?**\
No. Houzz does not offer a public directory API. This Actor is a **Houzz API alternative** that reads public listing, profile, and gallery HTML.

**Why not emails?**\
Lead workflows already get phones, websites, and socials published on Houzz. Third-party inbox hunting is noisy, extra-billed, and not this product.

**How many professionals per page?**\
A directory page currently renders **15 cards**. Pagination is `?fi=15`, `?fi=30`, …. Photo galleries paginate with `?pg=2` (20 images).

**Does it work with Python / Node.js / MCP?**\
Yes. Use the Apify client examples above or Apify MCP prompts.

**Which country sites?**\
`houzz.com`, `.co.uk`, `.com.au`, `.de`, `.fr`, `.it`, `.es`, and other Houzz locales in the `site` enum.

### Related Actors

- [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper)
- [Glassdoor Scraper](https://apify.com/crawloop/glassdoor-scraper)
- [ThomasNet Scraper](https://apify.com/crawloop/thomasnet-scraper)
- [Kompass Scraper](https://apify.com/crawloop/kompass-scraper)

# Actor input Schema

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

Houzz directory, profile, photo gallery, or project URLs. Type is detected automatically. Example: https://www.houzz.com/professionals/interior-designer/c/Austin--TX

## `recordType` (type: `string`):

What each dataset row should be. URLs still auto-detect (profile vs gallery vs project).

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

Country site used when you build searches from profession + location (not pasted URLs).

## `profession` (type: `string`):

Directory category if you do not paste a URL (interior designers, architects, contractors, …).

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

Cities such as Austin, TX or London. Combined with profession as /c/Austin--TX (Houzz redirects to the canonical directory).

## `searchQueries` (type: `array`):

For photos: gallery keywords (modern kitchen). For professionals: extra category slugs to combine with each location.

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

Open each pro profile for services, areas served, aspect ratings, hire badges, website, and project ids.

## `includeReviews` (type: `boolean`):

Nest featured / listing reviews on each professional. Does not crawl third-party inboxes.

## `emitReviewRows` (type: `boolean`):

Also push each review as its own dataset row (recordType=review).

## `maxReviewsPerPro` (type: `integer`):

Cap nested / emitted reviews per professional.

## `minRating` (type: `number`):

Keep professionals with rating >= this value. Empty = no floor.

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

Keep professionals with at least this many Houzz reviews.

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

Keep Houzz-verified professionals only.

## `excludeSponsored` (type: `boolean`):

Drop paid directory cards and keep organic results.

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

Stop after this many primary rows (pros, photos, projects, or reviews depending on recordType). 0 = unlimited within maxPages.

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

Maximum listing pages per start URL. Professionals use ?fi= (15 per page); photos use ?pg= (20 per page).

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

Compare professionals to a named Key-Value Store. Emit NEW/UPDATED. Skip UNCHANGED unless emitUnchanged is on.

## `monitorBaselineOnly` (type: `boolean`):

First scheduled run: seed KV fingerprints without emitting or billing professional rows.

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

In monitor mode, also push UNCHANGED professionals (still billed).

## `resetMonitorState` (type: `boolean`):

Clear MONITOR\_STATE in the named store before this run.

## `monitorStoreName` (type: `string`):

Named Key-Value Store for professional fingerprints (rating, reviews, phone, verified).

## `compact` (type: `boolean`):

Drop long about/description text and nested reviews (token-efficient for MCP).

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

Apify Proxy. US residential is recommended for houzz.com; country is auto-aligned when you pick another site.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.houzz.com/professionals/interior-designer/c/Austin--TX"
    }
  ],
  "recordType": "professionals",
  "site": "houzz.com",
  "profession": "interior-designers",
  "locations": [
    "Austin, TX"
  ],
  "fetchDetails": false,
  "includeReviews": false,
  "emitReviewRows": false,
  "maxReviewsPerPro": 20,
  "verifiedOnly": false,
  "excludeSponsored": false,
  "maxItems": 50,
  "maxPages": 5,
  "incrementalMode": false,
  "monitorBaselineOnly": false,
  "emitUnchanged": false,
  "resetMonitorState": false,
  "monitorStoreName": "houzz-pro-monitor",
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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.houzz.com/professionals/interior-designer/c/Austin--TX"
        }
    ],
    "profession": "interior-designers",
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "startUrls": [{ "url": "https://www.houzz.com/professionals/interior-designer/c/Austin--TX" }],
    "profession": "interior-designers",
    "locations": ["Austin, TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "startUrls": [
    {
      "url": "https://www.houzz.com/professionals/interior-designer/c/Austin--TX"
    }
  ],
  "profession": "interior-designers",
  "locations": [
    "Austin, TX"
  ]
}' |
apify call crawloop/houzz-scraper --silent --output-dataset

```

## MCP server setup

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