# Local Business Google Maps Scraper (`woundless_yellowwood/local-business-google-maps-scraper`) Actor

Scrape local business listings from Google Maps. Search any term and location to get structured data with names, contacts, ratings, hours, and optional reviews. No API key required.

- **URL**: https://apify.com/woundless\_yellowwood/local-business-google-maps-scraper.md
- **Developed by:** [Proyecto Apify](https://apify.com/woundless_yellowwood) (community)
- **Categories:** Lead generation, Developer tools
- **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/platform/actors/running/actors-in-store#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

## Local Business Google Maps Scraper

Search Google Maps for any business type and location, and get back a structured dataset of local listings — names, addresses, phone numbers, websites, ratings, hours, and optionally reviews. No Google Places API key needed.

### How It Works

The Actor opens Google Maps in a real browser (Playwright), searches for your term + location, scrolls through the results panel to load listings, and opens each business detail page to extract structured data. Deduplication by Google Maps place ID ensures no duplicates in a single run.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchTerm` | string | "coffee shops" | Business type to search for |
| `location` | string | "Austin, TX" | City, state, or lat/lng coordinates |
| `maxResults` | integer | 50 | Maximum listings to extract (1–500) |
| `language` | string | "en" | Google Maps interface language code |
| `includeReviews` | boolean | false | Fetch reviews for each business |
| `maxReviewsPerBusiness` | integer | 5 | Reviews per business (if includeReviews is true) |
| `proxyConfiguration` | object | Apify proxy | Proxy settings (residential recommended) |

### Output

Each row in the dataset contains:

- **name** — Business name
- **category** — Google Maps category label
- **fullAddress** — Street address
- **phone** — Phone number
- **website** — Website URL
- **rating** — Star rating (numeric, null if unavailable)
- **totalReviewCount** — Number of Google reviews
- **priceLevel** — 1 ($), 2 ($$), 3 ($$$), 4 ($$$$), or null
- **openingHours** — Formatted hours string
- **listingUrl** — Direct Google Maps URL
- **placeId** — Google Maps place identifier
- **reviews** (optional) — Array of { reviewerName, rating, reviewText, relativeDate }

### Proxy Configuration

Google Maps is aggressive about blocking automated requests. For best results, use **Apify residential proxies** (the default). If you encounter frequent CAPTCHAs, ensure your Apify plan includes residential proxy access and that `proxyConfiguration.useApifyProxy` is set to `true`.

### Notes

- This Actor extracts only **publicly visible** data from Google Maps' web interface. No login, no Google Places API.
- Selectors use multiple fallbacks to handle Google's frequent UI changes, but extraction accuracy may vary.
- If a run returns zero results, check logs for CAPTCHA/block warnings and try again with residential proxies.
- This Actor performs **read-only** extraction. No data is written, posted, or modified on Google's platform.

### Example Usage

Search for dentists in Chicago with reviews:

```json
{
  "searchTerm": "dentists",
  "location": "Chicago, IL",
  "maxResults": 30,
  "includeReviews": true,
  "maxReviewsPerBusiness": 5
}
```

### Disclaimer

This tool extracts only publicly available information from Google Maps. Users are responsible for ensuring their use complies with Google's Terms of Service and applicable local laws. The Actor does not guarantee unblockable scraping and does not claim to bypass any terms of service.

# Actor input Schema

## `searchTerm` (type: `string`):

What to search for on Google Maps (e.g. "coffee shops", "dentists", "plumbers").

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

City, state, or coordinates (e.g. "Austin, TX", "41.8781,-87.6298").

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

Maximum number of business listings to extract.

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

Two-letter language code for Google Maps interface.

## `includeReviews` (type: `boolean`):

If true, fetch up to maxReviewsPerBusiness recent reviews for each listing.

## `maxReviewsPerBusiness` (type: `integer`):

Maximum number of reviews to extract per business (only used if includeReviews is true).

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

Apify proxy settings. Use Apify residential proxies for best results with Google Maps.

## Actor input object example

```json
{
  "searchTerm": "coffee shops",
  "location": "Austin, TX",
  "maxResults": 50,
  "language": "en",
  "includeReviews": false,
  "maxReviewsPerBusiness": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("woundless_yellowwood/local-business-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 = { "proxyConfiguration": { "useApifyProxy": True } }

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/APvZdap3njNddcWKL/builds/qEaL3TGNepCX0vfSd/openapi.json
