# Fastest Google Maps Reviews Scraper With Images & Videos (`vero-api/google-maps-reviews-scraper`) Actor

Scrape every review of any business on Google Maps: star rating, full text, reviewer name and profile, owner responses, review photos, videos and dates. Paste a Maps URL or place ID, choose how to sort, and export clean JSON.

- **URL**: https://apify.com/vero-api/google-maps-reviews-scraper.md
- **Developed by:** [VeroAPIs](https://apify.com/vero-api) (community)
- **Categories:** Lead generation, E-commerce, SEO tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 reviews

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Maps Reviews Scraper

Google Maps Reviews Scraper **extracts every review of any business on Google Maps** — star rating, full text, reviewer profile, owner responses, photos, and dates — and downloads them as **JSON, CSV, Excel, or XML**. It runs in the cloud, needs no coding, and no Google API key.

Try it right away: paste a Google Maps place URL into the input form, click **Start**, and watch the dataset fill up with structured review data.

### What data does it extract?

Each result is **one review**, with the business it belongs to nested in a `place` object:

| Data | Details |
|---|---|
| 💬 **Review** | full text in its original language (with the language code), star rating, and source |
| 🗓️ **Dates** | when the review was published and last edited (ISO 8601) |
| 👤 **Reviewer** | nested `reviewer` object: name, profile URL, photo, ID, total reviews written, Local Guide status |
| 🏢 **Owner response** | the business's reply text and date, when present |
| 📷 **Photos & videos** | every image and video attached to the review — playable video URLs, image URLs, and dimensions |
| 📍 **Place** | nested `place` object: name, address, category, coordinates, overall rating, total review count, place ID, URL |

### How do I scrape Google Maps reviews?

1. **Add a place** — paste one or more Google Maps URLs (`google.com/maps/place/…`, or short `maps.app.goo.gl` links). You can also supply place IDs directly.
2. **Choose how many** — set *Maximum reviews per place*, or use `0` to scrape all of them.
3. **Pick a sort order** — Newest, Most relevant, Highest rating, or Lowest rating.
4. **Filter the content** *(optional)* — keep all reviews, only those with text, or only those with text and media (photos/videos).
5. **Click Start** — then download the results from the **Storage** tab in any format, or send them anywhere using integrations.

### How do I find a place's URL?

Open [Google Maps](https://www.google.com/maps), search for the business, click it, and copy the URL from your browser's address bar. Each URL contains the place's ID (the `0x…:0x…` value), which is what the scraper uses.

### Input example

```json
{
    "startUrls": [
        { "url": "https://www.google.com/maps/place/Katz's+Delicatessen/@40.722233,-73.987429,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea!8m2!3d40.722233!4d-73.987429" }
    ],
    "maxReviews": 100,
    "reviewsSort": "newest",
    "language": "en",
    "personalData": true
}
```

You can also target places by ID instead of URL:

```json
{
    "placeIds": ["0x89c2598f7ff4aa09:0x313547e757cb8cea"],
    "maxReviews": 0
}
```

### Output example (abridged)

```json
{
    "place": {
        "placeId": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
        "title": "Katz's Delicatessen",
        "address": "205 E Houston St, New York, NY 10002, United States",
        "categoryName": "Deli",
        "categories": ["Deli"],
        "location": { "lat": 40.722233, "lng": -73.987429 },
        "totalScore": 4.5,
        "reviewsCount": 53374,
        "url": "https://www.google.com/maps/place/…"
    },
    "reviewId": "Ci9DQUlRQUNvZ…",
    "reviewer": {
        "id": "1002…",
        "name": "Jane D.",
        "url": "https://www.google.com/maps/contrib/1002…",
        "photoUrl": "https://lh3.googleusercontent.com/…",
        "numberOfReviews": 197,
        "isLocalGuide": true
    },
    "stars": 5,
    "text": "Best pastrami in NYC. The line moves fast and the portions are huge.",
    "textTranslated": null,
    "originalLanguage": "en",
    "publishedAtDate": "2026-02-04T05:28:13.519Z",
    "lastEditedAtDate": "2026-02-04T05:28:13.519Z",
    "likesCount": null,
    "reviewImageUrls": ["https://lh3.googleusercontent.com/…"],
    "reviewVideoUrls": [],
    "reviewMedia": [
        { "type": "photo", "url": "https://lh3.googleusercontent.com/…", "thumbnailUrl": "https://lh3.googleusercontent.com/…", "width": null, "height": null, "caption": "Katz's signature pastrami sandwich" }
    ],
    "reviewOrigin": "Google",
    "responseFromOwnerText": null,
    "responseFromOwnerDate": null
}
```

### Input reference

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Google Maps place URLs to scrape. One business per URL. |
| `placeIds` | array | Place feature IDs (`0x…:0x…`) — an alternative to full URLs. |
| `maxReviews` | integer | Reviews per place. `0` = all available. Default `100`. Counts only reviews kept after filtering. |
| `reviewsSort` | string | `mostRelevant`, `newest`, `highestRanking`, or `lowestRanking`. Default `mostRelevant`. |
| `reviewsContentFilter` | string | `all`, `textOnly` (has text), or `textAndMedia` (has text + at least one photo/video). Default `all`. |
| `searchQuery` | string | Keyword/phrase to search reviews for (e.g. `delivery`). Only matching reviews are fetched. Leave empty for all. |
| `language` | string | Language for business details and dates, e.g. `en`, `fr`, `de`, `es`. Reviews are returned in their original language. Default `en`. |
| `personalData` | boolean | Include reviewer name, profile, photo, and review URL. Default `true`. |

### Why scrape Google Maps reviews?

- **Reputation monitoring** — track what customers say about your locations over time.
- **Competitor analysis** — benchmark ratings and sentiment against nearby businesses.
- **Customer insight** — mine review text for recurring praise and complaints.
- **Lead generation & research** — gather reviewer and business data at scale.

### Pricing

This Actor uses **pay-per-event** pricing: a small fee when a run starts, plus a fee per review delivered. You only pay for the reviews you actually receive — set *Maximum reviews per place* to control your spend.

### Notes

- The Actor routes through Apify Proxy automatically for reliable scraping — no proxy setup needed on your end.
- Reviewer personal data is publicly visible on Google Maps. Make sure your use complies with Google's terms and applicable data-protection laws (e.g. GDPR). Turn off *Include reviewer personal data* if you don't need it.

# Actor input Schema

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

Links to the businesses you want reviews from. Paste the full Google Maps link from your browser's address bar — short <code>maps.app.goo.gl</code> links work too. One business per link.

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

Optional — most users can leave this empty and just paste links above. If you already have Google Maps place IDs (the <code>0x…:0x…</code> code found in a Maps link), add them here, one per line, to skip pasting full URLs.

## `maxReviews` (type: `integer`):

How many reviews to scrape for each business (according to the chosen sort order). Use <code>0</code> to scrape all available reviews.

## `reviewsSort` (type: `string`):

Order in which reviews are fetched. <code>Most relevant</code> is Google's default ordering (content-rich reviews first, star-only ratings last); <code>Newest</code> returns the most recent first.

## `reviewsContentFilter` (type: `string`):

Which reviews to return. <code>All</code> keeps every review (including star-only ratings). <code>Only with text</code> keeps reviews that have written text. <code>Only with text and media</code> keeps reviews that have text and at least one photo or video.

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

Return only reviews that mention this keyword or phrase (e.g. <code>delivery</code>, <code>parking</code>, or a dish name). Leave empty to fetch all reviews. Combine with the sort order and content filter to narrow results further.

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

Language for the business details and dates, e.g. <code>en</code>, <code>fr</code>, <code>de</code>, <code>es</code>. Each review comes back in the language it was written in, with that language noted on every review.

## `personalData` (type: `boolean`):

Include reviewer details (name, profile URL, profile photo, reviewer ID) and the direct review URL. Turn off to exclude personal data from the output.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Statue+of+Liberty+National+Monument/@40.6892494,-74.0466891,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445142!16zL20vMDdiZ3M"
    }
  ],
  "maxReviews": 100,
  "reviewsSort": "mostRelevant",
  "reviewsContentFilter": "all",
  "language": "en",
  "personalData": true
}
```

# Actor output Schema

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

One row per review.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.google.com/maps/place/Statue+of+Liberty+National+Monument/@40.6892494,-74.0466891,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445142!16zL20vMDdiZ3M"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vero-api/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 = { "startUrls": [{ "url": "https://www.google.com/maps/place/Statue+of+Liberty+National+Monument/@40.6892494,-74.0466891,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445142!16zL20vMDdiZ3M" }] }

# Run the Actor and wait for it to finish
run = client.actor("vero-api/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 '{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Statue+of+Liberty+National+Monument/@40.6892494,-74.0466891,17z/data=!3m1!4b1!4m6!3m5!1s0x89c25090129c363d:0x40c6a5770d25022b!8m2!3d40.6892494!4d-74.0445142!16zL20vMDdiZ3M"
    }
  ]
}' |
apify call vero-api/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/TpT0HL7BiefH22ll3/builds/ka5fmaKlgnjgXln4Q/openapi.json
