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

Collect public local-business listing details from Google Maps searches.

- **URL**: https://apify.com/light\_shutter/google-maps-local-business-scraper.md
- **Developed by:** [Eslam Diaa](https://apify.com/light_shutter) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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?

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 Local Business Scraper

An Apify Actor that searches Google Maps and stores public local-business listing details in the default dataset.

**Unofficial tool:** This Actor is not affiliated with, endorsed by, or sponsored by Google or Google Maps.

### Input

#### Recommended first run

Start with `searchQueries` and `locations`, keep Apify Proxy enabled, leave all `require*` and rating/review filters off, and set `maxCandidatesPerSearch` higher than `maxResultsPerSearch`. Once that works, enable filters one at a time.

#### Common conflicts and zero-result settings

- `scrapeSocialProfiles` must be `true` when `requireSocialMedia` is `true` or `requiredSocialPlatforms` is not empty. Otherwise the Actor rejects the input because social profiles are not being collected.

- `requiredSocialPlatforms` means at least one of the selected platforms, not all of them. Use it only when you want to exclude businesses without a specific social platform.

- `requiredWebsiteDomains` already requires a matching website. It can be used with `requireWebsite`, but `requireWebsite` is redundant in that case.

- If both `minRating` and `maxRating` are set, the minimum cannot be greater than the maximum. The same rule applies to `minReviewsCount` and `maxReviewsCount`.

- `openNow`, `requirePhone`, `requireAddress`, `requireWebsite`, `requireSocialMedia`, and keyword filters all reduce the final result set. If no rows appear, turn them off first and then add them back one at a time.

- `maxCandidatesPerSearch` should be higher than `maxResultsPerSearch` when filters are enabled; otherwise the Actor may run out of candidates before finding enough matches.

- Keep `proxyConfiguration.useApifyProxy` enabled. Disabling it can cause Google Maps timeouts, anti-automation pages, or no results.

- `searchQueries`: keywords or categories, for example `restaurants` or `dentists`

- `locations`: cities, neighborhoods, or countries

- `maxResultsPerSearch`: result limit for each query/location combination

- `language`: Google Maps interface language, default `en`

- `scrapeSocialProfiles`: collect public social-media links found on the Maps listing and linked website homepage, default `true`

- `requireWebsite`: keep only businesses with a listed website

- `requiredWebsiteDomains`: optionally restrict results to specific website domains

- `requireSocialMedia`: keep only businesses with at least one detected social profile

- `requiredSocialPlatforms`: optionally require Facebook, Instagram, LinkedIn, X, YouTube, TikTok, or another supported platform

- `minRating` / `maxRating`: filter by Google Maps rating

- `minReviewsCount` / `maxReviewsCount`: filter by Google Maps review count

- `openNow`: keep only businesses currently reported as open

- `excludeClosedBusinesses`: remove businesses marked permanently or temporarily closed

- `requirePhone` / `requireAddress`: require core contact fields

- `includeKeywords` / `excludeKeywords`: filter against business name, category, and address

- `maxCandidatesPerSearch`: increase this when filters are strict; it controls how many listings are inspected to find matching businesses

- `proxyConfiguration`: Apify Proxy configuration; enabled by default because Google Maps may block direct cloud IP addresses. Keep the default UNBLOCKER group for normal runs.

### Output

Each dataset item includes the business name, category, address, phone, website, public social-media profile links, business status, open-now state, rating, review count, opening hours, coordinates, place ID, Google Maps URL, and the search that found it.

Use this Actor only for data collection that is permitted by applicable laws and service terms. It does not attempt to bypass CAPTCHA or other access controls.

### Local development

```bash
npm install
apify validate-schema .actor/input_schema.json
apify run
```

The default local input is stored in `storage/key_value_stores/default/INPUT.json` when using `apify run`.

# Actor input Schema

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

Required. Keywords or business categories to search for, such as restaurants or dentists. Use a normal spelling and keep the query specific enough to avoid unrelated results.

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

Required. Cities, neighborhoods, or countries appended to each search query, such as Dubai, UAE. Each query is combined with each location.

## `maxResultsPerSearch` (type: `integer`):

Maximum number of matching businesses collected for each query/location combination. If filters are enabled, set Maximum candidates scanned higher than this value so enough listings can be checked.

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

Language code used for the Google Maps interface, for example en or ar. This does not translate your search query.

## `scrapeSocialProfiles` (type: `boolean`):

Turn on to inspect public social-media links on the Google Maps listing and linked business website homepage. Must be ON when Require social media or Required social platforms is used. It may increase run time.

## `requireWebsite` (type: `boolean`):

Keep only businesses with a website listed on Google Maps. Turn this ON when you need website-based social discovery or when using Required website domains.

## `requiredWebsiteDomains` (type: `array`):

Optional website filter. Keeps only businesses whose website hostname matches one of these domains, such as example.com. An entry here effectively requires a website even if Require a website is OFF.

## `requireSocialMedia` (type: `boolean`):

Keep only businesses with at least one detected public social-media profile. Requires Scrape social profiles=ON; otherwise the Actor rejects the input. Leave OFF if you want all businesses and only want social links when available.

## `requiredSocialPlatforms` (type: `array`):

Keep businesses with at least one profile on ANY selected platform, not every platform. Requires Scrape social profiles=ON. Leave empty unless you specifically need a platform filter.

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

Optional lower rating filter from 0 to 5. If Maximum rating is also set, Minimum rating must not be higher.

## `maxRating` (type: `number`):

Optional upper rating filter from 0 to 5. If Minimum rating is also set, Maximum rating must not be lower.

## `minReviewsCount` (type: `integer`):

Optional lower review-count filter. If Maximum review count is also set, Minimum review count must not be higher.

## `maxReviewsCount` (type: `integer`):

Optional upper review-count filter. If Minimum review count is also set, Maximum review count must not be lower.

## `openNow` (type: `boolean`):

Keep only businesses that Google Maps reports as open at run time. This can remove businesses that are valid but closed today or outside their opening hours. It works together with Exclude closed businesses.

## `excludeClosedBusinesses` (type: `boolean`):

Exclude businesses marked permanently or temporarily closed by Google Maps. This does not exclude businesses that are merely closed right now. Leave OFF for the broadest result set.

## `requirePhone` (type: `boolean`):

Keep only businesses with a phone number listed on Google Maps. Some legitimate businesses do not publish a phone number, so leave OFF unless required.

## `requireAddress` (type: `boolean`):

Keep only businesses with an address listed on Google Maps. Some service-area businesses may not have a traditional address, so leave OFF unless required.

## `includeKeywords` (type: `array`):

Keep businesses whose name, category, or address contains at least one keyword. This is an additional filter after the Google Maps search; combining it with strict rating/review filters may produce zero results.

## `excludeKeywords` (type: `array`):

Exclude businesses whose name, category, or address contains any keyword. Exclude keywords take priority if the same text also matches Include keywords.

## `maxCandidatesPerSearch` (type: `integer`):

Maximum Google Maps listings inspected per search. Set this higher than Maximum results when filters are enabled; otherwise the Actor may inspect too few candidates and return fewer results. Higher values increase run time and cost.

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

Keep Apify Proxy enabled for cloud runs. The default UNBLOCKER group is recommended for Google Maps. Turning the proxy OFF can cause timeouts, CAPTCHA pages, or zero results. Do not use Require social media with proxy-disabled runs unless you accept higher failure risk.

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

Maximum time allowed for each Google Maps request. Use 60-90 seconds with Apify Proxy if requests are slow. Increasing this does not create more results; it only allows slow requests to finish.

## Actor input object example

```json
{
  "searchQueries": [
    "restaurants"
  ],
  "locations": [
    "Dubai, UAE"
  ],
  "maxResultsPerSearch": 25,
  "language": "en",
  "scrapeSocialProfiles": true,
  "requireWebsite": false,
  "requiredWebsiteDomains": [],
  "requireSocialMedia": false,
  "requiredSocialPlatforms": [],
  "openNow": false,
  "excludeClosedBusinesses": false,
  "requirePhone": false,
  "requireAddress": false,
  "includeKeywords": [],
  "excludeKeywords": [],
  "maxCandidatesPerSearch": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  },
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

## `businesses` (type: `string`):

Collected local-business records, including contact details, ratings, review counts, websites, social-media profiles, and coordinates.

## `runSummary` (type: `string`):

Summary containing accepted results, filtered candidates, and failed searches.

# 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": [
        "restaurants"
    ],
    "locations": [
        "Dubai, UAE"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("light_shutter/google-maps-local-business-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": ["restaurants"],
    "locations": ["Dubai, UAE"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("light_shutter/google-maps-local-business-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": [
    "restaurants"
  ],
  "locations": [
    "Dubai, UAE"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call light_shutter/google-maps-local-business-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,light_shutter/google-maps-local-business-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/0XVuUMKy3DB3P6R2V/builds/NjeTDrHe2n3A5XqBI/openapi.json
