Google Maps Review Scraper — Ratings & Review Text avatar

Google Maps Review Scraper — Ratings & Review Text

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Google Maps Review Scraper — Ratings & Review Text

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

naoki anzai

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

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 reviewLimit at 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.

  1. Resolve the URL. goo.gl/maps/… and maps.app.goo.gl/… share links are expanded by following their redirects.
  2. 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").
  3. 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 id 0x…: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"].
  4. 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,lng if 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.
  5. Legacy HTML parsers (meta tags, page title, JSON-LD, AF_initDataCallback blocks, @lat,lng in the URL, inline rating text) still run on the page HTML, but values from maps_place_json take priority. A parser appears in dataSources only 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 record FAILED_ROWS with its warnings (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 fullReviewsAvailable is always false. reviewLimit caps how many of those go into reviewSnippets; 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 before reviewLimit is applied. snippetCount is how many are in the row. Example: N = 5 with reviewLimit: 3 gives snippetCount: 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 an error message; it is not written to the dataset and not charged (it is saved in the FAILED_ROWS record). 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. Check warnings and dataSources on each row.

Use Cases

WhoWhy
Local SEO teamsBenchmark ratings, review counts, and category fit across locations
Franchise operatorsCompare multiple stores or branches with one normalized schema
AgenciesBuild lightweight review-monitoring datasets without Google Places API keys
Competitive analystsPair Maps reputation signals with Trustpilot or app-review data

Input

FieldTypeDefaultDescription
placeUrlsstring[](required)Google Maps place URLs or share links
reviewLimitinteger3Max review snippets per place (from the reviews Google embeds; usually only a few)
deliverystring"dataset""dataset" or "webhook"
webhookUrlstringWebhook URL for delivery
dryRunbooleanfalseExtract without saving results

Supported URL formats

  • https://www.google.com/maps/place/Place+Name/
  • https://www.google.com/maps/place/Place+Name/@lat,lng,zoom
  • https://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_json when 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.json
npm 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.

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 placeUrls while validating the schema.
  • Keep reviewLimit low 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_ROWS record.
  • Use dryRun: true before 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.