Google Maps Review Scraper — Ratings & Review Text
Pricing
from $8.00 / 1,000 results
Google Maps Review Scraper — Ratings & Review Text
Analyze Google Maps reviews. No API key / no login. Open Input → leave defaults → Start (1 Maps place URL ≈ USD 0.009): https://console.apify.com/actors/rQCiEp92zSp1BZaos/input From USD 0.
Pricing
from $8.00 / 1,000 results
Rating
0.0
(0)
Developer
naoki anzai
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Google Maps Review Intelligence API | Ratings, Snippets & Place Data
Open Input (leave defaults → Start)
Paid first run ≈ USD 0.009 total (1 place URL): Actor Start USD 0.001 + 1×USD 0.008. Keep reviewLimit low. Open Console Input (deep link above) and run this JSON.
{"placeUrls": ["https://www.google.com/maps/place/Tokyo+Station/"],"reviewLimit": 3,"delivery": "dataset","dryRun": false}
Track branch reputation signals by extracting aggregate ratings and public snippets from Google Maps pages. This scraper fetches a Google Maps place page over plain HTTP, reads the place data JSON that the page preloads, and returns the public business fields and the reviews Google embeds there, without an API key, browser, or login. Franchise managers, travel agencies, and digital marketing teams can use it to monitor location watchlists and spot public sentiment changes for follow-up review.
Store Quickstart
- Start with 1–3 full Google Maps place URLs and keep
reviewLimitat 3 (the input default). - Use dataset delivery first so you can inspect
warnings,dataSources, and review availability. - Treat review snippets as a sample: you get only the few reviews Google embeds in the place data (5 for Tokyo Station in the example run below), not the full review list.
- After the first useful run, move to the recurring multi-location template, then use the webhook handoff template for action-needed review alerts.
Use with Apify MCP
Exact actor: taroyamada/google-maps-review-intelligence
Sample input JSON:
{"placeUrls": ["https://www.google.com/maps/place/Tokyo+Station/"],"reviewLimit": 3,"delivery": "dataset","dryRun": false}
Data Strategy
No Google API key, browser, login, or proxy. The actor makes a few plain HTTPS requests per place, one place at a time, at least 2 seconds apart.
- Resolve the URL.
goo.gl/maps/…andmaps.app.goo.gl/…share links are expanded by following their redirects. - Fetch the place page HTML. The Maps page is a JavaScript app, so the HTML shell itself carries almost no place data (its title is just "Google Maps").
- Read the place data JSON the page preloads (
/maps/preview/place?…or/search?tbm=map…). The actor finds the place record in that JSON (identified by its feature id0x…:0x…) and reads the name, Place ID, address, coordinates, category, phone, website, price level, opening hours, image, description, rating, review count, and the reviews embedded in the record. Rows built this way show"dataSources": ["maps_place_json"]. - Follow-up lookups, only when needed:
- No place record in the preload and no feature id in the URL: the actor runs a Google Maps search for the place name in the URL (biased to the URL's
@lat,lngif present) and uses the first match. If several places match and the first one has a different name, a warning asks you to paste that branch's own Maps URL. - No embedded reviews in the record found so far (or no record, but the URL has a feature id): the actor opens the place page pinned to the feature id, whose preload carries the full record with its reviews.
- No place record in the preload and no feature id in the URL: the actor runs a Google Maps search for the place name in the URL (biased to the URL's
- Legacy HTML parsers (meta tags, page title, JSON-LD,
AF_initDataCallbackblocks,@lat,lngin the URL, inline rating text) still run on the page HTML, but values frommaps_place_jsontake priority. A parser appears indataSourcesonly when it found something; on current Google pages they usually find nothing. If no place record is found at all and Google returns no place data (rating, address, Place ID, reviews…), the place is not written to the dataset and not charged; it is saved in the key-value store recordFAILED_ROWSwith itswarnings(see Pricing).
Limitations
- Reviews are a sample, not the full list. Only the reviews Google embeds in the place record are returned (5 for Tokyo Station in the example run below), and
fullReviewsAvailableis alwaysfalse.reviewLimitcaps how many of those go intoreviewSnippets; a higher value does not fetch more. For the complete review list, use the Google Places API or a browser-based scraper. - The
Review snippets are the N review(s) Google embeds…warning counts the reviews Google embedded beforereviewLimitis applied.snippetCountis how many are in the row. Example: N = 5 withreviewLimit: 3givessnippetCount: 3. - Rate limiting: requests are throttled (2s minimum between requests), and HTTP 429/502/503 responses are retried with backoff. If the page still cannot be fetched, the place gets
status: "error"and anerrormessage; it is not written to the dataset and not charged (it is saved in theFAILED_ROWSrecord). Heavy use may trigger Google's bot detection. - Format changes: the place data JSON is an undocumented Google format. The actor finds the place record and its reviews by their shape, but reads most fields from fixed positions, so a Google change can leave fields
null. CheckwarningsanddataSourceson each row.
Use Cases
| Who | Why |
|---|---|
| Local SEO teams | Benchmark ratings, review counts, and category fit across locations |
| Franchise operators | Compare multiple stores or branches with one normalized schema |
| Agencies | Build lightweight review-monitoring datasets without Google Places API keys |
| Competitive analysts | Pair Maps reputation signals with Trustpilot or app-review data |
Input
| Field | Type | Default | Description |
|---|---|---|---|
placeUrls | string[] | (required) | Google Maps place URLs or share links |
reviewLimit | integer | 3 | Max review snippets per place (from the reviews Google embeds; usually only a few) |
delivery | string | "dataset" | "dataset" or "webhook" |
webhookUrl | string | Webhook URL for delivery | |
dryRun | boolean | false | Extract without saving results |
Supported URL formats
https://www.google.com/maps/place/Place+Name/https://www.google.com/maps/place/Place+Name/@lat,lng,zoomhttps://maps.google.com/maps?q=...https://goo.gl/maps/...(short links — auto-resolved)https://maps.app.goo.gl/...(app share links — auto-resolved)
Output
Each place returns:
- Normalized place metadata: name, address, coordinates, category, phone, website, etc.
- Review intelligence: aggregate rating, review count, review snippets (when available)
- Data provenance (
dataSources):maps_place_jsonwhen the place data JSON was read; legacy HTML parser names appear only if they also found something - Explicit warnings: what data couldn't be extracted and why
Local run
npm start # Run with input.jsonnpm test # Run test suite
Example output
One dataset row per place. Real output from build 1.0.16 (input: Tokyo Station URL, reviewLimit: 3, run pbS86YR9gq1QgPTmq at 2026-10-18 17:50 UTC). Review snippet text is shortened here with "…"; the dataset contains the full snippet text Google embeds in the place page.
{"sourceUrl": "https://www.google.com/maps/place/Tokyo+Station/","status": "ok","dataSources": ["maps_place_json"],"place": {"name": "Tokyo Station","placeId": "ChIJC3Cf2PuLGGAROO00ukl8JwA","address": "1 Chome Marunouchi, Chiyoda City, Tokyo 100-0005, Japan","coordinates": {"lat": 35.681299599999996,"lng": 139.76706579999998},"category": "Transit station","phone": null,"website": "https://www.tokyoinfo.com/","priceLevel": null,"businessStatus": null,"hours": null,"imageUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLdMgYm4IoK10tejaSiYfiPIqOP6sqz1g2wOugVNmSFOUQG2f9hxM3_WpXF1Bm7THnG3B9CzDSoBWTlhx_wPnqjDReSUqn3DzkMx03y5ZHdb5WTmBcSB5riAlRyRZ6a3y8jeL3syNA=w129-h86-k-no","description": null},"reviewIntelligence": {"rating": 4.3,"reviewCount": 20556,"reviewSnippets": [{"text": "Our Tokyo adventure starts here, at Chiyoda city, Tokyo Station. From Osaka we rode the fastest Shikansen train, the NOZOMI line, in just over 2 hours. It cane me radiant and …","author": "vino fel","rating": 4,"date": "2026-08-31T06:14:52.848Z"},{"text": "We traveled as a family of four (2 adults and 2 kids) through Tokyo Station, taking the Shinkansen Nozomi to Osaka in Green Car reserved seats, and the experience was absolutely …","author": "Deepak Sundaram","rating": 5,"date": "2026-05-25T07:56:44.199Z"},{"text": "Tokyo Station honestly surprised me more than I expected. From the outside, the red-brick building in Marunouchi looks really beautiful and almost historic, especially compared to …","author": "Miles & Passport","rating": 5,"date": "2026-05-10T22:18:26.459Z"}],"snippetCount": 3,"fullReviewsAvailable": false,"reviewLimitApplied": 3},"warnings": ["Review snippets are the 5 review(s) Google embeds in the place page (not the full review list)."]}
Note on warnings: in this run Google embedded 5 reviews and reviewLimit: 3 kept 3 of them, so the warning says 5 while snippetCount is 3.
Related Actors
Pricing & Cost Control
Apify Store pricing is usage-based, so total cost mainly follows how many placeUrls you process. Check the Store pricing card for the current per-event rates.
Failed places are not charged. A place that could not be read from Google Maps (status: "error", or no place data at all) is not written to the dataset, so it is not billed. These places are saved in the run's key-value store record FAILED_ROWS (with error / warnings), and the run status message tells you how many there were. Only rows with Google Maps place data are charged.
- Start with a few
placeUrlswhile validating the schema. - Keep
reviewLimitlow because Google often exposes only snippets anyway. - Use dataset delivery first so partial cases are easy to inspect; places that failed are in the
FAILED_ROWSrecord. - Use
dryRun: truebefore larger location batches or webhook handoffs.
⭐ Was this helpful?
If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.
Bug report or feature request? Open an issue on the Issues tab of this actor.