# Google Maps Area Scanner (`googleapi/google-maps-area-scraper`) Actor

Extract rich Google Maps places for bounded keyword searches centered on a location or explicit coordinates and zoom.

- **URL**: https://apify.com/googleapi/google-maps-area-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 searches. Search by business type, keyword, or map area, then optionally open selected place profiles for additional public details such as hours, photos, reviews, and business attributes.

Each dataset row represents a Google Maps place. The Actor keeps only details visible on the public listing or profile; it does not fill missing values with guesses.

### Quick start

Search for coffee shops in a city:

```json
{
  "searchKeywords": ["coffee shops"],
  "locationQuery": "Seattle, WA",
  "maxItems": 20,
  "maxPages": 3
}
```

### Input

#### Search area and sources

| Input | Description |
| --- | --- |
| **searchKeywords** | One or more Maps search phrases (up to 50). **queries** and **searchStringsArray** are list aliases; **searchQuery** accepts one phrase. |
| **locationQuery** | Optional city, region, or country appended to generated searches. |
| **lat / lng** | Optional map center coordinates; provide both together. |
| **zoom** | Optional Maps zoom level (3–21). |
| **radius** | Search radius in meters (100–1,000,000), used to derive a zoom level when zoom is not set. |
| **startUrls** | Up to 25 public Google Maps search or place URLs. These take precedence over generated searches. **sourceUrls**, **searchUrls**, and **urls** are list aliases; **url** accepts one URL. |
| **locale** | Short locale such as en or en-US. **language** is a compatibility alias. |

When you provide URLs, use Google Maps search or place pages. Generated searches use the selected phrases, location, and map coordinates.

#### Results and filters

| Input | Description |
| --- | --- |
| **maxItems** | Maximum unique places across the run (default 20; maximum 100). **maxCrawledPlacesPerSearch** is a legacy alias. |
| **page / maxPages** | Starting result batch and final batch to inspect (defaults: 1 and 3; maximum 25). Google Maps uses an infinite-scroll feed rather than stable numbered pages. |
| **deduplicate** | Remove duplicate places across searches (default true). |
| **sortBy** | Order the collected places: recommended source order, rating, review count, or name. |
| **minRating** | Keep places with at least this displayed rating (1–5). **placeMinimumStars** is a legacy alias. |
| **minReviews** | Minimum public review count. |
| **categoryFilter** | Keep places whose public category contains this text. |
| **closedPlacesFilter** | Choose all places, skip closed places, or keep only closed places. |

#### Optional place details

| Input | Description |
| --- | --- |
| **includeDetails** | Open public place profiles for richer details (default false). |
| **maxDetailItems** | Maximum profiles to open (default 20; maximum 25). |
| **includeOpeningHours** | Include weekly and current hours when available (default true). |
| **includeReviews** | Include a bounded set of public review snippets (default false). |
| **maxReviewsPerPlace** | Maximum review snippets per place (default 5; maximum 20). |
| **includeMedia** | Include public business photos when available (default true). |
| **includeAttributes** | Include public amenities and accessibility labels when available (default true). |

#### Page display options

| Input | Description |
| --- | --- |
| **renderJavaScript** | Use a standard browser to display Maps results. Google Maps feeds usually require JavaScript. **useBrowser** is a compatibility alias. |
| **proxyConfiguration** | Optional Apify proxy settings for browser requests. Use only proxy groups available to your account. |

### Output

The dataset has one row for each collected place and includes its name and Google Maps URL. Depending on what Maps displays, a row may also contain:

- **Place identity:** place ID, CID, feature ID, and Knowledge Graph ID.
- **Location:** address components, Plus Codes, coordinates, and neighborhood.
- **Contact and links:** website, phone, menu, and other public business links.
- **Ratings and reviews:** displayed rating and review totals, rating distribution, review summary, topics, and optional review snippets.
- **Business details:** opening hours, price information, service options, amenities, and popular times.
- **Photos and updates:** public business photos, photo categories, and owner updates.

Review snippets are only collected when **includeReviews** is enabled. Reviewer names, profile links, and avatars are not included. Missing yes/no details are left unknown unless Maps explicitly states them.

```json
{
  "title": "Overcast Coffee",
  "canonicalUrl": "https://www.google.com/maps/place/Overcast+Coffee/",
  "placeId": "ChIJ6WqLxohrkFQRfyUGQh-AXmc",
  "categoryName": "Coffee shop",
  "address": "1517 12th Ave Ste 100, Seattle, WA 98122, United States",
  "location": {
    "lat": 47.6146106,
    "lng": -122.3171338
  },
  "website": "https://overcastcoffee.co/",
  "phone": "+1 206-588-2621",
  "totalScore": 4.7,
  "reviewsCount": 314,
  "openingHours": {
    "Monday": "7 AM–6 PM",
    "Tuesday": "7 AM–6 PM"
  },
  "photoCountText": "267+ Photos",
  "photoCountIsApproximate": true
}
```

The example is abbreviated. Optional values vary by place and by the details selected for a run. Download the dataset from the Apify run page in JSON, CSV, Excel, or another supported format. Run totals and access outcomes are available in the run output.

### Limits and troubleshooting

- Google Maps may show different listings and details by search, area, and time.
- Pagination follows visible result batches, so a run can return fewer places than requested.
- If a run has no place records, check the run log and summary for an access boundary, an empty result feed, or a request failure.
- The Actor uses public Google Maps pages and does not bypass CAPTCHAs or other access controls.

### Privacy

The Actor sends search phrases, location or coordinates, and locale settings to Google Maps. If you provide start URLs, it visits those public Maps pages. Avoid submitting sensitive information. This Actor is independent and is not affiliated with Google.

# Changelog

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

# Actor input Schema

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

Legacy alias for queries. Each query is searched on Google Maps; values are merged with the other query aliases.

## `searchKeywords` (type: `array`):

One or more public Google Maps searches. Alias: queries.

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

Additional search queries. Queries are deduplicated before crawling.

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

Single-query alias for searchKeywords.

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

Optional city, region, or country appended to generated queries and geocoded through public OpenStreetMap Nominatim when coordinates are not supplied.

## `lat` (type: `string`):

Optional latitude from -90 to 90. Must be supplied with lng.

## `lng` (type: `string`):

Optional longitude from -180 to 180. Must be supplied with lat.

## `zoom` (type: `string`):

Optional Google Maps zoom from 3 to 21. If omitted, a bounded zoom is derived from radius.

## `radius` (type: `integer`):

Used only to derive a zoom when zoom is omitted.

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

Optional public Google Maps search or place URLs. When supplied, they take precedence over generated query URLs while filters and limits still apply. Consent/login/access responses are blocked, not business records.

## `sourceUrls` (type: `array`):

Compatibility alias for startUrls. URLs must be public Google Maps search or place routes.

## `searchUrls` (type: `array`):

Compatibility alias for startUrls.

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

Compatibility alias for startUrls.

## `url` (type: `string`):

Compatibility alias for one public Google Maps search or place URL.

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

Global maximum of normal place records across all queries and source URLs.

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

Legacy alias for maxItems with the same global semantics.

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

Maximum one-based rendered result batch to traverse per source, including batches scrolled through before page. page must not exceed maxPages. Google Maps uses an infinite-scroll feed rather than numbered result pages.

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

One-based starting batch in the Google Maps infinite-scroll results. The Actor scrolls to this batch before collecting results.

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

Deduplicate globally by Google place ID, CID, KGMID, canonical URL, or title plus address.

## `sortBy` (type: `string`):

Recommended preserves source order; other choices sort the bounded collected candidate set globally.

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

Exclude records with a public rating below this value; records without a rating do not match.

## `placeMinimumStars` (type: `string`):

Legacy alias for minRating.

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

Exclude records with fewer than this public review count.

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

Case-insensitive text filter applied to the public category fields.

## `closedPlacesFilter` (type: `string`):

Include all places, skip closed places, or keep only closed places based on public listing text.

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

Open public place pages only when enabled; this adds source-backed profile details to search-card records.

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

Maximum number of selected places whose public detail pages may be opened. Defaults to up to 20 for richer business records.

## `includeOpeningHours` (type: `boolean`):

Include public weekly hours and current opening label when exposed.

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

Include bounded public review text, ratings, and date labels; expand visible review text when Maps offers a more control, without reviewer profile data or avatars.

## `maxReviewsPerPlace` (type: `integer`):

Bound the number of public review text snippets returned per place.

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

Include only deduplicated lh3.googleusercontent.com place photos associated with the card/detail page.

## `includeAttributes` (type: `boolean`):

Include public accessibility and amenity attributes when exposed.

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

Use the public browser page. Google Maps result feeds normally require JavaScript.

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

Compatibility alias for renderJavaScript; both values must agree when supplied.

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

Delay between rendered scroll batches to keep traffic bounded.

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

Timeout for a browser navigation or source request.

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

Millisecond alias for requestTimeoutSecs; both values must agree when supplied.

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

Maximum response size for static HTTP mode.

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

Bounded wait after a browser navigation before reading the rendered page.

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

Optional Apify Proxy or explicit proxyUrls used by the browser transport. Proxy routing is transparent and does not bypass CAPTCHAs or access controls.

## `userAgent` (type: `string`):

Optional honest browser user agent. Do not use this to impersonate another person or evade access controls.

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

Short locale such as en or en-US.

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

Compatibility alias for locale; both values must agree when supplied.

## Actor input object example

```json
{
  "radius": 50000,
  "maxItems": 20,
  "maxPages": 3,
  "page": 1,
  "deduplicate": true,
  "sortBy": "recommended",
  "closedPlacesFilter": "all",
  "includeDetails": false,
  "maxDetailItems": 20,
  "includeOpeningHours": true,
  "includeReviews": false,
  "maxReviewsPerPlace": 5,
  "includeMedia": true,
  "includeAttributes": true,
  "requestDelayMs": 750,
  "requestTimeoutSecs": 60,
  "maxResponseBytes": 5000000,
  "browserWaitMs": 1500
}
```

# Actor output Schema

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

Business-only records with public identity, contact, location, reputation, hours, service, profile details, and media.

## `summary` (type: `string`):

Record, source, pagination, filter, and detail counts stored outside the dataset.

## `runHealth` (type: `string`):

Access boundaries and failure tallies stored outside the dataset.

# 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-area-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-area-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-area-scraper --silent --output-dataset

```

## MCP server setup

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