# Google Maps Business Data Extractor (`rambunctious_fingerprint/google-maps-business-extractor`) Actor

Extract business listings from Google Maps by location and keyword. Get name, address, phone, website, rating, reviews, and more.

- **URL**: https://apify.com/rambunctious\_fingerprint/google-maps-business-extractor.md
- **Developed by:** [Casey Marsh](https://apify.com/rambunctious_fingerprint) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## 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 Business Data Extractor

[![Built with Apify](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com)

Extract business listings from **Google Maps** by location and keyword. Get detailed business information including name, address, phone number, website URL, rating, number of reviews, business category, operating hours, and GPS coordinates.

### Features

- 🔍 **Search by keyword & location** — Find businesses in any area by category or keyword (e.g., "plumber in Chicago", "restaurant in London")
- 📍 **Multi-location support** — Search across multiple cities or regions in a single run
- 📊 **Rich business data** — Extract name, address, phone, website, rating, reviews count, category, hours, and coordinates
- 🔄 **Infinite scroll pagination** — Automatically scrolls through search results to capture all available listings
- 🛡️ **Anti-blocking measures** — Uses realistic browser fingerprints, proper user agents, and human-like interaction patterns
- 📋 **Structured output** — Data is saved to a clean Apify dataset, ready for CSV/JSON export or API access

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `searchKeywords` | string | ✅ | — | Business category or keyword to search (e.g., "plumber", "restaurant", "dentist"). Comma-separated for multiple keywords. |
| `locations` | array of strings | ✅ | — | List of cities/areas to search in (e.g., `["New York", "Los Angeles"]`). |
| `maxResults` | integer | ❌ | `50` | Maximum businesses to extract per keyword-location combination (max 500). |
| `maxConcurrency` | integer | ❌ | `5` | Number of concurrent browser pages (max 20). |

#### Example Input

```json
{
  "searchKeywords": "plumber, electrician",
  "locations": ["Chicago", "Houston"],
  "maxResults": 100,
  "maxConcurrency": 5
}
```

### Output

Each extracted business is a JSON object in the dataset with the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `businessName` | string | Business name |
| `address` | string | Street address |
| `phone` | string | Phone number |
| `website` | string | Website URL |
| `rating` | number | Star rating (0–5) |
| `reviewsCount` | number | Number of reviews |
| `category` | string | Business category/type |
| `hours` | string | Operating hours (if available) |
| `lat` | number | Latitude coordinate |
| `lng` | number | Longitude coordinate |
| `searchKeyword` | string | The keyword used to find this business |
| `location` | string | The location searched |
| `googleMapsUrl` | string | Direct Google Maps URL for the business |

#### Example Output

```json
{
  "businessName": "Joe's Plumbing Services",
  "address": "123 Main St, Chicago, IL 60601",
  "phone": "(312) 555-0123",
  "website": "https://joesplumbing.example.com",
  "rating": 4.5,
  "reviewsCount": 127,
  "category": "Plumber",
  "hours": "Mon-Fri: 8AM–6PM, Sat: 9AM–3PM",
  "lat": 41.8826,
  "lng": -87.6226,
  "searchKeyword": "plumber",
  "location": "Chicago",
  "googleMapsUrl": "https://www.google.com/maps/place/..."
}
```

### Use Cases

- **Lead Generation** — Build a database of businesses in specific industries for cold outreach
- **Market Research** — Analyze the competitive landscape in a given area
- **Sales Prospecting** — Find potential customers by category and location
- **Data Enrichment** — Add phone numbers, websites, and ratings to existing business lists
- **Real Estate Analysis** — Map businesses and services available in target neighborhoods
- **SEO & Local Listings** — Audit competitor presence on Google Maps

### Pricing

This actor uses browser automation (Playwright) and incurs compute costs based on:

- Number of keyword × location combinations
- `maxResults` setting (more results = more page interactions)
- `maxConcurrency` setting (higher concurrency = faster but more resource-intensive)

For typical usage (5 locations × 2 keywords × 50 results each), expect modest Apify platform usage within standard compute units.

### Configuration Notes

- **Rate limiting**: Google Maps may show CAPTCHAs or rate-limit requests if too many searches are performed in quick succession. Reduce `maxConcurrency` to 2–3 for large multi-location runs.
- **Data freshness**: Google Maps data may vary slightly by region and time of day. Results are as accurate as what is publicly displayed on the search page.
- **Dedup**: The actor deduplicates businesses by name + address within a single search combination.
- **Location specificity**: For best results, use city-level locations (e.g., "San Francisco" rather than "California").

### FAQ

**Q: How many results can I get per run?**\
A: Up to 500 per keyword-location combination. The number of results depends on what Google Maps displays for that search.

**Q: Can I search for multiple keywords at once?**\
A: Yes! Use comma-separated values in the `searchKeywords` field, e.g., `"dentist, orthodontist, oral surgeon"`.

**Q: Does it handle pagination?**\
A: Yes — the actor automatically scrolls the search results to trigger infinite loading. It stops when no new results appear or when `maxResults` is reached.

**Q: What if a business has no website listed?**\
A: The `website` field will be an empty string. Not all businesses list their website on Google Maps.

**Q: Can I get email addresses?**\
A: Google Maps does not publicly display email addresses in search results, so this actor does not extract them.

**Q: How do I export the data?**\
A: Data is saved to the Apify dataset. You can export as JSON, CSV, Excel, or XML from the Apify console, or access it via the Apify API.

### Technical Details

- **Runtime**: Node.js 20 on Playwright with Chrome
- **Framework**: [Crawlee](https://crawlee.dev) PlaywrightCrawler
- **Platform**: Apify (actor-node-playwright-chrome base image)
- **Deployment**: `apify push`

***

*Built with ❤️ for the Apify Store*

# Actor input Schema

## `searchKeywords` (type: `string`):

The business category or keyword to search for (e.g., 'plumber', 'restaurant', 'dentist').

## `locations` (type: `array`):

List of cities or areas to search in (e.g., \['New York', 'Los Angeles']).

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

Maximum number of business listings to extract per location-keyword combination.

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

Maximum number of concurrent browser pages to use.

## Actor input object example

```json
{
  "searchKeywords": "plumber",
  "locations": [
    "New York"
  ],
  "maxResults": 50,
  "maxConcurrency": 5
}
```

# 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 = {
    "searchKeywords": "plumber",
    "locations": [
        "New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rambunctious_fingerprint/google-maps-business-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 = {
    "searchKeywords": "plumber",
    "locations": ["New York"],
}

# Run the Actor and wait for it to finish
run = client.actor("rambunctious_fingerprint/google-maps-business-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchKeywords": "plumber",
  "locations": [
    "New York"
  ]
}' |
apify call rambunctious_fingerprint/google-maps-business-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=rambunctious_fingerprint/google-maps-business-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8VMgPwtfnOWoisYDT/builds/cnqJUlKHdUcEMcC2p/openapi.json
