# Local Business Leads Scraper - Verified Emails + Phone Finder (`flash_scraper/bbb-yellowpages-leads-scraper`) Actor

A no-API-key alternative to Yellow Pages & BBB scrapers for local business lead gen. Search any trade + city, enrich each site for emails + socials, MX-verify deliverability, score leads 0-100 (A-F), and add AI cold openers. Phone, address, category included. Export CSV, JSON, or Excel.

- **URL**: https://apify.com/flash\_scraper/bbb-yellowpages-leads-scraper.md
- **Developed by:** [Flash Scrape](https://apify.com/flash_scraper) (community)
- **Categories:** Lead generation, Travel, Automation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.00 / 1,000 business leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Yellow Pages & BBB Scraper - Business Email & Phone Leads

**Scrape Yellow Pages and BBB-style business directories into a ready-to-contact SMB lead list** — with verified emails, phone numbers, addresses, categories, and a 0–100 lead score. Search by **keyword + location** (e.g. *plumbers in Austin, TX*), let the scraper visit each business website to enrich the **email**, and export clean leads to CSV, JSON, or Excel. This is a **Yellow Pages scraper** and **BBB scraper** built for one outcome: contactable small-business leads, not a raw directory dump.

Built for **local-services agencies, B2B cold email, SDR and lead-gen teams, and SMB outreach** — every row is deduped, scored, and ready to drop into your CRM or email tool.

***

### How to scrape Yellow Pages for leads

You don't need code, an API key, or a proxy setup. Getting SMB leads takes three steps:

1. **Enter your search terms** — one keyword + location per line, like `plumbers in Austin, TX` or a JSON object `{"keyword": "dentists", "location": "Miami, FL"}`. Add as many trade + city combinations as you want.
2. **Set your filters** — cap the number of leads with **Max results**, and optionally keep only businesses that have a website or an email.
3. **Run it.** The scraper pulls each Yellow Pages listing, visits the business website to find the email and social links, dedupes, and scores every lead 0–100 — best leads first.

When the run finishes you get a clean, sortable table on the **Output** tab that exports straight to CSV, JSON, or Excel.

***

### How the Yellow Pages & BBB scraper works

1. Finds local businesses by category + city worldwide via OpenStreetMap (Nominatim geocode + Overpass) — no API key, no proxies.
2. Visits each business's website (home / `/contact` / `/about`) to extract the real **email** plus LinkedIn, Facebook, and Twitter links.
3. Captures the **owner/operator name** when the listing exposes it, so you can prioritize owner-run shops.
4. Dedupes (same website / email / name+phone collapses to one row), applies your quality filters, and scores every lead 0–100.
5. *(Optional)* Writes a personalized cold-email opener per lead using your own AI key.
6. Pushes a clean dataset you can export to CSV, JSON, or Excel.

***

### What data you get

Each row is one business, sorted best-lead-first:

- **Find the business email** — enriched from the company website, not just whatever the directory shows.
- **Get phone numbers and addresses** for every listing.
- **See the business category** so you can segment plumbers vs. roofers vs. dentists.
- **Spot owner-operated SMBs** via the owner/operator name signal.
- **Sort by a 0–100 lead score** — email (+40), phone (+10), website (+15), owner/tenure (+10) — so the most contactable leads float to the top.
- **Grab the listing and website URLs** to verify any lead in one click.
- **Export to CSV, JSON, or Excel** and pipe straight into your outreach stack.

***

### Filters & options

| Field | What it does |
|---|---|
| **searchTerms** | Keyword + location, one per line — `"plumbers in Austin, TX"` or `{"keyword": "dentists", "location": "Miami, FL"}`. |
| **maxItems** | Max number of business leads across all search terms (budget split evenly between terms). |
| **onlyWithWebsite** | Keep only listings that have a website (you can't enrich an email without one). |
| **onlyWithEmail** | Keep only listings where an email was found — best for cold-email campaigns. |
| **enrichEmails** | Visit each business website (home + `/contact` + `/about`) to extract emails and socials. On by default. No key needed. |
| **writeOpeners** | Add an AI cold-opener per lead — requires your own OpenAI/Anthropic key. |
| **llmProvider** | OpenAI or Anthropic, for the openers. |
| **llmApiKey** | Your own AI key. Used only to write openers; never stored. |
| **llmModel** | Optional model override. |

#### Example input

```json
{
  "searchTerms": ["plumbers in Austin, TX", { "keyword": "dentists", "location": "Miami, FL" }],
  "maxItems": 100,
  "onlyWithEmail": true,
  "enrichEmails": true,
  "writeOpeners": false
}
```

***

### JSON output sample

One row per business, best leads first:

```json
{
  "lead_score": 75,
  "name": "Lone Star Plumbing Co.",
  "category": "Plumbers, Drain Cleaning",
  "phone": "(512) 555-0142",
  "email": "hello@lonestarplumbing.com",
  "email_status": "found",
  "website": "https://lonestarplumbing.com",
  "address": "1200 E 6th St, Austin, TX 78702",
  "city": "Austin",
  "owner_name": "Maria Delgado",
  "icebreaker": "18 years keeping Austin's drains clear is no small feat…",
  "source_url": "https://www.openstreetmap.org/node/1980597011"
}
```

Results render as a clean sortable table on the Output tab and export to CSV, JSON, or Excel.

***

### Use with AI agents & automation

This Yellow Pages & BBB scraper plugs into your stack with zero glue code. Trigger it from an **MCP** client (Claude, Cursor, or any MCP-compatible agent) to pull SMB leads on demand, or wire it into **Make**, **n8n**, or **Zapier** to run on a schedule and push fresh leads into your CRM, email sequencer, or **Google Sheets**. A common flow: scrape leads → filter `onlyWithEmail` → append rows to **Google Sheets** → fire a cold-email sequence — all automated.

***

### Use cases

- Build an outreach list of **local service businesses** in a city + trade.
- Find **owner-operated SMBs** with real contact info for cold email or calling.
- Agencies: enrich a client's target-market directory into emails + CSV.

***

### Pricing

You're billed for Apify platform usage (compute units + the leads delivered) — you only pay for leads that survive your filters, so `onlyWithEmail` and `onlyWithWebsite` keep your bill tight. Email enrichment needs **no API key**. The optional AI cold-opener uses **your own** OpenAI or Anthropic key (one call per lead, never stored), so that cost is on your provider, not here. See the live pricing on the actor's Apify Store page.

***

### Other Flash Scrape scrapers

Need leads from another platform? The full Flash Scrape suite:

- [Google Maps Leads Scraper](https://apify.com/flash_scraper/google-maps-leads-opener) — Google Maps business leads
- [Yelp Leads Scraper](https://apify.com/flash_scraper/yelp-leads-scraper) — Yelp business leads
- [Instagram Leads Scraper](https://apify.com/flash_scraper/instagram-leads-scraper) — Instagram profile leads
- [TikTok Leads Scraper](https://apify.com/flash_scraper/tiktok-leads-scraper) — TikTok creator leads
- [YouTube Leads Scraper](https://apify.com/flash_scraper/youtube-leads-scraper) — YouTube creator leads
- [Smart Scraper by Example](https://apify.com/flash_scraper/smart-scraper-by-example) — no-code web scraper

***

### FAQ

**Is it legal to scrape Yellow Pages and BBB listings?**
It scrapes **public** business-directory data — names, categories, phones, addresses, and emails published on the open web. Use it for legitimate B2B outreach and follow the applicable terms and anti-spam laws (CAN-SPAM, GDPR) in how you message people.

**Do I need an API key?**
No — searching listings and finding emails on business websites needs **no key**. A key is only required if you turn on the optional AI cold-opener, and it's your own OpenAI or Anthropic key, used once per lead and never stored.

**Will every business have an email?**
No. Many directory listings only carry a phone and address; emails depend on what's published on the business website. Turn on `enrichEmails` (on by default) to maximize the fill-rate, and `onlyWithEmail` to keep only the contactable leads.

**How many results / leads can I get?**
As many as the directory returns for your search terms — set **Max results** to cap your run, and add more keyword + location combinations to widen the net. The budget is split evenly across your search terms.

**Can I export to CSV, Excel, or Google Sheets?**
Yes. Results export to CSV, JSON, and Excel from the Output tab, and you can push rows directly to **Google Sheets** via Make, n8n, or Zapier.

**Where does the owner name come from?**
From the underlying listing's operator field when it publishes one; it's left blank otherwise.

# Actor input Schema

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

What to search for — one per line. Use 'keyword in location' (e.g. 'plumbers in Austin, TX') or JSON objects like {"keyword": "dentists", "location": "Miami, FL"}.

## `maxItems` (type: `integer`):

Maximum number of business leads to return across all search terms (the budget is split evenly between terms).

## `onlyWithWebsite` (type: `boolean`):

Drop listings with no website (you can't enrich an email without one).

## `onlyWithEmail` (type: `boolean`):

Drop listings where no email could be found. Best for cold-email campaigns.

## `onlyVerifiedEmail` (type: `boolean`):

Drop leads whose email fails deliverability verification. Keeps only addresses on a domain with real mail servers (MX) — protects your sender reputation. Requires 'Verify email deliverability' on.

## `enrichEmails` (type: `boolean`):

Visit each business's website (home + /contact + /about) to extract emails and social links. Higher email fill-rate. No key needed.

## `verifyEmails` (type: `boolean`):

Check every email's domain for real mail servers (MX) and flag role (info@, sales@) and disposable addresses. Each lead gets an email\_status of deliverable / risky / undeliverable and, where known, the mailbox provider. No key needed — protects your cold-email sender reputation.

## `writeOpeners` (type: `boolean`):

Generate a personalized one-sentence outreach opener for each lead. Requires your OpenAI/Anthropic key below.

## `llmProvider` (type: `string`):

AI provider used to write the cold openers — OpenAI (GPT) or Anthropic (Claude). Use the provider that matches the LLM API key you supply.

## `llmApiKey` (type: `string`):

Your own OpenAI or Anthropic API key. Used only to write the openers; never stored.

## `llmModel` (type: `string`):

Override the default model (gpt-4o-mini for OpenAI, claude-haiku-4-5-20251001 for Anthropic).

## `minScore` (type: `integer`):

Keep only leads scoring at or above this value, 0-100 (0 = no filter). Pay only for your best A/B leads.

## Actor input object example

```json
{
  "searchTerms": [
    "hvac in Phoenix, AZ"
  ],
  "maxItems": 100,
  "onlyWithWebsite": false,
  "onlyWithEmail": false,
  "onlyVerifiedEmail": false,
  "enrichEmails": true,
  "verifyEmails": true,
  "writeOpeners": false,
  "llmProvider": "openai",
  "minScore": 0
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "plumbers in Austin, TX",
        "roofing contractors in Dallas, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/bbb-yellowpages-leads-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": [
        "plumbers in Austin, TX",
        "roofing contractors in Dallas, TX",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("flash_scraper/bbb-yellowpages-leads-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": [
    "plumbers in Austin, TX",
    "roofing contractors in Dallas, TX"
  ]
}' |
apify call flash_scraper/bbb-yellowpages-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/3b4eNVbWnqjohXIHi/builds/rqXEAZDFv5UQQ79X6/openapi.json
