Google Maps Reviews Scraper - Most Comprehensive
Pricing
from $0.04 / 1,000 reviews
Google Maps Reviews Scraper - Most Comprehensive
🔥 ~$0.04/1K reviews 🔥 The most comprehensive Google Maps review scraper. Extract reviews with ratings, text, translations, photos, author details, owner responses, structured dining/hotel/attraction data, and 65+ place fields. Supports keyword filtering, sorting.
Pricing
from $0.04 / 1,000 reviews
Rating
4.9
(11)
Developer
Kai
Maintained by CommunityActor stats
28
Bookmarked
883
Total users
253
Monthly active users
10 hours
Issues response
5 hours ago
Last modified
Categories
Share
Google Maps Reviews Scraper
Collect Google Maps reviews from canonical place or search URLs and from Place IDs. Each review can include its rating, text, language, dates, author, photos, owner response, structured details, and place reference.
What each run saves
| Storage | Record | Use it for |
|---|---|---|
| Default Dataset | One item per saved review | Review text, rating, language, dates, author data, media, structured details, and owner responses |
| Default key-value store | One place-* record per resolved place | Full place identity, address, contact data, ratings, hours, amenities, popular times, and related places |
Each review repeats only a small place reference. Use the place-* record when
you need the full business or location context. You can mix supported Maps URLs
and bare Place IDs in one run.
Something not working? Please report it. We monitor the Actor, but Google occasionally changes its Maps API or page structure and some cases slip past us. These fixes are usually quick, please report helps us restore it fast.
Quick start
Enter one or more bare Place IDs or supported Google Maps URLs:
{"urls": ["ChIJs0ZTJXyPGGAR3nco_Lv_q1Q"]}
The default run saves up to 20 reviews per place and sorts them by newest activity. You can mix supported URLs and Place IDs in one run.
More or all available reviews
Set a larger per-place limit:
{"urls": ["ChIJs0ZTJXyPGGAR3nco_Lv_q1Q"],"maxReviews": 100}
Set maxReviews to 0 to collect all reviews available to the run. The Actor follows the continuation feed until it ends or repeats.
Monitor several places
The limit and sort order apply to each place. Dataset rows from different places can be mixed.
{"urls": ["ChIJN1t_tDeuEmsRUsoyG83frY4", "ChIJs0ZTJXyPGGAR3nco_Lv_q1Q"],"maxReviews": 100,"sort": "newest"}
Sort modes
| Value | Result order |
|---|---|
relevant | Most relevant first |
newest | Latest review activity first. An edit time is used when present, otherwise the publication time. |
highest | Highest rating first |
lowest | Lowest rating first |
newest is the default. Date filters always use the publication timestamp, regardless of the selected sort mode.
Keyword and localisation
{"urls": ["ChIJs0ZTJXyPGGAR3nco_Lv_q1Q"],"searchQuery": "service","sort": "relevant","language": "ja","region": "JP"}
Filter by date range
{"urls": ["ChIJs0ZTJXyPGGAR3nco_Lv_q1Q"],"reviewsNewerThan": "2026-01-01","reviewsOlderThan": "2026-06-30","sort": "newest","maxReviews": 0}
Date values use standard date-time parsing. A date-only boundary resolves to 00:00:00.000Z; date-times can include Z or a UTC offset. The Actor preserves the supplied order when both boundaries are present, so an inverted range normally produces no matching reviews.
Input
urls is the only required field. Give one or more canonical google.com/maps/place or google.com/maps/search URLs, equivalent maps.google.com URLs, URLs with place_id=... or q=place_id:..., or bare Place IDs. Short share links are not accepted. Unsupported entries are skipped. The run must have at least one usable entry.
The complete examples below show filters, localisation, and several supported target forms.
Input reference
| Parameter | Type | Default | Effect |
|---|---|---|---|
urls | string[] | required | Google Maps targets. The Actor keeps the input order and accepts a mix of supported forms. |
maxReviews | integer, 0 or more | 20 | Maximum saved reviews for each place. 0 removes the per-place limit. |
sort | relevant, newest, highest, or lowest | newest | Selects the Google review feed. Use newest when completeness is more important than ranking. |
searchQuery | string | none | Keeps reviews that match a keyword or phrase. |
reviewsNewerThan | date string | none | Keeps reviews on or after the parsed boundary. |
reviewsOlderThan | date string | none | Keeps reviews on or before the parsed boundary. |
language | string | en | Requested Google language code. |
region | string | US | Requested country or region code. |
proxyConfiguration | object | {"useApifyProxy":true} | Optional connection settings for the run. |
A date such as 2026-07-01 resolves to 2026-07-01T00:00:00.000Z. If the newer boundary is after the older boundary, the Actor normally returns no matching reviews. It does not reverse the values.
language and region accept values outside the examples; the Actor does not restrict them to a built-in list. Unknown top-level fields are ignored.
Output
The Actor writes two output types:
- The default Dataset contains one review record for each saved review.
- The default key-value store contains one
place-*record for each resolved place. The key is normallyplace-{placeId}. The record includes the run's dynamicratingBreakdownmap.
Long arrays below keep one item. Square brackets mark values removed from the documentation, not values returned by the Actor. The selected examples are not saved Dataset or key-value-store records.
Review field groups
| Group | Root fields |
|---|---|
| Place | place |
| Identity and dates | reviewId, url, publishedAt, lastEditedAt, relativeDate |
| Text, language, and rating | text, textTranslated, language, originalLanguage, translatedLanguage, originalLanguageName, translatedLanguageName, rating, reviewOrigin |
| Visit and review details | visitedIn, visitedYear, visitedMonth, details |
| Author and media | author, photos |
| Response and run data | ownerResponse, engagement, meta |
Review field types
| JSON type | Root fields |
|---|---|
object or null | place, ownerResponse |
| string | reviewId |
string or null | url, publishedAt, lastEditedAt, relativeDate, text, textTranslated, language, originalLanguage, translatedLanguage, reviewOrigin, originalLanguageName, translatedLanguageName, visitedIn |
| number | rating |
number or null | visitedYear, visitedMonth |
| object | author, details, engagement, meta |
| object[] | photos |
| Object | Field types |
|---|---|
place | name: string; placeId, address, googleMapsUri: string or null |
author | name, id: string; url, avatarUrl, profileUrl, badgeLabel: string or null; reviewCount, photoCount, localGuideLevel, contributionCount: number or null; isLocalGuide, hasLocalGuideBadge, hasGuideProfile: boolean |
photos[] | id, aiDescription, uploadedAt: string or null; url: string; width, height, latitude, longitude: number or null |
ownerResponse | text, textTranslated, language, originalLanguage, translatedLanguage, publishedAt, lastEditedAt, relativeDate: string or null |
engagement | likes: number |
meta | scrapedAt: string |
details is an open map. Google can add keys, and each value can be a string, number, or string array.
Selected review fields
This redacted field example from The Ritz London contains an author, one review photo, hotel detail keys, and an owner response. It is not a saved Dataset item.
In this record, textTranslated, originalLanguage, translatedLanguage,
originalLanguageName, translatedLanguageName,
ownerResponse.textTranslated, ownerResponse.originalLanguage,
ownerResponse.translatedLanguage, and ownerResponse.lastEditedAt are
null.
Place field groups
| Group | Root fields |
|---|---|
| Identity | name, hexId, placeId, cid, knowledgeGraphId, businessType, businessStatus, isClaimed, isChain |
| Address and position | address, shortAddress, addressComponents, area, neighborhood, plusCode, latitude, longitude, entranceLatitude, entranceLongitude, timezone, countryCode, containingPlaceId, relatedPlaces, subDestinations |
| Contact and links | phone, phoneIntl, website, websiteDomain, googleMapsUri, reviewsLink, menuLink, reservationLinks |
| Description and type | description, subtitle, ownerDescription, thirdPartyDescription, categories, placeTypes, placeAttributes, localName, localLanguage |
| Owner and media | ownerName, ownerId, ownerAvatarUrl, profileImageUrl, photoTier, photos, coverPhotoUrl, streetViewUrl, streetViewPanoId, featuredReviews |
| Rating and price | rating, totalReviewCount, priceRange, priceLabel, reviewsSummary, reviewHighlights, reviewsPerRating, reviewTopics, ratingBreakdown, hotelStars |
| Hours and amenities | businessHours, hoursStatus, popularTimes, typicalTimeSpent, amenities |
Place field types
| JSON type | Root fields |
|---|---|
| string | name, hexId |
string or null | placeId, address, shortAddress, phone, phoneIntl, website, websiteDomain, description, timezone, countryCode, googleMapsUri, reviewsLink, menuLink, subtitle, ownerDescription, ownerName, ownerAvatarUrl, thirdPartyDescription, businessType, businessStatus, hoursStatus, ownerId, profileImageUrl, localName, localLanguage, knowledgeGraphId, area, neighborhood, plusCode, priceRange, priceLabel, reviewsSummary, coverPhotoUrl, streetViewUrl, streetViewPanoId, typicalTimeSpent, cid, containingPlaceId |
number or null | rating, totalReviewCount, latitude, longitude, photoTier, hotelStars, entranceLatitude, entranceLongitude |
| boolean | isClaimed |
boolean or null | isChain |
| string[] | categories, reservationLinks, reviewHighlights, placeAttributes, placeTypes, relatedPlaces |
number[] or null | reviewsPerRating |
| object | addressComponents, ratingBreakdown |
| object[] | reviewTopics, photos, featuredReviews, amenities, subDestinations |
object[] or null | businessHours |
JSON value[] or null | popularTimes |
| Object | Field types |
|---|---|
addressComponents | neighborhood, street, city, postalCode, state, countryCode, floor: string or null |
businessHours[] | day, hours: string |
reviewTopics[] | keyword: string; mentionCount: number |
photos[] | url: string; width, height: number; caption: string or null |
featuredReviews[] | authorName, text: string; authorAvatarUrl, publishedDate: string or null; rating: number |
amenities[] | category, name: string; available: boolean |
subDestinations[] | name: string; dataId, knowledgeGraphId: string or null; categories: string[]; latitude, longitude, rating, reviewCount: number or null |
ratingBreakdown | object with keys 1 through 5 and numeric counts |
Selected place fields
This redacted field example uses values from the Eiffel Tower place-* record.
It is not the saved key-value-store record.
The Eiffel Tower record includes the businessHours[] child shape. These smaller examples show optional fields that are empty in that record:
[{"name": "Sensō-ji","addressComponents": {"neighborhood": "2 Chome Asakusa","state": "Tokyo"},"reviewHighlights": ["[review text removed]"],"placeTypes": ["buddhist_temple"]},{"name": "The Capital Grille","phone": "(212) 548-8338","phoneIntl": "+12125488338","reservationLinks": ["[reservation URL removed]"],"reviewsSummary": "Diners like this restaurant's delicious steaks, including the bone-in filet and dry-aged options, along with popular sides like creamed spinach and truffle mac and cheese. They also highlight the elegant and upscale atmosphere, which is suitable for business meals and special occasions. Guests mention the staff provides attentive, professional, and friendly service, making for a memorable dining experience."},{"name": "The Ritz London","hotelStars": 5},{"name": "Times Square","neighborhood": "Manhattan","containingPlaceId": "0x89c258f52ad45a79:0x8131f549e8af76f4"},{"name": "Starbucks Coffee Company","isChain": true,"ratingBreakdown": {"1": 1,"2": 1,"3": 1,"4": 2,"5": 5}}]
In this place record, addressComponents.floor, menuLink, ownerName,
ownerAvatarUrl, thirdPartyDescription, priceRange, priceLabel,
reviewsPerRating, reviewTopics, photos, coverPhotoUrl, streetViewUrl,
streetViewPanoId, featuredReviews, placeAttributes, popularTimes, and
typicalTimeSpent are null or empty.
ratingBreakdown is a map whose keys can be 1 through 5. Child keys in
popularTimes can change.
Use hasLocalGuideBadge for the author badge. hasGuideProfile has the same
value and remains available for older integrations.
Review and place availability
Open the full place data
Open the default key-value store and select place-{placeId}, or place-{hexId} when no Place ID is available. Each review row repeats only name, placeId, address, and googleMapsUri.
Request localised reviews
Set language and region to request localised results. Original and
translated text and language metadata are included when available.
When review and place records differ
A place can have no available reviews, or no review can match your keyword and date filters. When place metadata is available, the Actor still saves its place-* record.
A review can use place: null when the review is available but its full place
record is not. One unavailable target does not remove rows already saved for
other targets. The Actor continues with later targets and can finish the run
successfully. An invalid input, a startup error, or an error while saving review
or place data stops the run.
Input and filtering constraints
maxReviewsapplies to each place, not to the full input.- Short share links such as
maps.app.goo.glare not accepted. Use the expanded URL or a Place ID. - Date filters use the review publication time. Reviews without one are excluded.
- Invalid date text causes the run to stop before collection.
- Optional fields and available reviews can differ by language, region, place, and time.
ratingBreakdowndescribes reviews saved in this run. It is not the place's lifetime rating distribution.