Skip to content

How to Scrape Google Maps Reviews: Text, Stars, Dates and Owner Replies

Scrape Google Maps reviews for any place URL or place ID: review text, stars, dates, owner replies and visit details. A real run on the Eiffel Tower, its exact cost, and code for curl, Python, Node.js and AI agents.

Published
Reading time
9 min read
Pixel-art robot with an orange >_ on its terminal head pulls a review card with five gold stars out of a Google Maps pin standing on a folded map
In this article
  1. What data you can get from Google Maps reviews
  2. How to scrape Google Maps reviews without code
  3. How to scrape Google reviews with the API
  4. A real run: Eiffel Tower reviews about queues
  5. What it costs
  6. What to watch out for
  7. Is it legal to scrape Google Maps reviews?
  8. Why Scrape.ly for Google Maps reviews
  9. FAQ
  10. Can you scrape Google reviews for free?
  11. How many Google Maps reviews can you scrape per place?
  12. Does Google's Places API return all reviews?
  13. Can I get only new reviews every day?
  14. Can I scrape reviews without reviewer names?
  15. Can I scrape the place details too?

To scrape Google Maps reviews, give a review scraper a place URL or a place ID and save every review it returns: the text, the stars, the date, the owner's reply, the visit details and the place it belongs to. The fastest way is the Google Maps Reviews Scraper on Scrape.ly: paste a link, set how many reviews you want, and the rows come back in seconds, at $0.40 per 1,000 reviews.

This guide covers both routes: the no-code way in the Scrape.ly console and the API way (curl, Python, Node.js and AI agents over MCP). Everything below comes from a real run we made on 22 October 2026: the exact input, the output, the log and what it cost.

What data you can get from Google Maps reviews

Every row is one review, and every row also carries the place, so a row still makes sense on its own after you export it. These are the fields the Google Maps Reviews Scraper writes:

Field What it holds
text, textTranslated The review as written, and Google's translation into your language
stars, rating Star rating from 1 to 5 (rating holds partner scales such as 4/10)
publishedAtDate, publishAt Exact ISO timestamp and Google's relative time ("4 months ago")
responseFromOwnerText, responseFromOwnerDate The owner's reply and when it was posted
reviewContext Visit details Google shows, such as "Wait time: 1 hr+"
reviewDetailedRating Aspect ratings, such as "Rooms 5, Service 4"
visitedIn, originalLanguage When the reviewer visited and the language of the original text
likesCount Likes on the review
reviewImageUrls Photos attached to the review
name, reviewerNumberOfReviews, isLocalGuide Reviewer details, only when Reviewer details is on
title, address, categoryName, location The place: name, address, category and coordinates
totalScore, reviewsCount The place's overall rating and total review count
placeId, cid, fid, url Google's identifiers and a Maps link for the place

Fields are filled only when Google has them: many reviews have stars but no text, no reply and no photos. The scraper reads Google reviews only, so partner scores (for example Tripadvisor ratings on a hotel page) and reviews that only signed-in users can see are not part of the output.

How to scrape Google Maps reviews without code

  1. Open the Actor's page in the Scrape.ly Store.
  2. Pick a ready-made input. We used the preset Eiffel Tower reviews about queues, 5 reviews. "Try this input" opens it in the console.
  3. Swap in your own place. This is the exact input of our run:
json
{
  "startUrls": [
    { "url": "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!3m1!4b1!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813" }
  ],
  "maxReviews": 5,
  "reviewsSort": "lowestRanking",
  "reviewsFilterString": "queue",
  "personalData": false
}
  1. Start the run. Reviews land in the dataset as each page of Google's review feed is read.
  2. Export the dataset as JSON, CSV, Excel or HTML.

The fields that matter most:

  • startUrls and placeIds: the places to read. A place URL, a ?cid= link or a place ID such as ChIJLU7jZClu5kcR4PcOOO6p3I0 all work. A search URL (for example https://www.google.com/maps/search/pizza+near+times+square) reads the first page of places, up to 20.
  • maxReviews: reviews to save per place. The default is 10; 0 means every review the place has.
  • reviewsSort: newest, mostRelevant (the default), highestRanking or lowestRanking.
  • reviewsStartDate: only reviews on or after a date, absolute (2026-05-03) or relative (8 days, 3 months). With newest sorting, the run stops paging as soon as it passes the date, so you only pay for the reviews you asked for.
  • reviewsFilterString and personalData: keep only reviews whose text contains all of your words, and switch reviewer names, profile links and photos off with one checkbox.

How to scrape Google reviews with the API

Create an API token in the dashboard under Settings → API & Integrations, then export it as SCRAPELY_TOKEN.

Our run finished in 6 seconds, so the synchronous endpoint is a good fit: it starts the run, waits up to 45 seconds and returns the reviews as a JSON array. Add ?format=csv for CSV.

shell
curl -X POST "https://api.scrape.ly/v2/actors/cornerledger~google-maps-reviews-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $SCRAPELY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"placeIds": ["ChIJLU7jZClu5kcR4PcOOO6p3I0"], "maxReviews": 5, "reviewsSort": "lowestRanking", "reviewsFilterString": "queue", "personalData": false}'

If you ask for thousands of reviews and a run takes longer than 45 seconds, the call answers 408 while the run keeps going. Don't call it again (that starts a second run); use a client instead, which waits as long as the run takes.

Python (pip install scrapely-client-python), here counting the stars of the newest 200 reviews:

python
import os
from collections import Counter
from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("cornerledger/google-maps-reviews-scraper").call(
    run_input={"placeIds": ["ChIJLU7jZClu5kcR4PcOOO6p3I0"], "maxReviews": 200, "reviewsSort": "newest", "personalData": False}
)
print(run.status)  # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
reviews = list(client.dataset(run.default_dataset_id).iterate_items())
print(Counter(r["stars"] for r in reviews))
for r in reviews[:5]:
    print(r["publishedAtDate"][:10], r["stars"], (r.get("text") or "")[:80])

Node.js (npm install scrapely-client):

javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('cornerledger/google-maps-reviews-scraper').call({
  placeIds: ['ChIJLU7jZClu5kcR4PcOOO6p3I0'],
  maxReviews: 5,
  reviewsSort: 'lowestRanking',
  reviewsFilterString: 'queue',
  personalData: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => [r.stars, r.publishedAtDate, r.reviewContext]));

To let an AI agent do it, add the Scrape.ly MCP server. In Cursor, put this in ~/.cursor/mcp.json:

json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://api.scrape.ly/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

In Claude Code, run claude mcp add --transport http scrapely https://api.scrape.ly/mcp and sign in with /mcp. Then ask in plain words: "Use scrapely to run cornerledger/google-maps-reviews-scraper on the Eiffel Tower, 50 newest reviews without reviewer details, and tell me what people complain about most." The agent finds the Actor, reads its input schema, runs it and reads the rows. See the MCP docs and the Python client for the details. If you want a ready endpoint rather than an Actor, the Google reviews API page shows the same data as an API product.

A real run: Eiffel Tower reviews about queues

We ran the "Eiffel Tower reviews about queues, 5 reviews" preset on 22 October 2026. It returned 5 reviews in 6 seconds and was charged $0.0022. The place itself has a 4.7 rating from 498,670 reviews, so this is a needle-in-a-haystack query: the lowest-rated reviews that mention a queue.

Reviewer Stars Published Review (start) Visit details
[reviewer 1] 1 2026-05-29 "Truly awful experience with spectacular views. How this became…" none
[reviewer 2] 1 2026-06-07 "I visited the Eiffel Tower on Saturday, May 30th. I had booked tickets…" Visited on: Weekend; Wait time: 1 hr+
[reviewer 3] 1 2023-04-19 "One of the most popular attractions and also one of the worst…" none
[reviewer 4] 1 2025-12-30 "No availability to book the summit when I checked daily weeks in advance…" none
[reviewer 5] 1 2025-06-26 "An Unpopular Opinion: The Eiffel Tower - A Visual Masterpiece, A Tourist Trap…" none

Reviewers are private people, so we show them as [reviewer 1] to [reviewer 5]; this run had Reviewer details off anyway, so no names were saved in the first place. Every row also carried the place (Historical landmark, Av. Gustave Eiffel, 75007 Paris), its place ID, CID and coordinates, the original language and "Visited in" text. None of the five had an owner reply, which is typical for a landmark rather than a restaurant or hotel.

Notice what the filter did: the five reviews span three years, because lowestRanking sorts by stars, not date, and the keyword filter kept only reviews that mention "queue". Switch to newest with a reviewsStartDate when you care about recent complaints.

The run's log, without the platform's start-up lines:

Text
2026-10-22T18:25:55.826Z [Scrapely] Container started (setup 1.4 s)
2026-10-22T18:25:57.271Z [scrapely.proxy_configuration] INFO  Platform proxy access check succeeded.
2026-10-22T18:25:57.288Z [scrapely.actor] INFO  [Status message]: Reading reviews...
2026-10-22T18:25:58.992Z [scrapely.actor] INFO  Saved 5 reviews from 1 places. Downloaded 0.09 MB in 1.8 s.
2026-10-22T18:26:00.151Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false

Under 0.1 MB of traffic and 1.8 seconds of scraping: the Actor reads Google's own review feed, about 50 reviews per request, instead of scrolling a map in a headless browser.

What it costs

The Actor charges one event, $0.0004 per review saved to the dataset, which is $0.40 per 1,000 reviews. On top of that, a run pays for the platform resources it uses.

For our run: 5 reviews × $0.0004 = $0.002 in review fees. The run was charged $0.0022 in total, because it also used $0.00009 of compute and $0.00008 of datacenter proxy traffic. Reviews that your keyword or date filter drops are not saved and not charged.

At scale the review fee dominates: 1,000 reviews cost $0.40 in review fees, and 10,000 reviews $4.00, plus usage of the same small kind. Set Max cost per run in the run options and the run stops cleanly when it reaches it. The Free plan's $5 of monthly credit covers more than 10,000 reviews in review fees.

What to watch out for

  • Big places take a while. A place with hundreds of thousands of reviews can't be read in one sync call. The README measures about 1,000 reviews per 25 seconds per place; use a client or the async flow, and up to six places run in parallel.
  • Sorting changes what "5 reviews" means. mostRelevant follows Google's own order, newest gives you a time window, highestRanking and lowestRanking mix years. A date filter only stops paging early with newest.
  • Empty fields are real. A review without text, reply or photos comes back with those fields empty, never guessed. Filter on text if you only want written reviews.
  • Search URLs cover one page. A Google Maps search URL reads its first page of places, up to 20. To cover a whole city, find the places first with the Google Maps Scraper and pass their place IDs.
  • Blocking. Google's review feed works through the default datacenter proxy. If Google starts refusing requests, switch the proxy group to residential in the input; no code changes.
  • Personal data. Reviewer names and profile photos identify private people. Leave Reviewer details off unless you have a reason to keep them.

Reviews on Google Maps are public: anyone can read them without signing in, and the Actor only reads what any visitor sees. That doesn't settle every question. Google's Maps Additional Terms of Service (last modified January 27, 2026) say users may not "mass download or create bulk feeds of the content", and how those terms bind you depends on where you are and what you do with the data.

Privacy law matters more for reviews than for place listings. A reviewer's name, photo and profile link are personal data under the GDPR and the CCPA, and review text can mention people too. Collect only what you need (turn Reviewer details off), keep it secure, and have a lawful basis for processing it. This is not legal advice: if reviews feed a product, a model or a public site, ask a lawyer about your case.

Why Scrape.ly for Google Maps reviews

  • Every review, not five. Google's official Places API (New) returns "a maximum of 5 reviews" per place, sorted by relevance. The Eiffel Tower has 498,670. With maxReviews: 0 the Actor pages through all of them.
  • No browser to babysit. Scroll-and-parse tutorials depend on Google's class names, which change. The ScraperAPI tutorial that ranks for this query parses one such class to get review counts, not review text. The Actor reads the review feed directly, which is why our run needed 1.8 seconds and 0.09 MB.
  • Filters that save money. Date, keyword and star sorting run before rows are saved, so filtered-out reviews cost nothing, and a maximum charge per run caps the bill.
  • Built for repeat work. Schedule a daily run with newest and a start date of 1 day, send new reviews to Slack, email or Google Sheets with automations, or hand the job to an AI agent over MCP.

FAQ

Can you scrape Google reviews for free?

The Scrape.ly Free plan includes $5 of usage credit every month with no credit card, which covers more than 10,000 reviews in review fees at $0.40 per 1,000. Our 5-review run cost $0.0022. Open-source scripts are free to run, but you maintain the browser, proxies and selectors yourself.

How many Google Maps reviews can you scrape per place?

As many as the place shows. Set maxReviews to 0 for every review; the run pages through Google's feed about 50 reviews at a time. Large places take minutes rather than seconds, so use the async API or a client.

Does Google's Places API return all reviews?

No. Google's Places API returns at most five reviews per place. For complete review histories, scrape them with the Actor, which you can call from your own code with the same token and endpoints shown above.

Can I get only new reviews every day?

Yes. Set reviewsSort to newest and reviewsStartDate to 1 day, then schedule the run daily. The run stops paging as soon as it passes the date, so a quiet day costs almost nothing.

Can I scrape reviews without reviewer names?

Yes. Turn off Reviewer details (personalData: false), as in our run. You still get the review text, stars, dates, replies, review ID and the place; names, profile links and reviewer photos are dropped.

Can I scrape the place details too?

Every review row already includes the place's name, address, category, rating, review count and IDs. For phones, websites and opening hours across many places, see our guide on how to scrape Google Maps.

  • google maps
  • reviews
  • reputation monitoring
  • python
  • api

About the author

Actor publisher on the Scrape.ly Store

The businesses on every corner and in every register: map listings, local directories, company registries and customer reviews. For sales teams and market researchers. A Scrapely studio.

//Keep reading\\

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.