# Google Maps Business Leads Scraper (`googleapi/google-maps-business-leads-scraper`) Actor

Bounded extraction of source-backed public Google Maps business details; stops at login, CAPTCHA, and traffic boundaries.

- **URL**: https://apify.com/googleapi/google-maps-business-leads-scraper.md
- **Developed by:** [Google API](https://apify.com/googleapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

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?

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

Collect public business listings from Google Maps for local research and outreach planning. Records can include contact details, ratings, opening hours, business attributes, public social links, and photos when Maps displays them.

The Actor returns business information visible on public listings and profiles. It does not create lead scores or verify that a public email address is deliverable.

### Quick start

```json
{
  "searchStringsArray": ["technology companies"],
  "locationQuery": "Seattle, WA",
  "maxItems": 25,
  "maxPages": 3
}
```

If no search phrase or Maps URL is supplied, the Actor uses its default search for technology companies.

### Input

#### Search sources and results

| Input | Description |
| --- | --- |
| **searchStringsArray** | One or more Google Maps searches. **queries** and **searchQuery** are aliases. |
| **startUrls** | Public Google Maps search or place URLs. **urls** is an alias; supplied URLs replace generated searches. |
| **locationQuery** | Optional location appended to generated searches. |
| **maxItems** | Global maximum number of business records (default 25; maximum 100). **maxCrawledPlacesPerSearch** is an alias. |
| **page / maxPages** | Starting result batch and maximum batches per search URL (defaults: 1 and 3). |
| **deduplicate** | Remove repeated businesses across sources (default true). |
| **minRating / minReviews** | Keep businesses meeting the displayed rating or review-count thresholds. |
| **categoryFilter** | Keep listings whose visible primary category contains this text. |
| **includeMedia** | Include visible public business photo URLs (default true). |

#### Optional business details

| Input | Description |
| --- | --- |
| **includeDetails** | Open a limited number of Maps profiles for hours, About attributes, aggregate review topics, price, menu highlights, and other details (default false). |
| **maxDetailItems** | Maximum result profiles to open (default 10; maximum 25). Set to 0 to disable profile visits. |
| **includeWebsiteEnrichment** | Check the listed public business website for additional contact details (default false). |
| **maxWebsiteEnrichmentItems** | Maximum listed business websites to check (default 2; maximum 25). |

#### Page settings

| Input | Description |
| --- | --- |
| **renderJavaScript** | Render dynamic Maps pages in a standard browser (default true). **useBrowser** is a compatibility alias. |
| **proxyConfiguration** | Optional Apify proxy for browser-rendered Maps pages. |
| **locale** | Language preference such as en or en-US. **language** is a compatibility alias. |

### Dataset

Each dataset row represents one business and includes `businessName` and `mapsUrl`. It can also include:

- **Identity and category:** business name, place ID, CID, category, Maps profile URL, and public description.
- **Contact and location:** address, phone, website, public email addresses, social links, and coordinates.
- **Ratings and hours:** displayed rating and review count, price information, current status, and weekly opening hours.
- **Profile details:** visible services, accessibility, business attributes, aggregate review summary and topics, menu highlights, and owner updates.
- **Photos:** public listing and profile image URLs with visible photo-count information.
- **Website profile:** if website enrichment is enabled, website-derived organization and menu information is grouped separately from the Maps listing.

Review and rating summaries are aggregate business information. Individual review text, reviewer identities, and reviewer media are not collected. Values from a linked website are public website information, not automatically verified Maps facts.

```json
{
  "businessName": "Harbor Coffee",
  "title": "Harbor Coffee",
  "categoryName": "Coffee shop",
  "categories": ["Coffee shop"],
  "address": "10 Example Street, Seattle, WA 98101, United States",
  "phone": "+1 206-555-0100",
  "website": "https://harbor.example/",
  "emailAddresses": ["hello@harbor.example"],
  "rating": 4.6,
  "reviewCount": 3206,
  "currentStatus": "Open · Closes 6 pm",
  "openingHours": ["Monday: 7:30 AM–5:00 PM"],
  "socialProfiles": [
    { "platform": "instagram", "profileUrl": "https://instagram.com/harborcoffee" }
  ]
}
```

The example is illustrative. Maps may not show every field for every business. Download the dataset from the Apify run page in JSON, CSV, Excel, or another supported format. Run totals and source outcomes appear in the run output.

### Limits and troubleshooting

Google Maps results and profile details can vary by query, location, language, and time. Optional profile visits are disabled by default; failed profile visits do not remove a valid result-card record. If a run returns no or partial results, check the run log and summary.

The Actor uses public Maps pages and does not bypass CAPTCHAs or other access controls. A proxy does not guarantee more results.

### Privacy

The Actor sends search phrases, locations, and supplied Maps URLs to Google Maps. If website enrichment is enabled, it also visits the public website linked from a selected business profile. Avoid submitting sensitive information. This independent Actor is not affiliated with Google.

# Changelog

This Actor's version history is a separate document: https://apify.com/googleapi/google-maps-business-leads-scraper/changelog.md

# Actor input Schema

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

One or more public Google Maps business searches. If no query or Maps URL is supplied, the runtime uses its built-in Technology companies search.

## `queries` (type: `array`):

API alias for searchStringsArray.

## `searchQuery` (type: `string`):

Single-query API alias for searchStringsArray.

## `startUrls` (type: `array`):

Public Google Maps search or place URLs. Only Maps URLs on Google domains are accepted.

## `urls` (type: `array`):

String-list API alias for startUrls.

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

Optional location appended to each generated search.

## `maxItems` (type: `integer`):

Global maximum number of business records to return.

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

API compatibility alias for maxItems.

## `maxPages` (type: `integer`):

Maximum rendered result batches per source.

## `page` (type: `integer`):

One-based starting page for generated search URLs (10-result offset).

## `deduplicate` (type: `boolean`):

Deduplicate returned businesses by public place identity.

## `minRating` (type: `number`):

Optional minimum public Maps rating.

## `minReviews` (type: `integer`):

Optional minimum public review count.

## `categoryFilter` (type: `string`):

Optional case-insensitive substring filter on the visible primary category.

## `includeMedia` (type: `boolean`):

Include visible public photo URLs when present.

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

When enabled, visit up to maxDetailItems public Maps profiles and read visible hours, About-tab business attributes, aggregate review summary/topics, menu highlights, price-report counts, rating breakdowns, and profile links. Off by default.

## `maxDetailItems` (type: `integer`):

Maximum number of result profiles to visit when includeDetails is enabled; set to 0 to disable profile visits.

## `renderJavaScript` (type: `boolean`):

Use regular Puppeteer rendering for public Maps pages. Stops on access challenges and does not attempt to solve or bypass them.

## `useBrowser` (type: `boolean`):

API compatibility alias for renderJavaScript.

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

Bounded delay between ordinary page batches.

## `maxRequestRetries` (type: `integer`):

Retries for transient transport failures only. Access challenges and HTTP error responses are not retried.

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

Navigation or request timeout.

## `requestTimeoutMs` (type: `integer`):

Millisecond alias for requestTimeoutSecs.

## `maxResponseBytes` (type: `integer`):

Maximum HTML response size when JavaScript rendering is disabled.

## `browserWaitMs` (type: `integer`):

Bounded wait for the public Maps result view to render.

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

Optional Apify Proxy configuration for Puppeteer rendering. It is unsupported when renderJavaScript is false. The Actor still stops when a public access boundary is returned.

## `locale` (type: `string`):

Short locale such as en or en-US.

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

API compatibility alias for locale.

## `includeWebsiteEnrichment` (type: `boolean`):

Fetch one public website page per selected Maps business. Organization/menu data stays website-scoped; branch facts require exact Maps feature identity.

## `maxWebsiteEnrichmentItems` (type: `integer`):

Maximum selected business websites to fetch. Each request has an 8-second timeout, 1.5 MB HTML bound and at most three DNS-validated redirects.

## Actor input object example

```json
{
  "maxItems": 25,
  "maxPages": 3,
  "page": 1,
  "deduplicate": true,
  "includeMedia": true,
  "includeDetails": false,
  "maxDetailItems": 10,
  "renderJavaScript": true,
  "requestDelayMs": 750,
  "maxRequestRetries": 1,
  "requestTimeoutSecs": 60,
  "maxResponseBytes": 5000000,
  "browserWaitMs": 1500,
  "includeWebsiteEnrichment": false,
  "maxWebsiteEnrichmentItems": 2
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("googleapi/google-maps-business-leads-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("googleapi/google-maps-business-leads-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 '{}' |
apify call googleapi/google-maps-business-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/google-maps-business-leads-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/dVjOfeI8LPRtaIGcJ/builds/Q3ovPzNW3BbhkseHD/openapi.json
