Google Maps Reviews Scraper avatar

Google Maps Reviews Scraper

Pricing

from $0.25 / 1,000 review scrapeds

Go to Apify Store
Google Maps Reviews Scraper

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

Thodor

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

1

Monthly active users

a day ago

Last modified

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

  1. 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.
  2. Paste your URLs into Place URLs, one per line.
  3. Click Start.
  4. 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 APIThis 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 alertsDaily 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 scaleFeed 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 benchmarkingYour 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 first
  • max_reviews: cap per place, the form prefills 100. 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.

Apify dataset preview showing scraped Google Maps reviews with reviewer, stars, review text, date, Local Guide status and likes

{
"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_date after the run for chronology, and know that max_reviews takes Google's slice, not the most recent N.

Fields

FieldWhat it is
place_name, place_id, place_urlThe place, on every row, so multi-place runs stay one flat dataset
review_idStable per review. The dedupe key across runs
stars1 to 5
textThe written review. null when the reviewer only left stars
review_detailed_ratingSub-ratings like Food / Service / Atmosphere / Rooms. Empty for categories without them (parks, shops)
review_image_urlsPhotos attached to the review
likes_countHow many users marked the review helpful
published_at_dateISO 8601 UTC. Sort and chart on this, not on publish_at ("2 months ago"), which is cosmetic
name, reviewer_id, reviewer_url, reviewer_photo_urlWho wrote it
reviewer_number_of_reviews, is_local_guideCredibility signals
response_from_owner_text, response_from_owner_dateThe business's reply, null until one is posted. Empty + low stars = the unanswered-negatives list
review_contextLanguage 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 requests
resp = 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