# Google Maps Lead Scraper (`ayush_labs/gmaps-lead-scraper`) Actor

Extracts business leads (name, phone, address, website, rating, reviews) from Google Maps search results for any search term and location.

- **URL**: https://apify.com/ayush\_labs/gmaps-lead-scraper.md
- **Developed by:** [Ayush Khatiwada](https://apify.com/ayush_labs) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 Scraper

Turn any Google Maps search into a clean, structured list of business leads —
names, phone numbers, websites, addresses, and ratings — ready for cold
outreach, CRM import, or market research.

Give it a search like `dentists in Austin, TX` and it returns every listing it
finds as a row of structured data. No manual copy-paste, no browser extensions.

### What you get

Each result is one business, with these fields:

| Field | Type | Description |
| --- | --- | --- |
| `name` | string | Business name as shown on the listing |
| `category` | string | Primary Google category (e.g. "Dentist", "Coffee shop") |
| `phone` | string | Public phone number, when the listing shows one |
| `website` | string | Business website URL, when linked |
| `address` | string | Full street address |
| `rating` | number | Average star rating (e.g. `4.5`) |
| `reviewsCount` | integer | Total number of reviews |
| `googleMapsUrl` | string | Direct link back to the listing |
| `searchQuery` | string | The query this lead came from |
| `scrapedAt` | string | ISO 8601 timestamp of extraction |

Fields that a listing doesn't publish come back as `null` rather than being
omitted — so your rows always have the same shape and import cleanly into
spreadsheets and CRMs.

Export as JSON, CSV, Excel, or XML from the console, or pull it straight from
the API.

### Input

| Option | Type | Default | Description |
| --- | --- | --- | --- |
| `searchQueries` | array of strings | *required* | One search per line. Include the location for best results. |
| `maxResultsPerQuery` | integer | `30` | Cap on listings per query (1–500). |
| `maxConcurrency` | integer | `2` | Queries processed in parallel (1–10). Lower is more reliable. |
| `proxyConfiguration` | object | Apify Proxy on | Strongly recommended — Google rate-limits datacenter IPs quickly. |

#### Example input

```json
{
  "searchQueries": [
    "dentists in Austin, TX",
    "plumbers near Chicago, IL"
  ],
  "maxResultsPerQuery": 50,
  "maxConcurrency": 2,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Example output

```json
{
  "name": "Congress Avenue Dental",
  "category": "Dentist",
  "phone": "+1 512-555-0142",
  "website": "https://example-dental.com",
  "address": "1100 Congress Ave, Austin, TX 78701",
  "rating": 4.7,
  "reviewsCount": 312,
  "googleMapsUrl": "https://www.google.com/maps/place/...",
  "searchQuery": "dentists in Austin, TX",
  "scrapedAt": "2026-08-24T09:15:22.104Z"
}
```

### Typical uses

- **Cold outreach lists** — pull every plumber, dentist, or gym in a metro with
  a phone number attached.
- **Finding businesses without websites** — filter for `website: null` to spot
  prospects for web design or SEO services.
- **Competitor and market mapping** — see how many competitors operate in an
  area and how they rate.
- **Enriching an existing CRM** — match on name and address to backfill missing
  phone numbers and ratings.

### Tips for good results

- **Put the location in the query.** `"dentists in Austin, TX"` works far better
  than `"dentists"`, which leaves the location up to Google's guess.
- **Split large areas into several queries** rather than raising
  `maxResultsPerQuery` — Google's results feed stops loading after a few hundred
  entries per search, so ten city-level queries beat one state-level query.
- **Keep `maxConcurrency` at 1–3.** Higher values scrape faster but raise the
  chance of being rate-limited, which costs you more in retries than it saves.
- **Leave Apify Proxy enabled.** Without rotating IPs, Google will start serving
  blocks partway through a run.

### Limitations — please read

- **Only publicly visible listing data is extracted.** No emails, no personal
  profiles, no data behind a login.
- **Google changes its page structure periodically.** If fields suddenly come
  back `null`, the selectors likely need an update — please report it and it
  will be fixed.
- **Not every listing has every field.** Many small businesses never add a
  website or phone number; those come back `null`.
- **Result counts are approximate.** Google decides how many listings it will
  load for a given search, so a query capped at 100 may legitimately return
  fewer.
- **Review the terms that apply to you.** This extracts public data, but
  large-scale commercial scraping of Google properties runs against Google's
  Terms of Service. You are responsible for how you use the output, including
  compliance with GDPR/CCPA and local marketing regulations when contacting
  businesses.

### Support

Found a broken selector or want a field added? Open an issue on the Actor's
issues tab with the search query you used and what you expected — that's the
fastest path to a fix.

# Actor input Schema

## `searchQueries` (type: `array`):

What to search for on Google Maps. One search per line, e.g. 'dentists in Austin, TX' or 'plumbers near Chicago, IL'.

## `maxResultsPerQuery` (type: `integer`):

Maximum number of business listings to scrape per search query.

## `maxConcurrency` (type: `integer`):

How many pages to scrape in parallel (searches and listings alike). Lower = safer, higher = faster but more likely to get rate-limited.

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

Apify Proxy is strongly recommended to avoid IP blocks from Google.

## Actor input object example

```json
{
  "searchQueries": [
    "coffee shops in Denver, CO"
  ],
  "maxResultsPerQuery": 30,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

Every business listing scraped across all search queries, with name, category, phone, website, address, rating and review count.

# 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 = {
    "searchQueries": [
        "coffee shops in Denver, CO"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ayush_labs/gmaps-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 = { "searchQueries": ["coffee shops in Denver, CO"] }

# Run the Actor and wait for it to finish
run = client.actor("ayush_labs/gmaps-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 '{
  "searchQueries": [
    "coffee shops in Denver, CO"
  ]
}' |
apify call ayush_labs/gmaps-lead-scraper --silent --output-dataset

```

## MCP server setup

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