# Google Maps Places, Reviews & B2B Lead (`crawlio/google-maps-lead-extractor`) Actor

Extract 1,000 Google Maps businesses for $0.75🔥. Collect business names, addresses, ratings, reviews, email, phone numbers, websites, categories, and locations for lead generation and analytics.

- **URL**: https://apify.com/crawlio/google-maps-lead-extractor.md
- **Developed by:** [Crawlio](https://apify.com/crawlio) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 11 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 search results

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 Lead Extractor

### What does Google Maps Lead Extractor do?

Google Maps Lead Extractor enables you to get detailed business data, local search results, and customer reviews from [Google Maps](https://www.google.com/maps) directly using search terms or listing URLs.

Google Maps Lead Extractor can scrape:

- Local search results (lighter, faster payload)
- Full business details (contact info, address, opening hours, coordinates)
- Paginated customer reviews
- Scored local business leads (combining search and details)
- Optional lead enrichment with website emails and Google web results

### Why scrape Google Maps?

Google Maps has millions of businesses listed and is a great source of data for lead generation, competitive research, reputation management, and local market intelligence.

Here are just some of the ways you could use that data:

- Build detailed contact lists for B2B outreach and sales
- Analyze customer reviews and sentiment for specific competitors
- Track business ratings and popularity in specific areas
- Discover new businesses and map local market trends

If you would like more inspiration on how scraping Google Maps could help your business or organization, check out our [industry pages](https://apify.com/industries).

### How to scrape Google Maps

It's easy to scrape Google Maps with Google Maps Lead Extractor. Just follow these few steps and you'll get your data in a few minutes.

1. Click on **Try for free**.
2. Select operation:
   - **Search** -> Get basic search results fast
   - **Business Details** -> Get all information about a specific place
   - **Lead Generation** -> Get scored lead records with business details
   - **Reviews** -> Fetch paginated reviews for one place
3. Enter your search terms and locations, or target listing URLs.
4. Click on **Run**.
5. When Google Maps Lead Extractor has finished, preview or download your data from the **Dataset** tab.

### Supported operations

The Actor supports four operations:

- `search` - fetch fast Google Maps search results
- `details` - fetch full business details from a Google Maps URL or ID
- `lead_generation` - fetch scored lead records with Google Maps details
- `reviews` - fetch paginated reviews for a specific place

Search is the default mode for new runs.

***

#### Search

**Example input:**

```json
{
  "mode": "search",
  "searchTerms": [
    "dentist"
  ],
  "locations": [
    "Jackson Heights NY"
  ],
  "numberOfPlaces": 20
}
```

**Example output:**

```json
{
  "title": "Sams Family Dental Care",
  "totalScore": 4.2,
  "reviewsCount": 277,
  "street": "3766 82nd St",
  "city": "Jackson Heights",
  "state": "NY",
  "countryCode": "NY 11372",
  "website": "",
  "phone": "",
  "categories": [
    "Dentist"
  ],
  "url": "https://www.google.com/maps/search/?api=1&query=Sams%20Family%20Dental%20Care...",
  "categoryName": "Dentist",
  "searchTerm": "dentist",
  "query": "dentist in Jackson Heights NY",
  "location": "Jackson Heights NY",
  "resultType": "search_result"
}
```

#### Lead Generation

**Example input:**

```json
{
  "mode": "lead_generation",
  "searchTerms": [
    "dentist"
  ],
  "locations": [
    "Jackson Heights NY"
  ],
  "numberOfPlaces": 20,
  "enrichDetails": true
}
```

**Example output:**

```json
{
  "name": "Ramos Dental P.C.",
  "place_id": "0x89c25fa8a4b143f9:0x2f0a9fa338d85770",
  "place_id_chij": "ChIJ-UOxpKhfwokRcFfYOKOfCi8",
  "google_maps_url": "https://www.google.com/maps/search/?api=1&query=Ramos%20Dental%20P.C.&query_place_id=ChIJ-UOxpKhfwokRcFfYOKOfCi8",
  "source_query": "dentist in Jackson Heights NY",
  "address": "35-53 82nd St # 1e, Jackson Heights, NY 11372",
  "category": "Dentist",
  "phone": "(718) 426-4176",
  "website": "",
  "emails": [],
  "about": {
    "accessibility": { "title": "Accessibility", "attributes": [ ... ] },
    "offerings": { "title": "Offerings", "attributes": [ ... ] }
  },
  "neighborhood": "Jackson Heights",
  "country_code": "US",
  "opening_status": "Open - Closes 6 PM",
  "owner_name": "Ramos Dental P.C. (Owner)",
  "review_histogram": {
    "star_1": 18,
    "star_2": 0,
    "star_3": 1,
    "star_4": 7,
    "star_5": 162,
    "total": 188
  },
  "rating": 4.6,
  "review_count": 188,
  "latitude": 40.750296999999996,
  "longitude": -73.884108,
  "lead_score": 85,
  "lead_grade": "A",
  "lead_signals": [
    "missing_website",
    "has_phone",
    "has_about_attributes",
    "multi_category_listing",
    "owner_managed_listing",
    "high_review_volume",
    "strong_reputation"
  ],
  "missing_fields": [
    "website"
  ],
  "resultType": "lead"
}
```

#### Business Details

**Example input:**

```json
{
  "mode": "details",
  "placeInput": "https://www.google.com/maps/place/ChIJN1t_tDeuEmsRUsoyG83frY4"
}
```

**Example output:**

```json
{
  "place_id": "0x6b12ae37b47f5b37:0x8eaddfcd1b32ca52",
  "place_id_chij": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "name": "Google Sydney - Pirrama Road",
  "address": "Ground Floor/48 Pirrama Rd, Pyrmont NSW 2009, Australia",
  "phone": "+61 2 9374 4000",
  "website": "http://google.com/",
  "category": "Corporate office",
  "rating": 4.0,
  "review_count": 1176,
  "latitude": -33.866489,
  "longitude": 151.1958561,
  "opening_status": "Closed - Opens 8:30 AM Mon",
  "resultType": "details"
}
```

#### Reviews

**Example input:**

```json
{
  "mode": "reviews",
  "placeInput": "https://www.google.com/maps/place/ChIJN1t_tDeuEmsRUsoyG83frY4",
  "maxReviews": 20,
  "sortBy": "newest"
}
```

**Example output:**

```json
{
  "reviewer_name": "Mark I-P",
  "reviewer_url": "https://www.google.com/maps/contrib/102042907633685184592?hl=en",
  "rating": 2,
  "text": "Google pixel 10, I have owned Pixel phones since Google launched their phones...",
  "time_description": "Edited 3 months ago",
  "timestamp": 1768005103358557,
  "is_local_guide": true,
  "photos": [],
  "owner_reply": "",
  "resultType": "review",
  "place_id": "0x6b12ae37b47f5b37:0x8eaddfcd1b32ca52"
}
```

***

### Is it legal to scrape Google Maps?

Note that personal data is protected by GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

We also recommend that you read our blog post: [is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

## `mode` (type: `string`):

Choose the extraction profile. Search is cheapest.

## `search` (type: `object`):

Configure settings for search.

## `lead_generation` (type: `object`):

Configure settings for local business leads.

## `details` (type: `object`):

Configure settings for single business details.

## `reviews` (type: `object`):

Configure settings for scraping reviews.

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

Google language.

## `gl` (type: `string`):

Google country code.

## `minScore` (type: `integer`):

Filter leads below this score (0-100). Applies to lead generation.

## `maxWorkers` (type: `integer`):

Parallel workers for lead generation only. Higher values may be faster but can increase Google blocking or proxy usage.

## Actor input object example

```json
{
  "mode": "search",
  "search": {
    "searchTerms": [
      "dentist"
    ],
    "locations": [
      "Jackson Heights NY"
    ],
    "numberOfPlaces": 20
  },
  "lead_generation": {
    "placeInput": "",
    "searchTerms": [
      "dentist"
    ],
    "locations": [
      "Jackson Heights NY"
    ],
    "numberOfPlaces": 20,
    "enrichDetails": false,
    "enrichWebsites": false,
    "enrichGoogleWebResults": false,
    "maxReviews": 20
  },
  "language": "English",
  "gl": "us",
  "minScore": 0,
  "maxWorkers": 4
}
```

# Actor output Schema

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

One dataset item per returned result.

## `runSummary` (type: `string`):

Summary stored in the OUTPUT record of 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 = {
    "search": {
        "searchTerms": [
            "dentist"
        ],
        "locations": [
            "Jackson Heights NY"
        ],
        "numberOfPlaces": 20
    },
    "lead_generation": {
        "placeInput": "",
        "searchTerms": [
            "dentist"
        ],
        "locations": [
            "Jackson Heights NY"
        ],
        "numberOfPlaces": 20,
        "enrichDetails": false,
        "enrichWebsites": false,
        "enrichGoogleWebResults": false,
        "maxReviews": 20
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlio/google-maps-lead-extractor").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 = {
    "search": {
        "searchTerms": ["dentist"],
        "locations": ["Jackson Heights NY"],
        "numberOfPlaces": 20,
    },
    "lead_generation": {
        "placeInput": "",
        "searchTerms": ["dentist"],
        "locations": ["Jackson Heights NY"],
        "numberOfPlaces": 20,
        "enrichDetails": False,
        "enrichWebsites": False,
        "enrichGoogleWebResults": False,
        "maxReviews": 20,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlio/google-maps-lead-extractor").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 '{
  "search": {
    "searchTerms": [
      "dentist"
    ],
    "locations": [
      "Jackson Heights NY"
    ],
    "numberOfPlaces": 20
  },
  "lead_generation": {
    "placeInput": "",
    "searchTerms": [
      "dentist"
    ],
    "locations": [
      "Jackson Heights NY"
    ],
    "numberOfPlaces": 20,
    "enrichDetails": false,
    "enrichWebsites": false,
    "enrichGoogleWebResults": false,
    "maxReviews": 20
  }
}' |
apify call crawlio/google-maps-lead-extractor --silent --output-dataset

```

## MCP server setup

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

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/f9NobDfC9itEMezue/builds/B5yRMXeEBLhixCPZp/openapi.json
