Lead generation
Houzz Professionals Scraper
Turn any Houzz professional category into a clean home-services lead list — name, rating, license number, project/photo count, and years-in-business pulled from Houzz's own embedded data, fields the incumbent Houzz scrapers leave on the table.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Houzz's professional directory (houzz.com/professionals/) is the go-to shortlist for architects, general contractors, interior designers, landscapers, and 70+ other home-services trades. This Actor turns each category-browse listing page (and, optionally, each pro's profile page) into structured leads — name, category, city/state, phone, rating, and review count from the listing, plus license number, project/photo count, clean website URL, and a self-reported years-in-business badge from the profile — fields the incumbent Houzz scrapers skip because they scrape the visible DOM instead of Houzz's own embedded JSON record.
What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
Use cases
- Franchise and vendor prospecting — build a call list of licensed contractors/designers by category and city.
- Sales prospecting — target pros with verified license numbers and strong review counts.
- Market research — track years-in-business and portfolio size distribution across a trade category.
- Lead scoring — filter by rating, review count, and license presence before outreach.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
category | string | yes | Houzz professional category slug to scrape, e.g. "general-contractor". This is a confirmed-live subset of the ~78 categories Houzz supports; the full slug->topicId table lives in src/categories.py. |
location | string | no | Optional "City, ST" free text. Applied as a post-scrape city/state match against nationwide category results (Houzz's native geo query needs an internal region ID we can't resolve — see README Limitations). Leave empty… |
maxResults | integer | no | Stop once this many unique (deduped by Houzz professional ID) leads are collected. |
maxPages | integer | no | Hard cap on listing pages fetched (15 rows/page), independent of Max results — the safety valve against Houzz's totalCount display-cap quirk. |
fetchProfileDetails | boolean | no | When true, fetch each pro's profile page for license number, project/photo count, and a clean website URL. Set false for a faster/cheaper listing-only run (those three fields stay null). |
{
"category": "general-contractor",
"maxResults": 5,
"maxPages": 1,
"fetchProfileDetails": true,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
houzz_professional_idnamecategorycityregionphonewebsitereview_countaverage_ratingproject_or_photo_countyears_in_businesslicense_numberhouzz_profile_urlscraped_at
{
"houzz_professional_id": 752464,
"name": "Full Service USA",
"category": "General Contractors",
"city": "Hallandale",
"region": "FL",
"phone": "(305) 487-8485",
"website": "http://www.fullserviceusa.com",
"review_count": 94,
"average_rating": 4.8,
"project_or_photo_count": 710,
"years_in_business": null,
"license_number": "CG 1516022",
"houzz_profile_url": "https://www.houzz.com/professionals/general-contractors/full-service-usa-pfvwus-pf~1830092161",
"scraped_at": "2026-08-06T12:00:00Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | — | Once per run, covers warm-up and proxy session setup. |
| Actor Start | $0.0200 | Per result written to the dataset. |
| result | $0.0020 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
FAQ
Is this legal?
Do I need a proxy?
Why is license_number often null?
Why is years_in_business usually null?
Does location filter to an exact radius?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors