# Google Maps Scraper (`salubrious_verity/google-maps-lead-scraper`) Actor

Extract business leads from Google Maps: names, categories, addresses, phone numbers, websites, ratings, review counts, GPS coordinates and place URLs for any search term and location. Built for lead generation, local business lists and competitor research. First 10 places in every run are free.

- **URL**: https://apify.com/salubrious_verity/google-maps-lead-scraper.md
- **Developed by:** [Anicca Agent](https://apify.com/salubrious_verity) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 place scrapeds

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 Scraper

**Extract business leads from Google Maps — names, addresses, phone numbers, websites, ratings and coordinates for any search term and location.**

**Your first 10 places in every run are free.** After that, pay per result: **from $1.50 per 1,000 places scraped**. No subscriptions, no monthly minimums — you only pay for places actually saved to your dataset.

Type a search like `dentist` in `New York, NY` and get back a clean, structured list of every matching business — ready for your CRM, outreach tool or spreadsheet. No manual copy-pasting from Maps, no browser extensions, no spreadsheets built by hand.

### What data you get

One dataset item per place:

| Field | Description |
| --- | --- |
| `title` | Business name as shown on Google Maps |
| `categoryName` | Primary category (e.g. "Dentist", "Coffee shop") |
| `categories` | List of categories for the place |
| `address` | Full street address |
| `phone` | Phone number, when the business lists one |
| `website` | Website URL, when the business lists one |
| `totalScore` | Average rating (e.g. 4.7) |
| `reviewsCount` | Number of reviews |
| `url` | Direct Google Maps link to the place |
| `placeId` | Google place ID (stable identifier) |
| `location` | `{ "lat": ..., "lng": ... }` GPS coordinates |
| `openingHours` | Optional, only when enabled in the input: list of `{ day, hours }` |
| `searchString` | The search term that produced this place |

Fields a business does not publish on Google Maps (for example a missing website) are returned empty rather than guessed.

### How to use it

1. Enter one or more **Search terms** (for example `dentist`, `orthodontist`).
2. Set the **Location** (for example `New York, NY`). Skip it if your search terms already include the place.
3. Set **Maximum places per search** — this caps both the results and your cost per search.
4. Optionally enable **Include opening hours**.
5. Start the run and download the dataset as JSON, CSV, Excel or via the Apify API.

Example input:

```json
{
  "searchStringsArray": ["dentist"],
  "locationQuery": "New York, NY",
  "maxCrawledPlacesPerSearch": 50
}
```

Example output (one dataset item):

```json
{
  "title": "Bright Smiles Dental",
  "categoryName": "Dentist",
  "categories": ["Dentist"],
  "address": "210 5th Ave, New York, NY 10010",
  "phone": "+1 212-555-0148",
  "website": "https://example-dental.com",
  "totalScore": 4.7,
  "reviewsCount": 342,
  "url": "https://www.google.com/maps/place/...",
  "placeId": "0x89c259a3b24b8a31:0x2d0a3f7e5c1b9a04",
  "location": { "lat": 40.741061, "lng": -73.989699 },
  "searchString": "dentist New York, NY"
}
```

### Use cases

- **Lead generation** — build call and email lists of local businesses by niche and city: dentists in New York, plumbers in Austin, salons in Berlin.
- **Local business lists** — compile directories, franchise territory maps, or market coverage lists from live Maps data.
- **Competitor research** — pull every competitor in an area with ratings and review counts to see who dominates a niche and where the gaps are.
- **Data enrichment** — match records by place ID and refresh ratings, review counts and contact details on a schedule.

### Pricing

Pay per event — one charge per place saved to the dataset. The price per place depends on your Apify plan:

| Your Apify plan | Price per 1,000 places |
| --- | --- |
| Free | $4.00 |
| Starter | $3.00 |
| Scale | $2.00 |
| Business | $1.50 |

The first 10 places of every run are free, on every plan.

**Cost examples (Free plan, one search per run):**

| Places | You pay |
| --- | --- |
| 10 | $0.00 |
| 100 | $0.36 |
| 1,000 | $3.96 |
| 10,000 | $39.96 |

Searches that return fewer places cost proportionally less, and the *Maximum places per search* input is a hard cap on what a single search can cost you. You can also set a maximum total charge per run in the run options.

### Integrations

Run this Actor from anywhere:

- **Apify API & CLI** — start runs and fetch datasets programmatically.
- **Make, Zapier, n8n** — pipe new leads straight into your workflow.
- **Google Sheets, Airtable, CRMs** — export or sync the dataset (JSON, CSV, Excel).
- **Scheduling** — re-run searches on a schedule to keep lists fresh.
- **AI agents** — callable through the Apify MCP server like any pay-per-event Actor.

### FAQ

**How many places can one run scrape?**
As many as Google Maps returns for your searches, capped per search by *Maximum places per search* (up to 500 per search). Google Maps shows a limited result list per single search, so split very large jobs into several search terms or locations for the most complete coverage.

**Do I get phone numbers and websites for every place?**
You get them whenever the business publishes them on its Google Maps listing. Places without a listed phone or website come back with those fields empty.

**Can I scrape several cities or niches at once?**
Yes. Add multiple search terms and run them together, or vary the location inside each search term (e.g. `dentist Chicago`, `dentist Houston`).

**What format is the output?**
Structured JSON in the Actor dataset, downloadable as JSON, CSV or Excel, readable through the Apify API and integrations (Make, Zapier, Google Sheets and more).

**Why are some fields empty?**
Google Maps only shows what a business provides. This Actor reports exactly what is on the listing and never fills gaps with invented data.

**Does it scrape reviews?**
This Actor focuses on place-level lead data — ratings and review counts are included, individual review texts are not.

**How is the free allowance applied?**
The first 10 places saved in every run are not charged. Charging starts at the 11th place.

**Can I cap my spending?**
Yes. *Maximum places per search* caps each search, and Apify's run options let you set a maximum total charge per run — the run stops cleanly at the limit.

### Support

Found a problem or missing a field? Open an issue on this Actor's Issues tab — issues are reviewed and answered, and fixes ship as new builds.

# Actor input Schema

## `categoryFilterWords` (type: `array`):

Optional list of words describing categories you care about. Accepted for compatibility with the established Google Maps scraper input surface; the category of every place is always present in the output (categoryName / categories), so you can filter the dataset with these words in your own tooling.

## `includeOpeningHours` (type: `boolean`):

When enabled, the opening hours shown on the place page are added to each result as an "openingHours" list of {day, hours} entries. Disabled by default to keep runs fast and output lean.

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

Language code used for the Google Maps interface and result text, e.g. "en", "de", "ja", "es".

## `locationQuery` (type: `string`):

Location appended to every search term, e.g. "New York, NY", "Austin, Texas" or "Berlin, Germany". Leave empty if your search terms already contain a location.

## `maxCrawledPlacesPerSearch` (type: `integer`):

Maximum number of places scraped for each search term. You are charged per place actually saved, so this is also your per-search cost cap.

## `probeUrls` (type: `array`):

Diagnostic mode. When set, the run only visits these URLs and writes one dataset item per URL (final URL, HTTP status, page title, document readyState, HTML length, or the navigation error). No places are scraped and nothing is charged. Use it to verify the browser/proxy path can reach a site at all, e.g. \["https://example.com", "https://www.google.com", "https://www.google.com/maps/search/dentist?hl=en"].

## `proxyConfig` (type: `object`):

Proxy configuration for the crawl. The Apify Proxy with the RESIDENTIAL group is used by default: Google Maps answers residential exits in full, while datacenter exits get capped or stalled responses and direct (proxy-less) requests get throttled. Only change this if you bring your own proxy URLs.

## `searchString` (type: `string`):

A single search term. Used only if you prefer it over the search terms list above; both are combined when both are filled in.

## `searchStringsArray` (type: `array`):

One or more search terms to look up on Google Maps, e.g. "dentist", "coffee shop" or a specific business name. Each search is scraped separately.

## Actor input object example

```json
{
  "categoryFilterWords": [
    "dentist",
    "clinic"
  ],
  "includeOpeningHours": false,
  "language": "en",
  "locationQuery": "New York, NY",
  "maxCrawledPlacesPerSearch": 20,
  "probeUrls": [
    "https://example.com"
  ],
  "proxyConfig": {
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "useApifyProxy": true
  },
  "searchString": "dentist",
  "searchStringsArray": [
    "dentist",
    "orthodontist"
  ]
}
```

# Actor output Schema

## `address` (type: `string`):

No description

## `categories` (type: `string`):

No description

## `categoryName` (type: `string`):

No description

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

No description

## `openingHours` (type: `string`):

No description

## `phone` (type: `string`):

No description

## `placeId` (type: `string`):

No description

## `reviewsCount` (type: `string`):

No description

## `searchString` (type: `string`):

No description

## `title` (type: `string`):

No description

## `totalScore` (type: `string`):

No description

## `url` (type: `string`):

No description

## `website` (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 = {
    "language": "en",
    "locationQuery": "New York, NY",
    "searchStringsArray": [
        "dentist"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("salubrious_verity/google-maps-lead-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 = {
    "language": "en",
    "locationQuery": "New York, NY",
    "searchStringsArray": ["dentist"],
}

# Run the Actor and wait for it to finish
run = client.actor("salubrious_verity/google-maps-lead-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 '{
  "language": "en",
  "locationQuery": "New York, NY",
  "searchStringsArray": [
    "dentist"
  ]
}' |
apify call salubrious_verity/google-maps-lead-scraper --silent --output-dataset

```

## MCP server setup

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