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
(13)
Developer
Kai
Maintained by CommunityActor stats
33
Bookmarked
1.8K
Total users
328
Monthly active users
4.3 hours
Issues response
7 days 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 Google Maps and some cases slip past us. These fixes are usually quick, please report helps us restore it fast.
📝 Use the latest build to get new fixes when Google Maps changes. If you use a pinned version, update your build setting to use the latest build.
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 continues until Google shows no more new reviews.
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 | Sets the review order. 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 | Country or region code. Google reviews do not change with it. |
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, detailCodes |
| 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, detailCodes, 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; video: object or null |
photos[].video | url: string; width, height, durationMs: 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.
detailCodes holds the same answers as details, keyed by Google's question code, such as HOTELS_ASPECT_ROOMS. A choice answer is Google's answer code, such as E:HOTELS_TRIP_TYPE_VACATION. Ratings and free text keep their values. Keys and codes are the same in every run language, so you can compare answers across languages.
A photos item with video set is a review video. Its url is the video thumbnail. video.url is the largest available rendition, up to 1080p.
Hotel feeds also include reviews from partner sites, as Google Maps shows them. reviewOrigin names the site, such as Tripadvisor or Trip.com, and url links to the review there. These reviews come in the same position as on Google Maps. They count toward maxReviews, and each one is charged as a saved review. Google's partner feed has no publish day, so a partner review has publishedAt and the language fields set to null. Its relativeDate has Google's own words, such as "10 months ago", in the run's language. A place that the Actor reads on its account fallback (when the Android feed fails for that place) gets the web feed instead, and those partner reviews have publishedAt as the end of the publication day in UTC. A date filter (reviewsNewerThan or reviewsOlderThan) skips partner reviews that have no publishedAt.
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 to request localised results. Original and translated text and
language metadata are included when available.
region does not change which Google reviews a place returns or their order.
The Actor sends it to Google for place details, place lookups by name, and hotel
partner reviews.
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.- When two entries name the same place, such as a Place ID and its URL, the run reads that place once.
- 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. For example,
visitedInis set only where Google shows the month of the visit, such as at some attractions. ratingBreakdowndescribes reviews saved in this run. It is not the place's lifetime rating distribution.