Google Maps Reviews Scraper avatar

Google Maps Reviews Scraper

Pricing

from $0.21 / 1,000 review-scrapeds

Go to Apify Store
Google Maps Reviews Scraper

Google Maps Reviews Scraper

Scrape Google Maps reviews for any place using URLs, Place IDs or names. Get review text, rating, exact timestamp, edited flag, owner reply, reviewer photos and stats, and restaurant or hotel detail scores. Sort four ways, or schedule it for only new reviews. $0.30 per 1,000 reviews.

Pricing

from $0.21 / 1,000 review-scrapeds

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

What is Google Maps Reviews Scraper?

Google Maps Reviews Scraper gets you the reviews of any place on Google Maps, each with the exact time it was posted where the page only says "a month ago". Paste a Maps link, a Place ID or just the name and city of a restaurant, hotel, shop or attraction. You get the review, the reviewer, the owner's reply and the photos, with the place's own details on the same row.

Where it's strong:

  • Dates you can sort and chart. Each review has a timestamp to the millisecond, Google's relative label and an edited flag. In a 360-review check across four places, all 360 had exact timestamps.
  • It's fast on a portfolio. 80 places at 60 reviews each (4,800 reviews) took 9 seconds, and 150 places took 19.
  • One export is enough. Place name, address, categories, rating, phone, website, coordinates and plus code ride along on each review at no extra charge.
  • A daily watch costs almost nothing. Reviews you've already had and reviews your rating filter drops are free, and a place with nothing new costs $0.0005.
  • $0.30 per 1,000 reviews on the Free plan and $0.21 on Business, with proxy usage and platform usage included.

BonCross Verified means we tested this actor against the live site before release and kept the record:

  • 22 of 22 live checks on its inputs and filters passed on 7 October 2026
  • 13 places run the same day by name, link and Place ID: 300 reviews, 1 error row
  • Charges matched the rows: 12 places, 300 reviews, 1 checked
  • A place with no reviews gets a row saying so

What you can do with it:

  • Read the full text of a review and its star rating
  • See whether a review was edited after it was posted
  • Read the owner's reply where the business has answered
  • Collect the reviewer's name, profile, review count, photo count and Local Guide status
  • Pull the detailed scores Google collects for restaurants and hotels
  • Sort by newest, most relevant, highest or lowest, and filter by rating
  • Return only the reviews you haven't had in earlier runs

How much does it cost?

EventFree planStarterScaleBusiness
actor-start, per run$0.001$0.001$0.001$0.001
place-resolved, per place given by name; a URL, Place ID or cid skips it$0.001$0.001$0.001$0.001
place-checked, per place given by URL, Place ID or cid that returns no review (none on the place, or all filtered out or already seen)$0.0005$0.0005$0.0005$0.0005
review-scraped, per review returned$0.0003$0.00027$0.00024$0.00021

Enterprise plans pay the Business price.

$0.30 per 1,000 reviews on the Free plan, $0.21 on Business. That's the whole price, with proxy usage and platform usage included. Filtered, duplicate and previously-seen reviews are free.

Two sizes of run, worked through:

  • A scheduled check of one place by URL, 20 newest reviews: $0.001 + 20 × $0.0003 = $0.007 ($0.0052 on Business).
  • A review archive for a chain, 200 locations by Place ID at 500 reviews each: $0.001 + 100,000 × $0.0003 = $30.001 ($21.001 on Business).

Apify's Free plan includes $5 of credits a month, which is about 710 of those 20-review checks, or about 16,000 reviews in larger runs.

If you paste names, each one costs $0.001 to look up. Links and IDs skip that fee, which is one more reason to keep a list of Place IDs for anything you check often.

What data is in each review?

Review text⭐ Star rating
🕑 Exact timestampRelative date as Google shows it
Edited flag👍 Helpful votes
💬 Owner's reply📷 Review photos
👤 Reviewer name and profile URLReviewer's review and photo counts
Local Guide status🔗 Review id and review URL
🍽 Food, service and atmosphere scores🏨 Rooms, service and location scores for hotels
What was ordered and meal typeTrip type and travel group for hotels
Place name, categories and rating📍 Address, coordinates and plus code
☎️ Place phone and websitePlace ID, feature id and cid

How to scrape Google Maps reviews

You don't write any code. Create a free Apify account, open Google Maps Reviews Scraper, and then:

  1. Paste your places, one per line: Maps links, Place IDs or names with the city.
  2. Pick a sort order and how many reviews you want from each place. Add a rating filter if you only want the complaints or the praise.
  3. Click Start. When the run finishes, download the reviews as Excel, CSV, JSON, XML or HTML.

⬇️ Input

Put one place per entry in "Places". Any of these works: a /maps/place/ URL, a ?cid= URL, a place_id: URL, a bare Place ID (ChIJ…), a feature id (0x…:0x…), a numeric cid, or a plain name. A name goes through Google Maps search and the first result is used. Add the city ("Café de Flore, Paris"), and paste a link or Place ID when you need to be certain which business you get.

Got a long list of links? Start URLs loads them in bulk from a file, a Google Sheet or a remote list, and is combined with whatever you put in Places.

You have two limits. "Max reviews per place" (1 to 20,000, default 100) applies to each place on its own: ten places at 50 each returns 500. "Maximum results for the whole run" caps the total. Nothing past it is fetched or charged for, and 0 means no cap.

"Sort" takes Google's four orderings: newest (the default), most relevant, highest and lowest. "Minimum rating" and "Maximum rating" (0 to 5, where 0 is off) drop reviews outside the band, and you aren't charged for the ones dropped.

"Include place summary on every review" is on by default and costs nothing extra. "Language" (default en) sets Google's interface language, which localises dates, labels and the place details. Review text stays in the language the reviewer wrote it in.

The newest 100 reviews of a place by URL

{
"places": ["https://www.google.com/maps/place/Eiffel+Tower"],
"maxReviewsPerPlace": 100,
"sort": "newest",
"language": "en"
}

Several places by Place ID, feature id and name

{
"places": [
"ChIJCar0f49ZwokR6ozLV-dHNTE",
"0x89c2597777397641:0x4387a82ee10d3e3b",
"Jardin Majorelle, Marrakech"
],
"maxReviewsPerPlace": 60
}

Complaints only

{
"places": ["ChIJCar0f49ZwokR6ozLV-dHNTE"],
"sort": "lowest",
"maxRating": 2,
"maxReviewsPerPlace": 300
}

A daily only-new monitor of a portfolio

{
"places": ["ChIJCar0f49ZwokR6ozLV-dHNTE", "ChIJQXY5d3dZwokROz4N4S6oh0M"],
"sort": "newest",
"maxReviewsPerPlace": 60,
"dedupStoreName": "my-locations-reviews",
"includePlaceInfo": false
}

For developers

  • maxReviewsPerPlace is the per-place limit and maxItems the run-wide one. Error rows don't count toward maxItems.
  • Scan guards: when a rating filter or the dedup store keeps nothing, a place's scan stops after five requests in a row with no review kept, and at three times the requests its limit needs (at least 20).
  • With sort: newest and dedupStoreName set, a place's list stops at the first review an earlier run returned. dedupStoreName is the name of a key-value store that remembers what you've had.
  • minRating above maxRating is refused before the run starts.
  • A place given by URL or ID that returns no review bills the place-checked fee and writes a row saying so. A name has already paid place-resolved. An error row is free.
  • includePlaceInfo (default true) reads the place's Maps listing once and adds placeName, placeId, address, categories, rating, phone, website, coordinates and plus code to each review record.
  • maxConcurrency (Parallel requests, default 32, 1 to 32) sets how many requests run at once across the whole run. Lower it only if a run reports errors. delayMs (Delay between requests, default 0, up to 10,000) adds an optional pause before each request, in milliseconds.
  • A run that's moved to another server or restarted carries on where it stopped, without writing or charging any review twice.

⬆️ Output

You get one record per review, viewable as a table or as JSON in the Output tab. With the place summary on, each row repeats the place record, and one export is enough for analysis.

{
"input": "Katz's Delicatessen, New York",
"cid": "0x0:0x313547e757cb8cea",
"placeName": "Katz's Delicatessen",
"placeId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
"placeFid": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
"placeAddress": "Katz's Delicatessen, 205 E Houston St, New York, NY 10002",
"placeCategories": ["Deli", "American restaurant", "…"],
"placeRating": 4.5,
"placeRatingScale": 5,
"placePhone": "(212) 254-2246",
"placeWebsite": "https://katzsdelicatessen.com/",
"placeLat": 40.722232999999996,
"placeLng": -73.98742899999999,
"placePlusCode": "P2C7+V2 New York",
"position": 1,
"id": "Ci9DQUlRQUNvZENodHljRjlvT2xwWVRsbEViV2xuVlZaNGQxVnlaQzE1YUhoaVprRRAB",
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xwWVRsbEViV2xuVlZaNGQxVnlaQzE1YUhoaVprRRAB",
"url": "https://www.google.com/maps/reviews/…",
"reviewUrl": "https://www.google.com/maps/reviews/…",
"source": "Google",
"sourceId": null,
"author": "Dr. Ed Harris",
"authorAvatar": "https://lh3.googleusercontent.com/…",
"authorUrl": "https://www.google.com/maps/contrib/100376163683258008326/reviews?hl=en-US",
"authorId": "100376163683258008326",
"authorReviewCount": 135,
"authorPhotoCount": 43,
"authorLocalGuide": true,
"postedText": "5 days ago",
"isEdited": false,
"postedAt": "2026-10-02T01:38:23.213Z",
"postedAtIsApproximate": false,
"postedAtMs": 1790905103213,
"rating": 5,
"ratingScale": 5,
"text": "I had previously ordered Katz and had it shipped to Georgia. It was so good, I had to get to NY to try the sandwich fresh from the restaurant. It did NOT disappoint.…",
"language": "en",
"likes": 1,
"details": { "order_type": "Dine in", "meal_type": "Lunch", "price_per_person": "$30–40", "food": 5, "service": 5, "atmosphere": 5, "noise_level": "Moderate noise", "parking_space": "Difficult to find parking" },
"detailsRaw": [ { "key": "GUIDED_DINING_MODE", "label": "Order type", "question": "Did you dine in, take out, or get delivery?", "value": "Dine in" }, "…" ],
"ownerResponse": null,
"photos": ["https://lh3.googleusercontent.com/…", "…"],
"sort": "newest",
"scrapedAt": "2026-10-07T19:31:10.335Z"
}

Notes on a few columns:

  • id and reviewId hold the same Google identifier. id is the name used across all BonCross actors, and reviewId is the review-specific one.
  • source is always "Google" on this actor and sourceId is always null. On Google's hotel pages those two say which partner site a review came from, and a Maps review is always Google's own. Both are kept to give a dataset that combines this actor with Google Hotels Reviews Scraper one shape.
  • Hotel reviews have three more fields where the reviewer filled them in: hotelAspects (Rooms, Service and Location scores, each with rating and ratingScale), tripType and travelGroup. They're absent on reviews of other kinds of place.
  • details holds the reviewer's answers keyed by label (for a restaurant: food, service, atmosphere, meal type and what was ordered). detailsRaw keeps each answer with Google's own question text.
  • ownerResponse and detailsRaw depend entirely on the place. Measured across four places, owner replies filled 39 of 40 reviews at one hotel, 3 of 40 at another and none at two more. The per-aspect detail filled 34 of 40 at one place and none at another. An empty column there means the business didn't reply. It isn't a missing field.
  • A place Google lists no reviews for gets one row of its own: the place, an error message saying it has none, and no review fields. If you gave that place as a link or Place ID it costs the $0.0005 place-checked fee, and if you gave a name you've paid the $0.001 lookup and nothing more.
  • In a CSV or Excel export, nested fields such as details and photos are flattened into columns.

How many reviews can you get, and how fast?

Up to 20,000 reviews per place per run, and busy places have thousands available.

RunReviewsRun time
1 place, 10 reviews103 s
5 places, 300 eachup to 1,50018 to 44 s over seven runs, depending on how quickly Google answered
32 places, 60 each1,9207 s
150 places, 20 each3,00019 s
80 places, 60 each4,8009 s

These are whole runs on Apify at the default settings, measured on 1 and 2 October 2026. Thousands of places fit comfortably in one run. Each place's reviews are read in order, which is why one place with many reviews takes longer than many places with a few each.

What fills in depends on the place. In a check of five inputs across four places (a Place ID URL, a name, a feature id, a full Maps URL and a name in another country), 90 newest reviews each, 360 reviews returned. All had exact timestamps, 55 had an owner reply and 111 had photos.

Watch new reviews from a schedule, your code or an agent

Reputation monitoring is the commonest setup. Schedule the run daily in Apify, sort by newest, and name an "Only-new store". Each run then hands you only the reviews posted since the last one. A webhook can pass low ratings to Slack as they arrive, or append them to a Google Sheet. Zapier, Make and Airbyte hook in the same way.

The same data serves other jobs: comparing rating trends and complaint themes across rival locations, ranking branches of a chain by rating and review volume, finding the reviews a business never answered, and building dated, rated, multilingual text sets for sentiment analysis or model training.

From your own code, a POST to https://api.apify.com/v2/acts/boncross~google-maps-reviews/run-sync-get-dataset-items with the input JSON in the body returns the reviews when the run finishes. The apify-client package is on NPM for Node.js and on PyPI for Python.

Agents reach it through the Apify MCP server at mcp.apify.com, where it appears as the tool google-maps-reviews. An agent can pass a place name or URL, get dated and rated reviews as JSON, and summarise or classify them in the same session.

FAQ

Do I need proxies or a Google account to scrape Google Maps reviews?

Neither. Proxy usage is included in the event prices and there's nothing to set up. The actor reads what Google shows a visitor who isn't signed in.

Web scraping is legal when the data is publicly available, which Google Maps reviews are. This actor reads only what Google serves to a logged-out visitor. Reviews are public content written by other people, and complying with Google's terms and your local law in how you use them is your responsibility.

How do I get only the new reviews each day?

Name an "Only-new store" and schedule the run sorted by newest. Anything you've had before is skipped and not charged. A place given by URL or ID with no new review at all costs only the $0.0005 place-checked fee.

How do I collect only the complaints?

Set "Maximum rating" to 2 and sort by lowest. You pay for the reviews that pass the filter and nothing for the ones it drops.

Why did a name return the wrong business?

A name resolves to Google's first search result. Add the city, or paste the place's Maps URL or Place ID. If Google finds nothing for a name, you get a row that says so, and it isn't charged.

Why does a reviewer show 0 reviews?

authorReviewCount is the number Google shows on the reviewer's profile, which counts written reviews. A reviewer who has only left star ratings can show 0. In one sample of 120 reviews, 23 authors showed 0.

Are reviews translated into my language?

They aren't. Review text is returned in the language the reviewer wrote it in. The "Language" setting localises the place details (such as placeCategories) and Google's labels.

What doesn't it return?

  • The place's total review count. Google Maps doesn't provide that number alongside the reviews.
  • Review topic chips such as "bathroom, 33 mentions".
  • Partner-site reviews shown on Google's hotel pages. Those are collected by Google Hotels Reviews Scraper. This actor returns Google's own reviews only.
  • An exact date for the owner's reply. Replies have a relative date, while the review itself has an exact timestamp.
  • The Local Guide level. Local Guide status is a true or false flag.
  • A separate last-edit timestamp. There's one date per review.
  • The score behind "Most relevant". That's Google's own ranking and no column records it.

More from BonCross

Your feedback

Is a review missing, or is there something on the place page you'd want in the row? Open an issue on the Issues tab in Apify Console. We read them all and reply there.