# Thumbtack Phone Number Scraper - Country Filter & Carrier Data (`code-beat/thumbtack-phone-number-scraper-fast-and-reliable`) Actor

📌 Thumbtack Phone Number Scraper collects local service pro numbers in bulk with country filters, line-type detection & carrier lookup. ✅ Invalid numbers removed. 🧰 Perfect for home service suppliers & contractor lead generation.

- **URL**: https://apify.com/code-beat/thumbtack-phone-number-scraper-fast-and-reliable.md
- **Developed by:** [Code Beat](https://apify.com/code-beat) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Phone Number Scraper 📞

**Thumbtack Phone Number Scraper** helps you extract phone numbers from public Thumbtack profiles, bios, and posts using keywords and country targeting. It’s built for marketers, recruiters, sales pros, and researchers who need Thumbtack lead generation, Thumbtack contact scraper workflows, and fast Thumbtack phone number extraction without manual browsing. ⚡

### Thumbtack Phone Number Scraper 🔍

**Thumbtack Phone Number Scraper** makes Thumbtack profile scraping faster and more practical by turning publicly available data into structured leads. Instead of hunting manually for contact details, you can use targeted keywords and country filters to support Thumbtack business data extraction, local service lead scraping, and scalable Thumbtack lead scraping for outreach, analysis, or research.

### 🌟 Key Features of Thumbtack Phone Number Scraper

| Feature | Benefit |
|---|---|
| ✅ **Targeted Keyword Search** | Uses your keywords to find relevant Thumbtack profiles, helping you focus on the right Thumbtack business leads. |
| ✅ **Country Targeting** | Select the country that matches your audience and improve Thumbtack phone number extraction accuracy. |
| ✅ **Location Filter** | Narrow results by location so your Thumbtack directory scraper run stays focused on a specific city, region, or market. |
| ✅ **Bulk Extraction** | Handle multiple keywords in one run for efficient Thumbtack data scraping at scale. |
| ✅ **Result Cap Control** | Stop after a set number of phone numbers, which helps you manage run size and time. |
| ✅ **Real-Time Dataset Saving** | Each matching result is pushed to your dataset as it’s found, reducing the risk of losing progress. |
| ✅ **Resume-Friendly Runs** | Saved progress helps continue large web scraping automation tasks more smoothly. |

### 📥 Input — Thumbtack Phone Number Scraper Parameters

```json
{
  "keywords": [
    "marketing",
    "founder"
  ],
  "location": "London",
  "country": "United Kingdom (+44)",
  "maxPhoneNumbers": 20
}
```

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `keywords` | Array | ✅ Yes | `["marketing", "founder"]` | Search terms used to find relevant Thumbtack profiles and posts. |
| `location` | String | No | `""` | Optional location filter, such as a city or region, to narrow the search. |
| `country` | String | ✅ Yes | `United Kingdom (+44)` | Country used to target phone numbers and match the correct dialing region. |
| `maxPhoneNumbers` | Integer | No | `20` | Maximum number of phone numbers to collect before stopping the run. |

### 📤 Output — What Thumbtack Phone Number Scraper Returns

The actor saves each result as a JSON record in your Apify dataset. 📦

```json
{
  "keyword": "marketing",
  "title": "Bright Side Marketing",
  "description": "Digital marketing consultant helping local businesses grow through branding, paid ads, and SEO strategy.",
  "url": "https://www.thumbtack.com/ca/san-francisco/marketing-consultants/brightside-marketing/service/123456789012345678901234",
  "phone_number": "+44 20 7946 0958",
  "country": "United Kingdom",
  "dial_code": "+44"
}
```

| Field | Label | Format | Description |
|---|---|---|---|
| `keyword` | Keyword | text | The keyword that produced the result. |
| `title` | Title | text | The Thumbtack profile or business title. |
| `description` | Description | text | The public profile text, bio, or post content associated with the result. |
| `url` | Url | link | The public Thumbtack profile URL for the result. |
| `phone_number` | Phone Number | text | The extracted phone number in the dataset. |
| `country` | Country | text | The selected country for the run. |
| `dial_code` | Dial Code | text | The dialing code associated with the selected country. |

### 💻 How to Use Thumbtack Phone Number Scraper — Step-by-Step

1. **Open the Actor** — Find **Thumbtack Phone Number Scraper** in the Apify Store.
2. **Add Keywords** — Enter one or more keywords, such as roles, services, or industries you want to target.
3. **Set the Location** — Add a city or region if you want more precise Thumbtack profile scraping.
4. **Choose the Country** — Select the country that matches your target phone number region.
5. **Set the Limit** — Define `maxPhoneNumbers` to control how many results you want.
6. **Run the Actor** — Start the job and let it collect public contact data.
7. **Export the Results** — Download the dataset for analysis, outreach, or CRM use.

No coding required — just run it and review your Thumbtack business leads. 🚀

### 💡 Best Use Cases for Thumbtack Phone Number Scraper

- 🎯 **Lead Generation** — Build targeted Thumbtack business leads for outreach campaigns.
- 📣 **Local Service Prospecting** — Discover public contacts for service providers in specific regions.
- 🔎 **Contact Research** — Support business contact extraction for analysts and researchers.
- 🧰 **CRM Enrichment** — Add public phone numbers to your existing lead records.
- 📊 **Online Directory Scraping** — Collect structured data from a public directory for downstream analysis.

### Disclaimer

This actor only accesses publicly available data. It does not access private profiles, authenticated content, or password-protected pages. Users are responsible for complying with applicable laws, Thumbtack’s terms, and any anti-spam or privacy regulations that apply to their use case. For data-removal requests or support, contact 📧 <codebeatapi@gmail.com>.

### 🆘 Support & Feedback

Have a question or found an issue with **Thumbtack Phone Number Scraper**? We’re here to help. 💬

- 🐞 **Bug Reports:** Let us know if something isn’t working as expected.
- ✨ **Feature Requests:** Share ideas for improving Thumbtack contact extraction and related workflows.
- 📧 **Email:** <codebeatapi@gmail.com>

### Country & Time Targeting

**Target Country** did two jobs already: it supplies the dial code the search
looks for, and it is the region numbers are parsed against. It now does a third

- Google is asked to answer as if searching from that country (`gl`). Turn on
  **Strict country filter** to also restrict results to pages Google attributes to
  it (`cr=countryXX`); that is much tighter and returns noticeably fewer results.

**Result Language** restricts results to one language (`hl` + `lr`).

**Time Range** limits results to a publication window - past hour, 24 hours,
week, month, year, or an explicit *Custom range* via **Custom range: from** /
**to** in `YYYY-MM-DD` form. Selecting *Custom range* without either date falls
back to no time filter rather than silently searching all of time.

### Region resolution

| Field | Meaning |
| --- | --- |
| `regionAmbiguous` | `true` when the number was printed without a country code and the same national digits are valid in more than one country |
| `phoneIsMobile` | `true`/`false` where the numbering plan can tell, empty where it genuinely cannot (US, Canada, Mexico) |
| `phoneCallingCode` | The country's international calling code, as a number |
| `phoneCountryName` | Full country name, falling back to the two-letter code rather than guessing |

`regionAmbiguous` is the important one. A number written as `020 7946 0958` is
only a UK number because the run targeted the UK - the country shown is a
reading, not a fact, and this column tells you which rows those are.

# Actor input Schema

## `scrapeMode` (type: `string`):

Find New Numbers (default) searches About.Me by keyword. Validate My List skips searching entirely and instead runs the numbers you paste into Phone List (below) through the same deliverability checks.

## `keywords` (type: `array`):

Enter keywords to search for (e.g., 'Target Keyword'). Only used in Find New Numbers mode.

## `location` (type: `string`):

Filter by location (e.g., 'London', 'California'). Leave empty for global search. Only used in Find New Numbers mode.

## `country` (type: `string`):

Select the country to target for phone numbers. Only used in Find New Numbers mode.

## `phoneList` (type: `array`):

Paste the phone numbers you want checked for deliverability (any format - the selected Country is used as the default region for numbers without a country code). Only used when Scrape Mode is set to "Validate My List".

## `maxPhoneNumbers` (type: `integer`):

Stop scraping after this many phone numbers are found. Setting a higher limit extends the scraping duration. Only used in Find New Numbers mode.

## `minQualityScore` (type: `number`):

Drop any number whose quality score (0.0-1.0) falls below this. Leave at 0 for no filter.

## `requireStrictValid` (type: `boolean`):

Drop numbers that fail strict validity (correct length/format for the region) - mainly relevant in Validate My List mode, since search results are already strictly valid by construction.

## `excludeTollFree` (type: `boolean`):

Drop numbers identified as toll-free.

## `excludePremiumRate` (type: `boolean`):

Drop numbers identified as premium-rate.

## `requireCountryMatch` (type: `boolean`):

Drop numbers whose own detected region does not match the Country you selected (e.g. shared dial codes like +1 covering the US, Canada, and Caribbean nations).

## `strictCountry` (type: `boolean`):

Restrict Google to pages it attributes to the country you selected (cr=countryXX), rather than only preferring them. Much tighter targeting, noticeably fewer results.

## `searchLanguage` (type: `string`):

Restrict results to one language. Leave on "Any language" for no filter.

## `timeRange` (type: `string`):

Only return pages Google indexed within this window. A number published last month is far more likely to still be answered than one last seen years ago.

## `customDateFrom` (type: `string`):

Only used when Time Range is "Custom range". Format: YYYY-MM-DD.

## `customDateTo` (type: `string`):

Only used when Time Range is "Custom range". Format: YYYY-MM-DD.

## Actor input object example

```json
{
  "scrapeMode": "Find New Numbers",
  "keywords": [
    "contractor",
    "photographer"
  ],
  "country": "United States (+1)",
  "phoneList": [],
  "maxPhoneNumbers": 20,
  "minQualityScore": 0,
  "requireStrictValid": false,
  "excludeTollFree": false,
  "excludePremiumRate": false,
  "requireCountryMatch": false,
  "strictCountry": false,
  "searchLanguage": "",
  "timeRange": "Any time",
  "customDateFrom": "",
  "customDateTo": ""
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "keywords": [
        "contractor",
        "photographer"
    ],
    "phoneList": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("code-beat/thumbtack-phone-number-scraper-fast-and-reliable").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 = {
    "keywords": [
        "contractor",
        "photographer",
    ],
    "phoneList": [],
}

# Run the Actor and wait for it to finish
run = client.actor("code-beat/thumbtack-phone-number-scraper-fast-and-reliable").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "contractor",
    "photographer"
  ],
  "phoneList": []
}' |
apify call code-beat/thumbtack-phone-number-scraper-fast-and-reliable --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,code-beat/thumbtack-phone-number-scraper-fast-and-reliable"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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