Google Maps Reviews Scraper avatar

Google Maps Reviews Scraper

Pricing

from $7.00 / 1,000 reviews

Go to Apify Store
Google Maps Reviews Scraper

Google Maps Reviews Scraper

Scrape all reviews for any Google Maps business: reviewer, star rating, text, dates, owner replies, photos and the place's overall rating.

Pricing

from $7.00 / 1,000 reviews

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Google Maps Reviews Scraper

Google Maps Reviews Scraper

Here is one real result, with every field the actor returns:

{
"placeName": "Katz's Delicatessen",
"placeUrl": "https://maps.google.com/?cid=3545819340560108778",
"placeRating": 4.5,
"placeReviewCount": 54573,
"ratingDistribution": {
"oneStar": 1747,
"twoStar": 1389,
"threeStar": 3284,
"fourStar": 8692,
"fiveStar": 39461
},
"featureId": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
"reviewerName": "Weston At The Table",
"rating": 5,
"reviewText": "I've been to Katz's several times over the years, and every time I bring someone new, I get to experience it all over again through their eyes. ... Not because it is famous, but because it earns that fame every single day. Five stars.",
"relativeDate": "a month ago",
"publishedAt": "2026-06-21T17:15:11.623Z",
"reviewLanguage": "en",
"reviewerAvatarUrl": "https://lh3.googleusercontent.com/a-/ALV-UjVbcybwlao5Yo1luWz0bAznFm5YDcqY4aSG9k2G0G56zC3Hp0k=s120-c-rp-mo-ba12-br100",
"reviewerProfileUrl": "https://www.google.com/maps/contrib/105557893517551139063?hl=en-US",
"reviewerReviewCount": 73,
"isLocalGuide": true,
"likesCount": 0,
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2tSc2QwdFBjVzVWVW5ad2VFeHRSVFJTVkVRMkxVRRAB",
"ownerResponseText": "This review means a lot to us - thanks for taking the time to write it up. We're proud to be part of NYC's history, and even prouder to still be hand-carving pastrami the same way after all these years!",
"ownerResponseDate": "a month ago",
"reviewPhotos": [
"https://lh3.googleusercontent.com/grass-cs/ACvplmMe-P8JCpFMbIp9EObRyjBiHfOfvYtRwFyP8jiko1MyR7LEe1Ty...=k-no",
"https://lh3.googleusercontent.com/grass-cs/ACvplmOkaN5p_MrO_cYvwJ_awlisPAVxfX6MDOth7dKXdiCivow2AH9A...=k-no"
],
"observedAt": "2026-08-10T14:32:32.368Z",
"error": null
}

reviewText and reviewPhotos above are trimmed for readability (the review is a long multi-paragraph text and the record has 7 photos). Every value shown is the real, unedited data from the run.

The most complete Google Maps reviews scraper available. It returns every field a review exposes (rating, full text, reviewer profile, local-guide status, likes and review ID), plus place context and the full rating distribution, owner replies and review photos, and optional AI add-ons for sentiment, a one-line summary and topics, so you can analyze reputation without extra parsing.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor resolves each place you provide (by Google Maps URL, share link, place ID, or a name plus optional location), then collects reviews in the sort order you choose and writes one normalized record per review to the run's dataset. Each record carries place context (name, rating, review count and the full star distribution) alongside the review itself. With withDetails on, each review also includes the business owner's response and any photos attached to the review. Missing source values are returned as null, never invented.

Three optional AI add-ons run only on paid Apify plans and only charge when they produce output: aiSentiment classifies each review, aiSummary writes a one-sentence summary, and aiTopics extracts discussed aspects and a broad category.

Quickstart

Open the actor, paste this into the input, and press Run. It returns the 10 most relevant reviews for Katz's Delicatessen with owner replies and photos.

{
"placeUrls": ["https://www.google.com/maps/place/Katz's+Delicatessen/@40.722237,-73.9884,17z"],
"maxReviews": 10,
"withDetails": true,
"reviewsSort": "mostRelevant",
"language": "en"
}

No URL handy? Set searchQuery to a business name (and optional location) and the top matching place is used.

Input reference

FieldTypeRequiredDefaultDescription
placeUrlsstring[]no(Katz's example)One or more Google Maps place URLs, share links, or place IDs (for example ChIJ...). Reviews are collected for each place.
searchQuerystringno(empty)Business name to search when you do not have a URL, for example Blue Bottle Coffee. The top matching place is used.
locationstringno(empty)City or area to disambiguate the search query, for example San Francisco.
maxReviewsintegerno10Maximum reviews to collect per place.
withDetailsbooleannotrueWhen on, each review also includes the owner's response and any attached photos.
reviewsSortenumnomostRelevantOrder in which reviews are collected. One of mostRelevant, newest, highestRating, lowestRating.
languagestringnoenTwo-letter language code for review dates and owner replies, for example en, es, pt.
withSentimentbooleannofalsePaid add-on. Classify each review as positive, negative or neutral with a confidence score. Requires a paid plan.
withSummarybooleannofalsePaid add-on. Generate a one-sentence AI summary of each review. Requires a paid plan.
withTopicsbooleannofalsePaid add-on. Extract discussed aspects and keywords plus a broad category. Requires a paid plan.

Output reference

One dataset item per review. Types: string, number, boolean, string[], object, or null when the source value is absent.

FieldTypeDescription
placeNamestringName of the place the review belongs to.
placeUrlstringCanonical Google Maps link to the place.
placeRatingnumberOverall average rating of the place.
placeReviewCountnumberTotal number of reviews for the place.
ratingDistributionobjectCount of one, two, three, four and five star reviews.
featureIdstringGoogle feature ID of the place.
reviewerNamestringDisplay name of the reviewer.
ratingnumberStar rating this reviewer gave, 1 to 5.
reviewTextstringFull text of the review, or null if none.
relativeDatestringHuman-relative date as shown by Google, for example a month ago.
publishedAtstringISO 8601 timestamp derived from the relative date.
reviewLanguagestringDetected language code of the review.
reviewerAvatarUrlstringReviewer profile photo URL.
reviewerProfileUrlstringLink to the reviewer's Google Maps contributor profile.
reviewerReviewCountnumberTotal reviews written by this reviewer.
isLocalGuidebooleantrue if the reviewer is a Google Local Guide.
likesCountnumberNumber of likes on the review.
reviewIdstringStable unique ID of the review.
ownerResponseTextstringBusiness owner's reply text (with withDetails), or null.
ownerResponseDatestringRelative date of the owner's reply, or null.
reviewPhotosstring[]URLs of photos attached to the review (with withDetails), or null.
aiSentimentstringAI sentiment positive, negative or neutral (add-on), else absent.
aiSentimentScorenumberAI sentiment score between -1 and 1 (add-on), else absent.
aiSummarystringAI one-sentence summary of the review (add-on), else absent.
aiTopicsstring[]AI-extracted aspects and keywords (add-on), else absent.
aiCategorystringAI broad category for the review (add-on), else absent.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringnull on success. On a failed run, a single item with a populated error field is written instead.

Example output record

Real record from a live run (input {"placeUrls":["https://www.google.com/maps/place/Katz's+Delicatessen/..."],"maxReviews":10,"withDetails":true}):

{
"placeName": "Katz's Delicatessen",
"placeRating": 4.5,
"placeReviewCount": 54573,
"ratingDistribution": {"oneStar": 1747, "twoStar": 1389, "threeStar": 3284, "fourStar": 8692, "fiveStar": 39461},
"reviewerName": "Weston At The Table",
"rating": 5,
"reviewText": "I've been to Katz's several times over the years ... it earns that fame every single day. Five stars.",
"relativeDate": "a month ago",
"publishedAt": "2026-06-21T17:15:11.623Z",
"reviewLanguage": "en",
"reviewerReviewCount": 73,
"isLocalGuide": true,
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2tSc2QwdFBjVzVWVW5ad2VFeHRSVFJTVkVRMkxVRRAB",
"ownerResponseText": "This review means a lot to us - thanks for taking the time to write it up.",
"ownerResponseDate": "a month ago",
"reviewPhotos": ["https://lh3.googleusercontent.com/grass-cs/ACvplmMe...=k-no"],
"observedAt": "2026-08-10T14:32:32.368Z",
"error": null
}

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~google-maps-reviews-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"searchQuery":"Blue Bottle Coffee","location":"San Francisco","maxReviews":25,"reviewsSort":"newest"}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~google-maps-reviews-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"placeUrls":["https://maps.google.com/?cid=3545819340560108778"],"maxReviews":100,"withDetails":true}'

Apify CLI:

apify call scrapers_lat/google-maps-reviews-scraper \
--input '{"searchQuery":"Katz'\''s Delicatessen","maxReviews":50}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per review returned (result event). See the pricing tab for the current per-result price.
  • Add-ons. Detail enrichment (owner reply and photos) and the three AI add-ons are priced separately and charge only when they produce output.
  • No charge on failure. If a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 reviews per place per run. Upgrade for higher maxReviews.

FAQ and troubleshooting

A run returned 0 reviews. Why? The place could not be resolved or has no reviews. Check the URL or place ID, or use searchQuery plus location. Zero-result runs are not charged.

How do I get the newest reviews only? Set reviewsSort to newest. You can also use highestRating or lowestRating.

Why are owner replies or photos missing? Either withDetails was off, or the review has no owner reply or photos. With withDetails on, they are included when present; otherwise they stay null.

Why did the AI fields not appear? The AI add-ons require a paid Apify plan and are off by default. Enable withSentiment, withSummary or withTopics on a paid plan. They charge only when output is produced.

Can I scrape several places at once? Yes. Pass multiple entries in placeUrls. Reviews are collected for each place up to maxReviews per place.

Is this an official Google tool? No. This actor is independent and not affiliated with Google. It reads only publicly visible Google Maps reviews.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with Google. Accesses only publicly available Google Maps reviews.