# Google Maps Local Lead Curator (`sfo_sfo/local-lead-curator`) Actor

Find local businesses on Google Maps and export clean, outreach-ready lead lists with websites, emails, and contact signals.

- **URL**: https://apify.com/sfo\_sfo/local-lead-curator.md
- **Developed by:** [Northern Skyline Data Tools](https://apify.com/sfo_sfo) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 14.3% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

Google Maps Local Lead Curator with Contact Enrichment

Extract local business leads from Google Maps and automatically enrich them with contact details like emails, phone numbers, and contact pages.

This actor is designed for sales, outreach, and lead generation workflows. It collects clean, structured data and outputs a polished CSV ready for immediate use.

No scraping setup required — just enter a search query and location.

---

### What this actor does

- Searches Google Maps for businesses (e.g., "dentist", "preschool", "video game store")
- Collects:
  - Business name
  - Address
  - Phone number
  - Website
- Visits each website to extract:
  - Emails
  - Contact names
  - Contact titles
  - Contact forms
- Outputs a clean CSV with ready-to-use leads

---

### Output

Each row includes:

- name  
- phone  
- website  
- email  
- contact (person)  
- title  
- address  
- category  
- distance  
- outreachReady (true/false)  
- outreachPath (email / phone / form)  
- mapsUrl (clickable Google Maps link)

The dataset is optimized for Excel and CRM import.

---

### Input

- query (string)  
  Example: "dentist", "preschool", "church school"

- originAddress (string)  
  Example: "Ashburn, VA"

- radiusMiles (number)  
  Search radius in miles

- requirePhoneOrWebsite (boolean)  
  Only return leads with contact info

- excludeHomeDaycare (boolean)  
  Filters out residential/daycare-type businesses

- enrichWebsiteContacts (boolean)  
  Visit websites and extract emails/contact info

- maxLeadsToEnrich (number)  
  Limit how many sites to crawl

- maxWebsitePages (number)  
  Max pages per site to crawl

- businessNameMustInclude (array, optional)  
  Filter results by keywords  
  Example: ["school", "academy"]

---

### Use cases

- Local lead generation  
- Sales prospecting  
- Marketing outreach  
- Agency client acquisition  
- Business research  

---

### Notes

- Some websites block automated access (e.g., large retail chains). In those cases, enrichment may be limited.  
- Results depend on Google Maps availability and website structure.  
- Contact names and titles are best-effort extracted and may not always be available.  

---

### Tips

- Use broader queries (e.g., "dentist") for more leads  
- Use businessNameMustInclude for precision targeting  
- Enable enrichment for higher-quality outreach data

This actor provides best-effort public contact enrichment and does not guarantee a personal email for every business.

# Actor input Schema

## `query` (type: `string`):

Business type or niche to search for on Google Maps.
## `businessNameMustInclude` (type: `array`):

Optional keywords the business name must include. Example: school, academy, preschool. Leave empty for broad searches.
## `maxResults` (type: `integer`):

Maximum number of cleaned, ranked leads to return after filtering.
## `originCoordinates` (type: `string`):

Optional center point for the search, formatted like: 39.049074274417336, -77.48746703585184. Used first if provided.
## `originAddress` (type: `string`):

Optional center address or city, such as Ashburn, VA. Used if origin coordinates are not provided.
## `originLat` (type: `number`):

Optional latitude of the center point. Used only if origin coordinates and origin address are empty.
## `originLng` (type: `number`):

Optional longitude of the center point. Used only if origin coordinates and origin address are empty.
## `radiusMiles` (type: `number`):

Only include businesses within this many miles of the origin.
## `requirePhoneOrWebsite` (type: `boolean`):

If enabled, only keep leads that have at least a phone number or website.
## `excludeHomeDaycare` (type: `boolean`):

Useful for preschool/daycare searches. Attempts to remove likely home daycare or family daycare results.
## `enrichWebsiteContacts` (type: `boolean`):

If enabled, visits business websites and attempts to extract public emails, contact names, titles, and contact forms. Slower and best-effort.
## `maxEnrichedResults` (type: `integer`):

Maximum number of ranked leads to attempt website contact enrichment for. Only used when website enrichment is enabled.
## `maxWebsiteContactPages` (type: `integer`):

How many website pages to inspect per lead when contact enrichment is enabled.

## Actor input object example

```json
{
  "query": "preschool",
  "businessNameMustInclude": [],
  "maxResults": 25,
  "originAddress": "Ashburn, VA",
  "radiusMiles": 10,
  "requirePhoneOrWebsite": true,
  "maxEnrichedResults": 10,
  "maxWebsiteContactPages": 5
}
````

# 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 = {
    "query": "preschool",
    "businessNameMustInclude": [],
    "maxResults": 25,
    "originCoordinates": "",
    "originAddress": "Ashburn, VA",
    "originLat": 0,
    "originLng": 0,
    "radiusMiles": 10,
    "requirePhoneOrWebsite": true,
    "excludeHomeDaycare": false,
    "enrichWebsiteContacts": false,
    "maxEnrichedResults": 10,
    "maxWebsiteContactPages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("sfo_sfo/local-lead-curator").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 = {
    "query": "preschool",
    "businessNameMustInclude": [],
    "maxResults": 25,
    "originCoordinates": "",
    "originAddress": "Ashburn, VA",
    "originLat": 0,
    "originLng": 0,
    "radiusMiles": 10,
    "requirePhoneOrWebsite": True,
    "excludeHomeDaycare": False,
    "enrichWebsiteContacts": False,
    "maxEnrichedResults": 10,
    "maxWebsiteContactPages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("sfo_sfo/local-lead-curator").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 '{
  "query": "preschool",
  "businessNameMustInclude": [],
  "maxResults": 25,
  "originCoordinates": "",
  "originAddress": "Ashburn, VA",
  "originLat": 0,
  "originLng": 0,
  "radiusMiles": 10,
  "requirePhoneOrWebsite": true,
  "excludeHomeDaycare": false,
  "enrichWebsiteContacts": false,
  "maxEnrichedResults": 10,
  "maxWebsiteContactPages": 5
}' |
apify call sfo_sfo/local-lead-curator --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Local Lead Curator",
        "description": "Find local businesses on Google Maps and export clean, outreach-ready lead lists with websites, emails, and contact signals.",
        "version": "0.0",
        "x-build-id": "Jn7PmH6HffrTkrmRM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sfo_sfo~local-lead-curator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sfo_sfo-local-lead-curator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sfo_sfo~local-lead-curator/runs": {
            "post": {
                "operationId": "runs-sync-sfo_sfo-local-lead-curator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sfo_sfo~local-lead-curator/run-sync": {
            "post": {
                "operationId": "run-sync-sfo_sfo-local-lead-curator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "query",
                    "radiusMiles"
                ],
                "properties": {
                    "query": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Business type or niche to search for on Google Maps."
                    },
                    "businessNameMustInclude": {
                        "title": "Business name must include",
                        "type": "array",
                        "description": "Optional keywords the business name must include. Example: school, academy, preschool. Leave empty for broad searches.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of cleaned, ranked leads to return after filtering."
                    },
                    "originCoordinates": {
                        "title": "Origin coordinates",
                        "type": "string",
                        "description": "Optional center point for the search, formatted like: 39.049074274417336, -77.48746703585184. Used first if provided."
                    },
                    "originAddress": {
                        "title": "Origin address",
                        "type": "string",
                        "description": "Optional center address or city, such as Ashburn, VA. Used if origin coordinates are not provided."
                    },
                    "originLat": {
                        "title": "Origin latitude",
                        "type": "number",
                        "description": "Optional latitude of the center point. Used only if origin coordinates and origin address are empty."
                    },
                    "originLng": {
                        "title": "Origin longitude",
                        "type": "number",
                        "description": "Optional longitude of the center point. Used only if origin coordinates and origin address are empty."
                    },
                    "radiusMiles": {
                        "title": "Radius in miles",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "number",
                        "description": "Only include businesses within this many miles of the origin."
                    },
                    "requirePhoneOrWebsite": {
                        "title": "Require phone or website",
                        "type": "boolean",
                        "description": "If enabled, only keep leads that have at least a phone number or website."
                    },
                    "excludeHomeDaycare": {
                        "title": "Exclude home daycare",
                        "type": "boolean",
                        "description": "Useful for preschool/daycare searches. Attempts to remove likely home daycare or family daycare results."
                    },
                    "enrichWebsiteContacts": {
                        "title": "Enrich website contacts",
                        "type": "boolean",
                        "description": "If enabled, visits business websites and attempts to extract public emails, contact names, titles, and contact forms. Slower and best-effort."
                    },
                    "maxEnrichedResults": {
                        "title": "Max leads to enrich",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of ranked leads to attempt website contact enrichment for. Only used when website enrichment is enabled."
                    },
                    "maxWebsiteContactPages": {
                        "title": "Max website pages per lead",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "How many website pages to inspect per lead when contact enrichment is enabled."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
