Houzz Professionals & Reviews Scraper
Pricing
Pay per event
Houzz Professionals & Reviews Scraper
Extract public Houzz professional leads, profile details, ratings, and review records from directory and profile URLs.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Collect structured public professional leads, profile details, ratings, and review records from Houzz.
Give the Actor a Houzz professional directory URL, an individual profile URL, or both. It discovers unique profiles, enriches them from server-rendered structured data, and writes integration-ready records to the default Apify dataset.
What does this Houzz scraper do?
Houzz Professionals & Reviews Scraper turns public Houzz pages into two typed record kinds:
professionalrecords for businesses and service providers;reviewrecords for public reviews attached to a professional profile.
The Actor supports category/location directories and direct profile URLs. It can run as a fast directory lead collector or open each profile for richer business and reputation data.
The implementation is HTTP-first. It reads server-rendered HTML and JSON-LD through Apify's SHADER proxy rather than starting a browser for every page.
Who is it for?
Use this Actor if you work in:
- home-services lead generation and need local contractor lists;
- agency sales operations and need business identity, phone, location, and website data;
- supplier market development and want to map professionals by category and area;
- contractor market analysis and need rating or service coverage data;
- reputation monitoring and want repeatable public review exports;
- data engineering and need a scheduled Houzz-to-dataset pipeline.
It is designed for public professional research. It does not log in, access private projects, or collect private account data.
Why use this Actor?
- Accepts real Houzz directory and profile URLs.
- Deduplicates profiles across pages and start URLs.
- Optionally enriches directory leads from their profiles.
- Emits professional and review rows with an explicit
recordType. - Applies hard page, professional, and per-profile review limits.
- Uses conservative retry behavior for Houzz anti-bot responses.
- Fails visibly when Houzz returns a challenge instead of reporting a false empty result.
- Works with Apify schedules, webhooks, API clients, exports, and MCP.
What data can I extract?
| Field | Record | Meaning |
|---|---|---|
recordType | both | professional or review |
name | professional | Public professional or business name |
profileUrl | both | Canonical Houzz profile URL |
phone | professional | Public phone number |
address | professional | Formatted public address |
streetAddress | professional | Street portion of the address |
locality | professional | City or locality |
region | professional | State or region |
postalCode | professional | Postal code |
country | professional | Country |
latitude, longitude | professional | Public coordinates when exposed |
categoryContext | professional | Category inferred from the source URL/page |
locationContext | professional | Directory location context when available |
imageUrl | professional | Profile image or logo |
description | professional | Public business description |
areasServed | professional | Public service-area list |
services | professional | Public service list when structured data exposes it |
website | professional | Public external business website |
socialLinks | professional | Public social profile URLs |
rating | both | Aggregate or individual review rating |
reviewCount | professional | Aggregate public review count |
author | review | Public review author name |
datePublished | review | Public review publication date |
reviewBody | review | Public review text |
sourceUrl | both | Page used for extraction |
scrapedAt | both | Extraction timestamp |
Fields can be null or empty when a professional does not publish them or Houzz omits them from the current page.
Getting started
- Open the Actor input page.
- Add one or more public
houzz.com/professionals/...URLs. - Choose the maximum number of unique professionals.
- Keep profile enrichment enabled when you need descriptions, links, ratings, or reviews.
- Set a sensible review limit for each professional.
- Start the run.
- Open Results to inspect, filter, or export the default dataset.
For a low-cost smoke test, use one profile URL and maxProfessionals: 1.
Input parameters
startUrls
Required array of public Houzz professional URLs.
Supported shapes:
- category/location directories such as a city contractor listing;
- individual professional profile pages.
Other Houzz sections and non-Houzz URLs are rejected before network work starts.
maxProfessionals
Maximum unique professional records across all start URLs. The default is 20 and the maximum is 5,000.
maxPages
Maximum directory pages followed across directory inputs. The default is 5. Direct profile URLs do not consume this limit.
includeProfileDetails
When true, the Actor opens each discovered profile. This provides the richest lead and reputation output but requires one additional page request per professional.
When false, directory JSON-LD is used directly for a faster lead list. Reviews are not available for those directory-only records.
includeReviews
When true, the Actor emits separate review records found on enriched profiles. Some profiles report an aggregate review count but do not expose review text in every page response; in that case, only the professional record is emitted.
maxReviewsPerProfessional
Maximum review rows accepted from each profile, from 0 to 200. The default is 20.
Example input: local contractor leads
{"startUrls": [{"url": "https://www.houzz.com/professionals/general-contractor/new-york-city-ny-us-probr0-bo~t_11786~r_5128581"}],"maxProfessionals": 20,"maxPages": 2,"includeProfileDetails": true,"includeReviews": true,"maxReviewsPerProfessional": 10}
Example input: one reputation profile
{"startUrls": [{"url": "https://www.houzz.com/professionals/general-contractors/nytdr-new-york-total-damage-restoration-pfvwgb-pf~188655390"}],"maxProfessionals": 1,"includeProfileDetails": true,"includeReviews": true,"maxReviewsPerProfessional": 50}
Output example
A professional record looks like this (public fields abbreviated):
{"recordType": "professional","name": "NYTDR New York Total Damage Restoration","profileUrl": "https://www.houzz.com/professionals/general-contractors/nytdr-new-york-total-damage-restoration-pfvwgb-pf~188655390","phone": "(212) 206-1300","locality": "New York","region": "NY","postalCode": "10010","areasServed": ["Manhattan, New York, New York City"],"website": "https://nytdr.com","rating": 5,"reviewCount": 4,"sourceUrl": "https://www.houzz.com/professionals/general-contractors/nytdr-new-york-total-damage-restoration-pfvwgb-pf~188655390","scrapedAt": "2026-07-26T06:45:32.177Z"}
A review record has recordType: "review" and includes professionalName, author, rating, datePublished, and reviewBody.
How much does it cost to scrape Houzz professionals and reviews?
Pay-per-event pricing charges for the core lead workflow:
- a small $0.005 start fee per run;
- $0.000041071 per professional at the FREE tier;
- public review rows included with their professional at no separate event charge.
Higher usage tiers receive lower per-professional prices. Active Console pricing is authoritative.
Example FREE-tier estimates:
| Workflow | Approximate Actor charge |
|---|---|
| 1 professional, with available reviews | $0.005041071 |
| 10 professionals, with available reviews | $0.00541071 |
| 100 professionals, with available reviews | $0.0091071 |
These examples describe Actor event charges. Actual records depend on what each public Houzz page exposes.
Performance and limits
The Actor intentionally uses conservative sequential detail requests because aggressive concurrency increases blocking risk and proxy transfer.
Directory-only mode is faster than profile enrichment. Use it when identity and directory contact data are enough.
Large runs should begin with a small sample from the exact target category and geography. Houzz can change page structure or anti-bot behavior without notice.
The Actor currently uses SHADER only. It does not silently switch to a higher-cost residential proxy route.
Data quality tips
- Use the most specific category/location directory Houzz provides.
- Keep canonical Houzz URLs instead of search-engine redirect links.
- Deduplicate downstream by
profileUrl. - Filter the dataset by
recordTypebefore sending rows to a CRM or review-analysis tool. - Schedule refreshes at a cadence appropriate for your business rather than repeatedly scraping unchanged profiles.
- Treat missing fields as unpublished or unavailable, not as empty facts about the business.
Lead-generation workflow
A common workflow is:
- scrape a category/location directory;
- enrich each profile;
- select
recordType = professional; - filter by service, city, rating, or review count;
- export CSV or connect the dataset to a CRM;
- retain the Houzz source URL for verification;
- refresh the dataset on a schedule.
Use public contact data responsibly and comply with applicable outreach and privacy rules.
Reputation-monitoring workflow
For repeat monitoring:
- store a list of profile URLs;
- run the Actor weekly or monthly;
- keep professional and review records in separate downstream tables;
- compare aggregate
ratingandreviewCountover time; - deduplicate reviews using profile URL, author, date, and body;
- notify analysts only when meaningful changes appear.
The Actor does not perform sentiment analysis itself. Send review rows to your preferred model or analytics workflow.
Export and integrations
The default dataset can be exported as JSON, CSV, Excel, XML, or RSS through Apify.
Useful integrations include:
- Google Sheets for lead review;
- Make or Zapier for workflow automation;
- webhooks for run-completion notifications;
- Apify API clients for scheduled ingestion;
- data warehouses for longitudinal market analysis;
- LLM pipelines for review classification or summarization.
Use the API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~houzz-professionals-reviews-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.houzz.com/professionals/general-contractors/nytdr-new-york-total-damage-restoration-pfvwgb-pf~188655390"}],"maxProfessionals": 1,"includeReviews": true}'
Never commit your Apify token to source control.
Use the API with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/houzz-professionals-reviews-scraper').call({startUrls: [{url: 'https://www.houzz.com/professionals/general-contractors/nytdr-new-york-total-damage-restoration-pfvwgb-pf~188655390',}],maxProfessionals: 1,includeReviews: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Use the API with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/houzz-professionals-reviews-scraper').call(run_input={'startUrls': [{'url': 'https://www.houzz.com/professionals/general-contractors/nytdr-new-york-total-damage-restoration-pfvwgb-pf~188655390'}],'maxProfessionals': 1,'includeReviews': True,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with Apify MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/houzz-professionals-reviews-scraper"
Use the same HTTP server definition for Claude Desktop, Cursor, or VS Code.
- Claude Desktop setup: add the JSON below to
claude_desktop_config.json. - Cursor setup: add it in Cursor MCP settings.
- VS Code setup: add the server URL through your MCP-compatible extension or workspace configuration.
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/houzz-professionals-reviews-scraper"}}}
Example prompts:
- “Collect the first 20 public professionals from this Houzz contractor directory.”
- “Export this Houzz profile and its available public review rows.”
- “Separate the professional leads and reviews, then summarize rating distribution.”
Responsible use and legality
This Actor extracts publicly visible professional information. Public availability does not remove your legal responsibilities.
You are responsible for:
- complying with Houzz terms and applicable laws;
- having a lawful purpose for collecting and processing personal data;
- respecting opt-out, marketing, and privacy requirements;
- avoiding harassment, spam, discrimination, or harmful profiling;
- setting appropriate retention and access controls;
- responding to data-subject requests where required.
Do not use the Actor to access private accounts, bypass authentication, or collect data you are not authorized to process.
Troubleshooting
Why did the run fail with a blocked or invalid response?
Houzz may temporarily challenge a proxy session. The Actor retries a bounded number of times with fresh SHADER sessions. If all retries fail, reduce run size and retry later rather than creating an aggressive loop.
Why are there no review rows?
A profile can publish an aggregate review count without including review bodies in the current server-rendered response. The professional record remains useful and reports the aggregate count. When review rows are emitted, they are included with the professional at no separate event charge.
Why is a field null?
Houzz professionals control which fields they publish, and page shapes vary. Null means the field was not available in the parsed public data.
Why did my URL fail validation?
Only public houzz.com/professionals/... directory and profile URLs are accepted. Remove tracking redirects or unrelated Houzz page types.
How can I reduce runtime?
Disable includeProfileDetails for directory-only leads, lower maxProfessionals, reduce maxPages, or set includeReviews to false.
Limitations
- Houzz page structure and anti-bot controls can change.
- Public reviews may not be embedded in every profile response.
- Directory pagination depends on a public next-page link.
- The Actor does not log in or scrape private projects/messages.
- It does not verify whether a phone, website, or business description is current.
- It does not crawl external websites linked from Houzz.
- It does not promise exhaustive coverage beyond the configured limits and pages Houzz returns.
Related Automation Lab Actors
Use Houzz Design Photo Gallery Scraper when the buyer job is collecting Houzz inspiration photos rather than professional lead and reputation records.
The two Actors intentionally cover different Houzz workflows:
- this Actor: professionals, business details, ratings, and reviews;
- photo gallery Actor: design images and inspiration metadata.
FAQ
Can I scrape multiple categories or cities in one run?
Yes. Add each real directory URL to startUrls. maxProfessionals and maxPages apply across the whole run.
Are duplicate professionals emitted?
No. The Actor deduplicates normalized profile URLs within a run.
Are failed or duplicate rows charged?
No. Failed or duplicate rows do not trigger a per-record charge. Only accepted professional records trigger the professional event; emitted review rows are included at no separate event charge.
Can I use directory-only mode?
Yes. Set includeProfileDetails to false. This reduces requests but also limits profile-only fields and review output.
Does it use residential proxies?
No. The current version uses SHADER sessions and does not automatically fall back to unmeasured residential traffic.
Can I schedule it?
Yes. Use an Apify schedule and keep the input focused on stable directory or profile URLs.
Is this an official Houzz product?
No. It is an independent data extraction Actor and is not affiliated with or endorsed by Houzz.