# ThreeBestRated Scraper - Local Business Leads, Emails & Phones (`scrapesage/three-best-rated-scraper`) Actor

Scrape ThreeBestRated.com curated Top-3 local businesses by category & US city: direct contact email, phone, website, full address, price range, services, year established & a lead score. Monitoring mode. No login, no API key, no browser.

- **URL**: https://apify.com/scrapesage/three-best-rated-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (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 $5.00 / 1,000 business scrapeds

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

## ThreeBestRated Scraper — Local Business Leads, Emails & Phones

Extract **curated Top‑3 local businesses from [ThreeBestRated.com](https://threebestrated.com)** for any category in any US city — dentists, roofers, web designers, chiropractors, lawyers, accountants, HVAC, real‑estate agents and **200+ more**. Every record ships with a **direct contact email and phone**, the business's own **website**, full street address, price range, services, year established and a star‑grade lead score — turning a hand‑vetted "best of" directory into a clean, ready‑to‑use **B2B lead list**.

No login, no cookies, no browser — fast JSON‑grade extraction with a built‑in retry on transient blocks.

### Why this ThreeBestRated scraper?

ThreeBestRated hand‑picks and "50‑Point inspects" the top three businesses per category per city, so these are **vetted, established, high‑intent leads** — not a raw dump of every listing. This actor pulls every field the page exposes, including the **contact email that sits right on each listing**, and ships the richest dataset in the category:

| Data | Google‑Maps lead tools | This actor |
|---|---|---|
| Direct contact **email** | ❌ needs a website crawl | ✅ on the listing |
| Phone | ✅ | ✅ |
| Business's own **website** | partial | ✅ |
| Full street address + ZIP | partial | ✅ |
| Category + city/state | partial | ✅ |
| Editorial **rank** (1–3) | ❌ | ✅ |
| Price range ($–$$$$) | ❌ | ✅ |
| Services offered | ❌ | ✅ |
| Year established ("Since …") | ❌ | ✅ |
| Awards / recognitions | ❌ | ✅ when listed |
| Curated / vetted quality | ❌ | ✅ |
| Lead score (0–100) | ❌ | ✅ |
| Website email/phone enrichment | ❌ | ✅ opt‑in |
| Monitoring mode (only new businesses) | ❌ | ✅ |

### Use cases

- **Lead generation** — every business is a vetted local SMB, ideal for SaaS, fintech, marketing, payroll, insurance and professional‑services outreach. Filter by category, city and lead score and reach them with the listing **email** and **phone**.
- **Agency & SaaS prospecting** — build targeted lists of the best dentists, roofers, law firms, salons, contractors or web designers in any metro for cold outreach and white‑label resale.
- **Market & competitor mapping** — see exactly who the top‑rated providers are by category and city to size territories and benchmark.
- **Recruiting & M\&A** — find established, owner‑operated businesses by location and year founded for staffing, acquisition or partnership outreach.
- **Directory & data enrichment** — append website, email, price range and services to an existing list of local businesses.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **ThreeBestRated Scraper**, choose categories (e.g. `dentists`, `roofing-contractors`) and locations (e.g. `Houston, TX`), and click **Start**.
3. Watch businesses stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "mode": "search",
    "categories": ["dentists", "roofing-contractors", "web-designers"],
    "locations": ["Houston, TX", "Chicago, IL"],
    "maxResults": 300,
    "enrichContactEmails": false,
    "withEmailOnly": true,
    "monitorMode": false
}
```

- **mode** — `search` (categories × locations) or `startUrls` (paste ThreeBestRated URLs).
- **categories** — ThreeBestRated category slugs or names, one per row: `dentists`, `roofing-contractors`, `web-designers`, `chiropractors`, `personal-injury-lawyers`, `accountants`, `hvac`, `real-estate-agents`, … **Leave empty to scrape every category listed for each city.**
- **locations** — US cities as `City, ST` (`Houston, TX`, `Chicago, IL`). ThreeBestRated lists are city‑based, so include a city.
- **startUrls** — ThreeBestRated category pages (`…/web-designers-in-chicago-il`) or city hubs (`…/local-businesses-in-houston-tx`). Auto‑detected and routed.
- **maxResults** — cap on businesses for the whole run (each category page yields up to 3).
- **maxCategoriesPerCity** — when scraping all categories for a city, cap how many to pull (0 = no cap).
- **enrichContactEmails** *(default false)* — crawl each business's own website (home + contact/about) for extra emails, phones and socials. ThreeBestRated already supplies a direct email on most listings. When enabled, this is billed as a separate `contact_enrichment` event — once per business that actually gets enriched.
- **withEmailOnly / withPhoneOnly / withWebsiteOnly** — output filters.
- **monitorMode** *(default false)* — emit ONLY businesses not seen in previous runs. Pairs with Apify Schedules.

### Output

One record per business (`type: "business"`):

```json
{
    "type": "business",
    "category": "web-designers",
    "categoryName": "Web Designers",
    "rank": 1,
    "name": "EWR DIGITAL",
    "email": "info@ewrdigital.com",
    "phone": "(713) 592-6724",
    "website": "https://www.ewrdigital.com/",
    "domain": "ewrdigital.com",
    "streetAddress": "5999 West 34th Street",
    "addressCity": "Houston",
    "addressState": "Texas",
    "zip": "77092",
    "country": "US",
    "fullAddress": "5999 West 34th Street, Houston, Texas, 77092",
    "priceRange": "$$$$",
    "award": "Crystal Award Winner in 2020-2023",
    "yearEstablished": 1999,
    "services": ["Web Design", "SEO", "PPC", "Branding", "Content Marketing"],
    "hours": "Mon-Fri 8:00 AM - 6:00 PM",
    "imageUrl": "https://threebestrated.com/images/...jpeg",
    "directionsUrl": "https://www.google.com/maps/dir/?api=1&destination=...",
    "socialLinks": { "facebook": "https://www.facebook.com/..." },
    "tbrProfileUrl": "https://threebestrated.com/web-designers-in-houston-tx#goto-business1",
    "searchCategory": "Web Designers",
    "searchLocation": "Houston, TX",
    "leadScore": 96,
    "scrapedAt": "2026-06-19T12:00:00.000Z"
}
```

#### What to expect (field coverage)

ThreeBestRated is curated, business‑entered data, so a few fields are present only when the business published them. Across categories and cities you can typically expect:

| Field | Coverage |
|---|---|
| name, phone, full address, category, city, rank | ✅ ~100% |
| **email** | ✅ ~80–90% (on the listing) |
| **website**, services, price range | ✅ ~90% |
| year established ("Since …") | ✅ ~85% |
| award, hours, social links | present when the business lists them |

A blank field means the business didn't publish it — not that scraping failed. Nothing is dropped, so you always get the richest record available.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with **monitoring mode** to capture only newly top‑rated businesses in a city; perfect for lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/three-best-rated-scraper').call({
    mode: 'search',
    categories: ['dentists', 'roofing-contractors'],
    locations: ['Austin, TX'],
    maxResults: 300,
    withEmailOnly: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} local business leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi‑step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new business leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored city gets new top‑rated businesses.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto‑export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM‑ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top‑rated roofers in Dallas with emails" and let it run the scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **local‑business & professional‑services lead‑gen stack**:

- **[TaxBuzz Scraper](https://apify.com/scrapesage/taxbuzz-scraper)** — tax preparers, CPAs and accountant leads.
- **[FindLaw Scraper](https://apify.com/scrapesage/findlaw-scraper)** — lawyers, law firms and legal leads.
- **[Healthgrades Scraper](https://apify.com/scrapesage/healthgrades-scraper)** — doctors, reviews and provider leads.
- **[WebMD Scraper](https://apify.com/scrapesage/webmd-scraper)** — doctors, reviews and provider leads.
- **[Insurance Agent Scraper](https://apify.com/scrapesage/insurance-agent-scraper)** — State Farm & Farmers agent leads.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — new LLC & company leads.
- **[Fresha Scraper](https://apify.com/scrapesage/fresha-scraper)** — salon, spa & beauty business leads.
- **[Booksy Scraper](https://apify.com/scrapesage/booksy-scraper)** — beauty & wellness provider leads.
- **[DesignRush Scraper](https://apify.com/scrapesage/designrush-scraper)** — marketing, design & dev agency leads.
- **[Bark Scraper](https://apify.com/scrapesage/bark-scraper)** — local service‑provider leads.

### Tips

- **Cover a metro fully**: leave `categories` empty to pull every category a city lists, or add nearby cities to `locations`.
- **Faster, higher‑intent runs**: turn on `withEmailOnly` to keep only directly contactable businesses.
- **Cost control**: website enrichment only fires when `enrichContactEmails` is on — and is billed as a separate `contact_enrichment` event per enriched business — so leave it off for the cheapest runs (the listing email already covers most businesses). `maxResults` / `maxCategoriesPerCity` bound the run.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to capture only newly top‑rated businesses over time.

### FAQ

**How do I scrape a specific category in a city?** Put the city in `locations` as `City, ST` (e.g. `Dallas, TX`) and the category slug in `categories` (e.g. `dentists`, `roofing-contractors`, `web-designers`). Leave `categories` empty to get every category the city lists.

**Where do the emails come from?** ThreeBestRated publishes a contact email on most listings — this actor reads that public email directly, so no website crawl is needed, and it comes free with the per-business charge. With `enrichContactEmails` on, it additionally crawls each business's own website for more contacts; that crawl is the separately-billed `contact_enrichment` event (one per enriched business).

**How many businesses per category?** ThreeBestRated curates the **Top 3** per category per city, so each category page returns up to three vetted businesses — quality over quantity.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I get only new businesses over time?** Turn on `monitorMode` and run on a [Schedule](https://docs.apify.com/platform/schedules) — each run returns only businesses not seen before. Monitoring mode complements the scheduler; it does not conflict with it.

**Is scraping ThreeBestRated legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and ThreeBestRated's terms.

**A field is null — why?** Some listings genuinely omit an email, website or price range. Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `mode` (type: `string`):

Search builds a list from categories × locations. Start URLs scrapes specific ThreeBestRated category or city-hub URLs you paste in.

## `categories` (type: `array`):

Business categories to pull, as ThreeBestRated slugs or names — e.g. `dentists`, `roofing-contractors`, `web-designers`, `chiropractors`, `personal-injury-lawyers`, `real-estate-agents`, `hvac`, `accountants`. One per row. Leave EMPTY to scrape every category listed for each city. (Search mode.)

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

US cities to search, as "City, ST" — e.g. "Houston, TX", "Chicago, IL", "Los Angeles, CA". ThreeBestRated lists are city-based, so a city is required. One per row. (Search mode.)

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

ThreeBestRated URLs to scrape directly: category pages (…/{category}-in-{city}-{st}, e.g. …/web-designers-in-chicago-il) or city hubs (…/local-businesses-in-{city}-{st}). Auto-detected and routed. One per row. (Start URLs mode.)

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

Cap on business records across the whole run. Each category page yields up to 3 curated businesses.

## `maxCategoriesPerCity` (type: `integer`):

When scraping ALL categories for a city (no categories specified), cap how many categories to scrape per city. 0 = no cap (every category the city lists).

## `enrichContactEmails` (type: `boolean`):

Opt-in extra lead enrichment: crawl each business's own website (home + contact/about) for additional emails, phones and social links. Only runs for businesses that list a website. ThreeBestRated already supplies a direct email on most listings, so leave this off for the cheapest runs. Note: when enabled, this is billed as a separate `contact_enrichment` event — once per business that actually gets enriched — in addition to the per-business charge.

## `withEmailOnly` (type: `boolean`):

Output only businesses that have a contact email (from ThreeBestRated or, if enabled, the website crawl).

## `withPhoneOnly` (type: `boolean`):

Output only businesses that have a phone number.

## `withWebsiteOnly` (type: `boolean`):

Output only businesses that list their own website.

## `deduplicateBusinesses` (type: `boolean`):

Skip a business already emitted in this run — useful when several searches overlap.

## `monitorMode` (type: `boolean`):

Remember what was already returned and emit ONLY businesses not seen in previous runs. Pairs with Apify Schedules to track new top-rated businesses over time. Does not conflict with the scheduler.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' ids for monitoring mode. Use a different name per tracked search to keep their histories separate.

## `maxConcurrency` (type: `integer`):

Maximum parallel page fetches. Lower it for very large runs if you see transient blocks; raise it for speed.

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

Proxy settings. ThreeBestRated works through the default Apify datacenter proxy (blocked requests retry automatically on a fresh IP). Switch to Residential for the most consistent results on very large runs.

## Actor input object example

```json
{
  "mode": "search",
  "categories": [
    "web-designers"
  ],
  "locations": [
    "Houston, TX"
  ],
  "maxResults": 100,
  "maxCategoriesPerCity": 0,
  "enrichContactEmails": false,
  "withEmailOnly": false,
  "withPhoneOnly": false,
  "withWebsiteOnly": false,
  "deduplicateBusinesses": true,
  "monitorMode": false,
  "monitorStoreName": "threebestrated-monitor",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped business leads in the default dataset.

# 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 = {
    "categories": [
        "web-designers"
    ],
    "locations": [
        "Houston, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/three-best-rated-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 = {
    "categories": ["web-designers"],
    "locations": ["Houston, TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/three-best-rated-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 '{
  "categories": [
    "web-designers"
  ],
  "locations": [
    "Houston, TX"
  ]
}' |
apify call scrapesage/three-best-rated-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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