Google Maps Reviews Scraper
Pricing
$19.99/month + usage
Google Maps Reviews Scraper
Scrape Google Maps reviews from any place. This actor extracts reviewer names, ratings, dates, comments, and review counts. Ideal for sentiment analysis, competitor research, customer insights, and performance tracking.
Pricing
$19.99/month + usage
Rating
5.0
(2)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
252
Total users
0
Monthly active users
10 days ago
Last modified
Categories
Share
Google Maps Reviews Scraper — Ratings, Review Text and Reviewer Data
Google Maps Reviews Scraper extracts every visible review from a Google Maps place page — star rating, review text, reviewer profile, owner replies, review photos, context chips (dine-in, meal type) and per-aspect sub-ratings (food, service, atmosphere) — plus the place's full address, category, price range and rating totals. Output is structured JSON, ready for a spreadsheet, database or LLM pipeline. Point it at a Maps URL or Place ID and start pulling reviews.
What is Google Maps Reviews Scraper?
Google Maps Reviews Scraper is an Apify Actor that opens a Google Maps place in a real browser, switches it into reviews mode, scrolls the review feed, and reads every rendered review card plus the place's metadata payload into structured rows. No Google account, API key or login is required — it reads the same public review data any visitor sees on the place page. It's built for local SEO teams, reputation-monitoring tools, competitor researchers and developers who need review data as clean JSON instead of scraping HTML themselves.
What Google Maps review data is publicly available to scrape?
Anyone who opens a Google Maps place page can read its reviews, ratings and business details without signing in — no account is required to view this data.
| Data Category | Publicly Available (no login) | Restricted (requires login/account) |
|---|---|---|
| Star rating and review text | ✅ | — |
| Reviewer name, avatar, Local Guide badge | ✅ | — |
| Review context chips (service type, meal type) | ✅ | — |
| Per-aspect sub-ratings (food, service, atmosphere) | ✅ | — |
| Owner replies to reviews | ✅ | — |
| Place address, category, price range, geo-coordinates | ✅ | — |
| Overall place rating and total review count | ✅ | — |
| Writing, editing or flagging your own review | ❌ | Google account login |
| Managing a business's Google Business Profile | ❌ | Owner login |
Google Maps Reviews Scraper only returns publicly visible data — what any visitor sees. Nothing behind a login wall.
What data can I extract with Google Maps Reviews Scraper?
The Actor returns review-level fields (the text and metadata of each individual review) and place-level fields (the business the reviews belong to), repeated on every row so each dataset item is self-contained.
| Field Name | Description |
|---|---|
reviewId | Google's internal ID for the review card |
reviewerId | Numeric contributor ID parsed from the reviewer's profile URL |
name | Reviewer's display name |
reviewerUrl | Link to the reviewer's Google Maps contributions profile |
reviewerPhotoUrl | Full-resolution reviewer avatar URL |
reviewerNumberOfReviews | Total review count shown in the reviewer's byline |
isLocalGuide | Whether the reviewer is a Google Local Guide |
text | Review body text |
originalLanguage | Language code of the review text, read from the DOM |
publishAt | Raw relative age string as shown by Google (e.g. "3 months ago") |
publishedAtDate | ISO 8601 timestamp derived from publishAt |
stars | Review rating, 1–5 |
likesCount | Number of "helpful" likes on the review |
reviewImageUrls | Array of photo URLs attached to the review |
reviewContext | Object of context chips, e.g. {"Service": "Dine in", "Meal type": "Dinner"} |
reviewDetailedRating | Object of per-aspect sub-ratings, e.g. {"Food": 5, "Service": 4} |
responseFromOwnerText | Business owner's reply text, if any |
responseFromOwnerDate | Relative age string of the owner's reply |
reviewUrl | Deep link to the individual review |
searchString | The original input value (URL or place_id:...) this row came from |
📍 Place fields (repeated on every review row)
| Field Name | Description |
|---|---|
title | Place name |
placeId | Google Place ID |
cid | Numeric CID derived from the place's feature ID |
fid | Raw Google feature ID (0x...:0x...) |
totalScore | Place's overall star rating |
reviewsCount | Place's total review count (all reviews Google reports, not just the rows scraped) |
address | Full formatted address |
street, city, neighborhood, state, postalCode, countryCode | Parsed address components |
categoryName | Primary business category |
categories | Array of all listed categories |
price | Price range indicator (e.g. $$) |
imageUrl | Place's primary photo URL |
location | {lat, lng} geo-coordinates |
url | Google Maps search URL built from the place title and Place ID |
language | UI language actually served by Google for this run, read from the rendered page |
scrapedAt | ISO 8601 timestamp of when the row was scraped |
🤖 Add-on: Need additional Google Maps data?
Pair this Actor with ../../2gis-Places-Scraper for a Yandex/2GIS-region equivalent, or ../../Google-Play-Scraper if the business you're monitoring also ships an app. For reviews on other platforms, see ../../airbnb-review-scraper, ../../Facebook-Reviews-Scraper and ../../walmart-reviews-scraper.
How does Google Maps Reviews Scraper differ from the official Google Places API?
The official Google Places API caps reviews at 5 per place and requires a billed Google Cloud project; this Actor returns up to 1,000 reviews per place with no API key. Google's own REST reference states, for the reviews field on the Place resource: "A maximum of 5 reviews can be returned" (Google Places API (New) REST reference, checked 2026-08-16). The reviews field also sits behind the Place Details Enterprise + Atmosphere SKU, which requires an API key and a billing-enabled Cloud project (Google Place Details (New) documentation, checked 2026-08-16).
| Feature | Google Places API (Place Details) | Google Maps Reviews Scraper |
|---|---|---|
| Reviews per place | Maximum of 5, sorted by relevance | Up to 1,000 (maxReviews) |
| Review sort control | Fixed at relevance | newest, mostRelevant, highestRanking, lowestRanking |
| Owner replies | Not returned | Returned (responseFromOwnerText) |
| Per-aspect sub-ratings / context chips | Not returned | Returned when Google renders them |
| Credentials | API key + billing-enabled Cloud project | None — Maps URL or Place ID only |
| Billing tier | Enterprise + Atmosphere SKU (paid per request) | Pay per review row (row_result) |
Use the official API if 5 reviews per place is enough and you already have Google Cloud billing set up. Use Google Maps Reviews Scraper when you need the full review history, owner replies, sub-ratings, or sort control the official API doesn't expose.
How to use Google Maps Reviews Scraper
Run it from the Apify Console — no separate signup or API key needed beyond your Apify account.
- Open Google Maps Reviews Scraper on the Apify Store and click Try for free (or Start, if you've already added it).
- Provide at least one place in
startUrls(a Maps place URL) orplaceIds(a Google Place ID) — the run exits with no output if neither is supplied. - Set
maxReviews,reviewsSortand, if you only want recent feedback,reviewsStartDateAbsoluteorreviewsStartDateRelative. - Click Start to launch the run.
- Download results from the run's dataset as JSON, CSV, Excel or the other formats Apify's dataset export supports.
How to scale to bulk review extraction
startUrls and placeIds both accept arrays, so one run scrapes many places in a single job — mix and match Maps URLs and Place IDs freely. The Actor processes up to 4 place URLs concurrently per run (CONCURRENT_URLS), so a list of 50 places is worked through in batches of 4 rather than one at a time.
What can you do with Google Maps review data?
- 🏢 Local SEO agencies monitoring client rankings use
stars,totalScoreandreviewsCounttrends over time to prove review-growth impact to clients. - 📊 Reputation-management analysts use
responseFromOwnerTextandresponseFromOwnerDateto audit which locations are (and aren't) replying to negative reviews. - 🍽️ Restaurant and hospitality operators use
reviewDetailedRating(food, service, atmosphere) to find the specific weak point behind a droppingtotalScore. - 🔬 Market researchers use
reviewContext(dine-in vs. takeout, meal type) to segment feedback by visit type across competitor locations. - 🤖 AI engineers feed
text,reviewContextandreviewDetailedRatinginto a RAG pipeline or LLM agent to answer natural-language questions like "what do customers say about wait times at this location?"
How does Google Maps Reviews Scraper handle rate limits and blocking?
Every run routes through Apify Residential proxies by default, with automatic IP rotation: if a place returns zero review cards or a suspiciously low yield relative to its stated review count, the Actor discards that attempt and retries on a freshly rotated residential IP (up to 5 rotated retries per place). You can supply your own proxy in the proxy input instead; if your custom proxy fails, the Actor falls back to Apify Residential automatically. Each place also gets its own retry budget and a hard per-attempt timeout, so one place Google is blocking can't consume the whole run. If every attempt for a place fails, that place returns 0 reviews and the run continues with the rest of the list rather than failing entirely.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | No | array | One or more Google Maps place URLs. Plain strings and {"url": "..."} objects are both accepted. | ["https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/data=!4m6!3m5!1s0x89c259a1ec5f5573:0x2fc6687f46f682d5!8m2!3d40.7372552!4d-73.9882246!16s%2Fg%2F11hbv5rh0_"] |
placeIds | No | array | Each Place ID (e.g. ChIJ...) is converted into a Maps URL and scraped together with startUrls. | ["ChIJnQ0EDVBZwokRPWY5rp2b1kY"] |
maxReviews | No | integer | Maximum reviews to extract per place. Reviews are read by scrolling the live feed, so large values take proportionally longer — roughly 5 seconds of scrolling budget per requested review, capped at 55 minutes per place. Minimum 1, maximum 1000. | 50 |
reviewsSort | No | string (enum: newest, mostRelevant, highestRanking, lowestRanking) | Sort exactly like Google Maps: newest, most relevant, highest rating, or lowest rating. Default newest. | "newest" |
reviewsStartDateAbsolute | No | string (datepicker) | Exact calendar date (YYYY-MM-DD). Reviews older than this are skipped. Google only publishes a relative age per review ("3 months ago"), so the cutoff is accurate to the published bucket, not the day. Default empty. | "2026-01-01" |
reviewsStartDateRelative | No | string (enum: "", "7 days", "1 month", "3 months", "6 months", "1 year", "2 years") | Relative time window, used when the absolute date is empty. Same bucket-level accuracy as the absolute cutoff. Default empty (no relative filter). | "3 months" |
language | No | string (enum: en, es, fr, de, it, pt, nl, bn, hi, ar, tr, id, ja, ko, zh-CN) | Interface language for the pages scraped. Applied as hl=<code>&gl=us in the URL — the only mechanism Google honours. Affects localized text such as publishAt, categories, price and review-context chip labels. publishedAtDate is most reliable with English. Default "en". | "en" |
personalData | No | boolean | When disabled, name, reviewerId, reviewerUrl, reviewerPhotoUrl and reviewUrl are emitted as null in every row. Default true. | true |
proxyConfiguration | No | object (Apify Proxy editor) | Optional override. Reviews are always collected through Apify Residential (US) with automatic IP rotation by default — leave this off. Turn it on to pick a specific Apify Proxy group/country, or supply your own custom proxy URLs, instead. | {"useApifyProxy": false} |
No parameter is marked required in the schema, but the Actor needs at least one non-empty startUrls entry or placeIds entry to have anything to scrape.
Example input
{"startUrls": ["https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/data=!4m6!3m5!1s0x89c259a1ec5f5573:0x2fc6687f46f682d5!8m2!3d40.7372552!4d-73.9882246!16s%2Fg%2F11hbv5rh0_"],"placeIds": [],"maxReviews": 50,"reviewsSort": "newest","reviewsStartDateAbsolute": "","reviewsStartDateRelative": "3 months","language": "en","personalData": true,"proxyConfiguration": {"useApifyProxy": false}}
⬆️ Output
Results are pushed to the run's Apify dataset as typed, normalized JSON — one row per review, with the parent place's metadata repeated on every row. Export as JSON, CSV, Excel, XML or HTML directly from the dataset, or pull it with the API/SDK.
⚠️ publishedAtDate is a derivation, not a scraped timestamp: Google only ever shows a relative age ("3 months ago"), so the ISO date is calculated from that bucket and is accurate to the bucket, not the calendar day.
Example output
{"searchString": "https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/data=!4m6!3m5!1s0x89c259a1ec5f5573:0x2fc6687f46f682d5!8m2!3d40.7372552!4d-73.9882246!16s%2Fg%2F11hbv5rh0_","reviewerId": "112345678901234567890","reviewerUrl": "https://www.google.com/maps/contrib/112345678901234567890","name": "Jamie Ortiz","reviewerNumberOfReviews": 214,"isLocalGuide": true,"reviewerPhotoUrl": "https://lh3.googleusercontent.com/a-/ALV-abc123=s1920","text": "Great steak frites and the service was fast even on a Friday night.","publishAt": "3 months ago","publishedAtDate": "2026-05-01T00:00:00.000Z","likesCount": 4,"reviewId": "ChdDSUhNMG9nS0VJQ0FnSURtcVoyR2dnEAE","reviewUrl": "https://www.google.com/maps/reviews/data=!4m6!14m5!1m4!2m3!1sChdDSUhNMG9nS0VJQ0FnSURtcVoyR2dnEAE!2m1!1s0x0:2fc6687f46f682d5?hl=en","stars": 5,"responseFromOwnerDate": "2 months ago","responseFromOwnerText": "Thank you for the kind words, Jamie — see you again soon!","reviewImageUrls": ["https://lh5.googleusercontent.com/p/AF1QipMexample1"],"reviewContext": {"Service": "Dine in","Meal type": "Dinner","Price per person": "$50–100"},"reviewDetailedRating": {"Food": 5,"Service": 5,"Atmosphere": 4},"originalLanguage": "en","placeId": "ChIJc0VlmqFZwokR1WjmRn9oxi8","location": {"lat": 40.7372552,"lng": -73.9882246},"address": "225 Park Ave S, New York, NY 10003","neighborhood": "Flatiron District","street": "225 Park Ave S","city": "New York","postalCode": "10003","state": "NY","countryCode": "US","categoryName": "French restaurant","categories": ["French restaurant", "Steak house"],"title": "Boucherie Union Square","totalScore": 4.6,"reviewsCount": 3120,"url": "https://www.google.com/maps/search/?api=1&query=Boucherie+Union+Square&query_place_id=ChIJc0VlmqFZwokR1WjmRn9oxi8","price": "$$$","cid": "3438338302510653141","fid": "0x89c259a1ec5f5573:0x2fc6687f46f682d5","imageUrl": "https://lh3.googleusercontent.com/p/AF1QipNexample2=w408-h306-k-no","scrapedAt": "2026-08-16T14:02:11.104Z","language": "en"}
How does it work?
The Actor drives a real Chromium browser (via Playwright) to open the place in Maps' reviews mode, forces the interface language with hl/gl query parameters (the only mechanism Google honours for locale), expands every truncated review, then step-scrolls the virtualized review feed and reads each mounted review card from the DOM. Place-level metadata — address, category, price, coordinates, totals — comes from Google's own /maps/preview/place response, read from fixed, shape-validated positions rather than pattern-matched anywhere in the payload. All traffic runs through Apify Residential proxies with automatic IP rotation on a blocked or empty feed. Only what a signed-out visitor can see is returned, and the output field names stay the same run to run regardless of how Google reshuffles its page layout.
Integrations
Google Maps Reviews Scraper runs on Apify, so it works with everything already built around the Apify platform.
Calling Google Maps Reviews Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("your-username/google-maps-reviews-scraper").call(run_input={"startUrls": ["https://www.google.com/maps/place/Boucherie+Union+Square/..."],"maxReviews": 50,"reviewsSort": "newest",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], item["stars"], item["text"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node (or an HTTP Request node against the Actor's run endpoint) to start a run and pull results into your workflow. In Make, the Apify app's "Run an Actor" module does the same, with a follow-up "Get Dataset Items" module to fetch results. In LangChain, use the ApifyWrapper / ApifyDatasetLoader to run the Actor and load its dataset directly as documents for a retrieval chain.
Is it legal to scrape Google Maps reviews?
Scraping publicly available web data, including Google Maps reviews, is generally legal — this is public information visible to any visitor without logging in. Google Maps Reviews Scraper returns only what's publicly displayed on the place page. Because review rows include reviewer personal data (name, reviewerId, reviewerUrl, reviewerPhotoUrl), GDPR and CCPA govern how you store, process and retain it — you need a lawful basis for holding that data, and you can strip it at the source by setting personalData to false. Consult legal counsel if your use case involves bulk storage of personal data.
Frequently asked questions
What Google Maps review fields does Google Maps Reviews Scraper return?
It returns stars, text, name, publishedAtDate, reviewDetailedRating and 36 more review and place fields — see the data fields section above for the full list.
Does Google Maps Reviews Scraper require a Google account or login?
No. It reads the same public review data any signed-out visitor sees on the Maps place page — no Google account, API key or login is needed to run it.
How many reviews can I extract in one run?
Up to 1,000 reviews per place (maxReviews), across as many places as you list in startUrls and placeIds in a single run.
What happens if a place has no reviews or Google blocks the feed?
If the reviews feed never renders a single card after retries and IP rotation, that place returns 0 rows and the run moves on to the next place rather than failing the whole run — check the run log for which places were skipped.
Can I scrape multiple Google Maps places at once?
Yes. startUrls and placeIds both accept arrays, and the Actor processes up to 4 places concurrently per run.
Does Google Maps Reviews Scraper work with Claude, ChatGPT, and other AI agent tools?
It's callable as an HTTP endpoint via the Apify API from any agent framework that can make a request — start a run, then read the dataset it produces.
How does Google Maps Reviews Scraper compare to the official Google Places API?
The Places API returns a maximum of 5 reviews per place, sorted by relevance only, and requires an API key plus a billing-enabled Google Cloud project (Google Places API (New) REST reference, checked 2026-08-16). This Actor returns up to 1,000 reviews per place with four sort options, owner replies and per-aspect sub-ratings, and needs no Google credentials at all.
Does Google Maps Reviews Scraper return data in a format LLMs can use directly?
Yes. Every run returns typed, normalized JSON with consistent field names — no HTML parsing or CSS selectors required. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Google changes its Maps layout or anti-bot system?
The Actor is maintained against Google's current review-card DOM and metadata payload, and it runs a coverage check on every batch of reviews that flags when key fields (name, stars, publishAt, reviewerUrl, reviewId) drop below expected coverage — an early signal that Google moved something. The output schema itself stays stable regardless of layout changes underneath it.
Can I use Google Maps Reviews Scraper without managing proxies or browser infrastructure?
Yes. It runs a full Chromium browser and Apify Residential proxies with automatic IP rotation on your behalf — you only supply a proxy if you specifically want to use your own.
Which Google Maps review fields work best for AI training data and RAG indexing?
For RAG, index text, reviewContext and responseFromOwnerText — the highest-information free text fields. For structured training data, stars, reviewDetailedRating, isLocalGuide and likesCount return as consistently typed primitives across every row.
Related scrapers
| Scraper Name | What it extracts |
|---|---|
| 2GIS Places Scraper | Places, ratings and business details from 2GIS maps |
| Google Play Scraper | App listings and details from the Google Play Store |
| Airbnb Review Scraper | Guest reviews and ratings from Airbnb listings |
| Facebook Reviews Scraper | Reviews and ratings from Facebook business pages |
| Walmart Reviews Scraper | Product reviews and ratings from Walmart listings |
| Udemy Course Reviews Scraper | Student reviews and ratings from Udemy courses |
Your feedback
Found a bug or a field that's missing or wrong? Let us know through the Actor's Issues tab on Apify or the Console's built-in support chat — reports get triaged against the Actor's coverage checks and layout monitoring described above.