# Google Maps Competitor Analysis Scraper (`googleapi/google-maps-competitor-analysis-scraper`) Actor

Bounded public Google Maps extraction with honest access-boundary handling.

- **URL**: https://apify.com/googleapi/google-maps-competitor-analysis-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

Compare the businesses Google Maps shows for one or more public searches. The Actor collects visible listing details and assigns each business a position within the bounded set returned for the run.

The comparison is limited to the collected Google Maps results. It is not a measure of a business's overall market share, web-wide visibility, or paid-search performance.

### Quick start

```json
{
  "queries": ["coffee shops in Seattle"],
  "maxItems": 25,
  "maxPages": 3
}
```

### Input

#### Searches and limits

| Input | Description |
| --- | --- |
| **queries** | Public Google Maps search phrases. **searchStringsArray** and **searchKeywords** are aliases; **searchQuery** accepts one phrase. |
| **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 (up to 100). |
| **maxPages** | Maximum rendered result batches per source (default 3; maximum 25). |
| **page** | Starting result batch (default 1). |
| **deduplicate** | Remove repeated places (default true). |
| **minRating / minReviews** | Keep listings meeting the visible rating or review-count thresholds. |
| **categoryFilter** | Keep listings whose visible category contains this text. |
| **includeMedia** | Include visible public photo URLs (default true). |

#### Optional business details and analysis

| Input | Description |
| --- | --- |
| **includeDetails** | Open selected public Maps profiles for additional business details (default false). |
| **maxDetailItems** | Maximum number of profile pages to open. |
| **requiredFields** | Contact or listing fields to check for lead or gap analysis. |
| **attributeTerms** | Extra phrases to match against visible listing text. |
| **brand / chainName** | Brand name for chain searches; **chainName** is an alias. |
| **keyword** | Keyword associated with a rank observation. |
| **lat / lng** | Optional coordinates for rank-grid searches. |
| **similarTo** | Query used for visible-text similarity comparison. |
| **lookbackDays** | Observation window label for new-business runs (default 30). |
| **previousSnapshot** | JSON text containing earlier business records to compare with matching listings. |
| **includeWebsiteEnrichment** | Check selected linked business websites for public 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. **useBrowser** is a compatibility alias. |
| **proxyConfiguration** | Optional Apify proxy settings for browser requests. |
| **locale** | Language preference such as en or en-US. **language** is a compatibility alias. |

### Dataset

Each record represents a business listing and includes its name and public Google Maps URL. When available, records can also include category, address, contact details, rating, review count, operating status, photos, and profile details.

Competitor-analysis fields include **competitorRank**, the business's position within the collected comparison set, and **comparison**, a set of visible signals that can be compared across those results. Profile details are included when **includeDetails** is enabled.

```json
{
  "title": "Example Coffee",
  "canonicalUrl": "https://www.google.com/maps/place/Example+Coffee/",
  "categoryName": "Coffee shop",
  "address": "100 Example Street, Seattle, WA",
  "totalScore": 4.8,
  "reviewsCount": 125,
  "position": 1,
  "competitorRank": 1
}
```

The example is illustrative. Results depend on the queries, limits, and public listings Google returns. The rank is relative to this collected set, not a guaranteed Google ranking. Download the dataset from the Apify run page in JSON, CSV, Excel, or another supported format. The run summary is available in the run output.

### Limits and troubleshooting

Google Maps results can vary by location, language, and time. A run may return partial results or a limited public view. Check the run log and summary if no businesses or fewer than expected businesses are returned.

The Actor uses public Maps pages and does not bypass CAPTCHAs or other access controls. Optional detail and website visits add run time.

### Privacy

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

# Actor input Schema

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

Primary public Maps queries.

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

Compatibility alias for searchStringsArray.

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

Public Google Maps searches.

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

Single-query compatibility alias.

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

Public Google Maps search/place URLs.

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

Compatibility alias for startUrls.

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

Optional location appended to generated searches.

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

Global maximum of normal records.

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

Compatibility alias for maxItems.

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

Maximum rendered result batches per source.

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

Deduplicate by public place identity.

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

Optional minimum public rating.

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

Optional minimum public review count.

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

Optional case-insensitive category substring.

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

Return filtered public photo URLs.

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

Use regular Puppeteer browser rendering.

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

Compatibility alias for renderJavaScript.

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

Bounded delay between result batches.

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

Retries for failed public HTTP requests.

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

Navigation/request timeout.

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

Millisecond timeout alias.

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

Bound static response size.

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

Wait after navigation before parsing.

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

Optional Apify Proxy configuration passed to browser transport.

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

Optional ordinary user agent; no stealth settings.

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

Short locale such as en or en-US.

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

Compatibility alias for locale.

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

Open identity-matched public Maps profiles for rich businessProfile fields up to maxDetailItems. Disabled by default.

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

Bound future detail navigation.

## `attributeTerms` (type: `array`):

Compatibility extra terms for public text matching.

## `requiredFields` (type: `array`):

Fields used by gap/lead scoring.

## `brand` (type: `string`):

Brand used for chain searches.

## `chainName` (type: `string`):

Chain-name compatibility alias.

## `keyword` (type: `string`):

Keyword used for rank tracking.

## `similarTo` (type: `string`):

Query used for transparent similarity scoring.

## `lookbackDays` (type: `integer`):

Observation window label for new-business runs.

## `lat` (type: `number`):

Optional rank grid latitude.

## `lng` (type: `number`):

Optional rank grid longitude.

## `previousSnapshot` (type: `string`):

Optional JSON text containing a prior public snapshot for change comparison.

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

One-based starting page or offset page for paginated sources.

## `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
{
  "maxPages": 3,
  "deduplicate": true,
  "includeMedia": true,
  "requestDelayMs": 750,
  "maxRequestRetries": 1,
  "maxResponseBytes": 5000000,
  "browserWaitMs": 1500,
  "includeDetails": false,
  "lookbackDays": 30,
  "page": 1,
  "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-competitor-analysis-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-competitor-analysis-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-competitor-analysis-scraper --silent --output-dataset

```

## MCP server setup

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