# Google Maps Scraper | Leads, Emails & Phones (`apivault_labs/google-maps-scraper`) Actor

Fast Google Maps scraper for whole-city business leads. Extract names, addresses, phones, websites, ratings, hours and place IDs; optionally find public emails, social profiles and sales signals. Search by city, category, postal code or coordinates. Export CSV, Excel or JSON. No Google API key.

- **URL**: https://apify.com/apivault\_labs/google-maps-scraper.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** Lead generation, Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 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

### Google Maps Scraper for Business Leads, Emails & Phones

Collect local business data from Google Maps by city, category, postal code,
coordinates, or an exact geographic area. Export names, addresses, phone numbers,
websites, ratings, opening hours, place IDs, public emails, social profiles, and
sales-ready lead signals to CSV, Excel, JSON, XML, or RSS.

Use this Google Maps business scraper for B2B lead generation, local SEO outreach,
sales prospecting, market research, territory analysis, competitor discovery, and
building local business directories. No Google API key or Google account is required.

### Why choose this Google Maps scraper?

- **Whole-city coverage:** search beyond the small set visible around one map point.
- **Ready-to-use contacts:** get addresses, phones, websites, emails, and social links.
- **Fast progressive delivery:** results appear while the run is still working.
- **Flexible targeting:** combine 74 business categories with custom search terms.
- **Lead qualification:** find businesses without websites or booking and prioritize opportunities.
- **Email options:** extract public emails, inspect contact pages, and optionally verify addresses.
- **Clean exports:** use focused Contacts views or download every available field.
- **Automation-ready:** run through API, schedules, webhooks, MCP agents, n8n, Make, or Zapier.

### Performance benchmarks

Measured development benchmarks demonstrate the available throughput. Actual speed
depends on the location, category density, enabled filters, and website response times.

| Workload | Measured result |
|---|---:|
| One category with contact enrichment | 500 businesses in 11 seconds |
| Large multi-category city discovery | 82,002 businesses in 243 seconds |
| Contact enrichment on collected websites | 82,002 websites in 394 seconds |

### Available Google Maps data

| Group | Available fields |
|---|---|
| Business | Name, categories, description, status, Google Maps URL, place IDs |
| Contacts | Address, phone, website, domain, public emails, social profiles |
| Location | Street, city, state, postal code, country, coordinates, timezone |
| Reputation | Rating, review count, photo, price range |
| Availability | Opening status, weekly hours, closed-business status |
| Booking | Booking availability, provider, and available booking links |
| Website | Page title, HTTPS, certificate status, platform, response time |
| Lead intelligence | Opportunity signals, priority score, recommended offer |
| Monitoring | New, changed, or unchanged status and first/last seen dates |

Optional fields depend on what each business and its public website make available.

### Business email finder and contact enrichment

Enable contact enrichment to inspect public business websites for:

- business email addresses;
- Facebook, Instagram, LinkedIn, TikTok, YouTube, and other social profiles;
- likely Contact and About pages;
- email format, disposable-domain, and DNS checks;
- website availability and sales opportunity signals.

Use `Only leads with an email` when you need an email list instead of all businesses.
This filter can significantly reduce the final number of Dataset rows because many
businesses do not publish an email address.

### Website audit and lead scoring

The optional full audit evaluates public website characteristics such as HTTPS,
certificate status, mobile readiness, platform information, response time, online
booking, and visible opportunity signals. Results include a 0–100 priority score
and a recommended service offer.

### Search and filtering

Search using one or many categories, including restaurants, cafes, dentists,
doctors, lawyers, plumbers, contractors, real estate agencies, hotels, salons,
marketing agencies, software companies, retailers, schools, and custom niches.

Available filters include:

- with or without a website;
- with a phone or email;
- open now or not marked closed;
- without online booking;
- minimum and maximum rating;
- minimum and maximum review count;
- Google business category;
- exact or partial business-name matching;
- minimum lead priority score;
- only new or changed businesses.

`Maximum places` is a discovery safety cap, not a guaranteed output count. Website,
email, phone, rating, score, and monitoring filters can reduce delivered rows below
the selected maximum.

### Monitoring new and changed businesses

Monitor a territory on a schedule and label businesses as new, changed, or
unchanged. Enable fresh-only output to receive only new or updated leads in each run.

### Dataset views

- **Contacts:** names, categories, emails, phones, websites, social links, and addresses.
- **Monitoring:** change status with first and last seen dates.
- **Prioritized leads:** lead score, opportunity signals, and recommended offer.
- **Website profile:** website and email analysis.
- **Hours & booking:** opening hours and booking availability.
- **Maps details:** other available Google Maps fields.
- **All fields:** complete unabridged records.

If email enrichment is disabled, the Contacts view still contains address, phone,
website, rating, and Google Maps information; email-related columns remain empty.

### Example input

```json
{
  "country": "us",
  "city": "Chicago",
  "categories": ["dentist", "plumber", "marketing agency"],
  "websiteFilter": "with",
  "maxResults": 1000,
  "concurrency": 250,
  "enrich": true,
  "enrichmentMode": "contacts",
  "enrichmentConcurrency": 500,
  "verifyEmails": true
}
```

For coordinate search, leave `city` empty and provide `lat`, `lng`, and `span`.
For an exact rectangular search area, provide `north`, `south`, `east`, and `west`.

### Pricing

Pricing is event-based, and Apify platform usage is charged separately. Users pay
only for the optional operations they enable and the work that is actually performed.

| Event | Price per 1,000 events |
|---|---:|
| Delivered business lead | $1.25 on paid plans; $20 on Free |
| Website contact enrichment | $0.75 |
| Deep Contact/About page search | $0.50 |
| Email verification | $0.50 |
| Full website audit | $1.00 |
| Change monitoring | $0.25 |

Filtered-out records are not charged as delivered business leads. Optional website
processing can still be charged when requested and completed even if a public email
is not found or the record is later excluded by an output filter.

### Common use cases

**Local lead generation:** collect restaurants, contractors, dentists, lawyers,
salons, agencies, and other businesses with phones, websites, and emails.

**Web design and SEO outreach:** find businesses without a website, without online
booking, or with visible website improvement opportunities.

**Sales territory research:** map companies across a city, postal code, coordinate
radius, or exact bounding box.

**Market monitoring:** schedule repeat runs and export only newly discovered or
changed businesses.

**CRM and AI workflows:** send structured business leads to spreadsheets, CRMs,
automation tools, or MCP-compatible AI agents.

### Frequently asked questions

#### Can it scrape an entire city?

Yes. Select a city and one or more categories. Standard coverage searches across
the city instead of returning only businesses near a single map point.

#### Can it extract business emails?

Yes. Enable contact enrichment. Deep contact-page search and email verification
are optional and billed only when enabled and performed.

#### Can it find businesses without websites?

Yes. Choose `Only without a website` to build prospect lists for web design,
local SEO, marketing, booking, or digital transformation services.

#### Why is the final result count below Maximum places?

The maximum is applied during discovery. Filters and optional enrichment run after
discovery and can exclude businesses that do not match the requested criteria.

#### Does it work with Apify API and automation tools?

Yes. Run it through Apify Console or API, schedule recurring jobs, trigger webhooks,
and connect the Dataset to n8n, Make, Zapier, Google Sheets, or your CRM.

### Responsible use

Results come from publicly available business information. Availability varies by
country, category, business, and website. Follow applicable privacy, marketing,
data-protection, and outreach regulations when using collected leads.

# Actor input Schema

## `country` (type: `string`):

Country code (ISO 3166-1 alpha-2, e.g. 'us', 'gb', 'de'). Scopes the city lookup and localizes Google results.

## `city` (type: `string`):

City to collect, for example `Chicago`, `Toronto`, or `Berlin`. Leave empty when using coordinates or a bounding box.

## `state` (type: `string`):

Narrows the city lookup, e.g. 'Illinois' for Springfield.

## `postalCode` (type: `string`):

Target a single postal code instead of a whole city.

## `categories` (type: `array`):

Select one or more common business categories. Each selected category expands city coverage and can increase the number of results.

## `customSearchTerms` (type: `array`):

Add categories or niche search phrases that are not available in the list above.

## `websiteFilter` (type: `string`):

Keep all businesses, only those WITHOUT a website, or only those WITH one.

## `requirePhone` (type: `boolean`):

Keep only leads that expose a public phone number.

## `onlyNoBooking` (type: `boolean`):

Keep only businesses with no booking system (no Reserve with Google, no third-party platform).

## `openNowOnly` (type: `boolean`):

Keep only places Google currently marks as open. Places with unknown opening status are excluded.

## `skipClosedPlaces` (type: `boolean`):

Exclude businesses Google marks with a closed status.

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

Keep only businesses rated at or above this (1-5). Unrated businesses are excluded when set.

## `maxRating` (type: `number`):

Keep only businesses rated at or below this (1-5) вЂ” find reputation problems to fix.

## `minReviews` (type: `integer`):

Keep only businesses with at least this many Google reviews. Unreviewed businesses are excluded when set.

## `maxReviews` (type: `integer`):

Keep only businesses with no more than this many Google reviews. Leave empty or zero for no upper limit.

## `nameFilter` (type: `string`):

Optional text to match against the business name, for example 'Hilton' or 'McDonald’s'.

## `nameMatching` (type: `string`):

Match the name exactly or keep names containing the filter text.

## `googleCategoryFilter` (type: `array`):

Keep only businesses whose Google category contains any of these words, e.g. 'pizza'.

## `enrich` (type: `boolean`):

Visit each business website to pull the best email, socials, CMS, and website problems (no HTTPS, expired SSL, no mobile, outdated CMS, no booking, hiring). Adds a priority score and a suggested offer, and sorts highest-intent first. Slower.

## `enrichmentMode` (type: `string`):

Fast contacts finds email and social profiles with high parallelism. Full website audit also checks CMS, SSL, mobile readiness, speed, booking, and hiring signals.

## `verifyEmails` (type: `boolean`):

Drop malformed, disposable, and no-DNS addresses so what you get is mailable. Requires enrichment.

## `requireEmail` (type: `boolean`):

Keep only leads where an email was found. Requires enrichment.

## `minPriorityScore` (type: `integer`):

Keep only leads scoring at or above this (0-100). Requires enrichment.

## `trackChanges` (type: `boolean`):

Remember businesses between runs and tag each lead new / changed / unchanged (with first-seen / last-seen). Ideal on a schedule.

## `onlyFresh` (type: `boolean`):

With monitor mode on, return only leads new or changed since the last run. Ignored if monitor mode is off.

## `maxResults` (type: `integer`):

Safety cap applied before website/email enrichment. Filters such as Only leads with an email, verified email, minimum score, website, phone, rating, or fresh-only monitoring can reduce the final number of Dataset rows below this value.

## `fastMode` (type: `boolean`):

Return a quick sample for validation and lightweight workflows. Use standard mode for broader coverage.

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

Parallel workers used to discover businesses. Default 250 is recommended. Increase only when your proxy pool and Actor memory can support it.

## `enrichmentConcurrency` (type: `integer`):

Parallel website checks used when contact enrichment is enabled. Default 500 is optimized for Fast contacts. Full website audit is automatically capped at 100.

## `deepContactPages` (type: `boolean`):

When the homepage has no email, inspect likely contact and about pages. Improves email coverage but makes enrichment slower.

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

Language code for result labels (e.g. 'en', 'de'). Empty = the country's own language.

## `lat` (type: `string`):

Center latitude. Example: `41.8781`. To search by coordinates, also provide Longitude and Area span. Coordinates override City.

## `lng` (type: `string`):

Center longitude. Example: `-87.6298`. Used together with Latitude and Area span.

## `span` (type: `string`):

Area width in degrees around the center. Example: `0.20` is roughly a medium-sized city area. Used only with custom coordinates.

## `north` (type: `number`):

Northern edge. Set north, south, east and west together to define an exact rectangle. The bounding box overrides both city and center coordinates.

## `south` (type: `number`):

Southern latitude.

## `east` (type: `number`):

Eastern longitude. Dateline-crossing boxes are not supported.

## `west` (type: `number`):

Western longitude.

## Actor input object example

```json
{
  "country": "us",
  "city": "Boise",
  "categories": [
    "restaurant",
    "cafe",
    "bar",
    "bakery",
    "fast food restaurant",
    "pizza restaurant",
    "hotel",
    "motel",
    "dentist",
    "doctor",
    "medical clinic",
    "pharmacy",
    "chiropractor",
    "physiotherapist",
    "psychologist",
    "veterinarian",
    "hair salon",
    "barber shop",
    "beauty salon",
    "nail salon",
    "spa",
    "massage therapist",
    "fitness center",
    "gym",
    "plumber",
    "electrician",
    "HVAC contractor",
    "roofing contractor",
    "general contractor",
    "painter",
    "landscaper",
    "cleaning service",
    "pest control service",
    "locksmith",
    "auto repair shop",
    "car dealer",
    "used car dealer",
    "tire shop",
    "auto body shop",
    "car wash",
    "towing service",
    "car rental agency",
    "real estate agency",
    "property management company",
    "mortgage broker",
    "insurance agency",
    "lawyer",
    "accountant",
    "tax preparation service",
    "financial advisor",
    "marketing agency",
    "advertising agency",
    "web design company",
    "software company",
    "IT support service",
    "business consultant",
    "employment agency",
    "coworking space",
    "retail store",
    "clothing store",
    "furniture store",
    "electronics store",
    "hardware store",
    "florist",
    "jewelry store",
    "pet store",
    "school",
    "day care center",
    "driving school",
    "photographer",
    "event planner",
    "wedding venue",
    "travel agency",
    "moving company"
  ],
  "customSearchTerms": [],
  "websiteFilter": "any",
  "requirePhone": false,
  "onlyNoBooking": false,
  "openNowOnly": false,
  "skipClosedPlaces": false,
  "nameMatching": "includes",
  "enrich": false,
  "enrichmentMode": "contacts",
  "verifyEmails": false,
  "requireEmail": false,
  "trackChanges": false,
  "onlyFresh": false,
  "maxResults": 5000,
  "fastMode": false,
  "concurrency": 250,
  "enrichmentConcurrency": 500,
  "deepContactPages": false
}
```

# 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 = {
    "country": "us",
    "city": "Boise",
    "customSearchTerms": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/google-maps-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 = {
    "country": "us",
    "city": "Boise",
    "customSearchTerms": [],
}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/google-maps-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 '{
  "country": "us",
  "city": "Boise",
  "customSearchTerms": []
}' |
apify call apivault_labs/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apivault_labs/google-maps-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/1j1jHccVPXZbsYZGL/builds/AiD4sl2JqS49jfbz7/openapi.json
