Houzz Pro Scraper at a glance
Houzz Pro Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes pro id, pro, type, city and state, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Lead Generation, Agents, Real Estate
- Pricing
- $1.70 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 23 options
- Run success
- 96.8% of completed public runs in the last 30 days
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.
What Houzz Pro Scraper can do
- 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.
Choose what to collect
These inputs let you configure Houzz Pro Scraper - Contacts, Reviews & 35+ Fields. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Pick what each output row should be. 'search' returns one row per pro (full profile). 'review' returns one row per review, pulling each matching pro's full review history. 'url' walks any directory URL you paste, one row per pro. |
categorystring | Service category. Mapped to that country site's own Houzz category id at runtime. Coverage differs per country, all 28 categories exist on houzz.com, but the smaller country sites carry fewer (for example houzz.com.sg has 8). If a category does not exist on the country you picked, the run stops immediately with a message listing the categories that country does have, rather than silently returning the unfiltered national directory. Bathroom remodels live under 'kitchen-and-bath-remodelers'. |
queriesarray | Optional free-text searches (e.g. 'mid century kitchen', 'sustainable architect'). Each keyword runs as a separate search and narrows the chosen category and location to pros matching that text, different keywords return genuinely different pros. A keyword nothing matches returns an empty result for that search. Leave empty to browse the whole category. |
locationsarray | Cities, regions, or country segments. Format examples: 'Sydney--NSW', 'New-York--NY', 'Berlin--BE', 'CA'. Each location runs as a separate search and combines with the chosen category and keywords. Leave empty to scrape across all locations. |
reviewSortstring | Order in which each pro's reviews are pulled. |
maxReviewsPerProinteger | Cap how many reviews to pull per pro in review mode. 0 = the maximum of 1024 (the most Houzz serves per pro). |
urlsarray | Paste any Houzz directory or search URL (single professional profile pages are not supported). Pagination continues automatically from where you start. Multiple URLs supported. Left untouched, url mode scrapes one example per supported URL shape (13 URLs). |
Show 16 more inputs
| Input | What it controls |
|---|---|
minRatinginteger | Only return pros with average rating >= this value (1 to 5). 0 = include all. |
minReviewCountinteger | Only return pros with at least this many reviews. 0 = include all. |
verifiedOnlyboolean | Skip pros without a verified company profile. |
maxPagesinteger | Stop after this many SERP pages per search. Each page has 15 pros. Leave empty or 0 for 1 page. Hard-capped at 200 pages per search in code. |
maxListingsinteger | Hard cap on total pros emitted across all searches (default 1000, up to 1,000,000). In Review mode it caps the total number of reviews emitted instead. 0 = no cap beyond Max pages per search and the 1,000,000 ceiling. |
maxItemsinteger | Alias of 'Max pros total' for users coming from other Houzz scrapers. 0 = not set. When both are set the smaller value applies. |
fetchDetailsboolean | Visit each pro's detail page for richer fields: full aboutMe, all services, awards, social links, operating hours, featured review, per-aspect ratings (communication / on-time / quality / value). Adds ~1 fetch per pro. Auto-enabled in 'review' mode. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue an interrupted crawl: records already collected there are skipped so you get only what's still missing. One-off continuation of a SPECIFIC run - for ongoing scheduled monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | For a search you run on a schedule (e.g. daily/weekly): remembers what this exact search returned last time and classifies every pro (or review) as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, so you can act on only what changed. UPDATED means an output field changed (rating, review count, badges, services, contact and social links, location and so on); changedFields lists them. An edit to a pro's award text also marks it UPDATED, listed as raw_professional. Never compared: scrapedAt, searchUrl, isProVerificationEnabled (a per-request flag) and the per-request tracking data raw_professional.webProTrackInfo; the top-level awards and awardsCount lists and the path, localProjectCount, distance and directoryBadge copies are compared through raw_professional instead. Add more exclusions under Ignore fields below. Off by default so existing scheduled runs are unaffected. Separate from Resume above, which continues one specific interrupted run. Uses State key below to isolate different searches; see Emit unchanged rows / Emit expired rows to control which of those get pushed (both bill extra rows when on). |
stateKeystring | Names the saved baseline Incremental mode compares against. Leave empty to auto-derive one from your mode/category/locations/queries/filters - two differently-configured searches never share a baseline even with this left empty. Set your own text only if you want to explicitly reuse or separate baselines yourself. Ignored when Incremental mode is off. |
emitUnchangedboolean | When Incremental mode is on: also push rows classified UNCHANGED (identical to last run), not just NEW/UPDATED/REAPPEARED/EXPIRED. Off by default to save you from paying for rows that didn't change. Turning this on bills the per-result event (and the detail-enrichment surcharge, if Fetch full profile is on) for every unchanged row too. |
emitExpiredboolean | When Incremental mode is on: push a synthetic EXPIRED row for pros tracked in a previous run that no longer appear in this one. Only fires after a run that scanned every page of every search with no cap/resume truncating it - a partial scan can't tell 'gone' apart from 'not reached yet', so it's skipped (with a log line) otherwise. Off by default; turning it on bills the per-result event for each EXPIRED row emitted. |
ignoreFieldsForChangesarray | Optional. Top-level field names to exclude from UPDATED change detection, in addition to the built-in exclusions (scrapedAt, searchUrl, isProVerificationEnabled and the per-request tracking data inside raw_professional.webProTrackInfo). Use it if another field in your setup rotates without the pro changing. Excluded fields stay in the output and are never listed in changedFields. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idPro ID (text)displayNamePro (text)proTypeDisplayNameType (text)cityCity (text)stateState (text)countryCountry (text)reviewRatingPro Rating (number)numReviewsReviews (number)formattedPhonePhone (text)websiteWebsite (link)verifiedVerified (boolean)urlPro URL (link)Show 27 more fields
reviewIdReview ID (text)rating⭐ Review Rating (number)textReview (text)reviewerNameReviewer (text)createdTimestampReview Date (text)proDisplayNameReview → Pro (text)proCityReview → City (text)proStateReview → State (text)proUrlReview → Pro Profile (link)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen at (incremental mode) (date)lastSeenAtLast seen at (incremental mode) (date)aboutMeAbout (text)servicesProvidedServices (text)areasServedAreas served (text)yearsInBusinessYears in business (text)awardsCountAwards (number)awardsawards (text)spaceCountProjects (number)localProjectCountLocal projects (number)socialFacebooksocialFacebook (text)socialInstagramsocialInstagram (text)socialLinkedinsocialLinkedin (text)socialPinterestsocialPinterest (text)socialYoutubesocialYoutube (text)socialTwittersocialTwitter (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"longitude": -74,
"formattedPhone": "(000) 000-0000",
"website": "sample-studio.com",
"numReviews": 0,
"reviewRating": 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": {}
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Houzz Pro Scraper return?
The documented output for Houzz Pro Scraper includes pro id, pro, type, city, state, country, pro rating and reviews. Availability of each field depends on the source page and the selected mode.
How much does Houzz Pro Scraper cost?
It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
