Google Maps Reviews Scraper avatar

Google Maps Reviews Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Google Maps Reviews Scraper

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

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

252

Total users

0

Monthly active users

10 days ago

Last modified

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 CategoryPublicly 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 reviewGoogle account login
Managing a business's Google Business ProfileOwner 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 NameDescription
reviewIdGoogle's internal ID for the review card
reviewerIdNumeric contributor ID parsed from the reviewer's profile URL
nameReviewer's display name
reviewerUrlLink to the reviewer's Google Maps contributions profile
reviewerPhotoUrlFull-resolution reviewer avatar URL
reviewerNumberOfReviewsTotal review count shown in the reviewer's byline
isLocalGuideWhether the reviewer is a Google Local Guide
textReview body text
originalLanguageLanguage code of the review text, read from the DOM
publishAtRaw relative age string as shown by Google (e.g. "3 months ago")
publishedAtDateISO 8601 timestamp derived from publishAt
starsReview rating, 1–5
likesCountNumber of "helpful" likes on the review
reviewImageUrlsArray of photo URLs attached to the review
reviewContextObject of context chips, e.g. {"Service": "Dine in", "Meal type": "Dinner"}
reviewDetailedRatingObject of per-aspect sub-ratings, e.g. {"Food": 5, "Service": 4}
responseFromOwnerTextBusiness owner's reply text, if any
responseFromOwnerDateRelative age string of the owner's reply
reviewUrlDeep link to the individual review
searchStringThe original input value (URL or place_id:...) this row came from

📍 Place fields (repeated on every review row)

Field NameDescription
titlePlace name
placeIdGoogle Place ID
cidNumeric CID derived from the place's feature ID
fidRaw Google feature ID (0x...:0x...)
totalScorePlace's overall star rating
reviewsCountPlace's total review count (all reviews Google reports, not just the rows scraped)
addressFull formatted address
street, city, neighborhood, state, postalCode, countryCodeParsed address components
categoryNamePrimary business category
categoriesArray of all listed categories
pricePrice range indicator (e.g. $$)
imageUrlPlace's primary photo URL
location{lat, lng} geo-coordinates
urlGoogle Maps search URL built from the place title and Place ID
languageUI language actually served by Google for this run, read from the rendered page
scrapedAtISO 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).

FeatureGoogle Places API (Place Details)Google Maps Reviews Scraper
Reviews per placeMaximum of 5, sorted by relevanceUp to 1,000 (maxReviews)
Review sort controlFixed at relevancenewest, mostRelevant, highestRanking, lowestRanking
Owner repliesNot returnedReturned (responseFromOwnerText)
Per-aspect sub-ratings / context chipsNot returnedReturned when Google renders them
CredentialsAPI key + billing-enabled Cloud projectNone — Maps URL or Place ID only
Billing tierEnterprise + 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.

  1. Open Google Maps Reviews Scraper on the Apify Store and click Try for free (or Start, if you've already added it).
  2. Provide at least one place in startUrls (a Maps place URL) or placeIds (a Google Place ID) — the run exits with no output if neither is supplied.
  3. Set maxReviews, reviewsSort and, if you only want recent feedback, reviewsStartDateAbsolute or reviewsStartDateRelative.
  4. Click Start to launch the run.
  5. 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, totalScore and reviewsCount trends over time to prove review-growth impact to clients.
  • 📊 Reputation-management analysts use responseFromOwnerText and responseFromOwnerDate to 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 dropping totalScore.
  • 🔬 Market researchers use reviewContext (dine-in vs. takeout, meal type) to segment feedback by visit type across competitor locations.
  • 🤖 AI engineers feed text, reviewContext and reviewDetailedRating into 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

ParameterRequiredTypeDescriptionExample Value
startUrlsNoarrayOne 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_"]
placeIdsNoarrayEach Place ID (e.g. ChIJ...) is converted into a Maps URL and scraped together with startUrls.["ChIJnQ0EDVBZwokRPWY5rp2b1kY"]
maxReviewsNointegerMaximum 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
reviewsSortNostring (enum: newest, mostRelevant, highestRanking, lowestRanking)Sort exactly like Google Maps: newest, most relevant, highest rating, or lowest rating. Default newest."newest"
reviewsStartDateAbsoluteNostring (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"
reviewsStartDateRelativeNostring (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"
languageNostring (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"
personalDataNobooleanWhen disabled, name, reviewerId, reviewerUrl, reviewerPhotoUrl and reviewUrl are emitted as null in every row. Default true.true
proxyConfigurationNoobject (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 ApifyClient
client = 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.

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.

Scraper NameWhat it extracts
2GIS Places ScraperPlaces, ratings and business details from 2GIS maps
Google Play ScraperApp listings and details from the Google Play Store
Airbnb Review ScraperGuest reviews and ratings from Airbnb listings
Facebook Reviews ScraperReviews and ratings from Facebook business pages
Walmart Reviews ScraperProduct reviews and ratings from Walmart listings
Udemy Course Reviews ScraperStudent 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.