# Google Maps Review Search & Scraper (`selective_stake/google-maps-review-search-scraper`) Actor

Extracts reviews from Google Maps, allowing advanced searches with multiple keywords per location to find specific feedback. Ideal for sentiment analysis and competitor research, it enables targeting by Place ID, URL, or name, with filters for date and rating.

- **URL**: https://apify.com/selective_stake/google-maps-review-search-scraper.md
- **Developed by:** [Selective](https://apify.com/selective_stake) (community)
- **Categories:** E-commerce, Travel
- **Stats:** 39 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 reviews

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?

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

## Google Reviews Search & Scraper

**The ONLY Google Maps review scraper that lets you search within reviews for specific keywords.**

Extract reviews from Google Maps places with **pinpoint keyword search** - the game-changing feature that sets this scraper apart from all others.

### What makes this scraper unique?

While other Google Maps scrapers can only scrape reviews sequentially (newest first, oldest first, etc.) and then require manual filtering afterward, this scraper lets you **search directly within Google's review system** for specific keywords. This means:

- **Targeted data collection**: Only get reviews mentioning your keywords
- **Massive time savings**: No need to scrape hundreds of reviews just to find the 20 that mention "waiting time"
- **Competitive intelligence**: Find specific complaint patterns in competitors (e.g., "price", "service", "quality")
- **Efficient analysis**: Focus on reviews that matter to your research

### What does this actor do?

This actor scrapes reviews from Google Maps for any place you specify, but **only reviews that contain your specified search terms**. This makes it ideal for:

- **Competitor analysis**: Find specific complaints about competitors (e.g., "long wait", "expensive", "rude staff")
- **Market research**: Identify pain points mentioned in reviews (e.g., "delivery", "quality", "service")
- **Sentiment analysis**: Target reviews about specific topics or features
- **Brand monitoring**: Track mentions of specific keywords about your business

You can target places by:

- Google Maps Place ID
- Google Maps URL
- Exact name as shown in Google Maps

### Features

- **🔍 PINPOINT KEYWORD SEARCH:** The core differentiator - search directly within Google's review system for specific keywords. Only get reviews that mention your terms (e.g., "waiting time", "price", "service quality").
- **🎯 Targeted data collection:** Skip irrelevant reviews and focus only on what matters to your research.
- **⚡ Massive efficiency gains:** No more scraping hundreds of reviews to find the 20 that mention "delivery issues".
- **🏢 Competitive intelligence:** Find specific complaint patterns in competitors (e.g., "rude staff", "long wait", "expensive").
- **Flexible input:** Scrape by Place ID, URL, or name.
- **Sorting:** Sort reviews by relevance, newest, highest, or lowest rating.
- **Date filtering:** Stop scraping at a specific oldest date (when sorting by newest).
- **Region selection:** Set browser language and residential proxy country (US, DE, FR, IT, ES, CZ, NL, PL, TR, UK, SE, AT, AU, AZ, BE, BR, BG, KH, CA, CL, HR, DK, EG, FI, GE, GR, HU, IN, ID, JP, LU, LT, LI, MY, MT, MX, NZ, NO, PE, PT, RO, RS, SK, SI, CH, TH, UA).
- **Proxy support:** Choose between datacenter, residential, or no proxy.
- **Headless mode:** Option to run browser with or without UI.
- **Author info:** Optionally include reviewer details (name, profile URL, image).
- **Duplicate detection:** Option to stop scraping when a duplicate review is found.
- **Review limits:** Set max reviews per place and per search term.

### Input

The actor accepts a JSON object with the following fields:

| Field                       | Type      | Description                                                                                  |
|-----------------------------|-----------|----------------------------------------------------------------------------------------------|
| `placeids`                  | array     | List of Google Maps Place IDs to scrape (max 10).                                            |
| `urls`                      | array     | List of Google Maps URLs to scrape (max 10).                                                 |
| `names`                     | array     | List of exact place names as shown in Google Maps (max 10).                                  |
| `sort_by`                   | string    | Sort order: `relevance`, `newest`, `highest`, `lowest`.                                      |
| `search_terms`              | array     | **REQUIRED** - List of keywords to filter reviews. This is the core feature - only reviews containing these terms will be scraped.                       |
| `oldest_date`               | string    | Oldest review date to scrape (YYYY-MM-DD). Only works with `sort_by: newest`.                |
| `max_reviews`               | integer   | Max number of reviews per place (default: 100).                                              |
| `max_reviews_per_search_term` | integer | Max reviews per search term (default: 50).                                                   |
| `region`                    | string    | Region code that sets browser language and residential proxy country: `US`, `DE`, `FR`, `IT`, `ES`, and many more. |
| `proxy`                     | string    | Proxy type: `none`, `datacenter`, `residential`.                                             |
| `headless`                  | boolean   | Run browser in headless mode (default: true).                                                |
| `include_author_info`       | boolean   | Include reviewer info (default: false).                                                      |
| `stop_on_match`             | boolean   | Stop scraping when a duplicate review is found (default: false).                             |

#### Example input

```json
{
  "sort_by": "newest",
  "search_terms": [
    "waiting time",
    "price"
  ],
  "max_reviews": 100,
  "max_reviews_per_search_term": 50,
  "region": "US",
  "proxy": "residential",
  "headless": true,
  "include_author_info": false,
  "stop_on_match": false,
  "placeids": [],
  "urls": [
    "https://www.google.com/maps/place/Independence+Palace/@10.7795106,106.6730372,3296m/data=!3m1!1e3!4m16!1m9!3m8!1s0x31752f385570472f:0x1787491df0ed8d6a!2sIndependence+Palace!8m2!3d10.7769942!4d106.6953021!9m1!1b1!16zL20vMDk4NHg5!3m5!1s0x31752f385570472f:0x1787491df0ed8d6a!8m2!3d10.7769942!4d106.6953021!16zL20vMDk4NHg5"
  ],
  "names": [],
  "oldest_date": "2022-01-01"
}F
```

### Output

The actor outputs a dataset of reviews, each with fields such as:

- `review_text`
- `published_date`
- `stars`
- `review_id`
- `review_url`
- `owner_response`
- `review_images`
- `detailed_ratings`
- `author` (if enabled)
- `author_profile_url` (if enabled)
- `profile_picture` (if enabled)
- ...and more

### Typical use cases

- **🔍 Competitive intelligence**: Find specific complaints about competitors (e.g., search for "long wait", "expensive", "rude staff" to identify pain points).
- **📊 Market research**: Discover what customers are saying about specific topics (e.g., "delivery", "quality", "service").
- **🎯 Targeted sentiment analysis**: Focus on reviews mentioning specific features or issues.
- **🏢 Brand monitoring**: Track mentions of specific keywords about your business.
- **⚡ Efficient data collection**: Skip irrelevant reviews and focus only on what matters to your research.

### Why this scraper is different

**Traditional Google Maps scrapers:**

- Can only scrape reviews sequentially (newest/oldest first)
- Require you to scrape many reviews to find relevant ones
- Need manual filtering afterward to find specific keywords
- Waste time on irrelevant reviews when you only need specific feedback

**This scraper:**

- Searches directly within Google's review system for your keywords
- Only scrapes reviews containing your search terms
- Delivers targeted, relevant data immediately
- Saves time by skipping irrelevant reviews

### How to use

1. **Add your search terms** (REQUIRED) - the keywords you want to find in reviews
2. Add your target places using Place IDs, URLs, or names.
3. Set your desired options (sort, region, proxy, etc.).
4. Run the actor.
5. Download your results from the Apify dataset in JSON, CSV, or Excel.

### Practical examples

**Competitive analysis:**

- Search for `["waiting time", "long wait", "slow service"]` to find customer complaints about delays
- Search for `["expensive", "overpriced", "price"]` to identify pricing concerns
- Search for `["rude", "unfriendly", "bad service"]` to find service quality issues

**Market research:**

- Search for `["delivery", "shipping", "arrived"]` to understand delivery experiences
- Search for `["quality", "durable", "broke"]` to assess product quality feedback
- Search for `["clean", "dirty", "hygiene"]` for cleanliness-related feedback

### FAQ

**Q: Can I scrape reviews for multiple places at once?**\
A: Yes, you can provide up to 10 places in total (across Place IDs, URLs, and names).

**Q: Can I search for reviews mentioning specific words?**\
A: Yes! This is the core feature that makes this scraper unique. Add your keywords to the `search_terms` field and only reviews containing those terms will be scraped. This saves time compared to scraping many reviews sequentially and filtering afterward.

**Q: Is it possible to limit the number of reviews?**\
A: Yes, use `max_reviews` and/or `max_reviews_per_search_term`.

**Q: Can I include reviewer details?**\
A: Set `include_author_info` to `true` to include author name, profile URL, and image.

**Q: What regions are supported?**\
A: The region setting controls both browser language and residential proxy country. Supported regions include: US, DE, FR, IT, ES, CZ, NL, PL, TR, UK, SE, AT, AU, AZ, BE, BR, BG, KH, CA, CL, HR, DK, EG, FI, GE, GR, HU, IN, ID, JP, LU, LT, LI, MY, MT, MX, NZ, NO, PE, PT, RO, RS, SK, SI, CH, TH, UA.

### Legal & ethical notice

Scraping Google Maps is subject to Google’s Terms of Service. Use this actor responsibly and only for lawful purposes.

***

For more details, see the [input schema](https://docs.apify.com/platform/actors/development/input-schema) and Apify documentation.

# Actor input Schema

## `placeids` (type: `array`):

List of Google Maps Place IDs to scrape reviews for. You can provide up to 10 places in total across all fields.

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

List of Google Maps URLs to scrape reviews for. Must start with https://www.google.com/maps/place or https://maps.app.goo.gl/. You can provide up to 10 places in total across all fields.

## `names` (type: `array`):

List of exact names as they appear in Google Maps. Used to construct a search URL. You can provide up to 10 places in total across all fields.

## `sort_by` (type: `string`):

Sort order for reviews.

## `search_terms` (type: `array`):

List of search terms to filter reviews. This is the core feature that makes this scraper unique - you can search for specific keywords within reviews to find targeted feedback.

## `oldest_date` (type: `string`):

Oldest review date to scrape (YYYY-MM-DD format, e.g., '2023-01-15'). Can only be used when sort_by is 'newest'. Scraping will stop when reaching reviews older than this date.

## `max_reviews` (type: `integer`):

Maximum number of reviews to scrape per place. If max_reviews_per_search_term is set, this will be the total number of reviews scraped for all search terms for each place.

## `max_reviews_per_search_term` (type: `integer`):

If set, limits the number of reviews scraped for each search term. If not set, all reviews for each search term are scraped (up to max_reviews per place).

## `region` (type: `string`):

Region code that sets the browser language and, for residential proxies, the country of the IP addresses. Available options: EN, DE, FR, IT, ES, CZ, NL, PL, TR, UK, SE, AT, AU, AZ, BE, BR, BG, KH, CA, CL, HR, DK, EG, FI, GE, GR, HU, IN, ID, JP, LU, LT, LI, MY, MT, MX, NZ, NO, PE, PT, RO, RS, SK, SI, CH, TH, UA, US.

## `proxy` (type: `string`):

Type of proxy to use for scraping.

## `headless` (type: `boolean`):

Run the browser in headless mode (no UI).

## `include_author_info` (type: `boolean`):

Whether to include author-related information (author, user_images, author_profile_url, profile_picture) in the output.

## `stop_on_match` (type: `boolean`):

Stop scraping when a duplicate review is found.

## Actor input object example

```json
{
  "placeids": [],
  "urls": [
    "https://www.google.com/maps/place/Independence+Palace/@10.7795106,106.6730372,3296m/data=!3m1!1e3!4m16!1m9!3m8!1s0x31752f385570472f:0x1787491df0ed8d6a!2sIndependence+Palace!8m2!3d10.7769942!4d106.6953021!9m1!1b1!16zL20vMDk4NHg5!3m5!1s0x31752f385570472f:0x1787491df0ed8d6a!8m2!3d10.7769942!4d106.6953021!16zL20vMDk4NHg5"
  ],
  "names": [],
  "sort_by": "newest",
  "search_terms": [
    "waiting time"
  ],
  "oldest_date": "2022-01-01",
  "max_reviews": 100,
  "max_reviews_per_search_term": 50,
  "region": "US",
  "proxy": "residential",
  "headless": true,
  "include_author_info": false,
  "stop_on_match": false
}
```

# 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 = {
    "placeids": [],
    "urls": [
        "https://www.google.com/maps/place/Independence+Palace/@10.7795106,106.6730372,3296m/data=!3m1!1e3!4m16!1m9!3m8!1s0x31752f385570472f:0x1787491df0ed8d6a!2sIndependence+Palace!8m2!3d10.7769942!4d106.6953021!9m1!1b1!16zL20vMDk4NHg5!3m5!1s0x31752f385570472f:0x1787491df0ed8d6a!8m2!3d10.7769942!4d106.6953021!16zL20vMDk4NHg5"
    ],
    "names": [],
    "sort_by": "newest",
    "search_terms": [
        "waiting time"
    ],
    "oldest_date": "2022-01-01",
    "max_reviews": 100,
    "max_reviews_per_search_term": 50,
    "region": "US",
    "proxy": "residential",
    "headless": true,
    "include_author_info": false,
    "stop_on_match": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("selective_stake/google-maps-review-search-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 = {
    "placeids": [],
    "urls": ["https://www.google.com/maps/place/Independence+Palace/@10.7795106,106.6730372,3296m/data=!3m1!1e3!4m16!1m9!3m8!1s0x31752f385570472f:0x1787491df0ed8d6a!2sIndependence+Palace!8m2!3d10.7769942!4d106.6953021!9m1!1b1!16zL20vMDk4NHg5!3m5!1s0x31752f385570472f:0x1787491df0ed8d6a!8m2!3d10.7769942!4d106.6953021!16zL20vMDk4NHg5"],
    "names": [],
    "sort_by": "newest",
    "search_terms": ["waiting time"],
    "oldest_date": "2022-01-01",
    "max_reviews": 100,
    "max_reviews_per_search_term": 50,
    "region": "US",
    "proxy": "residential",
    "headless": True,
    "include_author_info": False,
    "stop_on_match": False,
}

# Run the Actor and wait for it to finish
run = client.actor("selective_stake/google-maps-review-search-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 '{
  "placeids": [],
  "urls": [
    "https://www.google.com/maps/place/Independence+Palace/@10.7795106,106.6730372,3296m/data=!3m1!1e3!4m16!1m9!3m8!1s0x31752f385570472f:0x1787491df0ed8d6a!2sIndependence+Palace!8m2!3d10.7769942!4d106.6953021!9m1!1b1!16zL20vMDk4NHg5!3m5!1s0x31752f385570472f:0x1787491df0ed8d6a!8m2!3d10.7769942!4d106.6953021!16zL20vMDk4NHg5"
  ],
  "names": [],
  "sort_by": "newest",
  "search_terms": [
    "waiting time"
  ],
  "oldest_date": "2022-01-01",
  "max_reviews": 100,
  "max_reviews_per_search_term": 50,
  "region": "US",
  "proxy": "residential",
  "headless": true,
  "include_author_info": false,
  "stop_on_match": false
}' |
apify call selective_stake/google-maps-review-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,selective_stake/google-maps-review-search-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/htX8FfsKg2Ip3WphQ/builds/bxkq2jvCarn4a3Kq9/openapi.json
