# Thumbtack Scraper — Local Service Pros, Ratings & Reviews (`moonlings/thumbtack-scraper`) Actor

Scrape Thumbtack pros by service and city: business name, star rating, review count, hires, Top Pro badge, service area, and (optionally) full profiles with reviews, credentials, business hours, and specialties. Pay per result.

- **URL**: https://apify.com/moonlings/thumbtack-scraper.md
- **Developed by:** [moonlings](https://apify.com/moonlings) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 81.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 search listing (delivered)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Thumbtack Scraper — local service pros, ratings & reviews

**Thumbtack Scraper** extracts local service providers from public Thumbtack pages: business name, star rating, review count, hires, Top Pro badge, and service area — and, optionally, **full pro profiles** with customer reviews, credentials, business hours, payment methods, and specialties. Search by service and city, or paste Thumbtack URLs directly. Pay only per delivered result.

Think of it as the **unofficial Thumbtack API**: Thumbtack publishes no public API, so this Actor is the practical alternative — a structured, pay-per-result feed of public Thumbtack data for markets, profiles, and reviews, on demand as JSON, CSV, Excel, or over HTTP.

Built for **per-market competitive snapshots, pro-profile enrichment, and review monitoring** — the jobs this data actually supports (see honest limits below).

### What data does the Thumbtack Scraper extract?

**Listing rows** (fast, cheapest — one per pro):

| Field | Example |
|---|---|
| `businessName` | Mendoza Cleaning pros |
| `rating` / `reviewCount` / `reviewQualifier` | 4.6 / 237 / "Very good" |
| `hires` | 334 |
| `badge` | Top Pro |
| `serviceArea` | Houston, TX |
| `avgResponseTimeHours` | 0.2 |
| `priceText` | $189 (when the pro shows one) |
| `highlightedReview` | "My house is nice and clean…" |
| `profileUrl` | canonical profile link |

**Full profile rows** (turn on *Full profiles*) add:

| Field | Example |
|---|---|
| `reviews` (up to 5, as displayed) | text, star rating, date, "Hired on Thumbtack" flag, job details, pro's reply |
| `reviewHistogram` | 1–5★ percentage breakdown |
| `yearsInBusiness` / `employees` | 13 / 4 |
| `backgroundChecked` | true |
| `credentials` | Background Check — holder name as displayed |
| `businessHours` / `paymentMethods` | per-day hours / "Cash, Venmo, and Zelle" |
| `specialties` | Cleaning type: Standard, Deep cleaning… |
| `faqs`, `mediaCount`, `city`, `state`, `zip` | … |

### How do I scrape Thumbtack?

1. Enter one or more **services** ("house cleaning", "handyman") and **locations** ("Cincinnati, OH").
2. Or paste **Thumbtack URLs** — search pages or pro profile links.
3. Toggle **Full profiles** if you want reviews and credentials.
4. Run. Results land in the dataset (tables: *Pros* and *Full profiles*), exportable as JSON, CSV, or Excel, or via the API.

Each unique pro is delivered and charged **once per run**, even when they serve several of your locations.

### Honest limits (read before buying)

- **~6 pros per city page.** Thumbtack's public pages embed about six pros per service+city. To go deeper in a metro, add nearby suburbs as extra locations — the Actor dedupes pros that appear in several. This Actor does not fake volume it can't deliver.
- **Up to 5 reviews per pro** — the ones Thumbtack shows on the public profile page. Full review history is not publicly served.
- **No phone numbers, emails, or street addresses.** Thumbtack does not publish pro contact details; any Thumbtack scraper claiming emails is guessing. You get the pro's profile link, city/state/ZIP, and everything above.
- Data comes from **public Thumbtack pages, as displayed** — reviewer names stay in Thumbtack's own shortened form ("Joy A."), never enriched.
- `backgroundChecked` reflects the badge Thumbtack displays. It is **not a consumer report** and must not be used for employment, credit, insurance, or housing decisions.

### Why these results are reliable

The Actor reads Thumbtack's own structured page data (not brittle CSS selectors), tolerates missing fields (brand-new pros without reviews still come through), fails loudly instead of silently returning junk when the site changes, and charges **only for delivered results** — a failed run costs nothing.

### FAQ

**Is scraping Thumbtack legal?** This Actor accesses only public pages and extracts only publicly displayed information — no login, no personal contact data, no bypassing of access controls. You are responsible for using the data in compliance with applicable laws and Thumbtack's terms. To have a record removed from your datasets, delete it and exclude the pro from future runs.

**Can I get more than 6 pros per city?** Yes — add more locations (suburbs, neighboring cities). A metro list of 8–10 locations typically yields 30–50 unique pros per service.

**Does it work for any Thumbtack service?** Yes — ~2,850 service categories are recognized by name; anything Thumbtack has a page for.

**Is there an official Thumbtack API?** No — Thumbtack does not offer a public API. This Actor is the practical **unofficial Thumbtack API**: it turns public Thumbtack pages into structured JSON/CSV you can query on demand, pay-per-result, with no subscription.

**Can AI agents run this?** Yes. The Actor works through Apify's MCP server — ask your agent to find "Thumbtack scraper" and call it with a service and city. It is also **x402-payable**, so an autonomous agent can discover, pay for, and run it with no Apify account.

### Other Actors by Moonlings

- [Local Business Competitor Analysis](https://apify.com/moonlings/local-business-competitor-analysis) — AI competitor scan and deep research reports for any local business.
- [AI Visibility Check](https://apify.com/moonlings/ai-visibility-check) — does ChatGPT recommend your business? Appearance rate, rivals, cited domains.
- [Review Gap Check](https://apify.com/moonlings/review-gap-check) — your Google rating vs. nearby rivals, with the gap math done.

# Actor input Schema

## `searchTerms` (type: `array`):

Thumbtack service names, e.g. "house cleaning", "handyman", "dog training". Combined with every location below. Browse thumbtack.com/services for exact names.

## `locations` (type: `array`):

US locations as "City, ST" (e.g. "Cincinnati, OH"). Each Thumbtack page embeds ~6 pros — list nearby suburbs too to go deeper in a metro. ZIP codes are not supported.

## `startUrls` (type: `array`):

Thumbtack search pages (thumbtack.com/oh/cincinnati/house-cleaning) or pro profile URLs (…/service/12345…). Profile URLs return full profiles with reviews. Only thumbtack.com URLs are accepted.

## `includeProfileDetails` (type: `boolean`):

OFF: fast listing rows (name, rating, review count, hires, badge — cheap). ON: visit each pro's profile for reviews (up to 5, as shown on the page), credentials, business hours, payment methods, specialties, and FAQs (richer, higher per-result price).

## `maxResults` (type: `integer`):

Stop after this many unique pros. Each pro is delivered and charged once per run, even if it appears in several locations.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Residential proxies are the default and strongly recommended — Thumbtack challenges datacenter IPs.

## Actor input object example

```json
{
  "searchTerms": [
    "house cleaning"
  ],
  "locations": [
    "Cincinnati, OH"
  ],
  "startUrls": [
    "https://www.thumbtack.com/oh/cincinnati/house-cleaning"
  ],
  "includeProfileDetails": false,
  "maxResults": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped pros as JSON. Use the 'Pros' and 'Full profiles' dataset views for tables.

## `run` (type: `string`):

Console view of this run, including charged events and the log.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "house cleaning"
    ],
    "locations": [
        "Cincinnati, OH",
        "Covington, KY"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("moonlings/thumbtack-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["house cleaning"],
    "locations": [
        "Cincinnati, OH",
        "Covington, KY",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("moonlings/thumbtack-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "house cleaning"
  ],
  "locations": [
    "Cincinnati, OH",
    "Covington, KY"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call moonlings/thumbtack-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=moonlings/thumbtack-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xQ2RAeYHcirg7l7oi/builds/XZ9pVi7URS87uqtGr/openapi.json
