Thumbtack Scraper — Pros, Reviews & Coverage — $2.78/1k
Pricing
from $0.90 / 1,000 results
Thumbtack Scraper — Pros, Reviews & Coverage — $2.78/1k
Thumbtack scraper for service providers by city: ratings, reviews, hires, prices, years in business. Coverage mode shows category gaps per city and service with the pro count. No login or cookies. MCP-ready for AI agents. $2.78 per 1,000 records.
Pricing
from $0.90 / 1,000 results
Rating
0.0
(0)
Developer
Fortuitous Pirate
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
4
Monthly active users
20 days ago
Last modified
Categories
Features
Share
Thumbtack Scraper — Pros, Reviews & Category Coverage
Thumbtack scraper for service providers and for market gaps. Give it cities and services and it returns, for every city x service pair, whether Thumbtack has a category page there and how many pros it shows ("31 near you"). Switch to listings mode and it returns one row per pro: rating, review count, times hired, starting price, years in business, Top Pro and "In high demand" badges, background check and license status, social links and the most recent reviews.
It runs on plain HTTP. No login, no cookies, no browser, no proxy, 512 MB of memory. A default run finishes in about five seconds.
What you get
Two kinds of rows, told apart by recordType:
- coverage: one row per city x service. Written even when nothing is found, so a gap shows up as a row instead of as a missing row.
- listing: one row per service provider.
Coverage row fields
| Field | Example | Meaning |
|---|---|---|
city, state, service | San Diego, CA, "dog grooming" | What you asked for |
categoryExists | true | Thumbtack has a category page for this service in this city |
categoryKnown | true | Thumbtack has this category anywhere. false means Thumbtack does not offer it at all ("xylophone repair") |
proCount | 31 | The number Thumbtack prints as "31 near you". 0 when the page shows none, null when the category is unknown |
proCountText, proCountIsMinimum | "31 near you", false | The raw text. true when Thumbtack prints "100+" |
proCountSource | cityPage / nearMeZip | Where the count came from (see below) |
resultCount | 7 | Pros listed on that page |
searchResultCount | 11 | Pros Thumbtack's own search returns for the city's ZIP |
matchedSlug, triedSlugs | mobile-dog-grooming | Which category slug matched, and every slug tried |
categoryName, categoryPk, thumbtackKeyword | House Cleaning | Thumbtack's own names and ids |
pageUrl, zipCode | https://www.thumbtack.com/ca/san-diego/house-cleaning | The page and the ZIP used |
topPros | ["Ramirez House Cleaning", ...] | First three pro names |
scrapedAt, error | Timestamp, and a parse error message if one happened |
Listing row fields
| Group | Fields |
|---|---|
| Identity | businessName (alias name), servicePk, profileUrl, avatarUrl, categories, serviceCategory, businessType |
| Reputation | rating, reviewCount, reviewQualifier ("Great"), hiresCount (times hired), similarJobsNearby, highlightedReview, reviewSentiment, ratingExact (with details) |
| Badges | isTopPro, isOnline, badges ("Top Pro", "In high demand", "Great value"), urgencySignals, businessFacts |
| Price | priceText ("$175" or "$85/hour"), priceFrom (number, USD), priceUnit, priceRange. Only filled when Thumbtack shows a price for that pro |
| Business | yearsInBusiness, foundingYear, numberOfEmployees, responseTimeHours, introduction, serviceArea, city, state |
| Position | service, matchedSlug, searchZip, rank, source (cityPage, search, profile), sourceUrl |
| Scores | leadScore {score, tier, factors}: a 0-100 outreach score built from rating, review volume, hires, Top Pro, online status |
With includeDetails | backgroundChecked, licensed, credentials, photosCount, paymentMethods, businessHours, socialLinks (real Facebook / Instagram / X URLs), address {locality, region, postalCode}, specialties, reviews (author, rating, date, text) |
Coverage mode: find the gaps in a city
Coverage mode answers one question per city and service: is this service already served on Thumbtack here, and how thinly?
How a row is built:
- The service text is turned into Thumbtack category slugs. "dog grooming" tries
dog-groomingfirst. Thumbtack redirects some slugs, and the actor also asks Thumbtack's own search for matching keywords, so "dog grooming" resolves tomobile-dog-groomingin San Diego and "cake" resolves tocake-decorators. The slug that matched is returned inmatchedSlug, so you can see how Thumbtack names the category. - The city category page is read (
/ca/san-diego/house-cleaning) andproCountis taken from the "N near you" label. - If the city has no category page, the actor falls back to the service's near-me search for a ZIP code of that city and counts what comes back. That row has
categoryExists: falseandproCountSource: "nearMeZip". A ZIP with pros still has a count; a ZIP with none givesproCount: 0.
Reading the three flags together:
| categoryKnown | categoryExists | proCount | What it means |
|---|---|---|---|
| true | true | 31 | Served. The count tells you how crowded |
| true | true | 0 | Page exists, nobody listed. A gap with demand potential |
| true | false | 0 | No city page and no pros in the city's ZIP. A clear gap |
| false | false | null | Thumbtack does not offer this service anywhere |
Real coverage output
Default run, San Diego, measured on Apify:
| City | Service | matchedSlug | proCount | Pros Thumbtack lists |
|---|---|---|---|---|
| San Diego, CA | house cleaning | house-cleaning | 31 | 7 on the page, 11 in search |
| San Diego, CA | dog grooming | mobile-dog-grooming | 5 | 4 on the page, 5 in search |
| San Diego, CA | cake | cake-decorators | 1 | 1 on the page, 2 in search |
A second run over Nome AK, Austin TX and Charlotte NC with the same three services plus "xylophone repair" (the Austin dog-grooming row is from a local run of the current version, the rest from the cloud run):
| City | Service | categoryExists | categoryKnown | proCount |
|---|---|---|---|---|
| Nome, AK | dog grooming | false | true | 0 |
| Nome, AK | cake | false | true | 0 |
| Austin, TX | dog grooming | true | true | 1 (via pet-grooming; the first slug tried, dog-grooming, shows 0) |
| Austin, TX | cake | true | true | 1 |
| Charlotte, NC | dog grooming | true | true | 6 |
| Charlotte, NC | cake | true | true | 3 |
| any of the three | xylophone repair | false | false | null |
One complete row:
{"recordType": "coverage","marketplace": "thumbtack","city": "San Diego","state": "CA","service": "house cleaning","categoryExists": true,"categoryKnown": true,"proCount": 31,"proCountText": "31 near you","proCountIsMinimum": false,"proCountSource": "cityPage","resultCount": 7,"searchResultCount": 11,"pageUrl": "https://www.thumbtack.com/ca/san-diego/house-cleaning","matchedSlug": "house-cleaning","triedSlugs": ["house-cleaning"],"categoryName": "House Cleaning","categoryPk": "219264413294461288","thumbtackKeyword": "House Cleaning","zipCode": "92101","topPros": ["Ramirez House Cleaning","Happy Cleaning Company","Artez Cleaning LLC Airbnb & Vacation Rentals"],"scrapedAt": "2026-10-22T02:23:35.814Z","error": null}
A gap row (Nome, AK, dog grooming):
{"recordType": "coverage","marketplace": "thumbtack","city": "Nome","state": "AK","service": "dog grooming","categoryExists": false,"categoryKnown": true,"proCount": 0,"proCountSource": "nearMeZip","resultCount": 0,"searchResultCount": 0,"pageUrl": "https://www.thumbtack.com/k/dog-grooming/near-me","matchedSlug": "dog-grooming","zipCode": "99762","topPros": [],"error": null}
Listings mode: one row per pro
For each city x service the actor reads the city category page, then runs Thumbtack's instant-results search across up to 15 ZIP codes of the city (maxZipsPerCity), removes duplicates and keeps going until maxItems is reached or six ZIPs in a row add nobody new. Each pro keeps source (cityPage or search) and searchZip, so you can see where it was found.
Measured on Apify: the LA house-cleaning run returned ten pros with rating, reviews, hires and, where Thumbtack shows one, a price:
| Pro | Rating | Reviews | Hired | Top Pro | Price | Years |
|---|---|---|---|---|---|---|
| VireliaClean | 4.8 | 46 | 90 | yes | not shown | 3 |
| Gleaming Cleanings | 4.9 | 146 | 210 | yes | $175 | 3 |
| Homeaglow | 3.0 | 107 | 60 | yes | not shown | 11 |
| Lena Lansky Cleaning | 4.8 | 158 | 329 | yes | $130 | 5 |
| Everclean Services | 4.8 | 60 | 137 | yes | $75 | 4 |
Be clear about what Thumbtack exposes
- Thumbtack shows roughly 4 to 13 pros per city x service and offers no paging. Measured in San Diego and Los Angeles: 11 to 13 unique pros per city x service after combining ZIPs. The ZIP sweep helps in large metros (Los Angeles went from 4 pros on the city page to 11 across ZIPs) and changes nothing in small ones.
- The true size of the market is in
proCount("31 near you"), not in the number of listing rows. Use coverage mode for market size and listings mode for the visible sample. - Phone numbers are masked by Thumbtack.
phoneis always null. - Thumbtack does not publish pro websites.
websitestays null; the real Facebook, Instagram or X link appears insocialLinkswithincludeDetails. - A profile page carries at most five reviews, so
reviewsholds up to five per pro. licensedis true only when Thumbtack lists a license credential. Most pros show only a background check.- Price fields are null for pros that do not show one.
Listing row (with profile details)
{"recordType": "listing","marketplace": "thumbtack","businessName": "VireliaClean","servicePk": "588195103066750988","profileUrl": "https://www.thumbtack.com/ca/beverly-hills/pro/vireliaclean/service/588195103066750988","rating": 4.8,"reviewCount": 46,"reviewQualifier": "Great","hiresCount": 90,"serviceArea": "Los Angeles, CA","isTopPro": true,"isOnline": true,"badges": ["Top Pro", "In high demand"],"yearsInBusiness": 3,"foundingYear": 2023,"numberOfEmployees": 29,"responseTimeHours": 0.28,"categories": ["House Cleaning"],"businessFacts": ["Current Top Pro", "Hired 90 times", "Serves Beverly Hills, CA", "Background checked", "29 employees", "3 years in business"],"city": "Los Angeles","state": "CA","service": "house-cleaning","matchedSlug": "house-cleaning","searchZip": "90001","rank": 1,"source": "cityPage","highlightedReview": "Leon S. says, \"My house is sparkling clean now.\"","leadScore": { "score": 85, "tier": "hot" },"backgroundChecked": true,"licensed": false,"photosCount": 218,"paymentMethods": "PayPal and Zelle","address": { "locality": "Beverly Hills", "region": "CA", "postalCode": "90210" },"phone": null,"website": null,"reviews": [{ "author": "Kevin H.", "rating": 5, "date": "Sep 19, 2026", "text": "Great value for the price. Very punctual and everything looks spotless." }],"detailsScraped": true}
(introduction, specialties and four more reviews are also present in a real row; shortened here.)
Use cases
- Find unserved services in a city. Run coverage for your city against 30 services and sort by
proCount. Services with 0 to 3 pros on Thumbtack are candidates to open or advertise. - Validate a business idea. Compare
proCountfor the same service across ten cities before choosing where to launch. - Cross-check against other directories. If Yelp or Google lists many businesses for a service but Thumbtack shows
proCount: 0, the marketplace is not covering that category. - Competitor benchmarking. Pull listings for your category and rank pros by reviews, hires, years in business and price.
- Lead lists for B2B sales. Tools, insurance, software and marketing vendors selling to home-service pros: filter on
hiresCount,isTopPro,leadScore.tierandnumberOfEmployees. - Pricing research.
priceFromandpriceUnitgive the starting price Thumbtack shows per pro and per city. - Weekly monitoring. Schedule a coverage run and watch
proCountchange by city and service.
Input
| Input | Type | Default | Meaning |
|---|---|---|---|
mode | coverage / listings | coverage; listings if a legacy input is filled | Which rows to produce |
cities | string list | San Diego, CA | "City, ST", "City, State", "st/city-slug" (ca/san-diego) or a 5-digit ZIP. Each city is combined with each service |
services | string list | cake, dog grooming, house cleaning | Plain words or Thumbtack slugs |
listUrl | string | none | Public CSV or Google Sheet. Header city[,state],service gives pairs; a city-only or service-only column extends the lists; headerless rows like San Diego,CA,cake work |
maxItems | integer | 10 | Total rows to return |
includeDetails | boolean | false | Open every profile for credentials, social links, photos, address and reviews. One extra request per pro |
includeReviews | boolean | true | Highlighted review, and the recent reviews with details on |
maxReviewsPerPro | integer | 5 | 0 to 5 |
maxZipsPerCity | integer | 15 | ZIP searches per city in listings mode. 1 means the city page only |
startUrls | URL list | none | Legacy: city category pages, /k/<service>/near-me URLs (with ?zip_code=), instant-results URLs, profile URLs |
serviceCategories | string list | none | Legacy alias of services; switches the default mode to listings |
locations | string list | none | Legacy alias of cities in st/city form; switches the default mode to listings |
concurrency | integer | 3 | Targets processed in parallel |
proxyConfiguration | proxy | none | Not needed |
Example: coverage for several cities
{"mode": "coverage","cities": ["San Diego, CA", "Austin, TX", "Charlotte, NC", "Nome, AK"],"services": ["dog grooming", "cake", "house cleaning", "piano lessons"],"maxItems": 100}
Example: listings with profile details
{"mode": "listings","cities": ["Austin, TX"],"services": ["plumbers"],"maxItems": 20,"includeDetails": true}
Example: import a list
{"mode": "coverage","listUrl": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/export?format=csv","maxItems": 500}
The sheet needs the headers city, state, service (one row per pair), or one column of cities and one of services to combine them all.
Example: existing task input (still works)
{"serviceCategories": ["house-cleaning"],"locations": ["ca/los-angeles"],"maxItems": 40}
Example: start URLs
{"startUrls": [{ "url": "https://www.thumbtack.com/ca/los-angeles/house-cleaning/" },{ "url": "https://www.thumbtack.com/k/plumbers/near-me/?zip_code=28202" }]}
Pricing
Pay per event: a start fee of $0.005 per run plus a price per row, coverage and listing rows alike. Every row you pay for is a row in your dataset. See the pricing panel on this page for the price in force today; a lower per-row price from a pending change is published there ahead of time.
What that means in practice:
- A coverage run for 20 cities x 10 services is 200 rows.
- Profile details cost no extra per-row fee. They cost time: one extra request per pro.
- Because HTTP is cheap, the platform compute for a run is a fraction of a cent. The default run of 3 rows measured $0.00026 in platform usage.
Output and OUTPUT summary
The default dataset holds the rows. A key-value record called OUTPUT summarizes the run:
{ "mode": "coverage", "records": 3, "targets": 3, "processed": 3, "failed": 0, "summary": [ { "target": "San Diego, CA / cake", "status": "ok" } ] }
If one city or service fails, everything else is still saved and the failure is listed in summary.
Limits and FAQ
Does it need a proxy? No. Thumbtack answered Apify's own IPs directly in testing. Apify datacenter proxies can hit Thumbtack's AWS WAF challenge on page requests; if you set a proxy anyway, blocked requests are retried directly.
Why is proCount bigger than the number of listing rows? Thumbtack prints "31 near you" but returns only a handful of pros per search and has no paging. The actor combines ZIP searches to get as many as Thumbtack will show, typically 11 to 13 in large cities.
Why does categoryExists say false while proCount is above 0? categoryExists is about the city category page. If the city has no page, the count comes from the near-me search for a ZIP of the city (proCountSource: "nearMeZip").
Why did "dog grooming" return mobile-dog-grooming or pet-grooming? Thumbtack keeps several keyword pages for one category and they show different counts. The actor tries the candidates and keeps the page with the most pros; matchedSlug and triedSlugs tell you which. If you need a specific slug, pass it as the service.
Can it scrape phone numbers or websites? No. Thumbtack masks phone numbers and does not publish websites.
Is the data free of duplicates? Listings are deduplicated per run by provider id.
Non-US cities? Thumbtack serves the US; ZIP lookups use the US ZIP database.
Is scraping Thumbtack legal? The actor reads publicly visible pages with no login. You are responsible for how you use the data, including privacy and marketing laws that apply to you.
Integrations
- API: start a run with
POST https://api.apify.com/v2/acts/fortuitous_pirate~thumbtack-service-providers/runs?token=YOUR_TOKENand read/dataset/items. - Python:
ApifyClient(token).actor("fortuitous_pirate/thumbtack-service-providers").call(run_input={...}), thenclient.dataset(run["defaultDatasetId"]).iterate_items(). - JavaScript:
new ApifyClient({ token }).actor('fortuitous_pirate/thumbtack-service-providers').call(input). - Schedules and webhooks: run weekly and POST to your endpoint when a run succeeds.
- Make, Zapier, n8n: use the Apify app and map
proCount,categoryExistsorratinginto your sheet or CRM. - Google Sheets / CSV / Excel / JSON: export from the dataset tab.
- AI agents (MCP): the actor is available through the Apify MCP server, so an agent can ask "which of these services have fewer than 3 Thumbtack pros in Austin?" and get rows back.
Support
Open an issue on this actor's page with the input you used and the run id. Thumbtack changes its site from time to time; reports with a run id are fixed fastest.