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

Paste a Google Maps place link, get all its reviews — reviewer, star rating, date, full text, and owner responses.

- **URL**: https://apify.com/arpitgandhi1934/google-maps-reviews.md
- **Developed by:** [Arpit Gandhi](https://apify.com/arpitgandhi1934) (community)
- **Categories:** Lead generation, SEO tools, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 results

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 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

Paste a Google Maps place link and get back that place's reviews — every reviewer, star rating, date, full review text, and even the business's replies. Point it at one place or many, cap the count or pull **all** of them.

There's nothing to set up or configure — just give it a place URL and it returns the reviews, whether you want the latest handful or the entire history.

> ⚡ **You only need one thing: the place's Google Maps URL** — the full link from your browser's address bar that starts with `https://www.google.com/maps/place/…`. **Not sure how to get it?** See **[How to get a Google Maps place URL](#how-to-get-a-google-maps-place-url)** right below. 👇

**Who it's for:**

- 📊 **Reputation monitoring** — track what customers are saying about your locations over time
- 💬 **Sentiment analysis** — feed real review text into your NLP / AI pipeline
- 🔍 **Competitor review mining** — see exactly why customers love (or leave) a rival
- 🎯 **Lead research** — qualify businesses by rating volume, recency, and response behavior

***

### How to get a Google Maps place URL

This is the #1 question, so here's the exact, foolproof way. The actor needs the **full place URL** (the one that starts with `https://www.google.com/maps/place/...`).

#### 💻 Desktop (recommended — gives the exact URL the actor needs)

1. Go to **[google.com/maps](https://www.google.com/maps)**.
2. **Search** for the business or place, then **click its pin on the map** — or click its **name** in the results list.
3. When the place's panel opens on the left, look at your browser's **address bar**. The URL now starts with:
   `https://www.google.com/maps/place/<Name>/@<lat>,<lng>,17z/data=...`
4. **Select the whole address-bar URL and copy it.** Paste that into the actor's **"📍 Google Maps place link(s)"** field.

> ⚠️ **Important:** The blue **"Share"** button's **"Copy link"** gives a **shortened** link (like `https://maps.app.goo.gl/...`). **Prefer the full address-bar URL** (`https://www.google.com/maps/place/...`) — that's the format the actor expects.

#### 📱 Mobile

1. Open the place in the Google Maps app.
2. Tap **Share → Copy link**.
3. Then **open that link in a desktop browser** and copy the **expanded** address-bar URL — the one that contains `/maps/place/`. Paste *that* into the actor.

#### ✅ Example of a good URL

```
https://www.google.com/maps/place/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d
```

***

### What you get

One dataset item **per review**, with:

- 🏷️ **placeName** — the business / place name
- 🔗 **placeUrl** — the place URL you supplied
- 🆔 **fid** — Google's stable place feature ID
- 👤 **reviewer** — the reviewer's name
- ⭐ **rating** — star rating, 1–5 (every review has one)
- 📅 **date** — when it was posted, relative (e.g. `"3 months ago"`) — present on every review
- 📝 **text** — the written review body (present when the reviewer wrote text; some reviews are rating-only)
- 🧭 **reviewerInfo** — the reviewer's badge / activity, e.g. `"Local Guide · 58 reviews"`
- 🔗 **reviewerUrl** — link to the reviewer's Google profile
- 🆔 **reviewId** — Google's unique ID for the review
- 👍 **likes** — how many people found the review helpful
- 💬 **ownerResponse** — the business's reply to the review, if there is one
- ⏱️ **scrapedAt** — timestamp of the run

***

### Input

| Field | Key | Type | Default | Description |
|---|---|---|---|---|
| 📍 Google Maps place link(s) | `startUrls` | array of URLs | — (**required**) | One or more Google Maps place URLs (`https://www.google.com/maps/place/...`). Add as many places as you like. |
| ⭐ Max reviews per place | `maxReviews` | integer | `0` | How many reviews to pull per place. **`0` = ALL reviews** (complete, but slower on very large places). Set a number to cap and finish fast — the run stops the instant it hits your target. |
| Proxy | `proxyConfiguration` | proxy | Apify Residential | **Residential proxy strongly recommended** — clean IPs give the most reliable access to Google. |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.google.com/maps/place/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d" }
  ],
  "maxReviews": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

***

### Output

Each item in the dataset is a single review. Here's a realistic example:

```json
{
  "placeName": "Flos Music & Bar",
  "placeUrl": "https://www.google.com/maps/place/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=...",
  "fid": "0x390d03c87620376d:0x7ec0084cad8ed5df",
  "reviewer": "Priya Sharma",
  "rating": 5,
  "date": "3 months ago",
  "text": "Amazing vibe and live music every weekend. The cocktails were excellent and the staff went out of their way to get us a good table. Will definitely come back.",
  "reviewerInfo": "Local Guide · 58 reviews",
  "reviewerUrl": "https://www.google.com/maps/contrib/103482759812345678901/reviews",
  "reviewId": "ChdDSUhNMG9nS0VJQ0FnSUNfeXZ1cnJnRRAB",
  "likes": 4,
  "ownerResponse": "Thank you so much for the kind words, Priya! We can't wait to host you again. 🎶",
  "scrapedAt": "2026-07-08T15:42:11.302Z"
}
```

#### Output fields

| Field | Type | Description |
|---|---|---|
| `placeName` | string | The business / place name. |
| `placeUrl` | string | The place URL you supplied. |
| `fid` | string | Google's stable place feature ID (identifies the place across links). |
| `reviewer` | string | The reviewer's display name. |
| `rating` | number | Star rating, 1–5. Present on every review. |
| `date` | string | Relative post date, e.g. `"3 months ago"`. Present on every review. |
| `text` | string | null | The written review body. Present when the reviewer wrote text; `null` for rating-only reviews. |
| `reviewerInfo` | string | null | Reviewer badge / activity, e.g. `"Local Guide · 58 reviews"`. |
| `reviewerUrl` | string | null | Link to the reviewer's Google profile. |
| `reviewId` | string | null | Google's unique ID for the review. |
| `likes` | number | How many people marked the review helpful (`0` if none). |
| `ownerResponse` | string | null | The business's reply to the review, if there is one. |
| `scrapedAt` | string | ISO timestamp of when the run scraped this review. |

***

### Speed & completeness

The actor returns the **complete review list** for a place — not just the handful shown by default.

- **Set `maxReviews` to a number** and the run finishes fast: it stops the instant it reaches your target. Great when you only need, say, the latest 100 or 500.
- **Leave `maxReviews` at `0` (all)** and it returns every review. This is complete, but on places with **thousands** of reviews it can take **several minutes** to work through the full list — that's expected for very large places.

**Rule of thumb:** if you need everything, use `0` and let it run. If you need speed, set a cap.

***

### FAQ

**Does it get ALL reviews?**
Yes. Set `maxReviews` to `0` (the default) and it loads the place's entire review list. Set a number to cap it instead.

**How long does a big place take?**
Small and mid-size places finish quickly. A place with thousands of reviews pulled with `maxReviews: 0` can take several minutes to work through the full list. Capping `maxReviews` keeps runs fast.

**Can I scrape multiple places at once?**
Yes — add multiple URLs to `startUrls` and the actor processes each place and outputs reviews for all of them into the same dataset (each review carries its own `placeName` / `placeUrl` / `fid`).

**Do I need a proxy?**
Yes — a **residential** proxy is strongly recommended. Clean IPs give the most reliable access to Google, and residential IPs work best. Apify Residential proxy is preselected by default.

**What export formats are available?**
All of Apify's standard exports — **JSON, CSV, and Excel** (plus HTML, XML, RSS) — from the run's dataset via the Apify Console or API.

**What if a review has no text?**
You still get it. Every review includes a `rating` and `date`; `text` is filled in only when the reviewer actually wrote something (rating-only reviews come back with `text: null`).

# Actor input Schema

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

Paste the FULL Google Maps place link — the one from your browser's ADDRESS BAR that starts with https://www.google.com/maps/place/…

How to get it: open google.com/maps → search the place → click its pin/name → copy the whole URL from the address bar.

⚠️ The blue 'Share → Copy link' button gives a SHORT link (maps.app.goo.gl/…) — use the full address-bar URL instead.

Example: https://www.google.com/maps/place/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d

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

How many reviews per place. 0 = ALL (complete, but slower on very large places). Set a number to cap and finish fast — it stops the instant it hits your target.

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

Residential proxy strongly recommended — clean IPs give the most reliable access to Google.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d"
    }
  ],
  "maxReviews": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arpitgandhi1934/google-maps-reviews").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/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d" }] }

# Run the Actor and wait for it to finish
run = client.actor("arpitgandhi1934/google-maps-reviews").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/Flos+Music+%26+Bar/@28.7067705,77.1839605,17z/data=!4m6!3m5!1s0x390d03c87620376d:0x7ec0084cad8ed5df!8m2!3d28.7067705!4d77.1839605!16s%2Fg%2F11vq3fmm9d"
    }
  ]
}' |
apify call arpitgandhi1934/google-maps-reviews --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/XO3nRfS5WBYs1kd6m/builds/QGgtI42L2vTgGLrra/openapi.json
