Thumbtack Scraper — Pros, Reviews & Coverage — $2.78/1k avatar

Thumbtack Scraper — Pros, Reviews & Coverage — $2.78/1k

Pricing

from $0.90 / 1,000 results

Go to Apify Store
Thumbtack Scraper — Pros, Reviews & Coverage — $2.78/1k

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

Fortuitous Pirate

Maintained by Community

Actor stats

0

Bookmarked

15

Total users

4

Monthly active users

20 days ago

Last modified

Features

Limited permissions

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

FieldExampleMeaning
city, state, serviceSan Diego, CA, "dog grooming"What you asked for
categoryExiststrueThumbtack has a category page for this service in this city
categoryKnowntrueThumbtack has this category anywhere. false means Thumbtack does not offer it at all ("xylophone repair")
proCount31The number Thumbtack prints as "31 near you". 0 when the page shows none, null when the category is unknown
proCountText, proCountIsMinimum"31 near you", falseThe raw text. true when Thumbtack prints "100+"
proCountSourcecityPage / nearMeZipWhere the count came from (see below)
resultCount7Pros listed on that page
searchResultCount11Pros Thumbtack's own search returns for the city's ZIP
matchedSlug, triedSlugsmobile-dog-groomingWhich category slug matched, and every slug tried
categoryName, categoryPk, thumbtackKeywordHouse CleaningThumbtack's own names and ids
pageUrl, zipCodehttps://www.thumbtack.com/ca/san-diego/house-cleaningThe page and the ZIP used
topPros["Ramirez House Cleaning", ...]First three pro names
scrapedAt, errorTimestamp, and a parse error message if one happened

Listing row fields

GroupFields
IdentitybusinessName (alias name), servicePk, profileUrl, avatarUrl, categories, serviceCategory, businessType
Reputationrating, reviewCount, reviewQualifier ("Great"), hiresCount (times hired), similarJobsNearby, highlightedReview, reviewSentiment, ratingExact (with details)
BadgesisTopPro, isOnline, badges ("Top Pro", "In high demand", "Great value"), urgencySignals, businessFacts
PricepriceText ("$175" or "$85/hour"), priceFrom (number, USD), priceUnit, priceRange. Only filled when Thumbtack shows a price for that pro
BusinessyearsInBusiness, foundingYear, numberOfEmployees, responseTimeHours, introduction, serviceArea, city, state
Positionservice, matchedSlug, searchZip, rank, source (cityPage, search, profile), sourceUrl
ScoresleadScore {score, tier, factors}: a 0-100 outreach score built from rating, review volume, hires, Top Pro, online status
With includeDetailsbackgroundChecked, 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:

  1. The service text is turned into Thumbtack category slugs. "dog grooming" tries dog-grooming first. Thumbtack redirects some slugs, and the actor also asks Thumbtack's own search for matching keywords, so "dog grooming" resolves to mobile-dog-grooming in San Diego and "cake" resolves to cake-decorators. The slug that matched is returned in matchedSlug, so you can see how Thumbtack names the category.
  2. The city category page is read (/ca/san-diego/house-cleaning) and proCount is taken from the "N near you" label.
  3. 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: false and proCountSource: "nearMeZip". A ZIP with pros still has a count; a ZIP with none gives proCount: 0.

Reading the three flags together:

categoryKnowncategoryExistsproCountWhat it means
truetrue31Served. The count tells you how crowded
truetrue0Page exists, nobody listed. A gap with demand potential
truefalse0No city page and no pros in the city's ZIP. A clear gap
falsefalsenullThumbtack does not offer this service anywhere

Real coverage output

Default run, San Diego, measured on Apify:

CityServicematchedSlugproCountPros Thumbtack lists
San Diego, CAhouse cleaninghouse-cleaning317 on the page, 11 in search
San Diego, CAdog groomingmobile-dog-grooming54 on the page, 5 in search
San Diego, CAcakecake-decorators11 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):

CityServicecategoryExistscategoryKnownproCount
Nome, AKdog groomingfalsetrue0
Nome, AKcakefalsetrue0
Austin, TXdog groomingtruetrue1 (via pet-grooming; the first slug tried, dog-grooming, shows 0)
Austin, TXcaketruetrue1
Charlotte, NCdog groomingtruetrue6
Charlotte, NCcaketruetrue3
any of the threexylophone repairfalsefalsenull

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:

ProRatingReviewsHiredTop ProPriceYears
VireliaClean4.84690yesnot shown3
Gleaming Cleanings4.9146210yes$1753
Homeaglow3.010760yesnot shown11
Lena Lansky Cleaning4.8158329yes$1305
Everclean Services4.860137yes$754

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. phone is always null.
  • Thumbtack does not publish pro websites. website stays null; the real Facebook, Instagram or X link appears in socialLinks with includeDetails.
  • A profile page carries at most five reviews, so reviews holds up to five per pro.
  • licensed is 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

  1. 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.
  2. Validate a business idea. Compare proCount for the same service across ten cities before choosing where to launch.
  3. 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.
  4. Competitor benchmarking. Pull listings for your category and rank pros by reviews, hires, years in business and price.
  5. Lead lists for B2B sales. Tools, insurance, software and marketing vendors selling to home-service pros: filter on hiresCount, isTopPro, leadScore.tier and numberOfEmployees.
  6. Pricing research. priceFrom and priceUnit give the starting price Thumbtack shows per pro and per city.
  7. Weekly monitoring. Schedule a coverage run and watch proCount change by city and service.

Input

InputTypeDefaultMeaning
modecoverage / listingscoverage; listings if a legacy input is filledWhich rows to produce
citiesstring listSan Diego, CA"City, ST", "City, State", "st/city-slug" (ca/san-diego) or a 5-digit ZIP. Each city is combined with each service
servicesstring listcake, dog grooming, house cleaningPlain words or Thumbtack slugs
listUrlstringnonePublic 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
maxItemsinteger10Total rows to return
includeDetailsbooleanfalseOpen every profile for credentials, social links, photos, address and reviews. One extra request per pro
includeReviewsbooleantrueHighlighted review, and the recent reviews with details on
maxReviewsPerProinteger50 to 5
maxZipsPerCityinteger15ZIP searches per city in listings mode. 1 means the city page only
startUrlsURL listnoneLegacy: city category pages, /k/<service>/near-me URLs (with ?zip_code=), instant-results URLs, profile URLs
serviceCategoriesstring listnoneLegacy alias of services; switches the default mode to listings
locationsstring listnoneLegacy alias of cities in st/city form; switches the default mode to listings
concurrencyinteger3Targets processed in parallel
proxyConfigurationproxynoneNot 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_TOKEN and read /dataset/items.
  • Python: ApifyClient(token).actor("fortuitous_pirate/thumbtack-service-providers").call(run_input={...}), then client.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, categoryExists or rating into 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.