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

Scrape Google Maps business leads by keyword via the GMaps Lead Finder Agent API. Returns name, phone, website, emails, address, ratings, and more.

- **URL**: https://apify.com/saaspro/google-maps-scraper.md
- **Developed by:** [Mike Jr](https://apify.com/saaspro) (community)
- **Stats:** 1 total users, 0 monthly users, 0.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/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

### What does Google Maps Scraper do?

**Google Maps Scraper** extracts business leads from Google Maps for a **single search keyword**. Give it a query like `dentists in Austin TX`, and it returns structured place data you can export to JSON, CSV, Excel, or feed into automations.

This Actor wraps the [GMaps Lead Finder](https://gmapsleadfinder.com) Agent API. You bring your own API key (**BYOK**). Scraping credits are charged on your GMaps Lead Finder account; Apify only charges for the platform compute used while the Actor runs.

#### What data can you extract?

Typical fields include (exact columns follow your GMaps Lead Finder export preferences):

| Field | Description |
| --- | --- |
| Name | Business name |
| Phone / Phones | Contact numbers |
| Website / Domain | Website URL and domain |
| Emails | Public emails when found |
| Fulladdress / Street / Municipality | Address parts |
| Categories / About | Category and description |
| Average Rating / Review Count | Ratings |
| Google Maps URL / Place Id | Maps identity |
| Social links | Facebook, Instagram, LinkedIn, etc. when found |
| Search Keyword | The keyword you ran |

Empty email or social fields mean nothing public was found — the Actor does **not** invent contacts.

#### Why use it on Apify?

- Run from Console, API, or schedule
- Export datasets and connect to Zapier, Make, n8n, Google Sheets, and more
- Monitor runs, retries, and logs in one place
- Same Actor API for scripts and agents

***

### How to use

1. Create a [GMaps Lead Finder](https://gmapsleadfinder.com) account on a **Growth+** plan (Agent API access).
2. Copy your API key from [Account → API key](https://gmapsleadfinder.com/account#api-key). Keys look like `gmf_` + hex.
3. Open this Actor on Apify → **Input**.
4. Set **Search keyword** (one query) and paste **API key**.
5. Optionally set **Max results** to cap how many places are written to the dataset.
6. Click **Start**. When the run finishes, open the **Dataset** tab (or use the Apify API) to download results.

#### Input example

```json
{
    "keyword": "dentists in Austin TX",
    "apiKey": "gmf_your_key_here",
    "maxResults": 100
}
```

| Field | Required | Description |
| --- | --- | --- |
| `keyword` | Yes | Exactly one Google Maps search query (1–500 characters). |
| `apiKey` | Yes | Your GMaps Lead Finder key (`gmf_…`). Marked secret in the UI. |
| `maxResults` | No | Cap rows pushed to the Apify dataset. Billing on GMaps Lead Finder still follows places returned by the job. |

#### Output example

Each dataset item is one place (field names match export column headers):

```json
{
    "Name": "Austin Dental Care",
    "Phone": "+1 512-555-0100",
    "Website": "https://example.com",
    "Emails": "info@example.com",
    "Fulladdress": "123 Main St, Austin, TX 78701",
    "Categories": "Dentist",
    "Average Rating": "4.8",
    "Review Count": "212",
    "Google Maps URL": "https://www.google.com/maps/place/...",
    "Place Id": "ChIJ...",
    "Search Keyword": "dentists in Austin TX"
}
```

***

### How much does it cost?

#### Apify platform

This Actor uses **pay per usage**: you pay Apify for compute units consumed while the run is active (waiting for the hosted scrape job and writing the dataset). Light keyword runs are usually inexpensive because the heavy lifting happens on GMaps Lead Finder’s servers.

#### GMaps Lead Finder credits

Your API key’s account is charged **1 credit per place** returned. You need a **Growth or higher** plan for Agent API access. See [pricing](https://gmapsleadfinder.com/pricing).

Example: a keyword that returns 80 places uses about **80 credits** on GMaps Lead Finder, plus a small Apify compute charge for the Actor run.

***

### Tips for better results

- Put **business type + location** in the keyword (`plumbers in Brooklyn NY`, not just `plumbers`).
- Run **one keyword per Actor run**. The API accepts exactly one keyword per job.
- Only **one job** can run at a time per GMaps Lead Finder account. If you see a 409 error, wait for the other job to finish.
- Prefer specific neighborhoods or cities when national queries return too many (or too few) useful leads.

***

### FAQ

#### Is this an official Google product?

No. This Actor is **not** affiliated with, endorsed by, or sponsored by Google LLC. “Google Maps” is used only to describe the data source.

#### Why are Emails empty?

Empty `Emails` (or social fields) means no public contact was found for that place. That is normal and not an Actor failure.

#### What do common errors mean?

| Code | Meaning | What to do |
| --- | --- | --- |
| 401 | Bad or missing API key | Regenerate the key at the [account page](https://gmapsleadfinder.com/account#api-key) |
| 402 | No credits left | Top up or upgrade on [pricing](https://gmapsleadfinder.com/pricing) |
| 403 | Plan cannot use Agent API | Upgrade to Growth+ |
| 409 | Another job is in flight | Wait, then retry |
| Timeout | Job took too long | Retry or narrow the keyword |

#### Can I scrape reviews or photos?

This Actor covers **keyword → business leads** only. Reviews and photos are available via the same GMaps Lead Finder API / SDKs; separate Actors may be published later.

#### How do I call it from code?

Use the [Apify API](https://docs.apify.com/api/v2) or client libraries to start a run with the input JSON above, then fetch dataset items when the run succeeds. Full Agent API docs: [gmapsleadfinder.com/docs/api](https://gmapsleadfinder.com/docs/api).

***

### Local development

```bash
npm install
cp INPUT.example.json storage/key_value_stores/default/INPUT.json
## edit INPUT.json with your real gmf_ key
apify run
npm test
```

Deploy:

```bash
apify login
apify push
```

***

### Support

- API docs: https://gmapsleadfinder.com/docs/api
- Get an API key: https://gmapsleadfinder.com/account#api-key
- Pricing: https://gmapsleadfinder.com/pricing

### Legal

Use scraped data in compliance with applicable laws, Google’s terms, and your own privacy obligations. You are responsible for how you process and store personal data obtained from public listings.

# Actor input Schema

## `keyword` (type: `string`):

Exactly one Google Maps search query, for example "dentists in Austin TX" or "coffee shops Berlin". Include the business type and location for best results.

## `apiKey` (type: `string`):

Your personal API key from https://gmapsleadfinder.com/account#api-key (Growth+ plan). Keys look like gmf\_ followed by hex. Never share this key publicly.

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

Optional cap on how many places to push to the dataset. Leave empty to return all places found for the keyword. GMaps Lead Finder still bills 1 credit per place returned by the job.

## Actor input object example

```json
{
  "keyword": "dentists in Austin TX"
}
```

# Actor output Schema

## `places` (type: `string`):

Dataset of Google Maps business leads for the search keyword.

# 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 = {
    "keyword": "dentists in Austin TX"
};

// Run the Actor and wait for it to finish
const run = await client.actor("saaspro/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 = { "keyword": "dentists in Austin TX" }

# Run the Actor and wait for it to finish
run = client.actor("saaspro/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 '{
  "keyword": "dentists in Austin TX"
}' |
apify call saaspro/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,saaspro/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/eURcgfflCyiT3XRVt/builds/gllp0gPj9zC9bYNIC/openapi.json
