Thumbtack is one of the largest local-services marketplaces in the US, connecting homeowners with hundreds of thousands of independent service pros across categories like plumbing, electrical work, house cleaning, landscaping, handyman work, personal training, photography, tutoring, and event services. For lead-generation tools, local SEO agencies, home-services SaaS companies, and market researchers, Thumbtack’s public pro listings are an unusually rich dataset: real local supply, verified ratings and review counts, response-rate signals, price ranges, and tenure on the platform — segmented by category and ZIP code. None of that is available through any official public API.
This post explains why Thumbtack pro data is hard to collect at scale, who needs it, and how to extract it cleanly without writing scraping code yourself.
Thumbtack’s search and pro pages are JavaScript-rendered, location-aware, and behind layered anti-bot infrastructure. Extracting clean data at scale runs into several practical obstacles.
Anti-bot infrastructure and session behavior: Thumbtack applies request- and session-level behavioral analysis to detect automated traffic. Bulk collection that fires rapid sequential requests across keyword and location combinations, ignores realistic browsing pacing, and uses datacenter IPs gets degraded responses, throttled, or blocked outright. Reliable extraction requires session management that mimics authentic browsing, request pacing calibrated to platform tolerance, and rotating residential network paths so long collections do not surface as scraper traffic. The infrastructure layer is the bulk of the engineering work, not the parsing.
Geographic targeting is the second dimension of difficulty. Thumbtack’s results are tightly tied to location — a ZIP, a city, or a metro — and the same keyword returns different result sets at different granularities. A naive collection that queries only at city level misses the long tail of suburban ZIPs; one that queries every ZIP individually wastes budget on overlap. Sound location coverage requires a dedup strategy keyed on the pro’s identity, not on the search request that surfaced them.
Field completeness varies widely across pros. Top-rated established pros expose full bios, response rates, years on the platform, verified badges, and price ranges; newer or less-engaged pros surface only a name, category, and partial location. A pipeline that does not normalize across these completeness levels — or that crashes on missing fields — produces brittle outputs that downstream lead-scoring or analysis cannot rely on. Verified-badge handling in particular is fiddly: the visual marker is rendered, not always present in the underlying markup, and missing it silently downgrades data quality.
Category structure is the fourth issue. Thumbtack’s category tree is broad and overlapping — “handyman”, “general contractor”, and “home repair” surface overlapping pros, and the same pro can appear under multiple categories. Without category-aware deduplication, downstream counts of “how many electricians in Phoenix” double-count pros who also list under related categories. The collection layer has to track which category a pro was found under and merge identities cleanly.
We maintain a Thumbtack Scraper on Apify that handles JavaScript rendering, location targeting, session management, and field normalization. You give it a service keyword and a location; it returns clean structured pro data ready for your CRM, lead-gen tool, or local market dataset.
Pull plumbers in Austin, TX:
{
"keyword": "plumber",
"location": "Austin, TX",
"max_results": 50
}
Pull house cleaners by ZIP code:
{
"keyword": "house cleaning",
"location": "94110",
"max_results": 100
}
Location accepts a city, a city-state pair, or a US ZIP code.
Using the Apify Python client:
import apify_client
client = apify_client.ApifyClient('YOUR_API_TOKEN')
run_input = {
'keyword': 'plumber',
'location': 'Austin, TX',
'max_results': 50,
}
run = client.actor('cryptosignals/thumbtack-scraper').call(run_input=run_input)
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item)
That is the entire integration. No selectors to maintain, no proxies to rotate, no session state to manage.
Each pro returns a structured object:
{
"pro_name": "Lone Star Plumbing & Drain",
"category": "Plumber",
"location": "Austin, TX",
"rating": 4.9,
"review_count": 187,
"price_range": "$$",
"bio": "Family-owned plumbing company serving the greater Austin area for 12 years. Licensed, bonded, and insured. We specialize in residential repairs, water heater replacement, slab leak detection, and emergency service. Same-day appointments available...",
"response_rate": "Responds within 1 hour",
"years_on_platform": 8,
"verified_badge": true,
"scrapedAt": "2026-05-01T14:22:00.000Z"
}
| Field | Type | Description |
|---|---|---|
pro_name | string | Business or individual pro name as listed |
category | string | Primary service category |
location | string | Stated service location (city, state) |
rating | number | Average star rating (0–5) |
review_count | integer | Total number of customer reviews |
price_range | string | Price tier indicator (e.g. $, $$, $$$) |
bio | string | Pro bio / business description excerpt |
response_rate | string | Stated typical response time |
years_on_platform | integer | Years the pro has been active on Thumbtack |
verified_badge | boolean | Whether the pro carries a verified badge |
scrapedAt | string | ISO 8601 collection timestamp |
Output is available as JSON, CSV, or XLSX. CSV drops straight into a CRM import, a pandas notebook, or a Postgres load for local-market aggregation. Apify’s scheduling and webhook integrations let you run a daily or weekly refresh across keyword×ZIP combinations without managing any infrastructure yourself.
The actor uses Pay Per Event pricing at $0.01 per pro. Free Apify plan users get 5 results per run for testing; the cap is removed on any paid Apify plan.
| Volume | Cost |
|---|---|
| 500 pros (single category, one metro) | $5.00 |
| 5,000 pros (multi-category city sweep) | $50.00 |
| Weekly 1,000-pro refresh | $40.00/month |
Try the Thumbtack Scraper free on Apify Store →
Apify’s free tier covers initial testing. Sign up here if you do not have an account. The actor plugs into Apify’s scheduling, webhook, and dataset APIs so you can automate recurring local-pro data pipelines without building scraping infrastructure yourself.