# Google Maps Reviews Scraper (`beatanalytics/google-maps-reviews-scraper`) Actor

Scrape Google Maps reviews with exact timestamps, date-range filtering, and bulk input. Extract full review text, ratings, author info, owner responses, and photos for any Google Maps place. Export as CSV, JSON, or Excel.

- **URL**: https://apify.com/beatanalytics/google-maps-reviews-scraper.md
- **Developed by:** [Beat Analytics](https://apify.com/beatanalytics) (community)
- **Categories:** Automation, Developer tools, SEO tools
- **Stats:** 6 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Reviews Scraper -- Extract Reviews with Exact Timestamps and Date Filtering

Scrape Google Maps reviews for any place at scale -- extract full review text, exact ISO 8601 timestamps, star ratings, author info, review photos, and business owner responses. Unlike other Google Maps review scrapers, this actor gives you exact review dates (not "2 weeks ago") and efficient date-range filtering that actually works. Find places by URL, Place ID, or built-in search, and export your data as JSON, CSV, Excel, XML, or HTML. Use the data for sentiment analysis, reputation monitoring, location intelligence, or competitive research.

- [Why use this Google Maps review scraper?](#why-use-this-google-maps-review-scraper)
- [What data can you extract from Google Maps reviews?](#what-data-can-you-extract-from-google-maps-reviews)
- [How to scrape Google Maps reviews](#how-to-scrape-google-maps-reviews)
- [Input parameters](#input-parameters)
- [Output example](#output-example)
- [How much does it cost to scrape Google Maps reviews?](#how-much-does-it-cost-to-scrape-google-maps-reviews)
- [Use cases for Google Maps review data](#use-cases-for-google-maps-review-data)
- [Integrations and API access](#integrations-and-api-access)
- [Frequently asked questions](#frequently-asked-questions)

### Why use this Google Maps review scraper?

- 🕐 **Exact timestamps, not "2 weeks ago"** -- most Google Maps scrapers only give you relative times like "a month ago." This scraper extracts the exact review date and time in ISO 8601 format (e.g. `2026-05-01T12:34:05+00:00`), so your data is precise and ready for time-series analysis.
- 📅 **Date-range filtering that works** -- filter reviews by start date, end date, or both. The scraper uses efficient newest-first pagination with early stopping, so it only fetches the pages it needs rather than crawling through an entire review history. Other scrapers' date filtering is often broken or inefficient.
- 📍 **Built-in place search** -- find places by search query and location (e.g. "pizza" in "New York") without needing URLs first. All combinations of queries and locations are searched automatically.
- 🔗 **Bulk multi-location input** -- scrape reviews from dozens or hundreds of places in a single run. Provide Google Maps URLs, share links, Place IDs, or Feature IDs -- mix and match input types freely.
- 🔄 **Automatic translation** -- reviews in other languages are automatically translated to your chosen language, with the original text preserved in a separate field.
- ⚡ **Full review history, no API limits** -- the Google Places API only returns up to 5 reviews per place with no pagination. This scraper extracts the full review history -- thousands of reviews per place -- with no API key, no billing setup, and no configuration overhead.
- 📦 **Rich place metadata with every review** -- each review includes the place name, address, rating, review count, categories, phone, website, and description. No need to run a separate details scraper.
- 💬 **Business owner responses included** -- extract owner reply text, original language text, and reply timestamp for every review that has a response.
- 🖼️ **Review photos** -- extract all photo URLs attached to each review.
- 👤 **Author information** -- get the reviewer's display name, Google Maps profile URL, and profile photo.
- 📊 **Flexible sorting** -- sort reviews by newest, most relevant, highest rated, or lowest rated.
- 💾 **Export as JSON, CSV, Excel, XML, or HTML** -- download your Google Maps review data in whichever format your workflow requires. All five formats are available out of the box on the Apify platform.

### What data can you extract from Google Maps reviews?

Google Maps Reviews Scraper extracts a comprehensive set of fields for every review, along with full place metadata. Here is the complete list of fields in each output item:

**Place information:**

- **placeName** -- name of the Google Maps place (e.g. "Joe's Pizza Broadway")
- **placeAddress** -- full address of the place
- **placeFeatureId** -- Google Maps internal feature ID (e.g. `0x89c259ab3c1ef289:0x3b67a41175949f55`)
- **placePlaceId** -- Google Place ID (e.g. `ChIJifIePKtZwokRVZ-UdRGkZzs`)
- **placeRating** -- overall average rating of the place (e.g. `4.5`)
- **placeReviewCount** -- total number of reviews for the place
- **placeCategories** -- list of place categories (e.g. `["Pizza restaurant", "Italian restaurant"]`)
- **placePhone** -- phone number
- **placeWebsite** -- website URL
- **placeDescription** -- short description of the place from Google Maps

**Review data:**

- **rating** -- star rating (1-5)
- **text** -- full review text, translated to your chosen language if applicable
- **originalText** -- original review text before translation (null if the review is in the target language)
- **language** -- detected language of the review (ISO 639-1 code, e.g. `en`, `es`, `de`)
- **timestamp** -- exact review date and time in ISO 8601 format (e.g. `2026-05-01T12:34:05+00:00`)

**Author information:**

- **authorName** -- reviewer's display name
- **authorUrl** -- link to the reviewer's Google Maps profile
- **authorPhoto** -- URL of the reviewer's profile photo

**Review media:**

- **photos** -- URLs of all photos attached to the review

**Business owner response (when present):**

- **ownerResponseText** -- the owner's reply text, translated if applicable
- **ownerResponseOriginalText** -- the owner's reply in the original language
- **ownerResponseTimestamp** -- when the owner replied (ISO 8601)

### How to scrape Google Maps reviews

Getting started with Google Maps review scraping takes less than two minutes. Follow these five steps to extract your first batch of reviews:

**Step 1: Create a free Apify account**

Sign up at [apify.com](https://apify.com) if you do not have an account yet. Every new account includes $5 in free credits -- enough to scrape 10,000 Google Maps reviews at no cost.

**Step 2: Open the Google Maps Reviews Scraper**

Navigate to the [Google Maps Reviews Scraper](https://apify.com/beatanalytics/google-maps-reviews-scraper) actor page on the Apify Store and click "Try for free" to open the actor in your Apify Console.

**Step 3: Add your places or search queries**

You have three ways to specify which places to scrape reviews for:

- **Place URLs** -- paste Google Maps URLs like `https://www.google.com/maps/place/Joe's+Pizza+Broadway/...` or share links like `https://maps.app.goo.gl/...`
- **Place IDs** -- enter Google Place IDs (e.g. `ChIJifIePKtZwokRVZ-UdRGkZzs`) or Feature IDs (e.g. `0x89c259ab3c1ef289:0x3b67a41175949f55`)
- **Search** -- enter search queries (e.g. "pizza", "hotels") and locations (e.g. "New York, NY"). The scraper searches all combinations of queries and locations and finds matching places automatically.

You can combine all three methods in a single run.

**Step 4: Configure optional settings**

Optionally, adjust these settings:

- Set a **date range** to only get reviews from a specific time period
- Choose a **sort order** (newest, most relevant, highest rated, lowest rated)
- Set a **maximum number of reviews** per place
- Change the **language** for review translation

**Step 5: Click Start and download your data**

Click the "Start" button to begin scraping. Once the run completes, download your Google Maps review data in any format: **JSON, CSV, Excel, XML, or HTML**. You can also access the data programmatically via the Apify API, or set up automatic exports to Google Sheets, Dropbox, Amazon S3, and other destinations.

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `placeUrls` | Array of URLs | No* | -- | Google Maps place URLs or share links to scrape reviews for. Supports full URLs (`google.com/maps/place/...`) and share links (`maps.app.goo.gl/...`). |
| `placeIds` | Array of strings | No* | -- | Google Place IDs (`ChIJ...`) or Feature IDs (`0x...:0x...`). Can be used instead of or in addition to Place URLs. |
| `searchQueries` | Array of strings | No* | -- | Search terms to find places (e.g. `"pizza"`, `"hotels"`, `"dentist"`). Used together with `searchLocations` -- all combinations are searched. |
| `searchLocations` | Array of strings | No | -- | Locations to search in (e.g. `"New York, NY"`, `"London, UK"`). Used together with `searchQueries` -- all combinations are searched. |
| `maxPlacesPerSearch` | Integer | No | `20` | Maximum number of places to find per search query + location combination. |
| `maxReviewsPerPlace` | Integer | No | unlimited | Maximum number of reviews to scrape per place. Leave empty to scrape all reviews. |
| `startDate` | Date (YYYY-MM-DD) | No | -- | Only include reviews on or after this date. When set, reviews are fetched newest-first for efficient filtering. |
| `endDate` | Date (YYYY-MM-DD) | No | -- | Only include reviews on or before this date. When set, reviews are fetched newest-first for efficient filtering. |
| `sortBy` | String | No | `newest` | Sort order for reviews: `newest`, `relevant`, `highest`, or `lowest`. Automatically set to `newest` when date filtering is active. |
| `language` | String | No | `en` | Language code for review translation (e.g. `en`, `de`, `es`). Reviews in other languages are translated to this language. |
| `country` | String | No | `us` | Country code (e.g. `us`, `de`, `gb`). Affects which Google region is used for results. |

*At least one of `placeUrls`, `placeIds`, or `searchQueries` (with `searchLocations`) must be provided.

**Search example:** Setting `searchQueries` to `["pizza", "sushi"]` and `searchLocations` to `["New York, NY", "Chicago, IL"]` runs four searches. With `maxPlacesPerSearch` at 20, this finds up to 80 places and scrapes reviews for each one.

**Date filtering example:** Setting `startDate` to `2025-01-01` and `endDate` to `2025-06-30` returns only reviews from the first half of 2025. The scraper paginates newest-first and stops as soon as it passes the start date, so it does not need to crawl through years of older reviews.

### Output example

Each item in the dataset represents a single review. Results are stored in an Apify dataset and can be exported as **JSON, CSV, Excel, XML, or HTML** directly from the Apify Console, or accessed programmatically via the Apify API. All fields flatten cleanly to tabular formats like CSV and Excel.

```json
{
  "placeName": "Joe's Pizza Broadway",
  "placeAddress": "1435 Broadway, New York, NY 10018",
  "placeFeatureId": "0x89c259ab3c1ef289:0x3b67a41175949f55",
  "placePlaceId": "ChIJifIePKtZwokRVZ-UdRGkZzs",
  "placeRating": 4.5,
  "placeReviewCount": 22117,
  "placeCategories": ["Pizza restaurant", "Italian restaurant"],
  "placePhone": "+1 212-391-7777",
  "placeWebsite": "https://www.joespizzanyc.com",
  "placeDescription": "No-frills, counter-serve pizzeria serving classic NYC slices.",
  "rating": 5,
  "text": "Best pizza in New York, hands down. The cheese slice is perfection -- crispy, foldable, and loaded with flavor. Worth the wait in line.",
  "originalText": null,
  "language": "en",
  "timestamp": "2026-05-01T12:34:05+00:00",
  "authorName": "John D.",
  "authorUrl": "https://www.google.com/maps/contrib/1234567890/reviews",
  "authorPhoto": "https://lh3.googleusercontent.com/a/example=s120-c-rp-mo-br100",
  "photos": [
    "https://lh5.googleusercontent.com/p/example1",
    "https://lh5.googleusercontent.com/p/example2"
  ],
  "ownerResponseText": "Thanks for the kind words, John! Glad you enjoyed the slice. See you next time!",
  "ownerResponseOriginalText": null,
  "ownerResponseTimestamp": "2026-05-02T09:15:00+00:00"
}
````

### How much does it cost to scrape Google Maps reviews?

Google Maps Reviews Scraper uses simple, transparent per-result pricing -- you only pay for the reviews you get.

**$0.50 per 1,000 reviews** -- each review extracted counts as one result. If you scrape 500 reviews from a place, you pay for 500 results. No hidden compute fees, no per-run charges.

**Free trial:** Every new Apify account comes with **$5 in free platform credits** -- no credit card required. That is enough to scrape 10,000 Google Maps reviews at no cost, so you can fully evaluate the scraper and data quality before committing.

**Enterprise plans:** If you need to scrape Google Maps reviews at very high volume -- hundreds of thousands of reviews across thousands of locations on a regular basis -- reach out to <sales@beatanalytics.org> for custom Enterprise pricing with dedicated support and volume discounts.

### Use cases for Google Maps review data

Google Maps review data powers a wide range of business, research, and operational workflows. Here are the most common use cases:

**Sentiment analysis and NLP**

Feed Google Maps review text into natural language processing pipelines to measure customer sentiment at scale. The exact ISO 8601 timestamps enable precise time-series analysis -- track how sentiment changes after a menu update, a renovation, or a management change. Google Maps reviews are among the most widely used datasets in NLP research because of the pairing of structured ratings with free-text reviews.

**Reputation monitoring**

Monitor your own business reviews across multiple locations to catch negative feedback early. Schedule regular scraping runs with date-range filtering to only fetch new reviews since the last run. Alert your team when low-rated reviews appear so you can respond promptly. Proactive reputation management prevents small issues from escalating.

**Competitive benchmarking**

Compare your review ratings, volume, and themes against direct competitors. Use the built-in search feature to find all competitors in a category and location (e.g. "dentist" in "Austin, TX"), then scrape all their reviews in one run. Identify what customers praise about competitors and where your business already stands out.

**Location intelligence and site selection**

Aggregate review data across businesses in a geographic area to evaluate market conditions. Retailers, restaurant chains, and franchises use review data to identify underserved neighborhoods, measure foot traffic sentiment, and evaluate potential new locations. The place metadata (rating, review count, categories) adds quantitative context alongside qualitative reviews.

**Multi-location brand monitoring**

Franchise and chain businesses can track review performance across all locations in a single run. Compare ratings and common complaints between locations, identify best-performing stores, and spot locations that need operational attention. Date-range filtering makes it easy to run weekly or monthly review digests.

**Market research and trend analysis**

Track emerging trends by monitoring what customers mention in reviews across an industry vertical. Use keyword analysis or topic modeling on review text to identify rising product demands, recurring service complaints, or seasonal patterns. The search feature lets you cast a wide net across a metro area or category.

### Integrations and API access

Google Maps Reviews Scraper integrates with the Apify platform ecosystem, giving you programmatic access to your scraped data and the ability to connect it to thousands of external tools.

#### Python

Use the [Apify Python SDK](https://docs.apify.com/sdk/python/) to run the scraper and retrieve results programmatically:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run_input = {
    "placeUrls": [
        {"url": "https://www.google.com/maps/place/Joe's+Pizza+Broadway/@40.7546795,-73.9870291,17z/"}
    ],
    "maxReviewsPerPlace": 100,
    "language": "en",
}

run = client.actor("beatanalytics/google-maps-reviews-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['placeName']} - {item['rating']}* - {item['text'][:80]}")
```

#### JavaScript / Node.js

Use the [Apify JavaScript SDK](https://docs.apify.com/sdk/js/) to integrate Google Maps review scraping into your Node.js applications:

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("beatanalytics/google-maps-reviews-scraper").call({
    searchQueries: ["pizza"],
    searchLocations: ["New York, NY"],
    maxPlacesPerSearch: 10,
    maxReviewsPerPlace: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.placeName} - ${item.rating}* - ${item.timestamp}`);
});
```

#### No-code integrations

Connect Google Maps Reviews Scraper to thousands of apps without writing code:

- **Make (formerly Integromat)** -- trigger workflows when new Google Maps review data is scraped, or schedule regular runs as part of larger automations
- **Zapier** -- connect Google Maps review data to Google Sheets, Slack, email, CRM tools, and 5,000+ other apps
- **Webhooks** -- receive HTTP notifications when a scraping run completes, then process the data in your own backend
- **Google Sheets** -- export results directly to a Google Sheets spreadsheet for collaborative analysis
- **Amazon S3 / Dropbox** -- automatically save scraped data to cloud storage after each run

#### Scheduled runs

Set up Google Maps Reviews Scraper to run on a schedule (hourly, daily, weekly, or custom cron) to keep your review data fresh. Use date-range filtering with `startDate` to only fetch reviews since the last run, making scheduled scrapes fast and cost-efficient. This is particularly useful for reputation monitoring, competitive tracking, and brand management workflows.

#### API endpoints

Every scraper run on Apify exposes RESTful API endpoints for accessing results, checking run status, and managing datasets. See the [Apify API documentation](https://docs.apify.com/api/v2) for the complete reference.

### Frequently asked questions

#### How to scrape Google Maps reviews without the API?

Google Maps Reviews Scraper is the easiest way to extract Google Maps reviews without the Google Places API. Open the actor on Apify, add your place URLs, Place IDs, or search queries, and click Start. The scraper handles all pagination and data extraction automatically and returns structured results in JSON, CSV, or any other supported format. No API key, no billing setup, no authentication. See [How to scrape Google Maps reviews](#how-to-scrape-google-maps-reviews) for a step-by-step guide.

#### Is it legal to scrape Google Maps reviews?

Web scraping of publicly available data is generally legal in the United States, as affirmed by the 2022 US Ninth Circuit ruling in *hiQ Labs v. LinkedIn*, which established that scraping publicly accessible data does not violate the Computer Fraud and Abuse Act. Google Maps reviews are publicly visible without requiring a login or account.

That said, you should always review Google's Terms of Service and consult with legal counsel if you have concerns about your specific use case. The legality of web scraping can vary by jurisdiction and intended use. Apify provides the scraping infrastructure, but users are responsible for ensuring their use of scraped data complies with applicable laws and terms of service.

#### How many reviews can I scrape?

There is no hard limit on the total number of reviews you can scrape. The scraper extracts all reviews available for each place, paginating through the full review history automatically. You can control the volume per place using the `maxReviewsPerPlace` parameter.

For places with thousands of reviews, the scraper handles pagination automatically and fetches every page. If you need to scrape reviews from hundreds or thousands of places in a single run, the scraper processes them concurrently for efficient bulk extraction.

#### How much does it cost to scrape Google Maps reviews?

Google Maps Reviews Scraper costs **$0.50 per 1,000 reviews** scraped. Every new Apify account includes $5 in free credits -- enough to scrape 10,000 reviews at no cost. Contact <sales@beatanalytics.org> for Enterprise pricing on large-scale operations. See [How much does it cost to scrape Google Maps reviews?](#how-much-does-it-cost-to-scrape-google-maps-reviews) for more details.

#### How is this different from other Google Maps review scrapers?

This scraper is built for users who need precise, analysis-ready data. The key differences:

- **Exact timestamps** -- most Google Maps scrapers only capture relative times like "2 weeks ago" or "a month ago." This scraper extracts the exact date and time in ISO 8601 format, which is essential for time-series analysis, trend tracking, and any workflow where you need to know exactly when a review was posted.
- **Date-range filtering that works** -- filter reviews by start date, end date, or both. The scraper uses newest-first pagination with early stopping, so it only fetches the pages it needs. Other scrapers either lack date filtering or implement it inefficiently by crawling the entire review history first.
- **Built-in place search** -- find places by query and location directly in the scraper, without needing to collect URLs first.
- **Rich place metadata** -- every review includes 10 place-level fields (name, address, rating, categories, phone, website, etc.), so you do not need a separate details scraper.

#### Can I filter reviews by date?

Yes. Set `startDate` and/or `endDate` in the input to only get reviews from a specific time period. For example, setting `startDate` to `2025-01-01` and `endDate` to `2025-12-31` returns only reviews from 2025.

When date filtering is active, the scraper automatically sorts reviews newest-first and stops paginating as soon as it passes the start date. This makes date-filtered scrapes much faster and cheaper than scraping the full review history, because the scraper does not need to crawl through years of older reviews.

#### Can I search for places and scrape their reviews in one run?

Yes. Enter search queries (e.g. "dentist", "coffee shop") and locations (e.g. "San Francisco, CA", "London, UK") in the input. The scraper searches all combinations of queries and locations, finds matching places, and scrapes reviews for each one -- all in a single run. Use `maxPlacesPerSearch` to control how many places are found per search combination.

#### What export formats are supported?

The scraper outputs data to an Apify dataset. From the Apify Console, you can export the results as **JSON, CSV, Excel (XLSX), XML, or HTML** with a single click. The data is also accessible via the Apify API for programmatic access in any format.

#### How often is the data updated?

The scraper fetches live data from Google Maps every time it runs. There is no caching or stale data -- each run makes fresh requests and returns the most current reviews available at that moment. To track new reviews over time, schedule the scraper to run on a recurring basis (hourly, daily, weekly) using Apify's built-in scheduling feature. Combine scheduled runs with `startDate` filtering to only fetch reviews posted since the last run.

#### Can I scrape reviews in languages other than English?

Yes. Set the `language` parameter to any language code (e.g. `de` for German, `es` for Spanish, `ja` for Japanese). Google Maps will translate reviews written in other languages into your chosen language. The original review text is always preserved in the `originalText` field, so you get both the translation and the original.

#### Can I scrape reviews from multiple places at once?

Yes. You can add as many Google Maps place URLs, Place IDs, or Feature IDs as you need in a single run. You can also use the search feature to find multiple places by query and location. The scraper processes all places concurrently, making bulk Google Maps review scraping fast and efficient. There is no limit on the number of places per run.

#### What is the difference between Place IDs and Feature IDs?

Google Maps uses two types of identifiers for places:

- **Place ID** -- a stable identifier that starts with `ChIJ` (e.g. `ChIJifIePKtZwokRVZ-UdRGkZzs`). This is the identifier used in the Google Places API and is the most commonly referenced ID format.
- **Feature ID** -- an internal Google Maps identifier in the format `0x...:0x...` (e.g. `0x89c259ab3c1ef289:0x3b67a41175949f55`). This can be found in Google Maps URLs.

The scraper accepts both formats. If you provide a Place ID or a Google Maps URL, it is automatically resolved to the correct place.

# Actor input Schema

## `placeUrls` (type: `array`):

Google Maps place URLs or share links to scrape reviews for. Supports full URLs (google.com/maps/place/...) and share links (maps.app.goo.gl/...).

## `placeIds` (type: `array`):

Google Place IDs (ChIJ...) or Feature IDs (0x...:0x...) to scrape reviews for. Can be used instead of or in addition to Place URLs.

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

Search terms to find places on Google Maps (e.g. "pizza", "hotels", "dentist"). Used together with Search locations — all combinations of queries and locations are searched.

## `searchLocations` (type: `array`):

Locations to search in (e.g. "New York, NY", "London, UK"). Used together with Search queries — all combinations of queries and locations are searched.

## `maxPlacesPerSearch` (type: `integer`):

Maximum number of places to find per search query + location combination. Each page returns up to 20 results.

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

Maximum number of reviews to scrape per place. Leave empty to scrape all reviews.

## `startDate` (type: `string`):

Only include reviews on or after this date (YYYY-MM-DD). When set, reviews are fetched newest-first for efficient filtering.

## `endDate` (type: `string`):

Only include reviews on or before this date (YYYY-MM-DD). When set, reviews are fetched newest-first for efficient filtering.

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

Sort order for reviews. Automatically set to 'newest' when date filtering is active.

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

Language code for review translation (e.g. 'en', 'de', 'es'). Reviews in other languages will be translated to this language.

## `country` (type: `string`):

Country code (e.g. 'us', 'de', 'gb'). Affects which Google region is used for results.

## Actor input object example

```json
{
  "placeUrls": [
    {
      "url": "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8"
    }
  ],
  "maxPlacesPerSearch": 20,
  "maxReviewsPerPlace": 100,
  "sortBy": "newest",
  "language": "en",
  "country": "us"
}
```

# Actor output Schema

## `reviews` (type: `string`):

All scraped reviews with place details, ratings, text, and timestamps.

## `csv` (type: `string`):

Reviews exported as a CSV file.

# 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 = {
    "placeUrls": [
        {
            "url": "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("beatanalytics/google-maps-reviews-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 = { "placeUrls": [{ "url": "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8" }] }

# Run the Actor and wait for it to finish
run = client.actor("beatanalytics/google-maps-reviews-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 '{
  "placeUrls": [
    {
      "url": "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8"
    }
  ]
}' |
apify call beatanalytics/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Reviews Scraper",
        "description": "Scrape Google Maps reviews with exact timestamps, date-range filtering, and bulk input. Extract full review text, ratings, author info, owner responses, and photos for any Google Maps place. Export as CSV, JSON, or Excel.",
        "version": "1.0",
        "x-build-id": "tUHhzkILwpEurngJ1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/beatanalytics~google-maps-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-beatanalytics-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/beatanalytics~google-maps-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-beatanalytics-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/beatanalytics~google-maps-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-beatanalytics-google-maps-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "placeUrls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "Google Maps place URLs or share links to scrape reviews for. Supports full URLs (google.com/maps/place/...) and share links (maps.app.goo.gl/...).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "placeIds": {
                        "title": "Place IDs",
                        "type": "array",
                        "description": "Google Place IDs (ChIJ...) or Feature IDs (0x...:0x...) to scrape reviews for. Can be used instead of or in addition to Place URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Search terms to find places on Google Maps (e.g. \"pizza\", \"hotels\", \"dentist\"). Used together with Search locations — all combinations of queries and locations are searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchLocations": {
                        "title": "Search locations",
                        "type": "array",
                        "description": "Locations to search in (e.g. \"New York, NY\", \"London, UK\"). Used together with Search queries — all combinations of queries and locations are searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPlacesPerSearch": {
                        "title": "Max places per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of places to find per search query + location combination. Each page returns up to 20 results.",
                        "default": 20
                    },
                    "maxReviewsPerPlace": {
                        "title": "Max reviews per place",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape per place. Leave empty to scrape all reviews.",
                        "default": 100
                    },
                    "startDate": {
                        "title": "Start date",
                        "type": "string",
                        "description": "Only include reviews on or after this date (YYYY-MM-DD). When set, reviews are fetched newest-first for efficient filtering."
                    },
                    "endDate": {
                        "title": "End date",
                        "type": "string",
                        "description": "Only include reviews on or before this date (YYYY-MM-DD). When set, reviews are fetched newest-first for efficient filtering."
                    },
                    "sortBy": {
                        "title": "Sort reviews by",
                        "enum": [
                            "newest",
                            "relevant",
                            "highest",
                            "lowest"
                        ],
                        "type": "string",
                        "description": "Sort order for reviews. Automatically set to 'newest' when date filtering is active.",
                        "default": "newest"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for review translation (e.g. 'en', 'de', 'es'). Reviews in other languages will be translated to this language.",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Country code (e.g. 'us', 'de', 'gb'). Affects which Google region is used for results.",
                        "default": "us"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
