# Local Business Leads — Google Maps + Verified Emails API (`nexgendata/local-business-leads-scraper`) Actor

Local business leads from Google Maps by industry & city: company, address, phone, website + a verified business email in one call. Export CSV/JSON/Excel.

- **URL**: https://apify.com/nexgendata/local-business-leads-scraper.md
- **Developed by:** [NexGenData](https://apify.com/nexgendata) (community)
- **Categories:** Lead generation, Business, Marketing
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 business lead records

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Local Business Leads — Google Maps + Verified Emails

Build a **territory list of local businesses** from Google Maps by industry and city — with a business email attached wherever one is publicly discoverable, MX-checked at the domain level. One run, outreach-ready.

> Most Maps scrapers hand back a name and a phone number. This one adds the reachable, MX-checked business email in the same pass — so the list is ready for a sequence the moment it lands.

### 📊 Sample Output

![6 real rows delivered by Local Business Leads — Google Maps + Verified Emails API — run 8vb2RDF2SR6Ga6ONY on build 0.0.17](https://api.apify.com/v2/key-value-stores/8gLgXMBveEI1tTz1z/records/local-business-leads-scraper-sample)

| `company` | `category` | `city` | `phone` | `email_provider` | `industry` |
|---|---|---|---|---|---|
| Austin Elite Smiles | Cosmetic & General Dentistry | Cosmetic dentist | Austin | \[phone on record] | Unknown | dentists |
| Define Dentistry of Austin | Dentist | Austin | \[phone on record] | Unknown | dentists |
| ATX Family Dental | Dentist | Austin | \[phone on record] | Google Workspace | Fintech |
| South Austin Dentist | Dentist | Austin | \[phone on record] | Unknown | dentists |
| Austin Dental Works | Dentist | Austin | \[phone on record] | Google Workspace | Marketing |
| 38th Street Dental | Dentist | Austin | \[phone on record] | Unknown | dentists |

Real rows from run `8vb2RDF2SR6Ga6ONY` on build 0.0.17 (2026-09-25), unedited apart from masked emails/phones and shortened long text; fields the source does not publish are empty.

### 🔧 Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `industry` (required) | array | `["dentists"]` | One or more business types / niches to search for, e.g. \['dentists'], \['plumbers','HVAC contractors'], \['marketing agencies']. Each is searched as ' in '. Public business data onl… |
| `location` (required) | string | `"Austin TX"` | City / area to search in, e.g. 'Austin TX', 'San Francisco, CA', 'Manchester UK'. Combined with each industry as ' in '. |
| `maxLeads` | integer | `10` | Maximum number of enriched leads to return across all industry keywords. 25 for a quick batch, up to 200 for a full local-market sweep. |
| `notionConnector` | string |  | Optional. Connect your Notion workspace and this Actor builds a CRM database of the enriched leads in the same run - it never sees your Notion credentials. Authorize a Notion MCP… |
| `notionParentId` | string |  | Optional. The Notion page ID to create the CRM database under. If blank, Notion creates it as a private page in your workspace. |
| `proxyConfiguration` | object | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` | Proxy settings. RESIDENTIAL is strongly recommended (and the default) - Google Maps blocks datacenter IPs. Leave as-is unless you have a reason to change it. |
| `supabaseConnector` | string |  | Optional. Connect your own Supabase project and the results are also inserted into a table in the same run — the Actor never sees your Supabase credentials. Authorize a write-scop… |
| `supabaseTable` | string | `"nexgendata_leads"` | Target table in the public schema (created if missing, with id, a jsonb data column, and a scraped_at timestamp). Default: nexgendata_leads. |
| `supabaseProjectId` | string |  | Your Supabase project reference (e.g. abcdefghijklmnop). Required unless your connector URL is already project-scoped. Find it in your project URL: supabase.com/dashboard/project/… |
| `deliveryDedup` | boolean | `true` | When on (default), records already delivered in a previous run are not delivered again to the same destination — so scheduled runs only push new items. Turn off to deliver every r… |

### 🧾 JSON sample record

One real record from run `8vb2RDF2SR6Ga6ONY` (emails/phones masked, long text shortened):

```json
{
  "company": "Austin Elite Smiles | Cosmetic & General Dentistry",
  "category": "Cosmetic dentist",
  "address": "Austin Elite Smiles | Cosmetic & General Dentistry, 15004 Avery Ranch Boulevard Bldg B, Suite 100, Austin, TX 78717",
  "city": "Austin",
  "phone": "[phone on record]",
  "website": "",
  "email": "",
  "contact_type": "",
  "email_verified": false,
  "email_provider": "Unknown",
  "industry": "dentists",
  "rating": 5,
  "reviews_count": 217,
  "latitude": 30.499872,
  "longitude": -97.774563,
  "place_id": "0x8644d2b720c0d73d:0x4f11d603cf5ecfb9",
  "source_url": "https://www.google.com/maps/search/?api=1&query=Austin+Elite+Smiles+%7C+Cosmetic+%26+General+Dentistry+Austin+Elite+Smiles+%7C+Cosmetic+%26+General+Dentistry%2C+15004+Avery+Ranch+Boulevard+Bldg+B%2C+Suite+100%2C+Austin%2C+TX+78717",
  "data_source": "nexgendata/local-business-leads-scraper",
  "as_of_timestamp": "2026-09-25T00:06:30Z"
}
```

### 🔗 Related Actors

More from the NexGenData **Leads, contacts & enrichment** family:

- [AI Lead Gen Agent — Automated B2B Prospecting API](https://apify.com/nexgendata/lead-gen-ai-agent?fpr=2ayu9b)
- [Lead List Enricher — Emails, Phones & Tech from a Domain API](https://apify.com/nexgendata/lead-list-enricher?fpr=2ayu9b)
- [Leads to Notion CRM — Verified Lead Delivery API](https://apify.com/nexgendata/leads-to-notion-crm?fpr=2ayu9b)
- [Website Tech & Contact Audit — Tech Stack + Emails API](https://apify.com/nexgendata/local-business-tech-contact-audit?fpr=2ayu9b)
- [Person Email Finder — Name + Company to Verified Email API](https://apify.com/nexgendata/person-business-email-finder?fpr=2ayu9b)
- [Person Enrichment API — Name & Company to Public Profile](https://apify.com/nexgendata/person-enrichment-lookup?fpr=2ayu9b)

30 more in this family on the [NexGenData Store page](https://apify.com/nexgendata?fpr=2ayu9b).

### 💡 What makes this different

- **Sourced from Google Maps** — real local businesses by category + location (not a stale directory).
- **Verified business email** — where a business email is publicly discoverable it's checked against the domain's live MX records and flagged (`email_verified`, `email_provider`). This is domain-level deliverability (MX), not per-mailbox SMTP verification. In a live "dentists / Austin TX" run, ~30% of listings carried a verified email; the rest return the full listing (name, phone, site) for you to enrich downstream.
- **Full firmographic + location record** — address, phone, website, rating, geo, `place_id`.

### 📊 Output — one record per business (19 fields)

From a live run (`dentists` / `Austin TX`):

| Field | Example |
|---|---|
| `company` | ATX Family Dental |
| `category` | Dentist |
| `address` | 1700 S 1st St, Austin, TX 78704 |
| `city` | Austin |
| `phone` | (512) 717-3147 |
| `website` | https://www.atxfamilydental.com/ |
| `email` | info@atxfamilydental.com |
| `email_verified` | true |
| `email_provider` | Google Workspace |
| `contact_type` | general |
| `rating` | 4.9 |
| `reviews_count` | 128 |
| `latitude` / `longitude` | 30.24 / -97.76 |
| `place_id` | ChIJb5gBC-u0RIYR… |
| `source_url` | google.com/maps/… |
| `as_of_timestamp` | 2026-07-10T… |

### 💰 Pricing

Pay-Per-Event, billed on what you actually receive:

| Event | Price | When it fires |
|---|---|---|
| Lead returned | **$0.05** per business record | Once per business delivered to the dataset. |
| MX-verified email add-on | **$0.02** | Only for a delivered lead that carries a business email whose domain passed a live MX check (`email_verified: true`). Leads with no email, or with an unverified one, never trigger it. |
| Actor start | $0.00005 per GB of memory | Negligible; charged by the platform when the run starts. |

So a plain listing costs **$0.05**, and a listing that comes with an MX-verified email costs **$0.07**. You pay per business delivered, not per run — a run that returns nothing charges nothing. See the Pricing tab for the authoritative figures.

### ▶️ Try it — one-click example

A pre-built task **"Dentists in Austin with verified emails"** ships with the actor. Or set your own:

```json
{ "industry": ["dentists"], "location": "Austin TX", "maxLeads": 25 }
```

### 🔗 Two-step B2B workflow — territory → decision-makers

This actor builds the **territory list**: *which* businesses, *where*, and *how to reach them*. Pair it with **[B2B Leads Finder](https://apify.com/nexgendata/b2b-leads-finder)** to get the **named decision-makers** inside those companies:

1. **This actor — Local Business Leads** ($0.05 / business, +$0.02 when the email is MX-verified): every dentist in Austin, with a verified business email where available.
2. **[B2B Leads Finder](https://apify.com/nexgendata/b2b-leads-finder)** ($0.05 / person): the owner / marketing manager / decision-maker at a target company, with LinkedIn + a personal deliverable email.

Territory-building (this) → account-based targeting (Finder). Run them in either order.

### 🔗 Full lead-gen cluster

Found leads? verify → enrich → push to CRM:

1. **Find:** [B2B Leads Finder](https://apify.com/nexgendata/b2b-leads-finder) · [Company Email Finder](https://apify.com/nexgendata/company-email-finder) · [Website Contact Scraper](https://apify.com/nexgendata/contact-info-scraper)
2. **Enrich:** [Company Enrichment](https://apify.com/nexgendata/company-enrichment-tool) · [Lead List Enricher](https://apify.com/nexgendata/lead-list-enricher)
3. **Verify & clean:** [Email Verification](https://apify.com/nexgendata/email-verification-tool) · [Bulk Email Validator](https://apify.com/nexgendata/email-validator)
4. **Deliver:** [Leads to Notion CRM](https://apify.com/nexgendata/leads-to-notion-crm)

### 🤖 Use with AI agents

Point Claude, the OpenAI Agents SDK, an n8n flow, or any MCP-aware client at it and build territory lists on demand.

***

*Public web & Google Maps business data, assembled as sales-team prospect lists. Use in line with applicable outreach and privacy law.*

# Actor input Schema

## `industry` (type: `array`):

One or more business types / niches to search for, e.g. \['dentists'], \['plumbers','HVAC contractors'], \['marketing agencies']. Each is searched as '<industry> in <location>'. Public business data only.

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

City / area to search in, e.g. 'Austin TX', 'San Francisco, CA', 'Manchester UK'. Combined with each industry as '<industry> in <location>'.

## `maxLeads` (type: `integer`):

Maximum number of enriched leads to return across all industry keywords. 25 for a quick batch, up to 200 for a full local-market sweep.

## `notionConnector` (type: `string`):

Optional. Connect your Notion workspace and this Actor builds a CRM database of the enriched leads in the same run - it never sees your Notion credentials. Authorize a Notion MCP connector in Apify Console -> Settings -> API & Integrations, then select it here. Without a connector you simply get the dataset.

## `notionParentId` (type: `string`):

Optional. The Notion page ID to create the CRM database under. If blank, Notion creates it as a private page in your workspace.

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

Proxy settings. RESIDENTIAL is strongly recommended (and the default) - Google Maps blocks datacenter IPs. Leave as-is unless you have a reason to change it.

## `supabaseConnector` (type: `string`):

Optional. Connect your own Supabase project and the results are also inserted into a table in the same run — the Actor never sees your Supabase credentials. Authorize a write-scoped, project-scoped Supabase MCP connector in Apify Console (Settings -> Integrations), then select it here.

## `supabaseTable` (type: `string`):

Target table in the public schema (created if missing, with id, a jsonb data column, and a scraped_at timestamp). Default: nexgendata_leads.

## `supabaseProjectId` (type: `string`):

Your Supabase project reference (e.g. abcdefghijklmnop). Required unless your connector URL is already project-scoped. Find it in your project URL: supabase.com/dashboard/project/THIS_PART.

## `deliveryDedup` (type: `boolean`):

When on (default), records already delivered in a previous run are not delivered again to the same destination — so scheduled runs only push new items. Turn off to deliver every record on every run.

## Actor input object example

```json
{
  "industry": [
    "dentists",
    "plumbers",
    "marketing agencies"
  ],
  "location": "Austin TX",
  "maxLeads": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "supabaseTable": "nexgendata_leads",
  "deliveryDedup": true
}
```

# Actor output Schema

# 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 = {
    "industry": [
        "dentists"
    ],
    "location": "Austin TX",
    "maxLeads": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/local-business-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 = {
    "industry": ["dentists"],
    "location": "Austin TX",
    "maxLeads": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/local-business-leads-scraper").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 '{
  "industry": [
    "dentists"
  ],
  "location": "Austin TX",
  "maxLeads": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call nexgendata/local-business-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgendata/local-business-leads-scraper"
        }
    }
}
```

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/j5Y9CULkZFulrz0hf/builds/xZpYA03KrAHLul3UM/openapi.json
