# Google Maps Local Business & Lead Extractor (`hoang_minh_quan/google-maps-local-business-scraper`) Actor

Extract public local business listings from Google Maps by keyword + location — name, address, phone, website, rating, review count, GPS. Business-directory data only; no sensitive personal PII.

- **URL**: https://apify.com/hoang\_minh\_quan/google-maps-local-business-scraper.md
- **Developed by:** [Hoang Minh Quan](https://apify.com/hoang_minh_quan) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 40.0% runs succeeded, 0 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 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

## Google Maps Lead Intelligence API — Turn the Map Into Your CRM Pipeline

**Stop copying pins into spreadsheets. Get enriched local leads — scored Hot / Warm / Cold — ready for HubSpot or Google Sheets.**

***

### The problem

Local outbound still looks like this:

- SDRs burn hours **clicking Maps pins**, copying names, phones, and websites by hand.
- Raw listing dumps give you **addresses without a path to contact** — no role email, no social, no priority.
- Every lead looks the same in a CSV. Nobody knows which accounts to dial **first**.
- Agencies can’t productize “we found 200 businesses” without **CRM-ready enrichment**.
- Personal email harvesting is risky and off-brand — you need **public business contact signals**, not private inboxes.

If your pipeline starts as a screenshot of Google Maps, you’re not running lead intelligence — you’re running busywork.

***

### The solution

This Actor turns **public Google Maps business listings** into a **Lead Intelligence layer**:

1. **Discover** — Search by keyword + location (e.g. `dentist` × `Austin TX`) and pull structured business-directory fields.
2. **Enrich** — Visit public websites for **role-based emails** (`info@`, `contact@`, `sales@`…) and **social links** (Facebook, Instagram, LinkedIn, etc.).
3. **Score** — Rank every account **Hot / Warm / Cold** from website, phone, email, socials, ratings, and review volume.
4. **Export** — Flat JSON rows sorted by lead score — drop straight into **HubSpot**, **Google Sheets**, Clay, or your CRM via Apify integrations.

You don’t buy “another Maps dump.” You buy a **prioritized outreach queue**.

> Public business-directory & website data only. **No sensitive personal / private individual PII.** Role emails only — never personal free-mail harvesting.

***

### Key features

- **Keyword × location discovery** — batch `searchQueries[]` for local ICP coverage
- **Website enrichment** — public role emails + social profile links
- **Lead score 0–100** with **Hot / Warm / Cold** tiers
- **CRM-ready schema** — name, phone, website, emails, socials, geo, category, score
- **Sorted output** — hottest leads first for same-day outreach
- **HubSpot / Sheets friendly** — one dataset export, no cleanup ritual
- **Residential proxy + retries** — resilient Maps collection
- **Ethical by design** — business contacts only, no Gmail/Yahoo owner scraping

***

### Quick start (Try for free)

1. Open the Actor in [Apify Console](https://console.apify.com/actors/LkkDCj7zooF92ThYB).
2. Prefill: `coffee shop` + `Ho Chi Minh City` — click **Start** with enrichment on.
3. Open the dataset → filter `leadTier = hot` → export CSV to Sheets or sync to HubSpot.

```json
{
  "searchQueries": ["marketing agency", "dentist"],
  "location": "Austin TX",
  "maxPlaces": 50,
  "countryCode": "US",
  "enableWebsiteEnrich": true,
  "maxWebsiteEnrich": 40,
  "useApifyProxy": true,
  "proxyCountry": "US"
}
```

**Pro tip:** Schedule weekly for each city × ICP. Export Hot leads Monday morning into HubSpot lists — your SDRs start dialing, not researching.

***

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | `string[]` | `[]` | Business keywords (e.g. `coffee shop`, `dentist`) |
| `searchQuery` | `string` | — | Legacy single query |
| `location` | `string` | — | City / district / area (strongly recommended) |
| `maxPlaces` | `integer` | `50` | Max businesses to return (1–300) |
| `language` | `string` | `"en"` | Maps UI language |
| `countryCode` | `string` | — | ISO country stored on each row (`VN`, `US`, …) |
| `scrollRounds` | `integer` | `12` | Results feed scroll depth |
| `maxAttempts` | `integer` | `3` | Retries with fresh residential session |
| `useApifyProxy` | `boolean` | `true` | Recommended to reduce CAPTCHA / empty feeds |
| `proxyCountry` | `string` | `"US"` | Residential exit country |
| `enableWebsiteEnrich` | `boolean` | `true` | Fetch websites for role emails + socials |
| `maxWebsiteEnrich` | `integer` | `40` | Cap website fetches per run (0–100) |
| `enrichConcurrency` | `integer` | `3` | Parallel website fetches (1–5) |

***

### Output

#### Dataset row (per business — CRM-ready)

```json
{
  "placeId": "ChIJ…",
  "name": "Austin Growth Agency",
  "address": "123 Congress Ave, Austin, TX",
  "phone": "+1 512-555-0142",
  "website": "https://austingrowth.example",
  "category": "Marketing agency",
  "rating": 4.7,
  "reviewCount": 86,
  "latitude": 30.2672,
  "longitude": -97.7431,
  "mapsUrl": "https://www.google.com/maps/place/…",
  "publicEmails": ["info@austingrowth.example", "contact@austingrowth.example"],
  "socialLinks": {
    "facebook": "https://facebook.com/austingrowth",
    "linkedin": "https://linkedin.com/company/austingrowth",
    "instagram": "https://instagram.com/austingrowth"
  },
  "leadScore": 82,
  "leadTier": "hot",
  "leadReasons": ["website", "phone", "publicEmail", "socialx3", "rating4+", "reviews20+"],
  "enrichOk": true,
  "countryCode": "US",
  "searchQuery": "marketing agency",
  "locationQuery": "Austin TX",
  "scrapedAt": "2026-08-06T15:00:00.000Z"
}
```

**`leadTier`:** `hot` (score ≥ 70) · `warm` (≥ 45) · `cold` (below)

#### `OUTPUT` summary

```json
{
  "totalPlaces": 50,
  "searchQueries": ["marketing agency", "dentist"],
  "location": "Austin TX",
  "hotLeads": 12,
  "warmLeads": 21,
  "withPublicEmail": 18,
  "withSocial": 27,
  "topLeads": [
    {
      "name": "Austin Growth Agency",
      "leadScore": 82,
      "leadTier": "hot",
      "website": "https://austingrowth.example",
      "publicEmails": ["info@austingrowth.example"],
      "phone": "+1 512-555-0142"
    }
  ],
  "scrapedAt": "2026-08-06T15:00:00.000Z"
}
```

#### HubSpot / Google Sheets path

1. Run Actor → Dataset
2. **Export CSV** → Google Sheets, or use Apify → HubSpot / Make / Zapier
3. Map fields: `name` → Company, `publicEmails[0]` → Email, `phone` → Phone, `leadTier` → Lifecycle / Lead status, `website` → Website
4. Filter `leadTier = hot` for same-day sequences

***

### Use cases

#### 1. B2B agency / local outbound team

Build city × ICP lists weekly (`plumbing` × `Dallas`, `dental clinic` × `HCMC`). Enriched Hot leads go into HubSpot; Warm into nurture. Sell “local lead intelligence retainers,” not “we copied Maps.”

#### 2. Franchise / multi-location expansion

Discover competitors and whitespace by market. Score density of rated, claimable businesses with websites — feed territory planning decks.

#### 3. SaaS GTM for SMB verticals

Find restaurants, clinics, or agencies with websites but weak digital presence. Hot tier + social gaps = perfect ICP for your product demo sequence.

***

### How lead scoring works

| Signal | Adds to score |
|---|---|
| Website present | +20 |
| Phone present | +15 |
| Public role email | +20 |
| Social links | up to +20 |
| Rating ≥ 4.0 | +10 |
| Review volume | +5 to +15 |
| Category / claimed | +5 each |

Scores clamp **0–100**. Enrichment prefers **role mailboxes** only (`info@`, `contact@`, `hello@`, `sales@`, …) — personal Gmail/Yahoo are blocked by design.

***

### Compliance & ethics

- Sources **public** Google Maps business listings and public websites.
- Does **not** collect sensitive personal / private individual PII.
- Role-based business emails only — no personal free-mail harvesting.
- You are responsible for lawful outreach under your jurisdiction (CAN-SPAM, GDPR, etc.).

***

### Call to action

**Try it free on Apify** → run the prefill city search, then export Hot leads to Sheets in one click.

Ready to productize local outbound? Enable website enrichment, Schedule weekly by market, and pipe Hot accounts into **HubSpot**. Turn the map into a CRM — not a time sink.

**Actor:** [Google Maps Lead Intelligence](https://console.apify.com/actors/LkkDCj7zooF92ThYB)\
**ID:** `LkkDCj7zooF92ThYB`\
**Build:** `1.1.3`

# Actor input Schema

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

Business keywords to search (e.g. "coffee shop", "dentist", "marketing agency").

## `searchQuery` (type: `string`):

Optional single query — same as adding one entry to searchQueries.

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

City, district, or area — required for reliable results (e.g. "Austin TX", "Ho Chi Minh City").

## `maxPlaces` (type: `integer`):

Maximum number of business listings to return (1–300). Keep low for fast Store QA (under 5 minutes).

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

Google Maps UI language code (en, vi, th, …).

## `countryCode` (type: `string`):

Optional ISO country code stored on each row (VN, US, …).

## `scrollRounds` (type: `integer`):

How many times to scroll the results feed to load more places.

## `maxAttempts` (type: `integer`):

Retries with a fresh residential proxy session.

## `useApifyProxy` (type: `boolean`):

Strongly recommended to reduce CAPTCHA / empty feeds.

## `proxyCountry` (type: `string`):

Residential proxy exit country (ISO 2-letter). Match target market when possible.

## `enableWebsiteEnrich` (type: `boolean`):

Fetch each business website for role-based emails (info@, contact@) and public social links. No personal free-mail harvesting. Default off so Store QA finishes under 5 minutes — turn on for production leads.

## `maxWebsiteEnrich` (type: `integer`):

Cap website fetches per run (0–100). Lead score still computed for all rows.

## `enrichConcurrency` (type: `integer`):

Parallel website fetches (1–5).

## Actor input object example

```json
{
  "searchQueries": [
    "coffee shop"
  ],
  "location": "Austin, TX",
  "maxPlaces": 5,
  "language": "en",
  "countryCode": "US",
  "scrollRounds": 3,
  "maxAttempts": 2,
  "useApifyProxy": true,
  "proxyCountry": "US",
  "enableWebsiteEnrich": false,
  "maxWebsiteEnrich": 0,
  "enrichConcurrency": 3
}
```

# Actor output Schema

## `leads` (type: `string`):

Dataset of businesses with Hot/Warm/Cold lead scores

## `summary` (type: `string`):

OUTPUT JSON summary in the default key-value store

# 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 = {
    "searchQueries": [
        "coffee shop"
    ],
    "location": "Austin, TX",
    "countryCode": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("hoang_minh_quan/google-maps-local-business-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 = {
    "searchQueries": ["coffee shop"],
    "location": "Austin, TX",
    "countryCode": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("hoang_minh_quan/google-maps-local-business-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 '{
  "searchQueries": [
    "coffee shop"
  ],
  "location": "Austin, TX",
  "countryCode": "US"
}' |
apify call hoang_minh_quan/google-maps-local-business-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hoang_minh_quan/google-maps-local-business-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/LkkDCj7zooF92ThYB/builds/HBl7vfT21sfkGJIo3/openapi.json
