# Local Business Leads Scraper - Verified Emails + Lead Scores (`flash_scraper/local-business-leads`) Actor

Finds local businesses of any category in any city worldwide — plain English (dentist, gym, plumber). Crawls sites for emails, socials + website platform, MX-verifies every email (deliverable/risky/undeliverable), scores leads 0-100 with A-F grades. OpenStreetMap — no API key, no proxies. $7/1k.

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

## Pricing

from $4.90 / 1,000 business leads

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Local Business Leads Scraper — any category, any city, with website-platform detection

Generate **B2B leads for any local business category** — dentists, gyms, lawyers, plumbers, salons, real estate agencies, restaurants, and 50+ more — in any city worldwide, complete with **website platform detection (WordPress, Wix, Shopify, Squarespace, Webflow, GoDaddy, Weebly, Joomla, Framer)**. At **$5 per 1,000 leads**, it's the flexible, low-cost way to build a prospect list for cold outreach or web/marketing agency pitches.

### What does it do?

This actor takes a **plain-English business category** (e.g. "dentist," "hair salon," "plumber") and a **location** (city, region, or country), maps the category to the right OpenStreetMap tags, and pulls every matching business in the area. It then **crawls each business's own website** to extract a **contact email**, **social profiles** (Facebook, Instagram), and — the key differentiator — **which website platform it runs on**. That last part is gold for agencies: filter the output for businesses stuck on an outdated Wix or GoDaddy site and you have a warm list of prospects who visibly need a website upgrade.

### Why use it / who's it for

- **Web design & marketing agencies** — find local businesses running on Wix, GoDaddy Website Builder, or Weebly (often a sign of a dated, DIY site) and pitch a redesign or SEO retainer.
- **Freelancers on Fiverr/Upwork** — generate a "100 dentists in Austin with emails" style lead list on demand for any client vertical without building a new scraper per niche.
- **SaaS sales teams** — any B2B tool sold to local businesses (booking software, payment processors, review management) can target by category and city.
- **Franchise & market researchers** — count and map competitor density for any category in a target city before opening a location.
- **B2B lead-gen resellers** — because it covers *any* category, one actor replaces dozens of niche scrapers.

### How to use it

1. Enter a **business category** in plain English (e.g. `dentist`, `gym`, `plumber`, `hair salon`).
2. Enter a **location** — city and region/country (e.g. `Austin, Texas`).
3. Optionally set **maxItems**, a name **keyword** filter, or restrict to businesses **with a website/email only**.
4. Run the actor. It geocodes the location, pulls matching places from OpenStreetMap, then crawls each business website for contact details.
5. Export the results as CSV, JSON, or Excel — or connect the dataset straight to your CRM/outreach tool via API/webhook.

### Output fields

| Field | Description |
|---|---|
| `name` | Business name |
| `category` | OSM category tag (e.g. dentist, hairdresser, lawyer) |
| `address` | Street address |
| `city` | City |
| `state` | State/region |
| `postal_code` | Postal/ZIP code |
| `phone` | Phone number |
| `website` | Business website URL |
| `email` | Primary contact email found on the site |
| `emails` | All emails found while crawling the site |
| `facebook` | Facebook profile URL |
| `instagram` | Instagram profile URL |
| `opening_hours` | Opening hours (from OSM, if listed) |
| `website_platform` | Detected platform: WordPress, Wix, Shopify, Squarespace, Webflow, GoDaddy, Weebly, Joomla, or Framer |
| `latitude` / `longitude` | Coordinates |
| `osm_type` / `osm_id` | OpenStreetMap source identifiers |
| `has_email` / `has_phone` / `has_website` | Boolean flags for quick filtering |

#### Example output

A real sample from a live run:

| Name | Category | City | Phone | Email | Website | Platform |
|---|---|---|---|---|---|---|
| Aloha Dental | dentist | Austin | +1-512-707-7300 | riverside@aloha-dental.com | https://www.aloha-dental.com/ | WordPress |
| Avery Ranch Dental | dentist | Austin | +1-512-246-7645 | smile@averyranchdental.com | https://www.averyranchdental.com/ | WordPress |
| Aviva Dental Care | dentist | Cedar Park | +1 512 852 8528 | dr.apurva@avivadentalcare.com | https://www.avivadentalcare.com/ | WordPress |
| BLVD Dentistry & Orthodontics | dentist | Austin | +1-512-640-8747 | austin@blvddentistry.com | https://www.blvddentistry.com/ | WordPress |

### Input example

```json
{
  "category": "hair salon",
  "location": "Miami, Florida",
  "maxItems": 200,
  "crawlEmails": true,
  "onlyWithEmail": false,
  "onlyWithWebsite": true,
  "maxPagesPerSite": 3,
  "concurrency": 8
}
```

### How much does it cost?

This actor uses **pay-per-result pricing at $0.005 per lead ($5 per 1,000 leads)** — you're only charged for businesses actually returned, not for API calls or compute time. There's no subscription. New Apify users get a **free tier of roughly 1,000 results** to test the actor before spending anything. Scraping 500 dentists with emails costs about $2.50; 5,000 leads across multiple cities costs about $25.

### Frequently asked questions

#### Is it legal to scrape local business data?

Yes. This actor only reads **publicly available data** from OpenStreetMap (an open-data project) and each business's own public website — the same information anyone could find by visiting the site. No login, no private data, no anti-bot circumvention.

#### How fresh is the data?

Business listings come from OpenStreetMap, which is community-maintained and updated continuously; most established businesses have accurate name/address/phone data. Website content (email, socials, platform) is crawled live on every run, so that part is always current at run time.

#### Can I search for any business category, not just the popular ones?

Yes — that's the point. 50+ common categories (restaurants, dentists, gyms, lawyers, salons, real estate, plumbers, and more) are pre-mapped for accuracy, but any other word you enter is automatically matched against OpenStreetMap's shop/amenity/office/craft/healthcare tags, so niche categories still work.

#### Why does website platform detection matter?

Knowing a business runs on Wix, GoDaddy, or Weebly (often associated with outdated, self-built sites) versus WordPress or Shopify lets agencies and freelancers **pre-qualify leads** before ever picking up the phone — pitching a redesign to someone visibly using a builder-tier platform converts far better than a cold, unqualified list.

#### Do I need an API key or proxy?

No. Discovery runs entirely on OpenStreetMap (Nominatim + Overpass) and enrichment crawls public websites directly — no API keys, no proxy configuration, and it runs fine from datacenter IPs.

### Other Flash Scrape lead tools

- **[Restaurant Leads Scraper](https://apify.com/actors/restaurant-leads-scraper)** — restaurant leads enriched with POS, reservation, and delivery tech stack (Toast, OpenTable, DoorDash, and more).
- **[Google Maps Leads Opener](https://apify.com/actors/google-maps-leads-opener)** — pull business leads directly from Google Maps search results.
- **[Email Verifier](https://apify.com/actors/email-verifier)** — validate and clean the emails this actor finds before you launch an outreach campaign.
- **[Company Domain Enricher](https://apify.com/actors/company-domain-enricher)** — turn a company name into its website domain and firmographic details for further enrichment.

# Actor input Schema

## `category` (type: `string`):

Type of business in plain English, e.g. 'dentist', 'gym', 'lawyer', 'plumber', 'hair salon', 'real estate agency', 'car repair'. Mapped automatically to OpenStreetMap tags.

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

City and region/country, e.g. 'Austin, Texas', 'Lyon, France', 'Casablanca, Morocco'.

## `keyword` (type: `string`):

Optional: only keep businesses whose name matches this keyword.

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

Maximum number of businesses to return.

## `crawlEmails` (type: `boolean`):

Visit each business's website to extract a contact email, socials, and detect its website platform.

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

Keep only businesses that list a website (a website is required for email and platform enrichment).

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

Keep only businesses where an email was found.

## `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.

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

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

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

Keep only leads scoring at or above this value, 0-100 (0 = no filter). Every lead is scored 0-100 with an A-F grade from its verified email, phone, website, socials and website platform.

## `maxPagesPerSite` (type: `integer`):

Pages to crawl per website while looking for an email.

## `concurrency` (type: `integer`):

How many websites to crawl in parallel.

## Actor input object example

```json
{
  "category": "dentist",
  "location": "Austin, Texas",
  "maxItems": 100,
  "crawlEmails": true,
  "onlyWithWebsite": true,
  "onlyWithEmail": false,
  "verifyEmails": true,
  "onlyVerifiedEmail": false,
  "minScore": 0,
  "maxPagesPerSite": 3,
  "concurrency": 8
}
```

# 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 = {
    "category": "dentist",
    "location": "Austin, Texas",
    "onlyWithWebsite": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/local-business-leads").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 = {
    "category": "dentist",
    "location": "Austin, Texas",
    "onlyWithWebsite": True,
}

# Run the Actor and wait for it to finish
run = client.actor("flash_scraper/local-business-leads").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 '{
  "category": "dentist",
  "location": "Austin, Texas",
  "onlyWithWebsite": true
}' |
apify call flash_scraper/local-business-leads --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/BRiuRAMHY1njVTRqQ/builds/q81McUOeHp22Lxr6E/openapi.json
