Google Maps Reviews Scraper — Sorted Reviews
Pricing
from $0.43 / 1,000 reviews
Google Maps Reviews Scraper — Sorted Reviews
Google Maps reviews scraper with four sort orders and anonymous cursor pagination. Extract review text, ratings, authors, photos, replies, and observed update times. $0.50 per 1,000 delivered reviews.
Pricing
from $0.43 / 1,000 reviews
Rating
0.0
(0)
Developer
Meka.im
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Use this Google Maps reviews scraper to collect review text, ratings, public reviewer details, photos, owner replies, and observed update times. Choose Google's most relevant, newest, highest rating, or lowest rating order, without a login or cookies.
Tool preview: Explore Google Maps Reviews for recorded examples and the current preview status. Browse the tools directory for other sources.
- Version 2 is now the default in Actor version 2.0: anonymous BOQ cursor pagination with native per-review Like counts.
- $0.50 per 1,000 delivered reviews, no start fee; platform usage is included.
- Four place formats: Maps URL,
ChIJ…place ID, numeric CID, or0x…:0x…feature ID. - Unique reviews are delivered in input order, then page order, then their position on the page.
- Original publication time and edit status are unknown in v2:
timeandisEditedarenull.
Quick start: scrape Google Maps reviews
{"places": ["https://www.google.com/maps?cid=7590626642755549500"],"sort": "newest","maxReviews": 50}
These references identify the same place:
{"places": ["https://www.google.com/maps?cid=7590626642755549500","ChIJ_bMOIClFVVMRPHkP-LZSV2k","7590626642755549500","0x53554529200eb3fd:0x695752b6f80f793c"]}
Given all four at once, the place is scraped once. Duplicate aliases and already delivered reviews are not charged again. Empty API input exits successfully with no reviews and no result charges. A nonempty input containing only unrecognised places fails clearly without result charges; mixed inputs skip the invalid references and report them in OUTPUT.
Google Maps review scraper input
| Field | Default | Notes |
|---|---|---|
places | none | One place per line. The form has a useful prefill; empty input is a no-op. |
contractVersion | 2 | Choose 1 for the legacy feed. A run cannot resume across versions. |
sort | mostRelevant | mostRelevant, newest, highest, or lowest |
maxReviews | 100 | Per-place upper bound, from 1 to 100,000; available reviews and the time/charge budget can limit delivery. |
language | en | Interface language such as de, ja, or pt-BR; does not filter review language. |
placeConcurrency | 2 | Advanced, from 1 to 8; output order is preserved. |
requireComplete | true | Legacy v1 session heuristic only. |
sessionRetries, retryDelayMs | 3, 1500 | Legacy v1 session retries. In v2 they are used only for compatibility with older Data Worker pages that omit native Like counts; current v2 pages do not call the legacy feed. |
sharedSessionExperiment | false | Legacy v1 only. |
Google Maps reviews data output
One Dataset row represents one unique review.
| Field | Meaning in contract v2 |
|---|---|
reviewId | Google's review identifier |
text, language, rating | Original review text, language, and star rating |
time | null: a verified original publication time is unavailable |
updatedTime | Observed update timestamp, or null when unavailable |
isEdited | null: edit status cannot be verified |
likesCount | Timeline-verified Like count as a non-negative integer, or null when the count was unavailable or malformed |
relativeTime | Google's relative time wording |
author | Public name, profile/image URLs, public ID, guide status, and review count when available |
ownerResponse | Public business reply when available |
images | Observed photo URLs only; videos are represented in media |
media | Contract v2 typed review media: { type: "photo" | "video", url, previewUrl } |
place | Input reference, input type, feature ID, CID, and Maps URL |
sort, requestedLanguage, page, rank | Requested order/language and position within delivery |
variant, incomplete, expected | Feed/completeness metadata |
scrapedAt, contractVersion | Collection timestamp and row contract version |
Example: one review Dataset item
This shortened example illustrates the shape; it is not a real person's review.
{"reviewId": "example-review-id","text": "Helpful staff and quick service.","language": "en","rating": 5,"time": null,"updatedTime": "2026-09-18T10:00:00.000Z","isEdited": null,"likesCount": 1,"author": { "name": "Example reviewer", "isLocalGuide": false },"images": ["https://lh3.googleusercontent.com/grass-cs/example-photo=k-no"],"media": [{ "type": "photo", "url": "https://lh3.googleusercontent.com/grass-cs/example-photo=k-no", "previewUrl": null }],"place": { "input": "https://www.google.com/maps?cid=7590626642755549500", "inputType": "url:cid" },"sort": "newest","incomplete": false,"contractVersion": 2}
Missing public fields are represented as null. The Data Worker resolves likesCount for every BOQ row through Google's anonymous timeline RPC, selecting the response only by the complete reviewId. The Actor accepts native likesCount fields from the Worker as the primary source and does not request the legacy /maps/reviews feed when every row on the page has that property, including when its value is null. Older Worker responses that omit the property retain a compatibility fallback to the legacy feed; native values still win row by row.
Each timeline lookup adds one upstream request per review, with bounded concurrency of six, a 10-second per-request timeout, no retries, and a 20-second page budget in the Data Worker. A lookup failure, timeout, budget exhaustion, missing exact wrapper, or malformed Like node leaves only that row's likesCount as null; it never fails or removes the BOQ page. An explicit 0 is a real observed count, while null means unknown.
Each visible photo or video is one media item. Video entries retain Google's preview resource in previewUrl; that preview is not counted as another photo. Photo and media URLs can expire or change, and their long-term availability is not guaranteed.
Migration from version 1
Actor version 2.0 defaults to contract v2. Existing integrations that depend on original publication timestamps or boolean isEdited must explicitly send "contractVersion": 1, or pin the preserved Actor version 0.1. Contract v1 keeps its published row shape and its cookie-based feed.
In v2, use updatedTime as the observed update time. Do not infer original publication time or whether a review was edited from it. Both time and isEdited are unknown. likesCount is emitted in every v2 row and is either a timeline-verified non-negative integer or null; zero is a real observed count, while null means unknown. The normal v2 path does not request the legacy review feed. media is always emitted and is the authoritative list of review photos and videos. The images field has narrowed to photo URLs only; older v2 output could contain mixed media resources in images. Consumers that need every photo and video should use media, while consumers that only need photos can continue using images. OUTPUT and STATE record the chosen version; mixing v1 and v2 during a resumed run fails before output writes or result charges.
The v2 continuation cursor is bound to place, sort, and language. It keeps the legacy compatibility cursor or a disabled marker so an older Worker feed is never restarted from page one. A continuation written before likes support is accepted, but its legacy compatibility fallback remains disabled because its position is unknown. Old v1 cursors cannot be reused. Contract v1 rows retain their published shape and never include likesCount. Pricing is unchanged.
Pricing
| Event | Price |
|---|---|
review-delivered | $0.0005 — $0.50 per 1,000 delivered reviews |
No start fee. Platform usage is included. A result event is charged after its Dataset row is committed. Invalid references, failed fetches, skipped reviews, duplicates, and empty results are not success events.
Google Maps review coverage and limits
Google controls the available reviews and sort order. We cannot guarantee that every published review will be accessible. Contract v2 requests 20 reviews per BOQ page and enriches each returned review with a bounded timeline lookup. A BOQ page can contain fewer than 20 reviews while still providing a continuation; the Actor follows it until the requested limit, feed end, or budget is reached.
Completeness is reported, not assumed. Version 2 uses the feed's continuation structure rather than v1's five-review teaser heuristic. Fetch or parse failures and place time limits are reported in OUTPUT; delivered rows for an affected place carry incomplete: true. Reaching your requested maxReviews does not mean every review on Google has been collected.
Language is not a review filter. language controls Google's interface language. Review text remains in the reviewer's original language. Each row includes both the review's language and requestedLanguage.
Public fields can be missing. Owner replies may have only relative time wording. Review media is parsed item by item from the observed feed slots, and exact duplicate items are removed. Likes are available only when the timeline wrapper matches the complete reviewId and contains a complete [1, integer >= 0] node; a missing dashboard Like label is not treated as zero. Alternate Google layouts may expose different fields; media and like coverage are not guaranteed.
Not included: sentiment analysis, AI summaries, reviewer profile enrichment, private reviews, emails, contact details, or data behind a login.
API and automation
Export the run's Dataset as JSON or CSV:
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&clean=true" \-H "Authorization: Bearer APIFY_TOKEN"
The linked OUTPUT record contains delivered/charged counts, skipped inputs, per-place outcomes, completeness, budget stops, and separate target, transport, parser, and input error counters.
Resurrecting the same run reconstructs delivered IDs from its Dataset and stored state. It avoids writing or charging the same output twice. A separate new run has a separate Dataset and can deliver and charge those reviews again.
Local business research workflow
Use Google Maps Business Scraper to discover businesses and their place identifiers, then run this Actor on those places. Compare review text and star ratings across locations, export to a spreadsheet, or monitor with scheduled runs.
FAQ
Why is the original review date empty?
The v2 feed does not provide a verified original publication timestamp. updatedTime is the observed update time; time and isEdited are deliberately null.
My run stopped early. Was the rest charged?
Only committed reviews are result events. Check stoppedOnBudget and the per-place OUTPUT details. Raise the budget and resurrect the same run to continue without duplicate delivery, or start a new run with its own Dataset.
Can I keep the old Dataset contract?
Yes. Send "contractVersion": 1 or pin Actor version 0.1. A Dataset created with one contract cannot be resumed with the other.
Legal
This Actor is independently developed and is not affiliated with, endorsed by, or sponsored by Google. It reads public data without signing in. You are responsible for your use of the data and any applicable terms and data-protection rules.