Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Google Maps Reviews Scraper icon

Google Maps Reviews Scraper

Scrape Google Maps reviews: rating, full text, exact date, reviewer, owner reply and photos. Set a date cutoff. No API key. $0.27 per 1,000.

5 from 2 reviews on Apify 578 runs on Apify $0.00027 per review ($0.27 / 1,000)
Run this in the cloudRun on Apify →

Maps & Local Lead Generation

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust placeUrls, searchTerms, maxReviews (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00027 per review = $0.27 per 1,000

You are charged forWhenPrice
Review scrapedCharged once per Google Maps review row written to the dataset. Sample rows and diagnostic rows are never charged.$0.00027

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-15, and they are what you are actually charged.

Inputs

FieldWhat it doesType
placeUrlsGoogle Maps place links (https://www.google.com/maps/place/... or a maps.app.goo.gl short link), place IDs (ChIJ...), or numeric CIDs. Up to 50 per run. Copy the link straight from the address bar - all the extra junk in it is ignored.array
searchTermsBusiness names to find on Google Maps first, e.g. "Katz's Delicatessen New York". The top matching place is used. Include the town or city - a bare "Starbucks" can match anywhere in the world.array
maxReviewsTotal reviews to return across every place in this run. The budget is shared evenly between the places, so five places and 100 reviews gives you twenty of each. Hard ceiling 5,000. Keep it low while testing - you pay per review.integer
maxReviewsPerPlaceOptional cap for a single place, on top of the total above. Useful when one place has 50,000 reviews and you only want the latest 100 from each.integer
sortWhich reviews Google hands over first. Newest is the right choice for monitoring; Most relevant returns the longer, photo-heavy reviews Google promotes.string
reviewsSinceOptional cutoff. Either a date like 2026-01-01 or a window like "30 days". With Newest first the run stops paging a place as soon as it is past the cutoff, so a daily monitor costs a couple of requests instead of a full history pull.string
onlyWithTextGoogle counts a bare star rating with no words as a review. Turn this on to drop those, so you only pay for reviews that actually say something.boolean
languageTwo-letter language code for the reviews, e.g. en, de, fr, es. Reviews written in another language come back translated, with the writer's original wording kept in originalText.string
countryTwo-letter country code for the Google edition to read, e.g. us, gb, de. Mostly affects how dates and place names are written.string
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

targetplaceNameplaceUrlratingtextpublishedAtrelativeDatereviewerNamereviewerReviewsCountownerReplyreviewPhotosCount

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

1 ready-to-run use cases

Google Maps Reviews - Newest First

Get the newest Google reviews for a place: rating, text, reviewer and date. Paste the Maps link and run.

Related tools in Maps & Local Lead Generation

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Yandex Maps Scraper iconMaps & Local Lead Generation

Yandex Maps Scraper

Scrape Yandex Maps business listings: name, address, coordinates, rating, reviews, phone, website and hours. No API key. $0.40 per 1,000 places.

1 use cases

Google Maps Scraper iconMaps & Local Lead Generation

Google Maps Scraper

Scrape Google Maps places and reviews. Business name, category, address, rating, GPS coordinates and place ID. $0.27 per 1,000 rows.

28 use cases

Google Reviews Monitor — Multi-Location Alerts & Reports iconMaps & Local Lead Generation

Google Reviews Monitor — Multi-Location Alerts & Reports

Watch Google reviews for every location on a schedule. Get only the new ones, rating-drop alerts in Slack and AI reply drafts. $1.00 per 1,000 reviews.

4 use cases

2GIS Places Scraper iconMaps & Local Lead Generation

2GIS Places Scraper

Scrape 2GIS places: name, category, address, phone, email, website, rating and hours. Russia, the CIS, the UAE and Cyprus only. $0.50 per 1,000 places.

Ready to run — no setup

2GIS Reviews Scraper iconMaps & Local Lead Generation

2GIS Reviews Scraper

Scrape 2GIS reviews by place URL or city: rating, text, author, date, photos, owner replies. No API key. $0.50 per 1,000.

Ready to run — no setup

Yelp Scraper iconMaps & Local Lead Generation

Yelp Scraper

Scrape Yelp businesses and reviews through Yelp's official Fusion API. Get rating, review count, price, phone, address, GPS and text. Bring your own key.

Ready to run — no setup

See all Maps & Local Lead Generation →

Google Maps Reviews Scraper: every review for a place, no API key

Paste a Maps link, a place ID, a CID or just the business name, and get the reviews back as rows. Star rating, the full text, the exact date, who wrote it, whether the owner replied, and any photos attached. It keeps paging rather than stopping at the first screen.

Google itself is the limit, not the actor. A very large place hands out several thousand reviews and then stops issuing pages, so nobody can pull the complete history of a busy restaurant.

InputMaps links, place IDs, CIDs or business names, up to 50 per run
OutputOne row per review
Ceiling5,000 reviews per run
Account neededNone, and no Google API key
Price$0.27 per 1,000 reviews, flat on every plan

🔍 What Google Maps Reviews Scraper does

It takes whatever form of a place you happen to have and resolves it to the same place. A copied address-bar URL, a maps.app.goo.gl short link, a ChIJ… place ID, a numeric CID, or the plain name of the business. Then it reads the review list, paging until it has what you asked for or Google stops handing out pages.

You can point it at up to 50 places in one run and set a total row budget. That budget is split evenly between the places, so a chain audit gives you a comparable sample from every branch rather than all of it from the busiest one.

Reviews only. Opening hours, phone number, address, category and the overall star average are not part of this actor's output. The Google Maps Scraper linked below covers place details.

📥 What you give it

{
  "placeUrls": ["https://maps.app.goo.gl/abc123"],
  "maxReviews": 300,
  "maxReviewsPerPlace": 100,
  "sort": "newest",
  "language": "en"
}
FieldDefaultWhat it is
placeUrlsnoneMaps links, short links, place IDs or numeric CIDs. Up to 50. Paste the link exactly as the address bar gives it.
searchTermsnoneBusiness names, if you do not have links. Up to 50, and each resolves to Google's top match.
maxReviewsbox starts at 20Total across every place in the run, split evenly between them. Up to 5,000.
maxReviewsPerPlacenoneOptional cap per place, on top of the even split. Useful when one branch has 40,000 reviews and you want the newest hundred from each.
sortnewestnewest, relevant, highest or lowest.
reviewsSincenoneOnly reviews after this point. See the warning below.
onlyWithTextoffSkip star-only ratings with no words.
languageenWhich language Google should translate into.
countryusWhich country's Google to ask.
proxyUrlsnoneOptional. Your own servers, used exactly as given.

reviewsSince only understands two formats: a number of days like 30 days or 30d, or a real date like 2026-01-15. Anything else, including 2 weeks and 1 month, is ignored without complaint, and the run then pulls and bills the full history up to your caps. Use days or a date.

reviewsSince stops paging early only when sort is newest. On any other order the cutoff still filters rows, but the run reads further to find them.

📤 What you get back

A real row from a recent run, trimmed where the URLs run long:

{
  "ok": true,
  "charged": true,
  "recordType": "review",
  "placeName": "Starbucks Reserve Roastery",
  "placeUrl": "https://www.google.com/maps?cid=7899526995152106350",
  "placeId": "ChIJsU30zM1qkFQRbnOm1_LBoG0",
  "cid": "7899526995152106350",
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT21GRFdtSnpUV2xQYjFvM1kxbFRZMHhWVlRSMFRWRRAB",
  "rating": 5,
  "text": "It's gone ):",
  "originalText": null,
  "language": "en",
  "publishedAt": "2025-09-26T17:40:32.007Z",
  "relativeDate": "11 months ago",
  "reviewerName": "Daniel J",
  "reviewerUrl": "https://www.google.com/maps/contrib/103952951038275342964/reviews?hl=en-US",
  "reviewerReviewsCount": 142,
  "reviewerPhotosCount": 625,
  "isLocalGuide": true,
  "ownerReply": "Hi there! We're so glad you had a wonderful experience. Thanks for sharing it with us!",
  "ownerReplyRelativeDate": "11 months ago",
  "reviewPhotosCount": 1,
  "reviewPhotoUrls": ["https://lh3.googleusercontent.com/grass-cs/..."],
  "scrapedAt": "2026-09-21T01:45:28.154Z"
}
FieldWhat it is
publishedAtA real timestamp, worked back from Google's relative wording. relativeDate keeps the original "11 months ago".
reviewIdStable. Use it as your dedupe key across runs.
targetExactly what you typed for this place, so you can join results back to your own list.
text, originalTexttext is in the language you asked for. originalText holds the writer's own wording when a translation happened, and null when none did.
ownerReplyThe owner's response, or null.
isLocalGuideThe badge as true or false. Google's numeric level is not published here.
placeNamenull when you gave a bare ID or CID and Google returned no label. Everything else on the row still identifies the place.
reviewPhotoUrlsUp to 10 per review.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itCharged
A reviewcharged: true and a reviewIdyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

Filter on _sample and _diagnostic being absent, not on recordType. The free sample row also carries recordType: "review", so a filter on that alone keeps it.

The errorCode on a diagnostic row tells you which target had the problem:

CodeWhat it means
NO_PLACE_FOUNDThat business name matched nothing. Use its link or place ID instead.
NO_REVIEWSThe place resolved but has no reviews, or none survived your filters.
SHORTLINK_UNRESOLVEDA maps.app.goo.gl link would not expand. Open it once in a browser and paste the full URL.
PLACE_ID_UNRESOLVEDThe ID did not resolve to a place.
TIME_BUDGETThe run ran out of time. Everything already delivered is complete.
PROXY_INPUT_ADJUSTEDA network setting in your input was not usable, so the run used its own.
NETWORKGoogle was unreachable or answered badly. Re-run it.

One bad target never stops the others, and a diagnostic row never fails the run.

▶️ How to run it

1. Open Google Maps Reviews Scraper and click Try for free. 2. Paste one or more links into Place links or IDs, or type names into Business names. 3. Set Maximum reviews. Start around 20 to see the output shape. 4. Pick a Review order and a Language if the defaults do not suit you, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.27 per 1,000 reviews. Flat on every Apify plan, no volume tiers.

You pay per review row delivered. Reviews dropped by reviewsSince or onlyWithText, duplicates, sample rows and diagnostic rows are all free, and a place with no reviews costs you nothing.

💡 What people use it for

  • Watching what changed in a place's reviews since last month, on a schedule, using reviewsSince.
  • Auditing every branch of a chain on the same terms, with a per-place cap so one busy site does not

eat the budget.

  • Pulling the text of everything below three stars to find the complaint that keeps repeating.
  • Checking which reviews the owner replied to, and how fast, across a set of competitors' locations.

🚧 What it does not do

  • Reviews only. No opening hours, phone number, address, category, star average or total review

count.

  • Not the full history. Google stops issuing pages after a few thousand on large places, and the

hard ceiling here is 5,000 per run regardless.

  • Sorting is Google's, applied before paging. Asking for 20 sorted "highest" gives you the 20

highest Google serves first, not a true sort of the whole history.

  • Star-only ratings have no text, so text is null on those unless you switch on **Skip

star-only ratings**.

  • Translation is Google's, and its quality is not something this actor controls.
  • Photo links are Google CDN URLs. Stable for a long time, but not archival.
  • A name matching several places resolves to Google's top match, and a name with no city in it

can land on the wrong branch. For a specific place, use its link or place ID.

  • Rows are a snapshot. A review can be edited or deleted later, and scrapedAt records when it

was read.

  • The row budget splits evenly between your places. A place with fewer reviews than its share

returns fewer rows, and the leftover is not handed to the others.

🧭 Which Google scraper do you need?

If you wantUse
Reviews for places you can name or linkThis one
Place details, and reviews alongside themGoogle Maps Scraper
Reviews plus AI-drafted replies, on a scheduleGoogle Reviews Monitor
App store reviews insteadGoogle Play Reviews Scraper
Search resultsGoogle Search Results Scraper

❓ Questions people ask

Do I need a Google API key? No. Nothing to apply for, no quota to manage.

Can I monitor a place over time? Yes. Schedule it with reviewsSince set to something like 7 days and sort on newest, and each run picks up only what is new. reviewId makes deduping across runs straightforward.

Why did I get fewer reviews than I asked for? Either the place does not have that many, or Google stopped issuing pages. You are charged for what arrived.

Why is my date cutoff being ignored? Almost always the format. reviewsSince takes 30 days, 30d or a date like 2026-01-15. Wordings like 2 weeks are dropped silently.

Can I audit every branch of a chain? Feed the list of place IDs, set maxReviewsPerPlace, and you get a comparable sample from each branch in one run.

Is scraping Google reviews legal? These are public reviews on public place pages. They contain personal data all the same, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the place link and the run ID. The errorCode on the diagnostic row usually names the problem on its own.