Google Maps Reviews Scraper
Pricing
from $0.25 / 1,000 review scrapeds
Google Maps Reviews Scraper
Extract every Google Maps review from any place URL. Get full text, star ratings, detailed sub-ratings, reviewer profiles, owner responses, images, and ISO dates.
Pricing
from $0.25 / 1,000 review scrapeds
Rating
0.0
(0)
Developer
Thodor
Maintained by CommunityActor stats
1
Bookmarked
7
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
A Google Maps reviews scraper tool. Paste a place URL, get every review back as one flat row: full text, star rating, sub-ratings, reviewer profile, owner response, photos, and ISO dates, exported to CSV, Excel, or JSON.
Google's official Places API returns at most 5 reviews per place, with no way to page further. This actor pulls the complete review history, thousands where they exist, and attaches the place to every row, so a run over ten locations stays one flat dataset. Looking to discover businesses rather than scrape a place you already know? That's the Google Maps Scraper; this one does depth on a known place.
๐ How to export Google Maps reviews to a spreadsheet
- Open google.com/maps, click the business, and copy the URL from the address bar. The long messy one full of coordinates is the right one.
- Paste your URLs into Place URLs, one per line.
- Click Start.
- Open the Output tab and click Export for CSV, Excel, JSON, or HTML.
๐ So what do you get?
| โญ Stars: 1 to 5, every review | ๐ Full review text | ๐ฝ๏ธ Sub-ratings: Food, Service, Atmosphere |
| ๐ง Reviewer profile: name, Local Guide, review count | ๐ฌ Owner response: text and date | ๐ ISO dates: sortable, not "2 months ago" |
| ๐ผ๏ธ Review photos | ๐ Helpful votes | ๐ Stable review ID: dedupe across runs |
โ๏ธ Compared to the Google Places API
| Google Places API | This actor | |
|---|---|---|
| ๐ Reviews per place | โ 5, no pagination | โ Full history, thousands |
| ๐ฐ Price | โ Bundled into per-request SKUs | โ $0.25-0.40 per 1,000 reviews |
| ๐ Access | โ Google Cloud project, API key, billing account | โ Register on Apify, $5 free monthly credit โ 12,000 reviews |
| ๐ค Output | โ JSON only | โ JSON, CSV, Excel, Google Sheets |
๐ฏ Three things people run this for
| How | |
|---|---|
| ๐จ Negative-review alerts | Daily run on a Schedule with a webhook to Slack or n8n. Keep rows where stars is 2 or less and response_from_owner_text is empty: the unanswered negatives, surfaced the morning they land |
| ๐ง Sentiment analysis at scale | Feed the text column to an LLM, or just paste it into ChatGPT with "top 3 complaints, top 3 things people love". Bucket by published_at_date monthly: sentiment usually drops before the star average moves |
| ๐ฅ Competitor benchmarking | Your locations plus their three nearest competitors in one run. Pivot on place_name for average stars, low-star share, and owner response rate; the sub-ratings show they beat you on Service, not just "overall" |
๐ฅ Input
{"start_urls": [{ "url": "https://www.google.com/maps/place/La+Donna+Re's/...!1s0x89c25d8a10261a7d:0x148b4752f2b99ae2..." }],"max_reviews": 100}
start_urls: Google Maps place URLs from the browser address bar, one per place. Short links (goo.gl/maps,maps.app.goo.gl) don't carry the place ID and won't work; open them in a browser firstmax_reviews: cap per place, the form prefills100. It is also the cost cap
๐จ A recent batch, for monitoring
Enough for "what happened since last run", cheap to schedule daily.
{"start_urls": [{"url": "https://www.google.com/maps/place/..."}], "max_reviews": 30}
๐ณ๏ธ The full history
{"start_urls": [{"url": "https://www.google.com/maps/place/..."}], "max_reviews": 5000}
๐ค Output
One row per review. Results stream into the dataset while the run is going. Reviews where the customer left only a rating come back with text: null, a meaningful share on high-volume listings; filter them out when you only want written feedback.

{"place_name": "La Donna Re's","place_id": "0x89c25d8a10261a7d:0x148b4752f2b99ae2","name": "Isatta Bassie","reviewer_number_of_reviews": 5,"is_local_guide": false,"published_at_date": "2026-01-11T02:01:27Z","stars": 5,"text": "10/10! Super friendly staff and everything was delicious...","review_detailed_rating": [{"category": "Food", "rating": 5},{"category": "Service", "rating": 5},{"category": "Atmosphere", "rating": 5}],"likes_count": 1,"response_from_owner_text": null,"response_from_owner_date": null,"review_image_urls": ["https://lh3.googleusercontent.com/geougc-cs/ABOP9..."]// HIDDEN: place_url, review_id, review_url, reviewer_id, reviewer_url,// reviewer_photo_url, publish_at, review_origin, review_context}
โ ๏ธ Reviews are not returned newest first. Google serves its default "most relevant" mix, biased toward longer, photo-bearing, and recent reviews, and offers no sort switch. Sort on
published_at_dateafter the run for chronology, and know thatmax_reviewstakes Google's slice, not the most recent N.
Fields
| Field | What it is |
|---|---|
place_name, place_id, place_url | The place, on every row, so multi-place runs stay one flat dataset |
review_id | Stable per review. The dedupe key across runs |
stars | 1 to 5 |
text | The written review. null when the reviewer only left stars |
review_detailed_rating | Sub-ratings like Food / Service / Atmosphere / Rooms. Empty for categories without them (parks, shops) |
review_image_urls | Photos attached to the review |
likes_count | How many users marked the review helpful |
published_at_date | ISO 8601 UTC. Sort and chart on this, not on publish_at ("2 months ago"), which is cosmetic |
name, reviewer_id, reviewer_url, reviewer_photo_url | Who wrote it |
reviewer_number_of_reviews, is_local_guide | Credibility signals |
response_from_owner_text, response_from_owner_date | The business's reply, null until one is posted. Empty + low stars = the unanswered-negatives list |
review_context | Language code of the review (en, nl, es). text_translated is reserved and currently always null; translate downstream |
โ๏ธ Use it as a Google Maps reviews API
Every run is an HTTP endpoint: POST the same JSON as the form and the reviews come back in the response body.
Python
import requestsresp = requests.post("https://api.apify.com/v2/acts/thodor~google-maps-reviews-scraper/run-sync-get-dataset-items",params={"token": "YOUR_APIFY_TOKEN"},json={"start_urls": [{"url": "https://www.google.com/maps/place/...!1s0x...:0x..."}], "max_reviews": 200},)unanswered = [r for r in resp.json() if r["stars"] <= 2 and not r["response_from_owner_text"]]for r in unanswered:print(r["place_name"], r["stars"], (r["text"] or "")[:80])
Node.js
import axios from "axios";const { data } = await axios.post("https://api.apify.com/v2/acts/thodor~google-maps-reviews-scraper/run-sync-get-dataset-items",{ start_urls: [{ url: "https://www.google.com/maps/place/...!1s0x...:0x..." }], max_reviews: 200 },{ params: { token: process.env.APIFY_TOKEN } });console.log(data.length, data[0].place_name, data[0].stars);
curl
curl -X POST "https://api.apify.com/v2/acts/thodor~google-maps-reviews-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"start_urls":[{"url":"https://www.google.com/maps/place/...!1s0x...:0x..."}],"max_reviews":100}'
Swap run-sync-get-dataset-items for runs to fire async and collect results by webhook; deep histories can outlive the 5-minute sync window. The apify-client SDK works too, in Python and JavaScript, and the n8n, Make, Zapier, and Google Sheets integrations take the same input.
๐ก Tip: no need to write the JSON by hand. Fill in the form on the Input tab, switch the editor from Form to JSON, and copy the result into your code.
๐ฐ How much does it cost to scrape Google Maps reviews?
Billing is per review delivered to your dataset: $0.40 per 1,000 on the free plan, down to $0.25 per 1,000 on higher plans, plus a run-start fee of fractions of a cent. max_reviews doubles as the cost cap, and a month where you scrape nothing costs nothing.
โ FAQ
Can I scrape Google Maps reviews for free? Yes. Registering on Apify comes with $5 of free platform credit every month, no credit card needed, which covers roughly 12,000 reviews.
How many reviews can one place return? Everything Google serves, which on very high-volume listings tops out somewhere in the low tens of thousands. That ceiling is Google's; no scraper reaches past it.
What if a place has no reviews? The run finishes that place with zero rows and moves to the next URL. You're only billed for reviews delivered.
Is scraping Google Maps reviews legal? Reviews are publicly displayed and reading them is generally permitted. Reviewer fields (name, photo, profile URL) are personal data, so GDPR and CCPA apply to how you store and use them, and you remain responsible under Google's terms.
๐ Support
Something not working, or a field missing? Message me in the Issues tab with the place URL and I'll look into it quickly. I'm a solo dev, so don't hesitate.
Prospecting instead of monitoring? Discover businesses by search and city with the Google Maps Scraper, then feed the place URLs in here for the deep review history.
- Thodor