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
- Open the Actor's page in the Scrape.ly Store.
- Pick a ready-made input. We used the preset Eiffel Tower reviews about queues, 5 reviews. "Try this input" opens it in the console.
- Swap in your own place. This is the exact input of our run:
{
"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
}- Start the run. Reviews land in the dataset as each page of Google's review feed is read.
- Export the dataset as JSON, CSV, Excel or HTML.
The fields that matter most:
startUrlsandplaceIds: the places to read. A place URL, a?cid=link or a place ID such asChIJLU7jZClu5kcR4PcOOO6p3I0all work. A search URL (for examplehttps://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;0means every review the place has.reviewsSort:newest,mostRelevant(the default),highestRankingorlowestRanking.reviewsStartDate: only reviews on or after a date, absolute (2026-05-03) or relative (8 days,3 months). Withnewestsorting, the run stops paging as soon as it passes the date, so you only pay for the reviews you asked for.reviewsFilterStringandpersonalData: 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.
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:
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):
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:
{
"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:
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=falseUnder 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.
mostRelevantfollows Google's own order,newestgives you a time window,highestRankingandlowestRankingmix years. A date filter only stops paging early withnewest. - Empty fields are real. A review without text, reply or photos comes back with those fields empty, never guessed. Filter on
textif 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.
Is it legal to scrape Google Maps reviews?
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: 0the 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
newestand a start date of1 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.




