Houzz Pro Scraper - Contacts, Reviews & 35+ Fields
Pricing
from $1.00 / 1,000 results
Houzz Pro Scraper - Contacts, Reviews & 35+ Fields
From $1/1K. Pull Houzz pro listings across global sites. Search by category and location, keyword, or URL, plus review mode for specific pros. Returns 35+ fields including ratings, reviews, awards, services, address, GPS, contacts, social links, project counts, and featured review.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(1)
Developer
Abot API
Maintained by CommunityActor stats
3
Bookmarked
43
Total users
11
Monthly active users
2 days ago
Last modified
Categories
Share
Houzz Scraper: Pros, Ratings, Reviews & Profile Data
Houzz Scraper turns Houzz into a clean directory of home professionals. Search interior designers, architects, builders, general contractors, kitchen remodelers, photographers and every other trade Houzz lists, across the Houzz country sites (houzz.com, .com.au, .co.uk and others, see coverage below), with 35+ fields per pro: ratings, per-aspect scores, awards, services, full address, contact details, social links and a featured review excerpt. Pull a pro's full review history on demand, then export to JSON, CSV or Excel, or read the results straight into your app through the API.
Why This Scraper?
- Four ways to find pros. Browse a category and city, run a free-text keyword search, paste any Houzz directory URL, or pull the full review history for the pros a search matches.
- 35+ fields per pro. Ratings, per-aspect scores (communication, on time, quality, value), awards, badges, services, full address, social links across eight platforms, and a featured review excerpt.
- Multiple Houzz country sites, one input shape. Your category choice is mapped to that country's own Houzz category id; coverage differs by country, and an unsupported category stops the run with the list of ones that country does have instead of quietly returning the wrong pros.
- Full review history on demand. Review mode pulls every review per pro, rating, reviewer, text, project price and the pro's own reply, not just the headline one.
- Filter at the source. Minimum rating, minimum review count and a verified-only toggle keep the dataset to the pros you actually want.
- Built for schedules. Incremental mode classifies every pro as new, updated, unchanged, reappeared or expired between runs; Resume continues one interrupted run without re-collecting what it already has.
- Fails loudly, not quietly. An unsupported category, a category that needs a location you did not give it, or a connection that cannot be established stops the run with a clear message instead of finishing as a success with nothing in it.
Use Cases
- Lead generation and vendor sourcing: build a shortlist of interior designers, architects or contractors in a city, filtered by rating and review count.
- Competitive and market research: compare how many pros of each trade a metro area has, and how their services, awards and pricing tiers stack up.
- Reputation monitoring: pull a pro's full review history to track sentiment, project types and recent feedback over time.
- Directory and marketplace enrichment: feed pro profiles and contact details into your own directory, CRM or matching tool.
- Recurring monitoring: schedule a search and get back only the pros that are new, changed or gone since the last run.
Data You Get
Sample shape, values are illustrative placeholders, not from a live profile.
| Field | Example |
|---|---|
id | "00000001" |
userId | 1 |
professionalId | 0 |
displayName | "Sample Design Studio" |
proTypeDisplayName | "Interior Designers & Decorators" |
city / state / country | "New York" / "NY" / "US" |
zip / formattedAddress | "10001" / "100 Sample Ave, New York, NY 10001" |
latitude / longitude | 40.0 / -74.0 |
formattedPhone | "(000) 000-0000" |
website | "sample-studio.com" |
numReviews | 0 |
reviewRating | 0.0 |
aspectCommunication / aspectOnTime / aspectQuality / aspectValue | 0.0 each (when Houzz publishes per-aspect scores) |
featuredReviewText | "Sample featured review excerpt appears here when present." |
verified / hasVerifiedLicense | true / false |
awards | [] (Best of Houzz year and category, when present) |
badges / merits | [] / [] |
aboutMe | "Sample about-me text describing the pro's specialty and approach." |
servicesProvided / areasServed | ["Bathroom Design", "..."] / ["Manhattan", "..."] |
socialFacebook / socialInstagram | "https://social.example/sample-studio" / null |
siteOrigin | "houzz.com" |
url | "https://www.houzz.com/professionals/interior-designers-and-decorators/sample-design-studio-pfvwus-pf~00000001" |
mode / category / location | "search" / "interior-designers" / "New-York--NY" |
Review mode (mode: "review") returns one row per review instead of one row per pro: reviewId, rating, text, reviewerName, projectPrice, relationship and proReply (the pro's own reply, when present), plus a proDisplayName / proUrl / proCity / proState back reference to the pro the review belongs to. Turning on Fetch full profile per pro adds richer fields such as businessHours, galleriesCount and Houzz's own jsonLdRating when published. Turning on Incremental mode adds changeType, changedFields, firstSeenAt and lastSeenAt to every row. The full source objects are always kept under raw_professional and raw_user so no field is ever silently dropped.
Output views
The dataset has these views: Overview and Results (one row per pro), Reviews (review mode), Detail (pros with Fetch full profile per pro) and Changes (Incremental mode classification). A summary record with the run totals is saved under the key OUTPUT.
How to Use
- Pick a mode:
search(one row per pro, filtered by category and location or keyword),review(one row per review, the full history for the pros the same search matches), orurl(paste any Houzz directory link). - For
searchorreview, choose a Country and Category, and optionally add Locations and/or Keywords to narrow it. Forurlmode, paste one or more directory links instead. - Turn on Fetch full profile per pro for services, awards, hours and social links, set the rating and review-count filters you need, and cap the run with Max pages per search and Max pros total.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search by category and location:
{"mode": "search","site": "houzz.com","category": "interior-designers","locations": ["New-York--NY", "Los-Angeles--CA"],"maxPages": 3,"maxListings": 50}
Keyword search with filters, on another country site:
{"mode": "search","site": "houzz.com.au","category": "architects","queries": ["sustainable architect"],"locations": ["Sydney--NSW"],"minRating": 4,"verifiedOnly": true}
Full review history for the pros a search matches:
{"mode": "review","site": "houzz.com","category": "kitchen-and-bath-remodelers","locations": ["Austin--TX"],"reviewSort": "NEWEST","maxReviewsPerPro": 20}
Paste a Houzz directory URL:
{"mode": "url","urls": ["https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785"],"maxPages": 2,"fetchDetails": true}
URL shapes (url mode)
Every shape below is covered by a test case. Only Houzz directory pages under professionals are supported; single professional profile pages (...-pf~<id>) are not, and pasting one logs a warning. The German, French and Japanese sites (houzz.de, houzz.fr, houzz.jp) are not supported: their directory pages returned "not found" when tested, so URLs from them are not scraped; a URL outside the supported Houzz professionals pages logs a warning and is skipped. searchUrls is accepted as an alias of urls.
| # | Shape | Example |
|---|---|---|
| 1 | Category directory | https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785 |
| 2 | Paginated page (?fi=15) | https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785?fi=15 |
| 3 | Category + region (~r_) | https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785~r_5454711 |
| 4 | Category + keyword (~q_) | https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785~q_mid-century |
| 5 | Category + region + keyword | https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785~r_5454711~q_modern |
| 6 | Location by name (/c/City--ST) | https://www.houzz.com/professionals/interior-designer/c/Los-Angeles--CA |
| 7 | City-slug canonical page | https://www.houzz.com/professionals/interior-designer/new-york-city-ny-us-probr0-bo~t_11785~r_5128581 |
| 8 | City-slug paginated page | https://www.houzz.com/professionals/interior-designer/new-york-city-ny-us-probr0-bo~t_11785~r_5128581?fi=15 |
| 9 | All-categories national directory | https://www.houzz.com/professionals/probr0-bo~ |
| 10 | Sub-service / project type (probr1, ~sv_) | https://www.houzz.com/professionals/cabinets/project-type-cabinet-refinishing-probr1-bo~t_11829~sv_29581 |
| 11 | houzz.com.au category directory | https://www.houzz.com.au/professionals/interior-designers-and-decorators/probr0-bo~t_11911 |
| 12 | houzz.co.uk all-categories directory | https://www.houzz.co.uk/professionals/probr0-bo~ |
| 13 | Directory with extra sort parameter | https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785?fi=30&sort=review |
Default behaviour change: if you choose url mode and leave Directory URLs untouched, the actor now scrapes these 13 example URLs (one per shape) instead of a single one, which takes longer and uses more compute and proxy. Replace the list with your own URLs to scrape only those.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/houzz-scraper").call(run_input={"mode": "search", "site": "houzz.com", "category": "architects", "locations": ["Austin--TX"]})for pro in client.dataset(run["defaultDatasetId"]).iterate_items():print(pro["displayName"], pro["reviewRating"], pro["numReviews"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/houzz-scraper').call({ mode: 'search', site: 'houzz.com', category: 'architects', locations: ['Austin--TX'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Country and category coverage
The Country selector still lists houzz.de, houzz.fr and houzz.jp so saved tasks keep validating, but those three return no professionals pages and are not advertised as working. Choose houzz.com, houzz.com.au or houzz.co.uk for results.
Category coverage differs per country: all 28 categories exist on houzz.com, smaller country sites carry fewer. Asking for a category a country does not have stops the run immediately, naming the categories that country does have. A handful of category and country combinations only list professionals city by city rather than as a national directory; picking one of those without a Locations or Keywords value stops the run immediately too, naming a city to add. Supplying either value makes the same category return results normally.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every pro (or review, in review mode) already collected there. - Incremental mode (
incrementalMode) is for a search you run on a schedule against the same category, location and query. Each pro (or review) is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(pros only, never reviews; only after a run that scanned every page of every search, and only withemitExpired).stateKeynames or shares the stored baseline.UPDATEDmeans an output field changed.scrapedAt,searchUrl,isProVerificationEnabledand the per-request tracking data inraw_professional.webProTrackInfoare never compared (they stay in the output). The top-levelawardsandawardsCountlists and thepath,localProjectCount,distanceanddirectoryBadgecopies are not compared directly either; they are compared throughraw_professional, so an edit to a pro's award text still marks itUPDATEDwithraw_professionalinchangedFields. In Review mode the saved baseline is keyed on the Max reviews per pro value you used; the old default of 0 (all reviews) keeps its baseline, but a schedule that now runs with the new default of 20 starts a fresh baseline once, so its first run returns every review asNEW.ignoreFieldsForChangeslets you exclude extra top-level fields from change detection if something in your own setup turns out to be noisy. With Incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | "search" | search (one row per pro), review (one row per review, full history), or url (paste directory links). |
site | string | "houzz.com" | Country site (houzz.com, houzz.com.au and houzz.co.uk are verified; houzz.de, houzz.fr and houzz.jp are accepted for old saved tasks but return no pros). Applied in search and review modes. |
category | string | "interior-designers" | Service category, mapped to that country site's own Houzz category. Coverage differs per country; an unsupported category stops the run with the list of ones that do work. |
queries | array | (none) | Free-text keywords, e.g. "mid century kitchen". Each one runs as its own search and narrows the chosen category and location to pros matching that text. Leave empty to browse the whole category. |
locations | array | (none) | Cities, regions or country segments, e.g. "Sydney--NSW", "New-York--NY", "CA". Each one runs as its own search. Leave empty to scrape across all locations. |
reviewSort | string | "NEWEST" | Order reviews are pulled in for review mode: NEWEST, OLDEST, HIGHEST_RATING, or LOWEST_RATING. |
maxReviewsPerPro | integer | 20 | Cap how many reviews to pull per pro in review mode (maximum 1024, which is also what 0 means). Default changed from 0 (all) to 20 to keep untouched runs cheap; raise it to pull more. Each review is one billed result row. |
urls | array | 13 example URLs, one per shape | Houzz directory or search URLs to paginate (url mode). |
minRating | integer | 0 | Only return pros with average rating >= this value (1 to 5). 0 = include all. |
minReviewCount | integer | 0 | Only return pros with at least this many reviews. |
verifiedOnly | boolean | false | Skip pros without a verified company profile. |
maxPages | integer | 1 | Stop after this many SERP pages per search (each page has 15 pros). Empty or 0 means 1 page; hard-capped at 200 pages per search. |
maxListings | integer | 1000 | Hard cap on total pros emitted across all searches (maximum 1,000,000). The default changed from unlimited to 1000; send 0 for no cap beyond maxPages. |
maxItems | integer | 0 | Alias of maxListings for users coming from other Houzz scrapers. 0 = not set; when both are set the smaller value applies. |
fetchDetails | boolean | false | Visit each pro's detail page for richer fields (search and url modes). |
resumeFromRunId | string | (none) | Continue one interrupted run: paste its run or dataset ID. |
incrementalMode | boolean | false | Track a scheduled search across runs and classify every pro as new, updated, unchanged, reappeared or expired. |
stateKey | string | (none) | Names or shares the Incremental mode baseline. Auto-derived from mode, category, locations, queries and filters when left empty. |
emitUnchanged | boolean | false | Also return (and bill) rows unchanged since the last Incremental mode run. |
emitExpired | boolean | false | Also return (and bill) a synthetic row for pros that dropped out of a fully scanned search. |
ignoreFieldsForChanges | array | [] | Incremental mode only. Extra top-level field names to exclude from UPDATED change detection, on top of the built-in exclusions. |
proxy | object | {"useApifyProxy": true} | Connection settings. Residential is optional and recommended for very large runs. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
Output Example
Sample shape, values are illustrative placeholders, not from a live profile.
{"id": "00000001","userId": 1,"professionalId": 0,"displayName": "Sample Design Studio","userName": "sample_studio","proType": 2,"proTypeDisplayName": "Interior Designers & Decorators","country": "US","state": "NY","city": "New York","zip": "10001","formattedAddress": "100 Sample Ave, New York, NY 10001","latitude": 40.0,"longitude": -74.0,"formattedPhone": "(000) 000-0000","website": "sample-studio.com","numReviews": 0,"reviewRating": 0.0,"aspectCommunication": null,"aspectOnTime": null,"aspectQuality": null,"aspectValue": null,"featuredReviewText": "Sample featured review excerpt appears here when present.","mostRecentReviewText": "Sample most-recent review excerpt.","verified": true,"hasVerifiedLicense": false,"awards": [],"badges": [],"merits": [],"aboutMe": "Sample about-me text describing the pro's specialty and approach.","servicesProvided": ["3D Rendering", "Bathroom Design", "Kitchen Design"],"areasServed": ["Manhattan", "Brooklyn"],"socialFacebook": null,"socialInstagram": null,"siteOrigin": "houzz.com","url": "https://www.houzz.com/professionals/interior-designers-and-decorators/sample-design-studio-pfvwus-pf~00000001","mode": "search","category": "interior-designers","location": "New-York--NY","raw_professional": {},"raw_user": {}}
Plan Requirement
A paid Apify plan with proxy access is required. Houzz answers plain requests, from any IP type, with a JavaScript "Client Challenge" page instead of results, so the actor clears it in a browser session through an Apify proxy. Datacenter proxy was measured to work; residential is not required. It is optional and recommended for very large runs, and selecting it pins the exit to the country of the Houzz site you chose.
On an Apify free plan every proxy connection is refused. The run logs "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." If no page can then be loaded, the run ends FAILED with one of these messages:
- Proxy refused for the account: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required."
- Free plan, backup connection reachable but Houzz served nothing: "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested Houzz pages."
- Any other run with no page loaded: "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."
FAQ
How much does it cost?
You pay per pro (or per review, in review mode) returned, plus a detail-enrichment surcharge only for pros actually visited when Fetch full profile per pro is switched on. Current live rates (Free tier): $0.002 per result, $0.001 per detail enrichment, and a one-time Actor start charge of $0.08 per GB of memory (minimum one). Paid Apify tiers get lower rates. The Pricing tab always shows the current figures. Use Max pros total and Max pages per search to cap the cost of any run.
Is it legal to scrape Houzz?
This actor collects only publicly available profile data Houzz shows to any visitor. You are responsible for how you use it: follow Houzz's terms and the laws that apply to you, and get legal advice before using contact details or reviews for outreach or commercial redistribution. Photos, awards and review text may carry Houzz's or the pro's own rights.
Can I get only new or changed pros on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then classifies every pro against what the same search returned last time as new, updated, unchanged, reappeared or expired, and unchanged pros are not billed unless you turn on Emit unchanged rows.
Why does a category sometimes ask me for a location?
A handful of category and country combinations only list professionals city by city rather than as a national directory. Picking one of those without a Locations or Keywords value stops the run immediately and names a city to add, instead of quietly returning an empty or unfiltered result.
Why did my run fail instead of returning an empty dataset?
The run fails with a clear message when it cannot do what you asked at all: an unsupported category for the chosen country, a category that needs a location you did not supply, a resume ID that could not be read, Resume combined with Incremental mode on a search that already has saved state, or a connection that could not be established. A search that reaches Houzz successfully but genuinely matches nothing, such as a keyword or a rating filter nothing meets, still returns a normal, empty dataset.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ Want more leads data?
Pair this actor with these related scrapers from the same team:
| ๐ 2GIS From $1/1K. Extract business and place data from 2GIS.com at scale. Get names, addresses... | ๐ Real Estate AU Agents Scraper Scrape Australian real estate agent and agency profiles by suburb or profile URLs... |
| ๐ BusinessesForSale.com Scraper From $1.5/1K. Extract businesses and franchises listed for sale on BusinessesForSale.com... | ๐ฑ Clutch Scraper Scrape Clutch company directories and profiles. Get names, ratings, review counts, hourly... |
| ๐ Dubizzle.com Scraper From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings... | ๐ BizQuest Scraper Extract business-for-sale, franchise, and asset listings from BizQuest. Search by... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.