Google Maps Reviews Scraper
Pricing
from $0.30 / 1,000 review scrapeds
Google Maps Reviews Scraper
Scrape Google Maps reviews by URL, data ID, Place ID, CID, or business name. Get rating, text, date, owner response, photos, and privacy-safe reviewer hashes. MCP/API-ready.
Pricing
from $0.30 / 1,000 review scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
21
Total users
3
Monthly active users
2 days ago
Last modified
Categories
Share
Google Maps Reviews Scraper — $0.30 per 1K Reviews
Google Maps Reviews Scraper is an Apify Actor for extracting reviews from a single Google Maps place target at a time. It accepts a Google Maps place URL, Place ID, Google Maps data ID or CID, or a business name plus location. Each dataset record represents one review and can include the rating, review text, publish date, owner response, photos, place metadata, and a privacy-safe reviewer hash. The Actor is available through Apify API and through Apify MCP.
Best fit and connected workflows
This Actor fits workflows that need review data for a specific place, such as reputation monitoring, sentiment analysis, and competitive review research. It is a focused review-extraction workflow, which makes it a clean fit when you already have a place URL, Place ID, CID, data ID, or a precise business name with a location hint.
When your workflow starts with business discovery or contact enrichment, a separate step can handle that before or after review scraping. For business contact data, use khadinakbar/google-maps-leads-scraper. This Actor stays centered on review records, review text, owner replies, and the place-level context around those reviews.
Practical scenario
Maya manages a neighborhood cafe and wants to review the newest customer feedback from Google Maps. She starts with the cafe's place URL, sets maxReviews to a moderate number, and chooses reviewsSort: "newest". The returned records include rating, text, publishedAtText, ownerResponse, reviewUrl, and sentimentHint. Maya uses sentimentHint to separate the newest positive and negative feedback, opens the reviewUrl for one recent review, and then prepares a response plan for the owner.
Input fields
| Field | Type | Purpose |
|---|---|---|
startUrls | array | Google Maps URLs for a single place, including place URLs, search URLs, CID URLs, and shortened Maps links. |
placeIds | array | Google Place IDs resolved to a place page and its reviews. |
dataIds | array | Google Maps internal 0x...:0x... data IDs and CIDs. |
searchQuery | string | Business name used with location to resolve one place. |
location | string | City, region, or country used to disambiguate searchQuery. |
maxReviews | integer | Maximum reviews to scrape per place. |
reviewsSort | string | Review order: newest, mostRelevant, highestRanking, or lowestRanking. |
reviewSearchQuery | string | Optional keyword filter inside reviews, such as parking. |
language | string | Google Maps UI language and review translation context. |
countryCode | string | Two-letter Google region hint, such as US or GB. |
includePersonalData | boolean | Returns reviewer name, profile URL, and photo URL when enabled. |
proxyConfiguration | object | Proxy settings for Google Maps requests. |
Focused JSON input example
{"startUrls": [{"url": "https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO_ouTY"}],"maxReviews": 50,"reviewsSort": "newest","reviewSearchQuery": "parking","language": "en","countryCode": "US","includePersonalData": false}
Output fields
Each dataset item is one review.
| Field | Type | Purpose |
|---|---|---|
reviewId | string | Stable Google review identifier. |
placeName | string | Google Maps business name. |
placeUrl | string | Canonical Google Maps place URL. |
placeDataId | string or null | Google Maps internal data ID. |
placeAddress | string or null | Postal address shown on the place panel. |
placeRating | number or null | Place-level average rating. |
placeReviewCount | integer or null | Total review count reported by Google. |
reviewerName | string or null | Reviewer display name when personal data is enabled. |
reviewerUrl | string or null | Reviewer profile URL when personal data is enabled. |
reviewerPhotoUrl | string or null | Reviewer profile photo URL when personal data is enabled. |
reviewerHash | string or null | Stable privacy-safe reviewer hash. |
reviewerReviewCount | integer or null | Lifetime review count if Google reports it. |
rating | integer or null | Review rating from 1 to 5. |
text | string or null | Review body text. |
language | string or null | Detected review language code. |
publishedAtText | string or null | Relative date label as Google renders it. |
publishedAt | string or null | Approximate ISO-8601 timestamp derived from the relative date. |
ownerResponse | string or null | Owner reply text if present. |
ownerResponseAt | string or null | Approximate timestamp for the owner reply. |
likesCount | integer or null | Number of likes if surfaced by Google. |
photos | array | Photo URLs attached to the review. |
sentimentHint | string | Rating-based bucket: positive, neutral, or negative. |
reviewUrl | string or null | Permalink to the review on Google Maps. |
scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
extractionSource | string or null | Internal extraction route, either listugcposts or boq. |
Illustrative output record
{"reviewId": "ChZDSUhNMG9nS0VJQ0FnSURwLVlPajJBRRAB","placeName": "Joe's Pizza","placeUrl": "https://www.google.com/maps/place/...","placeDataId": "0x89c259a9b3117469:0xd134e199a405a163","placeAddress": "7 Carmine St, New York, NY 10014","placeRating": 4.6,"placeReviewCount": 12847,"reviewerHash": "b7c2f4e0c9d1...","rating": 5,"text": "The classic slice was excellent.","language": "en","publishedAtText": "a month ago","publishedAt": "2026-03-25T13:24:00.000Z","ownerResponse": "Thanks for visiting!","ownerResponseAt": "2026-03-26T10:11:00.000Z","likesCount": 3,"photos": ["https://lh3.googleusercontent.com/..."],"sentimentHint": "positive","reviewUrl": "https://www.google.com/maps/...review...","scrapedAt": "2026-03-27T08:00:00.000Z","extractionSource": "listugcposts"}
How it works
The Actor resolves each input into a Google Maps place target and then extracts reviews through browser-free Google Maps review RPC paths. The implementation uses Chrome TLS impersonation, BOQ fallback, data ID resolution, soft validation, and safe dataset pushes. The dataset stores one record per review, and the run summary is written to the OUTPUT key.
Pricing
This Actor uses Pay per event plus Apify platform usage. The primary event is Review scraped, and there is also an Actor Start event. Review scraping is billed per review scraped, while the Apify platform usage covers the run itself and the resources you allocate for execution.
For planning, imagine scraping one hundred reviews. That execution produces one hundred review events, plus the start event that applies when the Actor begins. Open the live Pricing tab on Apify for the current event breakdown and the exact pricing shown for this Actor.
Use with AI agents (MCP)
This Actor is available through Apify MCP as an Apify Actor tool for review extraction. The exact Actor identity is khadinakbar/google-maps-reviews-scraper.
Tool description: provide a Google Maps place target and receive structured review records with rating, text, owner response, photos, review metadata, and privacy-safe reviewer hashing. It is built for one place at a time, which makes it useful when an agent needs review data for a specific business and wants one record per review.
Extract reviews for this Google Maps place URL. Return the newesta bounded number of reviews, include the review text, rating, owner response, review URL, and a privacy-safe reviewer hash. Keep reviewer personal data disabled unless I explicitly request it.
Output interpretation:
sentimentHintis a rating-derived bucket, not a model-generated sentiment score.publishedAtTextis Google's relative date label.publishedAtis an approximate ISO-8601 timestamp derived from that label.reviewerHashremains available when reviewer personal data is hidden.reviewUrlpoints to the specific review on Google Maps.extractionSourceshows the internal review path used for the record.
Provenance and scope:
- Each record comes from one Google Maps place.
- The Actor is designed for review extraction, not business contact data.
- For business lead or contact enrichment, route that step to
khadinakbar/google-maps-leads-scraper.
Pagination and cost guidance:
maxReviewscontrols how many reviews are requested per place.- Billing follows the number of scraped review events.
- Use a lower
maxReviewsfor testing and increase it only when you need a deeper review sample.
Apify API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const run = await client.actor('khadinakbar/google-maps-reviews-scraper').call({startUrls: [{url: 'https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO_ouTY',},],maxReviews: 25,reviewsSort: 'newest',includePersonalData: false,});const dataset = await client.dataset(run.defaultDatasetId).listItems({ clean: true });console.log(dataset.items);
Best results and outcome guidance
For review monitoring, start with reviewsSort: "newest" so the returned sample reflects the latest feedback first. Use a direct Google Maps place URL, Place ID, or data ID when you already know the target place. Use reviewSearchQuery when you want reviews mentioning a specific topic such as a service issue or product feature. Keep includePersonalData disabled when you only need a privacy-safe review stream, and enable it only when your use case and legal basis require reviewer profile fields.
Continue the workflow
- Then use Google Maps Business Profile Rank Checker to extend Google Maps Reviews Scraper — $0.30 per 1K Reviews research with a complementary monitor contract.
- Then use Houzz Pros Scraper to extend Google Maps Reviews Scraper — $0.30 per 1K Reviews with a neighboring local-business research source when the brief calls for Houzz data.
Design note
I found that reviewId is always returned regardless of the includePersonalData setting, while reviewer name, profile URL, and profile photo URL are nulled when personal data is disabled.
FAQ
Can I start from a Google Maps URL, a Place ID, or a CID?
Yes. The Actor accepts Google Maps URLs, Place IDs, and Google Maps data IDs or CIDs. It also supports a business name plus location.
When should I use searchQuery instead of startUrls?
Use searchQuery when you know the business name and want the Actor to resolve the place with a location hint. Use startUrls when you already have the exact Maps URL.
How do I focus on a specific review topic?
Set reviewSearchQuery to a keyword such as parking or refund to narrow extraction toward matching reviews.
What if I need reviewer personal fields?
Set includePersonalData to true when your use case has a legitimate basis for those fields. The dataset will then include reviewer name, profile URL, and profile photo URL when available.
Which output field identifies the extraction route?
Use extractionSource, which can be listugcposts or boq.
Responsible use
Use this Actor only for publicly available Google Maps reviews and for lawful purposes. Review the applicable Google Maps terms and your privacy obligations before using reviewer data. When working with personal data, keep the data handling scope aligned with your documented purpose and legal basis.