# Google Maps Reviews Scraper - Unlimited Reviews Per Place (`zen-studio/google-maps-reviews-scraper`) Actor

Scrape unlimited Google Maps reviews from place URLs or IDs. Get ratings, full text, owner replies, sub-ratings, photos and reviewer details.

- **URL**: https://apify.com/zen-studio/google-maps-reviews-scraper.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** SEO tools, Lead generation
- **Features:** Limited permissions
- **Stats:** 26 total users, 1 monthly users, 95.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Maps Reviews Scraper | Unlimited Reviews Per Place, Owner Replies (2026)

[![GOOGLE MAPS REVIEWS. NO PER-PLACE LIMIT. OWNER REPLIES. PHOTOS. DETAILED RATINGS.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/google-maps-reviews-scraper-readme-hero-v1.png)](https://console.apify.com/actors/ojjo6BxQiOiLYRca1/input)

From <strong>Zen Studio</strong>, creators of <a href="https://apify.com/zen-studio/apple-maps-scraper-pro">Apple Maps</a>, <a href="https://apify.com/zen-studio/yandex-maps-scraper">Yandex Maps</a> and <a href="https://apify.com/zen-studio/2gis-places-scraper-api">2GIS</a> scrapers. Established maps tools for business discovery and local research.

### Why choose this actor?

<strong>Collect the history, not just a sample.</strong> Set <code>maxReviewsPerPlace</code> to <code>0</code> to keep collecting until Google returns no more reviews. There is no preset per-place review cap, and results arrive progressively as individual rows.

<strong>Keep the review and the response together.</strong> Export full review text, owner replies, photos and reviewer details. Capture Food, Service and Atmosphere scores, plus answers such as price per person and parking, where reviewers provide them.

<strong>Focus on the feedback that matters.</strong> Filter by topic, sort by newest or lowest rating, or use a rolling window such as <code>7 days</code>. Recent edits are included, making recurring runs useful for reputation monitoring.

<a href="https://console.apify.com/actors/ojjo6BxQiOiLYRca1/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/google-maps-reviews-scraper-readme-cta-v1.svg" width="240" height="48" alt="Collect your reviews"/></a>

### Quick start

Try the latest 100 reviews for the example place, then replace its ID with your own or paste a Google Maps URL into <code>startUrls</code>.

```json
{
  "placeIds": [
    "ChIJHQQciMZRqEcR2X4b8-vf5Bk"
  ],
  "maxReviewsPerPlace": 100,
  "reviewsSort": "newest"
}
```

<a href="https://console.apify.com/actors/ojjo6BxQiOiLYRca1/input">Open actor input</a> to choose your places. Set <code>maxReviewsPerPlace: 0</code> for uncapped collection. Export JSON, CSV or Excel; JSON preserves nested replies, ratings and media.

Collection stops when Google provides no further reviews or your run budget is reached. Free-tier limits still apply. Replies, photos and detailed ratings are included when present on the source review.

<table><tr><td colspan="5" style="background:#4285F4;color:white;padding:10px 14px;font-size:13px;font-weight:700">Zen Studio · Maps Suite</td></tr><tr><td style="background:#DDEAFF;padding:10px 12px;border:1px solid #CCDDF5;vertical-align:top;width:20%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-ojjo6BxQiOiLYRca1-RU3DuH650K-google-maps-directions-api-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/zen-studio/google-maps-reviews-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Google Reviews</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">You are here</span></td><td style="background:#EFF5FF;padding:10px 12px;border:1px solid #CCDDF5;vertical-align:top;width:20%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-vBUd2ObzJUemitHHP-IYaavrd0t8-google-maps-directions-api-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/zen-studio/google-maps-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Google Maps</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Find businesses</span></td><td style="background:#EFF5FF;padding:10px 12px;border:1px solid #CCDDF5;vertical-align:top;width:20%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-5bSvAQKSK3LPq9OXb-AgVhcT1mQC-apple-maps-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/zen-studio/apple-maps-scraper-pro" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Apple Maps</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Contacts & details</span></td><td style="background:#EFF5FF;padding:10px 12px;border:1px solid #CCDDF5;vertical-align:top;width:20%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-fRSgBvgbsRB4o7t30-UkaIbH1Yhq-yandex-maps-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/zen-studio/yandex-maps-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Yandex Maps</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Russia & CIS</span></td><td style="background:#EFF5FF;padding:10px 12px;border:1px solid #CCDDF5;vertical-align:top;width:20%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-NBmcHCtkUEhA0DNP3-SrXbUedsVm-2gis-scraper-api-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/zen-studio/2gis-places-scraper-api" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">2GIS</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Local business data</span></td></tr></table>

#### Copy to your AI assistant

```
zen-studio/google-maps-reviews-scraper on Apify. Scrapes every review of a Google Maps place, with owner responses and sub-ratings. Call ApifyClient("TOKEN").actor("zen-studio/google-maps-reviews-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Needs startUrls or placeIds; maxReviewsPerPlace=0 means the whole history. Full spec: GET https://api.apify.com/v2/acts/zen-studio~google-maps-reviews-scraper/builds/default (Bearer TOKEN) -> inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### Key Features

- **No limit per place**: set *Reviews per place* to `0` and the complete history comes back, however long it is. Rows stream out as they land, so a place with tens of thousands of reviews stays within 512 MB.
- **41 fields per review**: rating and its scale, full text, the owner's reply, per-question sub-ratings, translations, likes, photos and videos, Local Guide standing, and the place the review belongs to.
- **Filter at the source**: keyword, date cutoff and sort are applied before delivery, so you are not billed for reviews you discard.
- **Partner reviews handled**: Tripadvisor, Booking and Trip.com reviews arrive with their own rating scale, so an 8 out of 10 is never read as an 8 out of 5.
- **Free tier**: 10 lifetime runs, 100 reviews per run, no credit card.

### How to Scrape Google Maps Reviews

1. Open **Google Maps Reviews Scraper** in the Apify Console and click **Try for free**.
2. Paste your Google Maps place URLs into *Start URLs*, or place IDs into *Place IDs*.
3. Set *Reviews per place*, or leave it at `0` to pull the complete history.
4. Click **Start**, then download the reviews as JSON, CSV, Excel, XML or HTML.

#### Basic: the latest reviews for a place

```json
{
  "startUrls": [
    { "url": "https://www.google.com/maps/place/Hotel+Adlon+Kempinski+Berlin/@52.5161791,13.3805048,17z" }
  ],
  "maxReviewsPerPlace": 100,
  "reviewsSort": "newest"
}
```

#### Monitoring: only what changed since last week

```json
{
  "placeIds": ["ChIJHQQciMZRqEcR2X4b8-vf5Bk"],
  "newerThan": "7 days",
  "maxReviewsPerPlace": 0
}
```

`newerThan` is measured from the moment the run starts, so a scheduled run keeps the same window instead of drifting behind a fixed date.

It compares each review's **latest activity**, not its original post date. A review edited this week comes back even if it was first posted years ago, which is what you want when watching for changes.

#### Complaints only

```json
{
  "placeIds": ["ChIJHQQciMZRqEcR2X4b8-vf5Bk"],
  "reviewsSort": "lowestRanking",
  "maxReviewsPerPlace": 50
}
```

#### One topic across a portfolio

```json
{
  "placeIds": ["ChIJHQQciMZRqEcR2X4b8-vf5Bk", "0x47a851db960e0eb1:0x6ce7f513876203dd"],
  "reviewsKeyword": "parking",
  "maxReviewsPerPlace": 0
}
```

Keyword matching works the way the search box on the Google Maps reviews panel does, so related wording is included, not just the exact word.

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `[]` | Google Maps place URLs, including shortened `maps.app.goo.gl` and `share.google` links. Max 500 |
| `placeIds` | array | one example place | `ChIJ...` place IDs or `0x...:0x...` feature IDs. Max 500 |
| `maxReviewsPerPlace` | integer | `100` | Stop after this many per place. `0` for the complete history |
| `reviewsSort` | string | `newest` | `newest`, `mostRelevant`, `highestRanking`, `lowestRanking` |
| `newerThan` | string | `""` | A date (`2026-08-01`) or a rolling period (`7 days`). Forces newest first |
| `reviewsKeyword` | string | `""` | Keep only reviews about a topic |
| `reviewsOrigin` | string | `all` | `all`, or `google` for first-party reviews only |
| `language` | string | `en` | Display language for place names, categories and relative dates |
| `countryCode` | string | `us` | Two-letter country code used when loading each place |

Feature IDs need no lookup, so they start fastest. The Google Maps Scraper emits them as `hexId`.

### What Data Can You Extract from Google Maps Reviews?

Every row carries its place, so the dataset is usable on its own with no join.

- **Review**: `reviewId`, `rating`, `ratingScale`, `text`, `textTranslated`, `language`, `translatedLanguage`, `date`, `publishedAtMicros`, `editedAtMicros`, `isEdited`, `likes`, `source`, `sourceIcon`, `reviewUrl`
- **Owner reply**: `ownerResponse` with its own text, date and language
- **Attributes**: `attributes[]`, the sub-ratings and chip answers the reviewer filled in (Food, Service, Atmosphere, Rooms, Location, price per person, trip type, wait time, parking)
- **Media**: `photos[]` plus `media[]` with type, caption, capture date, dimensions and coordinates
- **Author**: `author`, `authorId`, `authorProfile`, `authorPhoto`, `authorReviewCount`, `authorPhotoCount`, `isLocalGuide`, `localGuideLevel`
- **Place**: `placeName`, `placeRating`, `reviewsCount`, `primaryCategory`, `categories`, `address`, `addressFormatted`, `countryCode`, `latitude`, `longitude`, `placeId`, `hexId`, `googleMapsUrl`
- **Place record**: one full profile per place in the run's key-value store, 60+ fields: contact, hours and live status, amenities, menu and popular dishes, review keyword pills, photo tabs, related places, hotel offers

#### Output Example

```json
{
  "recordType": "review",
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xGb2FGTkJlbVpJVUhKdVVsSXhTSHAzY1hKb2VVRRAB",
  "rating": 5,
  "ratingScale": 5,
  "date": "a month ago",
  "publishedAtMicros": 1785628764081573,
  "editedAtMicros": 1785628810449730,
  "isEdited": true,
  "text": "I went on a saturday night and got a table right away right at the window. The salmon was to die for. Instead of the ...",
  "textTranslated": null,
  "language": "en",
  "translatedLanguage": null,
  "likes": 0,
  "source": "Google",
  "sourceIcon": "https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",
  "ownerResponse": {
    "text": "Thank you so much for the detailed review! 🥂 We can tell from your photos that you had an amazing time, and we’re so ...",
    "date": "a week ago",
    "publishedAtMicros": 1787756829000000,
    "language": "en"
  },
  "attributes": [
    {
      "key": "GUIDED_DINING_PRICE_RANGE",
      "label": "Price per person",
      "question": "How much did you spend per person?",
      "rating": null,
      "values": [
        "$100+"
      ]
    },
    {
      "key": "GUIDED_DINING_FOOD_ASPECT",
      "label": "Food",
      "question": "Food",
      "rating": 5,
      "values": null
    },
    {
      "key": "GUIDED_DINING_SERVICE_ASPECT",
      "label": "Service",
      "question": "Service",
      "rating": 5,
      "values": null
    },
    "... +4 more"
  ],
  "media": [
    {
      "id": "CIABIhCPc-Ipf-UZBik_MCAY6-uB",
      "caption": null,
      "takenAt": "2026-08-02",
      "date": "a month ago",
      "latitude": 40.75683722983638,
      "longitude": -73.99349376183964,
      "type": "photo",
      "url": "https://lh3.googleusercontent.com/grass-cs/ACvplmOnAWPHwcee6dTXjhwUrs1LqXavVOVJ9ViPO-OVib0UHNo1CerrEo8e-GObtUY0OZzx5M...",
      "width": 3024,
      "height": 4032,
      "durationMs": null
    },
    {
      "id": "CIABIhDisTC3_b36sgmh9MO_p-wm",
      "caption": null,
      "takenAt": "2026-08-02",
      "date": "a month ago",
      "latitude": 40.75683722983638,
      "longitude": -73.99349376183964,
      "type": "photo",
      "url": "https://lh3.googleusercontent.com/grass-cs/ACvplmP-a2RLCdaSoxC3aTyzgGIIK7FnbuUapkbZKVFze7_6mDFEy6W9emsCUe-VKyM8zbC2JN...",
      "width": 4032,
      "height": 3024,
      "durationMs": null
    }
  ],
  "photos": [
    "https://lh3.googleusercontent.com/grass-cs/ACvplmOnAWPHwcee6dTXjhwUrs1LqXavVOVJ9ViPO-OVib0UHNo1CerrEo8e-GObtUY0OZzx5M...",
    "https://lh3.googleusercontent.com/grass-cs/ACvplmP-a2RLCdaSoxC3aTyzgGIIK7FnbuUapkbZKVFze7_6mDFEy6W9emsCUe-VKyM8zbC2JN..."
  ],
  "author": "Honestly Mars",
  "authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjX_BJYAyPq61rPEbsQMGkcony0NVoDytmRRVPQkDfqqxb_PV3be=s120-c-rp-mo-ba12-br100",
  "authorProfile": "https://www.google.com/maps/contrib/105567505416875095501/reviews?hl=en",
  "authorId": "105567505416875095501",
  "authorReviewCount": 31,
  "authorPhotoCount": 15,
  "isLocalGuide": true,
  "localGuideLevel": 5,
  "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2xGb2FGTkJlbVpJVUhKdVVsSXhTSHAz...",
  "placeId": "ChIJ__8ztFJYwokRm2x1-poe3ks",
  "hexId": "0x89c25852b433ffff:0x4bde1e9afa756c9b",
  "placeName": "Buena Vista Restaurant & Bar",
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ__8ztFJYwokRm2x1-poe3ks",
  "address": "Buena Vista Restaurant & Bar, 536 9th Ave, New York, NY 10018",
  "addressFormatted": "536 9th Ave, New York, NY 10018",
  "latitude": 40.7568372,
  "longitude": -73.9934938,
  "placeRating": 4.7,
  "reviewsCount": 1507,
  "primaryCategory": {
    "id": 8,
    "slug": "restaurants"
  },
  "categories": [
    "Latin American restaurant",
    "Bar & grill",
    "Cocktail bar",
    "... +3 more"
  ],
  "countryCode": "US"
}
```

Download the results as JSON, CSV, Excel, XML or HTML from the run's Storage tab, or pull them through the Apify API.

#### Place record

Each place also gets a full profile, saved once per run in the key-value store
under `place-<feature id>` (the run's Output tab links to them). Taken from a
live run; long arrays are shortened here with a `... +N more` marker.

```json
{
  "recordType": "place",
  "name": "Pig Beach BBQ Queens",
  "placeId": "ChIJsT7KfEtfwokRdTuEU6J5MAI",
  "hexId": "0x89c25f4b7cca3eb1:0x23079a253843b75",
  "latitude": 40.755083,
  "longitude": -73.92518059999999,
  "localName": null,
  "address": "Pig Beach BBQ Queens, 35-37 36th St Ground Floor, Astoria, NY 11106",
  "addressFormatted": "35-37 36th St Ground Floor, Astoria, NY 11106",
  "addressComponents": {
    "street": "35-37 36th St Ground Floor",
    "locality": "Astoria, NY 11106",
    "country": null
  },
  "ftid": "/g/11rdc6k11s",
  "rating": 4.3,
  "reviewsCount": 1167,
  "priceRange": "$20–30",
  "priceLabel": "$20 to $30",
  "plusCode": {
    "compound": "Q34F+2W Astoria, Queens, NY",
    "global": "87G8Q34F+2W"
  },
  "phone": "(718) 362-6111",
  "website": "http://www.pigbeachnyc.com/",
  "menuUrl": "https://www.pigbeachnyc.com/queens-ny/",
  "categories": [
    "Barbecue restaurant",
    "Restaurant"
  ],
  "primaryCategory": {
    "id": 8,
    "slug": "restaurants"
  },
  "categoryGcids": [
    {
      "gcid": "barbecue_restaurant",
      "label": "Barbecue"
    },
    {
      "gcid": "restaurant",
      "label": null
    }
  ],
  "entityType": "bbq_restaurant",
  "shortDescription": "Smoked & grilled meats in an urban space",
  "neighborhood": "Astoria",
  "cityLabel": "Astoria, NY",
  "countryCode": "US",
  "timezone": "America/New_York",
  "description": "Industrial venue with Southern flair selling smoked & grilled ribs, burgers, brisket, sides & more.",
  "metaDescription": "Pig Beach BBQ Queens at 35-37 36th St (Ground Floor) is your go-to for BBQ Near Me in Astoria—chef-driven, pitmaster-...",
  "popularSpendTime": "People typically spend 1.5-3.5 hours here",
  "amenities": {
    "Service options": [
      "Outdoor seating",
      "Delivery",
      "Onsite services",
      "Takeout",
      "Dine-in"
    ],
    "Highlights": [
      "Fast service",
      "Great beer selection",
      "Great cocktails",
      "Live music",
      "Serves local specialty",
      "Sports"
    ],
    "Popular for": [
      "Lunch",
      "Dinner",
      "Solo dining"
    ],
    "Accessibility": [
      "Wheelchair accessible entrance",
      "Wheelchair accessible restroom",
      "Wheelchair accessible seating"
    ],
    "Offerings": [
      "Alcohol",
      "Beer",
      "Cocktails",
      "Comfort food",
      "Happy hour drinks",
      "Happy hour food",
      "Hard liquor",
      "Quick bite",
      "Small plates",
      "Wine"
    ],
    "Dining options": [
      "Lunch",
      "Dinner",
      "Catering",
      "Counter service",
      "Dessert",
      "Seating",
      "Table service"
    ],
    "Amenities": [
      "Bar onsite",
      "Restroom"
    ],
    "Atmosphere": [
      "Casual",
      "Trendy"
    ],
    "Crowd": [
      "Family-friendly",
      "Groups",
      "Tourists"
    ],
    "Planning": [
      "Accepts reservations"
    ],
    "Payments": [
      "Credit cards",
      "Debit cards",
      "NFC mobile payments"
    ],
    "Children": [
      "Good for kids",
      "High chairs"
    ],
    "Parking": [
      "Free street parking",
      "Paid street parking",
      "Parking"
    ],
    "Pets": [
      "Dogs allowed inside",
      "Dogs allowed outside"
    ]
  },
  "openingHours": {
    "Wednesday": "2–10 PM",
    "Thursday": "2–10 PM",
    "Friday": "12–11 PM",
    "Saturday": "12–11 PM",
    "Sunday": "12–10 PM",
    "Monday": "Closed",
    "Tuesday": "2–10 PM"
  },
  "openStatus": "Closed · Opens 2 PM",
  "departments": [
    {
      "name": "Delivery",
      "openingHours": {
        "Wednesday": "12–9 PM",
        "Thursday": "12–9 PM",
        "Friday": "12–10 PM",
        "Saturday": "12–10 PM",
        "Sunday": "12–9 PM",
        "Monday": "Closed",
        "Tuesday": "12–9 PM"
      }
    },
    {
      "name": "Kitchen",
      "openingHours": {
        "Wednesday": "2–9 PM",
        "Thursday": "2–9 PM",
        "Friday": "12–10 PM",
        "Saturday": "12–10 PM",
        "Sunday": "12–9 PM",
        "Monday": "Closed",
        "Tuesday": "2–9 PM"
      }
    },
    "... +1 more"
  ],
  "menu": [
    {
      "name": "Wings/Apps 3Po",
      "items": [
        {
          "name": "25 Wings",
          "price": "$46.50"
        },
        {
          "name": "6 Wings",
          "price": "$15.00"
        }
      ]
    },
    {
      "name": "Smoker 3Po",
      "items": [
        {
          "name": "Sausage Link",
          "price": "$9.50"
        },
        {
          "name": "1/2lb Turkey",
          "price": "$18.50"
        },
        "... +5 more"
      ]
    },
    "... +4 more"
  ],
  "services": null,
  "popularDishes": [
    {
      "name": "Sampler Platter",
      "id": "/g/11kk81g59x",
      "reviewMentions": 11,
      "photoCount": 44,
      "photos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl92cM8VxZftTJrg7z1FTrjiDNncCv34st3cEuz63s_VMEoItFlPkmiyPNtcmEUegppPn...",
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkgjw62ShoVAIyqXJ06xi9pYGiXQYZMe2ABUhjyIPFbkgX_ZOY1WyEIUtauxCVZnLmBa0...",
        "... +4 more"
      ]
    },
    {
      "name": "Cornbread",
      "id": "/g/11nhlxdxnb",
      "reviewMentions": 45,
      "photoCount": 9,
      "photos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlZpft3tm-PkIQcaWecRUFXhD7IA41FbU9yJIDg3KEiicnFKNbjqSS4CPlsWiRZQf3j26...",
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmDGauwdrYSWfS8-HeCdRILDM2Op31TKYG-DfQlm_q3zhft_ziU0YSh3fO7HBKSt_Q70z...",
        "... +2 more"
      ]
    },
    "... +18 more"
  ],
  "hotelOffers": null,
  "popularTimes": [
    {
      "day": "Monday",
      "hours": [
        {
          "hour": 6,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "6 AM"
        },
        {
          "hour": 7,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "7 AM"
        },
        "... +16 hours"
      ]
    },
    {
      "day": "Tuesday",
      "hours": [
        {
          "hour": 6,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "6 AM"
        },
        {
          "hour": 7,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "7 AM"
        },
        "... +16 hours"
      ]
    },
    "... +4 days"
  ],
  "ratingHistogram": null,
  "reviewPills": [
    {
      "label": "cornbread",
      "topicId": "EB6x5v5Zjbk",
      "count": 64,
      "secondaryCount": 38,
      "positiveCount": 45,
      "neutralCount": 8,
      "negativeCount": 6,
      "fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6RUI2eDV2NVpqYms="
    },
    {
      "label": "knicks game",
      "topicId": "cUi84WC_H6c",
      "count": 11,
      "secondaryCount": 52,
      "positiveCount": 2,
      "neutralCount": 2,
      "negativeCount": 0,
      "fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6Y1VpODRXQ19INmM="
    },
    "... +8 more"
  ],
  "verifiedOwner": {
    "name": "Pig Beach BBQ Queens (Owner)",
    "ownerId": "104702959717892551553"
  },
  "regionHierarchy": [
    {
      "name": "Americas",
      "weight": 0.75
    },
    {
      "name": "Astoria",
      "weight": 1
    },
    "... +11 more"
  ],
  "heroPhoto": {
    "url": "https://streetviewpixels-pa.googleapis.com/v1/thumbnail?panoid=W6B_rU8sYPDrfatlxiDO2Q&cb_client=search.gws-prod.gps&w...",
    "photoId": "W6B_rU8sYPDrfatlxiDO2Q",
    "nativeWidth": null,
    "nativeHeight": null,
    "caption": null,
    "photoCount": 1341
  },
  "photoTabs": [
    {
      "name": "All",
      "previewPhotoCount": 1,
      "previewPhotos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWknNI9ysNP7blra9fQf2-rGQ-o7sSU3fcchS56vm8kNyJWhgmz5KkGMhifPytYBMfH8na..."
      ]
    },
    {
      "name": "Latest",
      "previewPhotoCount": 1,
      "previewPhotos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmKGgoCvHfatJdxAe4UeW774xRCmgEGsfInL1t_YakQfi7MIwDnHxLM5OT3WKiwUQ-w2Y..."
      ]
    },
    "... +12 more"
  ],
  "travelTimeMarkers": [
    {
      "durationSeconds": 900,
      "label": "15 min",
      "latitude": 40.7552726,
      "longitude": -73.92530239999999
    },
    {
      "durationSeconds": 1800,
      "label": "30 min",
      "latitude": 40.7552726,
      "longitude": -73.92530239999999
    },
    "... +7 more"
  ],
  "reviewTeasers": null,
  "bookingLinks": null,
  "bookingPartners": null,
  "immersiveView": null,
  "fuelPrices": null,
  "editorial": {
    "title": "Pig Beach BBQ Queens",
    "photoUrl": "https://lh5.googleusercontent.com/-PeduWSrsGlw/AAAAAAAAAAI/AAAAAAAAAAA/QXo1bDeb8Fg/s40-c-k-mo/photo.jpg",
    "snippet": "Big screens, blue skies, and a crowd that cheers louder with every plate that comes out of the kitchen. That's game d..."
  },
  "anchorPlaces": null,
  "directoryPlaces": null,
  "hotelAmenities": null,
  "hotelDescription": null,
  "hotelEditorial": null,
  "hotelInfo": null,
  "nearbyCategories": null,
  "relatedPlaces": [
    {
      "name": "Butcher Bar",
      "hexId": "0x0:0x5c26c39eca5fb41a",
      "rating": 4.2,
      "reviewsCount": 1060,
      "latitude": 40.764306499999996,
      "longitude": -73.9163566,
      "categories": [
        "Barbecue",
        "Bar",
        "... +3 more"
      ]
    },
    {
      "name": "John Brown BBQ",
      "hexId": "0x0:0x8bbd7a759a06f6f0",
      "rating": 4.5,
      "reviewsCount": 3222,
      "latitude": 40.752658499999995,
      "longitude": -73.93667359999999,
      "categories": [
        "Barbecue",
        "Restaurant"
      ]
    },
    "... +2 more"
  ],
  "streetViewThumb": "https://lh5.googleusercontent.com/-PeduWSrsGlw/AAAAAAAAAAI/AAAAAAAAAAA/QXo1bDeb8Fg/s44-p-k-no-ns-nd/photo.jpg",
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJsT7KfEtfwokRdTuEU6J5MAI",
  "businessStatus": null,
  "permanentlyClosed": false
}
```

### Advanced Usage

Ready-made configurations for review monitoring, reputation management, competitor tracking and sentiment analysis.

#### Track a portfolio daily

```json
{
  "placeIds": ["ChIJHQQciMZRqEcR2X4b8-vf5Bk", "0x47a851db960e0eb1:0x6ce7f513876203dd"],
  "newerThan": "2 days",
  "maxReviewsPerPlace": 0,
  "reviewsOrigin": "google"
}
```

#### Pull a full history for analysis

```json
{
  "placeIds": ["0x47a851c6881c041d:0x19e4dfebf31b7ed9"],
  "maxReviewsPerPlace": 0,
  "reviewsSort": "newest"
}
```

#### Local-language reviews with local labels

```json
{
  "placeIds": ["0x47a851c6881c041d:0x19e4dfebf31b7ed9"],
  "maxReviewsPerPlace": 200,
  "language": "de",
  "countryCode": "de"
}
```

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

**$0.399 per 1,000 reviews** on the Free and Bronze plans, falling automatically to $0.349 on Silver and $0.299 on Gold and above. A $0.05 start fee applies once per run.

| Reviews | Total cost |
|---------|------------|
| 100 | $0.09 |
| 1,000 | $0.46 |

Reviews are charged as they are delivered, so a run that returns 40 reviews is charged for 40. Filtering by keyword, date or sort happens before delivery, so narrowing your input is the direct way to lower cost.

Free tier: 10 lifetime runs, 100 reviews per run, no credit card.

### Keeping it running

Reviews arrive continuously, so this Actor earns its place on a schedule rather than as a one-off.

**Suggested cadence.** Daily with `newerThan: "2 days"` for active monitoring, or weekly with `newerThan: "8 days"` for reporting. The small overlap covers a missed run.

**Where the rows go.** The dataset connects to Google Sheets, Make, Zapier, Slack and plain webhooks from the Actor's Integrations tab. A webhook on run completion is the usual way to push new reviews straight into a helpdesk or an alerting channel.

How to run the scraper and put it on a schedule (official Apify videos):

https://www.youtube.com/watch?v=1OW8gOqlZbY

https://www.youtube.com/watch?v=1jI7WcVQmwM

### FAQ

#### What is Google Maps, and what counts as a review here?

Google Maps is Google's mapping and local-business service, where visitors rate places from one to five stars and leave written reviews. This Actor returns those reviews for places you already have, one row each, including the reviews Google syndicates from partner sites such as Tripadvisor and Booking.

#### Does Google have an official reviews API, and why use this instead?

The Google Places API returns at most five reviews per place, with no owner replies, no reviewer sub-ratings and no partner reviews. This Actor returns the complete history with all 41 fields, and needs no Google Cloud project, billing account or API key.

#### How many reviews can I extract per place?

There is no cap. Set *Reviews per place* to `0` and the complete history comes back; places with tens of thousands of reviews stream through in bounded batches.

#### How do I find the places to feed in?

Paste Google Maps URLs, or use [Google Maps Scraper](https://apify.com/zen-studio/google-maps-scraper) to find places by search term and location and feed its `placeId` or `hexId` values straight in here.

#### Can I search for places from this Actor?

No, this one starts from places you already have. [Google Maps Scraper](https://apify.com/zen-studio/google-maps-scraper) does the discovery, and [Google Maps Directions & Routes API](https://apify.com/zen-studio/google-maps-directions-api) covers travel times between them.

#### How do I export the data?

JSON, CSV, Excel, XML or HTML from the run's Storage tab, or through the Apify API. JSON preserves the nested `ownerResponse`, `attributes` and `media` fields exactly; CSV flattens them.

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

The Actor collects only publicly visible information. Reviews contain personal data such as author names and profile links, so you are the controller under GDPR, CCPA and equivalent laws, and you need a lawful basis to process them. Using the output is your responsibility, and so is compliance with Google's terms.

#### Why is a partner review's rating not out of 5?

Syndicated reviews keep their source's scale. `ratingScale` tells you what the number is out of, so always read `rating` together with `ratingScale`.

#### What are `attributes` on a review?

The structured answers reviewers give alongside the stars: Food, Service and Atmosphere scores for restaurants, Rooms and Location for hotels, plus chips such as trip type, price per person, wait time and parking. Each entry carries the question Google asked, so an unfamiliar key still explains itself.

#### Does it return reviews in one language?

Reviews come back in the language they were written in. Where Google offers a translation it is included as `textTranslated`, with both language codes.

#### What happens if a place cannot be loaded?

It is skipped and reported in the run log, and the rest of the run continues. If a place's history comes back only partially, the run says so explicitly rather than presenting it as complete.

#### What is the free tier?

10 lifetime runs, 100 reviews per run, no credit card.

### More Zen Studio & Clearpath scrapers for maps & local data

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-EgDf0I1X8lNhCes2E-kpZCa398Jg-baidu-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Baidu Maps 百度地图**
  - [Baidu Maps Scraper](https://apify.com/zen-studio/baidu-maps-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-y6Jak0F6vxdZew3b2-HljeTJZkhm-google-maps-directions-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Google Maps**
  - [Google Maps Scraper](https://apify.com/zen-studio/google-maps-scraper)
  - [Google Maps Directions & Routes API](https://apify.com/zen-studio/google-maps-directions-api)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-5bSvAQKSK3LPq9OXb-AgVhcT1mQC-apple-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Apple Maps**
  - [Apple Maps Scraper](https://apify.com/zen-studio/apple-maps-scraper-pro)
  - [Apple Maps Directions & Route API](https://apify.com/zen-studio/apple-maps-directions-route-api)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-fRSgBvgbsRB4o7t30-UkaIbH1Yhq-yandex-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Yandex Maps Яндекс Карты**
  - [Yandex Maps Scraper](https://apify.com/zen-studio/yandex-maps-scraper)
  - [Yandex Maps Reviews Scraper](https://apify.com/zen-studio/yandex-maps-reviews-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-NBmcHCtkUEhA0DNP3-SrXbUedsVm-2gis-scraper-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **2GIS 2ГИС**
  - [2GIS Places Scraper](https://apify.com/zen-studio/2gis-places-scraper-api)
  - [2GIS Reviews Scraper](https://apify.com/zen-studio/2gis-reviews-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-F5g6zADHgY9XgfKpv-uUDQtIEe9Q-naver-place-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Naver Map & Place 네이버 지도**
  - [Naver Map & Place Scraper](https://apify.com/zen-studio/naver-place-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-NrhaGcIgNVy9fCV5b-mEAgbbceA8-bing-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Bing Maps**
  - [Bing Maps Scraper](https://apify.com/zen-studio/bing-maps-scraper)
    **🔗 Review aggregators**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-2EJcvIYcO9H0KQOIO-RfOMRAFXbQ-local-business-leads-scraper.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Place reviews**
  - [Place Review Aggregator](https://apify.com/zen-studio/place-review-aggregator)

### Support

- **Bugs**: Issues tab
- **Features**: Issues tab

### Legal Compliance

Extracts publicly available data. Users must comply with Google's terms and data protection regulations (GDPR, CCPA).

***

*Google Maps reviews scraper: unlimited reviews per place with ratings, review text, owner responses, reviewer sub-ratings, photos and videos, exported to CSV, JSON or Excel.*

# Actor input Schema

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

The places to scrape reviews for. Accepts <code>/maps/place/...</code>, <code>/maps?cid=...</code>, shortened <code>maps.app.goo.gl</code> links, and <code>share.google</code> links from the Share button in the Google app. Paste the links themselves; a link to a hosted list of URLs is not supported.

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

Google Maps place IDs like <code>ChIJN1t_tDeuEmsRUsoyG83frY4</code> (the <code>place_id:</code> prefix is optional). Feature IDs like <code>0x89c25a1bd8d6f2f7:0xf28aad03aa6f0532</code> also work, and start fastest.

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

Stop after this many reviews per place, or earlier if the place has fewer. Set <code>0</code> for the complete history; some places have tens of thousands. Each review is billed at $0.399 per 1,000.

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

<b>Newest first</b> orders by latest activity, so an edited review counts as recent; it is the one to use for monitoring. <b>Most relevant</b> matches what the Google Maps page shows by default. Combine <b>Lowest rating first</b> with a small <b>Reviews per place</b> to pull just the complaints.

## `newerThan` (type: `string`):

A date (<code>2026-08-01</code>) or a rolling period (<code>7 days</code>, <code>3 months</code>). A period is measured from the moment the run starts, so scheduled runs keep the same window instead of drifting. Compared against each review's latest activity, so a review edited inside the window is kept even if it was first posted years ago. Dates with no time zone are read as UTC; a month counts as 30 days. Leave blank for no cutoff. Setting this forces <b>Newest first</b>.

## `reviewsKeyword` (type: `string`):

Keep only reviews about a topic, e.g. <code>parking</code> or <code>breakfast</code>. Matches the way the search box on the Google Maps reviews panel does, so related wording is included, not just the exact word. Leave blank for all reviews.

## `reviewsOrigin` (type: `string`):

Places like hotels also show reviews syndicated from partner sites. Restrict to Google-native reviews if you only want first-party ratings.

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

Display language for place names, categories, and relative dates. Review text is always returned in the language it was written in.

## `countryCode` (type: `string`):

Two-letter country code used when loading each place, e.g. <code>de</code>. Affects regional labels only, not which reviews are returned.

## `parentActor` (type: `string`):

Optional integration label for orchestrated runs. It does not change scraping or output.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "startUrls": [],
  "placeIds": [
    "ChIJHQQciMZRqEcR2X4b8-vf5Bk"
  ],
  "maxReviewsPerPlace": 100,
  "reviewsSort": "mostRelevant",
  "newerThan": "",
  "reviewsKeyword": "",
  "reviewsOrigin": "all",
  "language": "en",
  "countryCode": "us",
  "parentActor": ""
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `places` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [],
    "placeIds": [
        "ChIJHQQciMZRqEcR2X4b8-vf5Bk"
    ],
    "maxReviewsPerPlace": 100,
    "reviewsSort": "mostRelevant",
    "newerThan": "",
    "reviewsKeyword": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/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": [],
    "placeIds": ["ChIJHQQciMZRqEcR2X4b8-vf5Bk"],
    "maxReviewsPerPlace": 100,
    "reviewsSort": "mostRelevant",
    "newerThan": "",
    "reviewsKeyword": "",
}

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/google-maps-reviews-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 '{
  "startUrls": [],
  "placeIds": [
    "ChIJHQQciMZRqEcR2X4b8-vf5Bk"
  ],
  "maxReviewsPerPlace": 100,
  "reviewsSort": "mostRelevant",
  "newerThan": "",
  "reviewsKeyword": ""
}' |
apify call zen-studio/google-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zen-studio/google-maps-reviews-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/ojjo6BxQiOiLYRca1/builds/IyKD97VH5J7uE03M8/openapi.json
