# Google Maps Business Lead Finder (`huggable_chipmunk/google-maps-business-leads`) Actor

Find businesses on Google Maps and enrich their websites with published emails, phone numbers and social links. Direct extraction, deduplication, evidence URLs and CSV-ready results.

- **URL**: https://apify.com/huggable_chipmunk/google-maps-business-leads.md
- **Developed by:** [Marco Schwartz](https://apify.com/huggable_chipmunk) (community)
- **Categories:** Business, Marketing, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 96.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.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/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

## Google Maps Business Lead Finder

Find local businesses and turn their published contact information into CRM-ready records. Search for a category and city, then collect Maps phone numbers, websites, ratings and published website emails with evidence URLs.

**Our own extraction code. No calls to other Actors, no paid third-party scraper, no Google API key.**

### Quick start

```json
{"searchQueries":["dentists in Barcelona","architects in Madrid"],"maxLeads":20,"enrichWebsites":true,"maxPagesPerWebsite":3}
```

The first result page is fetched for each search, usually up to 20 businesses. Add precise categories, neighborhoods or cities for broader coverage. This version does not scroll or paginate a whole city and does not promise exhaustive coverage. `maxLeads` limits output; it does not guarantee that many matching results. Duplicate place IDs are removed within the run. `minRating` and `requireWebsite` filter the output.

### What you receive

One record per business: name, place ID, CID, address, city, categories, Maps phone, website, rating, review count (when available), coordinates and Maps URL. Website enrichment adds emails, per-email role labels and source URLs, website phone numbers, social profile links, status and errors. These are published contacts, not verified mailboxes or verified legal entities. Email role labels are heuristics. The default keeps the business's email domain and common public email providers; unrelated domains are excluded.

Export results in CSV, Excel or JSON from the dataset. Use `mapsUrl` as input to **Google Maps Review Change Tracker**. `RUN_SUMMARY` reports query coverage, deduplication, filters, failures and spending limits.

### Price

$8 per 1,000 emitted business leads ($0.008 each). Website enrichment is included in this result price. No other Actor charges. Apify may apply its usual platform charges. No business-output charge for failed queries or filtered/duplicate listings. The Actor stops when the result spending budget is exhausted.

### Limitations

Google can block cloud IPs or change its page/data format. Blocked and unsupported responses are errors rather than silently empty datasets. Missing fields remain null. Partial website enrichment still produces a Maps lead, with errors and source URLs. Website requests respect robots.txt, use bounded retries and page limits, validate redirects and reject private network addresses. JavaScript-only pages and login-gated contacts are not supported. No login, CAPTCHA solving or Google review extraction is part of this Actor.

For legitimate use of public business data. Follow applicable site terms and privacy/marketing rules.

### Development

Node.js 22+: `npm ci`, `npm test`, then `npm start` with local Apify input in `storage/key_value_stores/default/INPUT.json`. Source is maintained locally; results are obtained directly from Google Maps and business websites.

# Actor input Schema

## `searchQueries` (type: `array`):

Business category and city, for example dentists in Barcelona. Up to 20 queries; retrieves the first result page, usually up to 20 businesses per query.

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

Maximum unique emitted business records.

## `enrichWebsites` (type: `boolean`):

Read homepage and contact pages with our own code. No other Actors or external scraping services. Some websites block access or use JavaScript.

## `maxPagesPerWebsite` (type: `integer`):

Homepage plus relevant contact/about/legal pages, respecting robots.txt.

## `minRating` (type: `number`):

Zero disables the filter. Businesses with missing ratings are excluded when this is above zero.

## `requireWebsite` (type: `boolean`):

Exclude Maps listings without a website URL.

## `language` (type: `string`):

Two-letter language code. Result order and category labels may differ by language.

## Actor input object example

```json
{
  "searchQueries": [
    "dentists in Barcelona"
  ],
  "maxLeads": 20,
  "enrichWebsites": true,
  "maxPagesPerWebsite": 3,
  "minRating": 0,
  "requireWebsite": false,
  "language": "en"
}
```

# Actor output Schema

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

No description

## `summary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("huggable_chipmunk/google-maps-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("huggable_chipmunk/google-maps-business-leads").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 '{}' |
apify call huggable_chipmunk/google-maps-business-leads --silent --output-dataset

```

## MCP server setup

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

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/uvsAEb8TJIcBWNaeI/builds/dS3jahdp9qpFmf4Dg/openapi.json
