Houzz Pro Scraper - Contacts, Reviews & 35+ Fields avatar

Houzz Pro Scraper - Contacts, Reviews & 35+ Fields

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Houzz Pro Scraper - Contacts, Reviews & 35+ Fields

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

Abot API

Maintained by Community

Actor stats

3

Bookmarked

43

Total users

11

Monthly active users

2 days ago

Last modified

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.

FieldExample
id"00000001"
userId1
professionalId0
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 / longitude40.0 / -74.0
formattedPhone"(000) 000-0000"
website"sample-studio.com"
numReviews0
reviewRating0.0
aspectCommunication / aspectOnTime / aspectQuality / aspectValue0.0 each (when Houzz publishes per-aspect scores)
featuredReviewText"Sample featured review excerpt appears here when present."
verified / hasVerifiedLicensetrue / 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

  1. 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), or url (paste any Houzz directory link).
  2. For search or review, choose a Country and Category, and optionally add Locations and/or Keywords to narrow it. For url mode, paste one or more directory links instead.
  3. 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.
  4. 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.

#ShapeExample
1Category directoryhttps://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785
2Paginated page (?fi=15)https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785?fi=15
3Category + region (~r_)https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785~r_5454711
4Category + keyword (~q_)https://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785~q_mid-century
5Category + region + keywordhttps://www.houzz.com/professionals/interior-designer/probr0-bo~t_11785~r_5454711~q_modern
6Location by name (/c/City--ST)https://www.houzz.com/professionals/interior-designer/c/Los-Angeles--CA
7City-slug canonical pagehttps://www.houzz.com/professionals/interior-designer/new-york-city-ny-us-probr0-bo~t_11785~r_5128581
8City-slug paginated pagehttps://www.houzz.com/professionals/interior-designer/new-york-city-ny-us-probr0-bo~t_11785~r_5128581?fi=15
9All-categories national directoryhttps://www.houzz.com/professionals/probr0-bo~
10Sub-service / project type (probr1, ~sv_)https://www.houzz.com/professionals/cabinets/project-type-cabinet-refinishing-probr1-bo~t_11829~sv_29581
11houzz.com.au category directoryhttps://www.houzz.com.au/professionals/interior-designers-and-decorators/probr0-bo~t_11911
12houzz.co.uk all-categories directoryhttps://www.houzz.co.uk/professionals/probr0-bo~
13Directory with extra sort parameterhttps://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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED (pros only, never reviews; only after a run that scanned every page of every search, and only with emitExpired). stateKey names or shares the stored baseline. UPDATED means an output field changed. scrapedAt, searchUrl, isProVerificationEnabled and the per-request tracking data in raw_professional.webProTrackInfo are never compared (they stay in the output). The top-level awards and awardsCount lists and the path, localProjectCount, distance and directoryBadge copies are not compared directly either; they are compared through raw_professional, so an edit to a pro's award text still marks it UPDATED with raw_professional in changedFields. 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 as NEW. ignoreFieldsForChanges lets 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.

  1. Authorize a connector once under Apify โ†’ Settings โ†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestring"search"search (one row per pro), review (one row per review, full history), or url (paste directory links).
sitestring"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.
categorystring"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.
queriesarray(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.
locationsarray(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.
reviewSortstring"NEWEST"Order reviews are pulled in for review mode: NEWEST, OLDEST, HIGHEST_RATING, or LOWEST_RATING.
maxReviewsPerProinteger20Cap 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.
urlsarray13 example URLs, one per shapeHouzz directory or search URLs to paginate (url mode).
minRatinginteger0Only return pros with average rating >= this value (1 to 5). 0 = include all.
minReviewCountinteger0Only return pros with at least this many reviews.
verifiedOnlybooleanfalseSkip pros without a verified company profile.
maxPagesinteger1Stop 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.
maxListingsinteger1000Hard 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.
maxItemsinteger0Alias of maxListings for users coming from other Houzz scrapers. 0 = not set; when both are set the smaller value applies.
fetchDetailsbooleanfalseVisit each pro's detail page for richer fields (search and url modes).
resumeFromRunIdstring(none)Continue one interrupted run: paste its run or dataset ID.
incrementalModebooleanfalseTrack a scheduled search across runs and classify every pro as new, updated, unchanged, reappeared or expired.
stateKeystring(none)Names or shares the Incremental mode baseline. Auto-derived from mode, category, locations, queries and filters when left empty.
emitUnchangedbooleanfalseAlso return (and bill) rows unchanged since the last Incremental mode run.
emitExpiredbooleanfalseAlso return (and bill) a synthetic row for pros that dropped out of a fully scanned search.
ignoreFieldsForChangesarray[]Incremental mode only. Extra top-level field names to exclude from UPDATED change detection, on top of the built-in exclusions.
proxyobject{"useApifyProxy": true}Connection settings. Residential is optional and recommended for very large runs.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap 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.

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.