ParseForge Scrapers

Google Maps Reviews Scraper - Exact Dates, Replies & Photos

parseforge/google-maps-reviews-scraper

Lead generationAutomationTravel

Google Maps reviews by place URL, ID or search: exact dates, owner replies, photos, likes, translations. No login. Export CSV, Excel, JSON, XML.

Run this scraper See the API call
Total runs
4
Bookmarked
0
Last modified
2 days ago

This scraper was last updated on .

What does the Google Maps Reviews Scraper - Exact Dates, Replies & Photos return?

ParseForge

Google Maps Reviews Scraper: Google Reviews API with Exact Dates, Owner Replies & Photos

Export Google Maps reviews for any business from its place URL, place ID, or a search like "pizza in Chicago": 5,000 reviews of one restaurant came back in 87 seconds in our last test. Every review carries its exact publish date, the reviewer, likes, photos, the owner's reply, Google's translation, the guided answers (price per person, meal type, wait time), and the Food / Service / Atmosphere scores, with the place's name, address, rating and review total on the same row. No login, no Google API key, no browser. Export to CSV, JSON, Excel, or XML.

The official Google Places API returns at most 5 reviews per place. This Actor reads the same review list the Google Maps "All reviews" window shows, page by page, in Google's own sort orders, and hands back one flat row per review with 40 fields.

Who uses it What they export Google reviews for
Local SEO and reputation agencies Review monitoring for every client location, new reviews and owner replies on a schedule
Multi-location brands Google business reviews across all branches, compared by rating, topic and reply rate
Market researchers What customers praise and complain about in a category and a city
Data scientists Review text with ratings, languages and translations for sentiment and topic models
Lead generation teams Businesses with low ratings or unanswered reviews, with website and phone on every row

What it does

The Actor takes Google Maps place URLs, place IDs (ChIJ...), feature IDs or CIDs, and search terms with a location, alone or together, and returns one row per review.

  • ⭐ Review: rating, full text, language, Google's translation into your language, exact publish time (ISO 8601) and Google's relative date.
  • πŸ‘€ Reviewer: name, contributor ID and profile URL, photo, total reviews and photos posted, Local Guide flag.
  • πŸͺ Owner reply: the business response text and its date.
  • πŸ‘ Engagement: likes and all reactions, plus the review's photos.
  • 🧾 Review details: the guided answers Google asks for (price per person, meal type, wait time, parking, recommended dishes) and the Food, Service and Atmosphere scores.
  • πŸ“ Place on every row: name, place ID, feature ID, CID, address, main and all categories, rating, total reviews, coordinates, website and phone.
  • πŸ”Ž Filters: star ratings, "only reviews newer than" a date, text contains, only reviews with text, only reviews the owner answered.

What you can do with Google reviews data

πŸ“‘ Monitor new reviews on a schedule.

Run every morning with sort set to newest and reviewsNewerThan set to "1 day". The run stops reading each place as soon as it reaches older reviews, so a daily check stays small and cheap.

🚨 Catch bad reviews first.

Set starRatings to 1 and 2 with sort "lowestRating" and onlyWithText on. The run reads the lowest reviews first and stops each place when the ratings climb out of range.

πŸ—ΊοΈ Benchmark a category in a city.

Search "dentist" in "Austin, TX" with maxPlacesPerSearch 20 and maxReviewsPerPlace 200, then compare ratings, reply rates and sub-scores across every practice.

🌍 Read reviews in any language.

Set language to your language: reviews written in another one come with Google's translation in textTranslated, and the original stays in text.

Why choose this scraper

What you get
Exact dates publishedAt is Google's own timestamp to the millisecond, not a guess from "3 weeks ago".
The whole review Owner reply, photos, likes, translation, guided answers and sub-ratings, all on the same row.
Place data included Name, IDs, address, rating, total reviews, website and phone repeat on every review, so one file is enough.
Any way in Place URLs, share links, ChIJ place IDs, feature IDs, CIDs, Maps search URLs, or a search term and a location.
Filters that save money Stars, date, text and owner-reply filters run as reviews are read. Only matching reviews are delivered and billed.
Light and fast Plain HTTP, no browser: up to 60 reviews per request and about 150 MB of memory for a 5,000-review run.

How it compares

All scrapers below read public Google Maps reviews. Prices are each Actor's public Store price for its main result event, read on September 24, 2026, lowest to highest.

Actor Price per 1,000 reviews Runs
kaix/google-maps-reviews-scraper $0.04 156,169
curious_coder/google-maps-reviews-scraper $0.20 14,290
solidcode/google-maps-reviews-scraper $0.25 6,077
web_wanderer/google-reviews-scraper $0.35 (free tier) to $0.22 389,899
compass/Google-Maps-Reviews-Scraper $0.60 (free tier) to $0.15 167,893,844
ParseForge $0.60 (free tier) to $0.534 new

Honest ceiling: Google shows signed-out visitors its review list, not every review ever posted. On a landmark with 112,688 reviews, newest-first reached back one year (3,540 reviews); on a busy deli it reached four months in 2,820 reviews and kept going. Every row carries placeTotalReviews, so you always see your coverage.

What a Google Maps review looks like

One unedited row from a verified run on September 24, 2026:

{
  "imageUrl": "https://lh3.googleusercontent.com/a/ACg8ocJzQH7fx2VaLLQ3hnHSpoqU90iZFahTej5OwYMiP4PEThGQbzM=s64-c-rp-mo-ba12-br100",
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xGdU5FbHFhMFF5YkhGaU0xTlBjbUU0TWxCWFpFRRAB",
  "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2xGdU5FbHFhMFF5YkhGaU0xTlBjbUU0TWxCWFpFRRAB!2m1!1s0x0:0xe494c5a4cb742aeb!3m1!1s2@1:CAIQACodChtycF9oOlFuNElqa0QybHFiM1NPcmE4MlBXZEE%7C%7C?hl=en-US",
  "rating": 5,
  "text": "Excellent service. The wait time for our order was long...but worth the wait. Drinks and food πŸ˜‹",
  "textTranslated": "N/A",
  "language": "en",
  "publishedAt": "2026-09-24T16:31:57.737Z",
  "publishedAtRelative": "3 hours ago",
  "likesCount": 0,
  "reactionsCount": 0,
  "ownerResponseText": "N/A",
  "ownerResponseRelative": "N/A",
  "reviewerName": "Mary Downs",
  "reviewerId": "116325683602922945114",
  "reviewerUrl": "https://www.google.com/maps/contrib/116325683602922945114/reviews",
  "reviewerReviewsCount": 28,
  "reviewerPhotosCount": 21,
  "isLocalGuide": "Yes",
  "placeName": "Giordano's",
  "placeId": "ChIJh3i0BqYsDogR6yp0y6TFlOQ",
  "placeFid": "0x880e2ca606b47887:0xe494c5a4cb742aeb",
  "placeCid": "16471007048779442923",
  "placeAddress": "130 E Randolph St, Chicago, IL 60601",
  "placeCategory": "Pizza restaurant",
  "placeRating": 4.5,
  "placeTotalReviews": 26763,
  "placeUrl": "https://www.google.com/maps/place/?q=place_id:ChIJh3i0BqYsDogR6yp0y6TFlOQ",
  "placeLatitude": 41.8851301,
  "placeLongitude": -87.62376119999999,
  "placeWebsite": "https://giordanos.com/locations/prudential-plaza-millennium-park/",
  "placePhone": "+13126161200",
  "sortOrder": "newest",
  "inputQuery": "pizza in Chicago, IL",
  "reviewContext": { "Meal type": "Dinner" },
  "subRatings": { "Food": 5, "Service": 5, "Atmosphere": 5 },
  "reviewImageUrls": [],
  "placeCategories": ["Pizza restaurant", "Delivery service", "Takeout Restaurant", "Pizza delivery"],
  "scrapedAt": "2026-09-24T19:34:12.047Z",
  "error": null
}

A review written in another language keeps the original and adds the translation, from the same run:

{ "text": "Ψ³Ψ§Ω†Ψ―ΩˆΨ΄ Ψ³ΨͺΩŠΩƒ Ω„Ψ­Ω… ΩƒΨ§Ω† Ψ¬Ω…ΩŠΩ„ ΩˆΩ„Ψ°ΩŠΨ°", "textTranslated": "The steak sandwich was beautiful and delicious.", "language": "ar" }

A field the review does not have reads "N/A" (no text on a star-only review, no owner reply), and empty lists are []. A row with error set is an input that could not be read; it is never billed.

Configure the run

Mix place URLs, place IDs and searches in one run. The Input tab lists every option.

New reviews from the last day for two locations, newest first:

{ "startUrls": [{ "url": "https://www.google.com/maps/place/Katz%27s+Delicatessen/data=!4m2!3m1!1s0x89c2598f7ff4aa09:0x313547e757cb8cea" }], "placeIds": ["ChIJh3i0BqYsDogR6yp0y6TFlOQ"], "sort": "newest", "reviewsNewerThan": "1 day" }

The 1 and 2 star reviews with text for the top 10 dentists in a city:

{ "searchTerms": ["dentist"], "location": "Austin, TX", "maxPlacesPerSearch": 10, "sort": "lowestRating", "starRatings": ["1", "2"], "onlyWithText": true }

Free users

Free-plan runs return up to 10 reviews as a preview. Upgrade your Apify plan to collect up to 1,000,000 reviews per run.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Google Maps Reviews Scraper.
  3. Paste place URLs or place IDs, or enter a search term and a location, pick a sort order and any filters, and click Start.
  4. Export the reviews as CSV, Excel, JSON, or XML from the Dataset tab, or schedule the run for ongoing review monitoring.

Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live Google reviews through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/google-maps-reviews-scraper"

Then prompt it in plain language:

  • "Get this week's Google reviews for our three locations and list every review under 3 stars that has no owner reply."
  • "Compare the Food, Service and Atmosphere scores of the top 10 pizza places in Chicago."
  • "Summarize what customers say about wait times at this restaurant, in Spanish."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/google-maps-reviews-scraper" to collect Google Maps reviews. Input: { "startUrls": [{ "url": "<google maps place url>" }], "placeIds": ["<ChIJ...>"], "searchTerms": ["<what>"], "location": "<where>", "sort": "<newest|mostRelevant|highestRating|lowestRating>", "reviewsNewerThan": "<30 days>", "maxItems": <n> }. Reviews come back with rating, text, textTranslated, publishedAt, likesCount, ownerResponseText, reviewerName, placeName, placeRating and placeTotalReviews. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why am I getting no results?

The URL may not point at a single place, or the place ID may be wrong; the run writes an error row that says so. A filter can also remove everything: loosen starRatings, reviewTextContains or reviewsNewerThan.

Why fewer reviews than the place total?

Google's review list for signed-out visitors is shorter than the lifetime total, and your filters remove more. Compare your count with placeTotalReviews on any row.

Why did the sort change to newest?

"Only reviews newer than" needs newest-first order to know where to stop, so the run switches to it and says so in the log.

Why does "Most relevant" differ between languages?

Google ranks relevance per language, so the same place returns a different first page in English and in Spanish.

Can I search inside the review text?

Yes, with reviewTextContains. Google offers no review search to signed-out visitors, so the Actor reads the reviews and keeps the matching ones; you pay only for the matches.

FAQ

Question Answer
Do I need a Google API key or account? No. It reads Google Maps' public review list, with no login, cookies or key.
How is this different from the Google Places API? The Places API returns at most 5 reviews per place. This returns the full list Google Maps shows, sorted and filtered your way.
Are the dates exact? Yes. publishedAt is Google's own timestamp of the review (or of its last edit), in ISO 8601.
Does it include owner replies? Yes, ownerResponseText and ownerResponseRelative on every review that has one.
Can it translate reviews? Google does: pick language, and reviews in other languages come with textTranslated.
Can I filter by stars or date? Yes: starRatings, reviewsNewerThan, reviewTextContains, onlyWithText and onlyWithOwnerResponse.
Which inputs work? Place URLs, maps.app.goo.gl share links, ?cid= links, Maps search URLs, ChIJ place IDs, feature IDs, CIDs, and a search term with a location.
How many places does a search return? Up to maxPlacesPerSearch. Google stops a single Maps search after a couple of hundred places at most (108 for "restaurants in Chicago, IL" in our test), so split big areas into neighborhoods.
How many reviews per run? Free plan: 10. Paid: up to 1,000,000, bounded by what Google lists for each place and your filters.
Do I need a proxy? Usually not. The run connects directly and switches to Apify Proxy by itself if Google starts refusing.
Is this an official Google product? No. It is unofficial and reads only public Google Maps data.

Browse the full ParseForge collection for more scrapers.

πŸ†˜ Need help? Open our contact form with your run ID, your input, and what you expected.

⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Google LLC. It collects only publicly available Google Maps data. You are responsible for using the data in compliance with Google's terms and applicable laws, including GDPR and CCPA. Do not use it to identify, profile, or target individuals.

What input does the Google Maps Reviews Scraper - Exact Dates, Replies & Photos accept?

FieldTypeWhat it doesDefault
startUrls array Place links copied from Google Maps (the long /maps/place/... URL, a maps.app.goo.gl share link, a ?cid= link, or a /maps/search/... link). [{"url":"https://www.google.com/maps/pla
placeIds array Google place IDs (ChIJ...), feature IDs (0x...:0x...) or CID numbers, one per line. not set
searchTerms array Find places by what they are, like "pizza" or "dentist". Each term returns up to "Max places per search" places, and their reviews. not set
location string Where to search, like "Austin, TX" or "Madrid, Spain". Added to every search term. not set
maxItems integer Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000 10
maxReviewsPerPlace integer Stop each place after this many reviews. Leave empty for every review Google shows. not set
maxPlacesPerSearch integer How many places each search term (or /maps/search/ URL) contributes. Google returns about 20 places per page. 5
sort string (4 options) Google's review order. "Only reviews newer than" always uses newest first. newest
reviewsNewerThan string A date (2026-01-31) or a window ("30 days", "6 months", "1 year"). The run stops reading a place once it reaches older reviews. not set
starRatings array Keep only reviews with these ratings. Leave empty for all. With highest or lowest sort the run stops a place as soon as the ratings run out of range. not set
reviewTextContains array Keep only reviews whose text (or its translation) contains at least one of these words. Google has no review search for signed-out visitors, so the Actor reads the reviews and filters them itself. not set
onlyWithText boolean Skip star-only reviews. false
onlyWithOwnerResponse boolean Keep only reviews that carry a response from the business. false
language string (31 options) Reviews written in another language come with Google's translation into this one in textTranslated. The original text is always kept. en
concurrency integer How many places are read at the same time. 3
proxyConfiguration object Off by default: Google answers these requests directly. If Google starts refusing, the run switches to Apify Proxy on its own. {"useApifyProxy":false}

How much does the Google Maps Reviews Scraper - Exact Dates, Replies & Photos cost?

from $0.53 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.00445 to $0.005
Review Each Google Maps review written to the dataset, with its place data. Error rows are free. $0.000534 to $0.0006

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the Google Maps Reviews Scraper - Exact Dates, Replies & Photos API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST Β· run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~google-maps-reviews-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [
      {
        "url": "https://www.google.com/maps/place/Katz%27s+Delicatessen/data=!4m2!3m1!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"
      }
    ],
    "maxItems": 10,
    "maxPlacesPerSearch": 5,
    "sort": "newest",
    "onlyWithText": false
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/place/Katz%27s+Delicatessen/data=!4m2!3m1!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"
    }
  ],
  "maxItems": 10,
  "maxPlacesPerSearch": 5,
  "sort": "newest",
  "onlyWithText": false
}

What do users say about the Google Maps Reviews Scraper - Exact Dates, Replies & Photos?

No reviews yet. Be the first.

How do I report an issue with the Google Maps Reviews Scraper - Exact Dates, Replies & Photos?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run Google Maps Reviews Scraper - Exact Dates, Replies & Photos on Apify All scrapers