# Google Maps Lead Extractor: Phones, Ratings & Review Counts (`nezha/google-maps-scraper-plus`) Actor

Turn keywords and one location into a qualified Google Maps sales lead list with phones, websites, ratings, review counts, addresses, service options, and business details. Export to CSV, Excel, or JSON.

- **URL**: https://apify.com/nezha/google-maps-scraper-plus.md
- **Developed by:** [nezha](https://apify.com/nezha) (community)
- **Categories:** Lead generation, SEO tools, Travel
- **Stats:** 9 total users, 0 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.0012 / result

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Extractor: Phones, Ratings & Review Counts

Turn keywords and a location into a qualified Google Maps sales lead list with business names, phones, websites, ratings, review counts, addresses, and richer local business detail fields.

### What this Actor does

This Actor is designed for lead generation teams that want a clean local prospect list, not just a map scrape. Enter keywords plus one location, and the Actor returns structured business leads ready for outreach, qualification, and export.

Typical workflows include:

- prospecting local businesses by category and city
- qualifying leads by review count, rating, and website presence
- comparing competitors and local demand signals before outreach
- exporting sales-ready lead lists to CSV, Excel, or JSON

### Quick start

1. Set `maxBusinesses` first. The default is `10` for preview runs.
2. Enter one or more `keywords` and one `location`.
3. Keep `includeDetails: true` if you want the full lead detail fields.
4. Click **Run**.
5. Download the dataset from Apify as CSV, Excel, or JSON.

### Use cases

**Sales prospecting**\
Pull local businesses in a target city, then export phone numbers, websites, addresses, ratings, service options, and business details for outreach.

**Local SEO research**\
Compare categories, ratings, review counts, review tags, website coverage, and business attributes to quickly spot businesses with strong demand but weak digital presence.

**Market research**\
Measure business density in a target area, inspect category coverage, compare nearby competitors, and see how different neighborhoods or cities are distributed.

### Output preview

Here is a simplified example of the business records you can download after a run:

| Business | Category | Phone | Website | Rating | Reviews | Address |
| --- | --- | --- | --- | --- | --- | --- |
| Blue Bottle Coffee | Coffee shop, Cafe | +1 510-653-3394 | bluebottlecoffee.com | 4.6 | 1,860 | 54 Mint Plaza, San Francisco, CA 94103 |
| Stumptown Coffee Roasters | Coffee shop, Cafe | +1 347-414-7800 | stumptowncoffee.com | 4.5 | 1,248 | 30 W 8th St, New York, NY 10011 |
| Devocion | Coffee shop, Cafe | +1 646-590-3365 | devocion.com | 4.7 | 980 | 69 Grand St, Brooklyn, NY 11249 |

The same record can also include richer fields such as:

| Extra field group | Example value |
| --- | --- |
| Business status | Closed, price range, primary category |
| Location detail | street, district, postal code, neighborhood, plus code |
| Review intelligence | review count, review distribution, review tags, sample reviews |
| Service options | delivery, takeout, dine-in, accessibility, payments |
| Media signals | main picture, menu pictures, highlight pictures, videos |
| Market context | people also search, popular times, image categories |

You still get the full dataset export in CSV, Excel, or JSON. This preview is only here to make the output easier to scan at a glance while still showing the depth of the data.

Typical fields include:

- business identity: `title`, `categoryName`, `categories`, `placeId`, `cid`, `kgmid`
- contact and lead fields: `phone`, `website`, `address`, `street`, `district`, `postalCode`
- geo fields: `city`, `countryCode`, `location.lat`, `location.lng`, `plusCode`, `plusCodeUrl`
- conversion signals: `totalScore`, `reviewCount`, `currentStatus`, `priceRange`, `delivery`
- review intelligence: `reviewsDistribution`, `reviewsTags`, `reviews`
- service and attribute data: `additionalInfo`, `openingHours`
- media and visibility data: `mainPicture`, `menuPictures`, `highlightPictures`, `videos`, `imageCategories`
- competitor and demand signals: `peopleAlsoSearch`, `popularTime`

#### Full JSON preview

If you want to inspect a more complete example record, open the preview below.

<details>
<summary>Show full example JSON record</summary>

```json
{
  "searchKeyword": "coffee shop",
  "searchLocation": "Seattle, Washington",
  "searchString": "coffee shop in Seattle, Washington",
  "fid": "0x54906a17f0f1e7ab:0x1d0b8d8d4c4a9b5e",
  "cid": "2094471805123456782",
  "placeId": "ChIJxxxxxxxxxxxxxxxxxxxxxx",
  "kgmid": "/g/11xxxxxxxx",
  "title": "Moonshot Coffee",
  "categoryName": "coffee shop",
  "categories": ["Coffee shop"],
  "address": "9622 16th Ave SW, Seattle, WA 98106, United States",
  "street": "9622 16th Ave SW",
  "district": "Seattle",
  "postalCode": "98106",
  "city": "Seattle",
  "countryCode": "US",
  "location": {
    "lat": 47.5169,
    "lng": -122.3548
  },
  "phone": "+1 206-620-0315",
  "phoneUnformatted": "+12066200315",
  "website": "http://toasttab.com/moonshotcoffee",
  "url": "https://www.google.com/maps/search/?api=1&query=Moonshot+Coffee&query_place_id=ChIJxxxxxxxxxxxxxxxxxxxxxx",
  "totalScore": 4.8,
  "reviewCount": 298,
  "currentStatus": "Closed",
  "priceRange": "$10-20",
  "delivery": "In-store shopping",
  "plusCode": "GJ8W+J2 Seattle, WA",
  "plusCodeUrl": "https://plus.codes/GJ8W+J2",
  "openingHours": [
    { "day": "Monday", "hours": "6 AM-4 PM" },
    { "day": "Tuesday", "hours": "6 AM-4 PM" }
  ],
  "reviewsDistribution": {
    "oneStar": 4,
    "twoStar": 6,
    "threeStar": 13,
    "fourStar": 58,
    "fiveStar": 217
  },
  "reviewsTags": [
    { "title": "barista", "count": 35 },
    { "title": "latte", "count": 25 },
    { "title": "espresso", "count": 15 }
  ],
  "reviews": [
    {
      "name": "Local Guide",
      "rating": 5,
      "text": "Great coffee and friendly staff.",
      "likesCount": 0
    }
  ],
  "additionalInfo": [
    {
      "title": "Service options",
      "properties": {
        "Delivery": true,
        "Takeout": true,
        "Dine-in": true
      }
    },
    {
      "title": "Payments",
      "properties": {
        "Debit cards": true,
        "NFC mobile payments": true
      }
    }
  ],
  "peopleAlsoSearch": [
    {
      "category": "People also search for",
      "title": "Dubsea Coffee",
      "reviewsCount": 568,
      "totalScore": 4.6
    }
  ],
  "popularTime": [
    {
      "day": "Saturday",
      "hours": [[8, 60], [9, 84], [10, 92]]
    }
  ],
  "imageCategories": ["Menu", "Food & drink", "Vibe", "Coffee"],
  "mainPicture": "https://lh3.googleusercontent.com/p/AF1QipExample",
  "menuPictures": ["https://lh3.googleusercontent.com/p/MenuExample"],
  "highlightPictures": ["https://lh3.googleusercontent.com/p/HighlightExample"],
  "videos": ["https://video.example.com/clip.mp4"]
}
```

</details>

### Pricing

This Actor now uses event-based pricing:

- `Result`: `$0.001` for each business record saved to the dataset
- `Actor start`: `$0.00005` for each run

In practice:

- A fast preview with `maxBusinesses: 10` is typically about `$0.01005`.
- A larger run with `maxBusinesses: 1000` is typically about `$1.00005`.
- `includeDetails` changes how rich each lead record is, while total cost is still mainly driven by how many businesses you save to the dataset.

### Examples

#### Example input

```json
{
  "keywords": ["dentist", "orthodontist"],
  "location": "Austin, Texas",
  "maxBusinesses": 50,
  "includeDetails": true,
  "batchDetailsPerQuery": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "countryCode": "US"
  }
}
```

### Best practices

- Use `keywords` plus `location` as the main workflow for first runs and repeatable exports.
- Keep `includeDetails` enabled if you want richer output by default.
- Use `maxBusinesses` to keep first runs small and fast, then set it explicitly for production exports.

For production runs, do not leave `maxBusinesses` on the default `10`. Set it deliberately to match the export size you need.

### Useful output fields

- `title`
- `categories`
- `phone`
- `website`
- `address`
- `location.lat`
- `location.lng`
- `totalScore`
- `reviewCount`
- `openingHours`
- `url`

### Notes

- This Actor currently focuses on business listing data available from Google Maps results and business detail pages.
- It does not promise email extraction.
- You can export results directly from the dataset in CSV, Excel, or JSON formats.

### Why the dataset feels complete

This Actor does more than return a bare list of business names.

- You get lead-ready fields such as phone, website, address, and coordinates.
- You get operating and offer context such as opening hours, delivery, accessibility, payments, and other service attributes.
- You get review intelligence such as review counts, review distribution, review tags, and sample reviews.
- You get visibility and content signals such as main pictures, menu pictures, videos, and image categories.
- You get competitor context such as `peopleAlsoSearch` and demand context such as `popularTime`.

That combination makes the export useful not just for lead generation, but also for qualification, segmentation, competitor mapping, and local market analysis.

### API access

Developers can run this Actor programmatically through the Apify API or the Apify Python and JavaScript clients.

- API reference: [Apify API](https://docs.apify.com/api/v2)
- Client docs: [Apify clients](https://docs.apify.com/api/client)

# Actor input Schema

## `maxBusinesses` (type: `integer`):

Maximum number of businesses to save. Default is 10 for a fast preview. For production runs, set this value explicitly based on the export size you actually want.

## `keywords` (type: `array`):

Business types or search terms to look up, for example 'coffee shop', 'restaurant', or 'hotel'.

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

City, region, or area to search in, for example 'New York, New York' or 'Austin, Texas'.

## `includeDetails` (type: `boolean`):

Recommended. When enabled, enrich each lead with deeper fields such as plus codes, opening hours, review signals, business attributes, and other detail data. Disable this only if you want a faster lightweight preview run.

## `batchDetailsPerQuery` (type: `integer`):

Number of business detail pages to open simultaneously when Include Detail Fields is enabled. Higher values are faster but use more resources.

## `requestTimeoutSecs` (type: `integer`):

Timeout in seconds for each geocoding request and geocoding browser fallback request.

## `retryCount` (type: `integer`):

Maximum retry attempts for geocoding requests.

## `requestDelayMs` (type: `integer`):

Delay between geocoding retries or endpoint fallback attempts.

## `nominatimBaseUrl` (type: `string`):

Optional primary Nominatim-compatible base URL, for example https://nominatim.openstreetmap.org or an internal mirror.

## `nominatimFallbackBaseUrls` (type: `array`):

Optional fallback Nominatim-compatible base URLs tried in order when the primary endpoint fails.

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "maxBusinesses": 10,
  "keywords": [
    "coffee shop"
  ],
  "location": "New York, New York",
  "includeDetails": true,
  "batchDetailsPerQuery": 3,
  "requestTimeoutSecs": 20,
  "retryCount": 3,
  "requestDelayMs": 1000
}
```

# Actor output Schema

## `overview` (type: `string`):

Overview view of scraped businesses.

## `detailed` (type: `string`):

Detailed business information view.

## `reviews` (type: `string`):

Reviews and ratings view.

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

Location details view.

## `locationFailures` (type: `string`):

Structured geocoding or location preprocessing failures for the current run.

## `outputSummary` (type: `string`):

Summary metadata for the current run.

# 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 = {
    "maxBusinesses": 10,
    "keywords": [
        "coffee shop"
    ],
    "location": "New York, New York",
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("nezha/google-maps-scraper-plus").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 = {
    "maxBusinesses": 10,
    "keywords": ["coffee shop"],
    "location": "New York, New York",
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("nezha/google-maps-scraper-plus").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 '{
  "maxBusinesses": 10,
  "keywords": [
    "coffee shop"
  ],
  "location": "New York, New York",
  "includeDetails": true
}' |
apify call nezha/google-maps-scraper-plus --silent --output-dataset

```

## MCP server setup

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

```

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/d4zi2meZ9p0l1YCTd/builds/KleDi0L8knj35CFxX/openapi.json
