Google Maps Reviews Scraper & Place Contact Details avatar

Google Maps Reviews Scraper & Place Contact Details

Under maintenance

Pricing

from $5.99 / 1,000 results

Go to Apify Store
Google Maps Reviews Scraper & Place Contact Details

Google Maps Reviews Scraper & Place Contact Details

Under maintenance

Google Maps Reviews Scraper & Place Contact Details extracts business reviews, ratings, reviewer data, addresses, phone numbers, websites, opening hours, categories, and other public place information. Ideal for local market research, reputation analysis, lead generation, and competitor insights.

Pricing

from $5.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

0

Monthly active users

2 days ago

Last modified

Share

Google Maps Reviews Scraper — Reviews, Phone, Website & Hours

Google Maps Reviews Scraper & Place Contact Details extracts every review for a Google Maps place — rating, text, reviewer, owner reply, photos, context chips — and attaches that place's own published contact block (phone, website, opening hours, plus code, timezone, editorial summary) to every single row. The contact block is read out of a response the run already downloads, so it costs no extra requests. Every run returns clean, typed JSON, ready to load into a spreadsheet, a CRM, or pass straight to an LLM as context. Point it at a place URL or a Place ID and it does the rest.

What is Google Maps Reviews Scraper & Place Contact Details?

It's an Apify Actor that opens a Google Maps place in reviews mode, scrolls the live review feed, and reads every review card straight out of the rendered DOM — no Google Places API key, no login. On the same pass it captures the /maps/preview/place response Google's own page fires to render the listing, and reads the place's phone, website, weekly opening hours, Plus Code, timezone and editorial summary out of that response at fixed, validated positions. That's the differentiator: contact enrichment that rides along on data the scrape already paid for, instead of a second lookup per place.

No Google account, Places API key, or login is required to run it.

  • Full review record: star rating, review text, reviewer profile, Local Guide status, photos, owner reply, review-context chips, per-aspect sub-ratings
  • Place contact block on every row: phone (display + E.164), click-to-call link, website, weekly opening hours, Plus Code, IANA timezone, Google's editorial summary
  • Sort control matching Google Maps itself: newest, most relevant, highest rating, lowest rating
  • Date filtering: an exact cutoff date or a relative window (7 days to 2 years)
  • 15 interface languages, applied the one way Google actually honors it
  • Two lead filters — keep only places with a published website, or only reviews with no owner reply yet — applied before you're charged

What data can you get with Google Maps Reviews Scraper & Place Contact Details?

Every dataset row is one review, carrying its own fields plus the review's parent place record and that place's contact block.

Result typeExtracted fieldsPrimary use case
Reviewname, stars, text, publishAt, publishedAtDate, likesCount, isLocalGuide, reviewerNumberOfReviews, reviewImageUrls, reviewContext, reviewDetailedRating, responseFromOwnerText, responseFromOwnerDate, originalLanguage, reviewId, reviewUrlSentiment tracking, reputation-management triage
Place contact detailsplacePhone, placePhoneInternational, placePhoneLink, placeWebsite, placeWebsiteDomain, placePlusCode, placePlusCodeCompound, placeTimezone, placeEditorialSummary, placeOpeningHours, placeOpeningHoursToday, placeOpeningHoursText, placeHasPhone, placeHasWebsite, contactFetched, contactSourceLocal lead generation, outreach lists, CRM enrichment
Place & business recordtitle, placeId, address, neighborhood, street, city, state, postalCode, countryCode, categoryName, categories, price, totalScore, reviewsCount, location, url, imageUrlLocal SEO audits, competitor monitoring

Place contact details

This is the reason the Actor exists. While the browser is on the reviews tab, Google's own page fires a /maps/preview/place XHR to render the listing header — the Actor reads that response twice (a small stub, then the full ~470 KB record) and pulls the contact fields out of fixed, shape-validated positions in the rich one. Nothing is guessed: a field Google doesn't publish for a place is written as null, never a placeholder. There is no "claimed / unclaimed" flag in the output, because Google's place record carries no such marker to read.

{
"placePhone": "(212) 353-0200",
"placePhoneInternational": "+12123530200",
"placePhoneLink": "tel:+12123530200",
"placeWebsite": "https://www.boucherieus.com/",
"placeWebsiteDomain": "boucherieus.com",
"placeOpeningHoursToday": "Monday: 11 AM–12 AM",
"contactFetched": true
}

Review

Each review card is expanded before it's read, so the context chips (reviewContext, e.g. {"Service": "Dine in"}) and per-aspect sub-ratings (reviewDetailedRating, e.g. {"Food": 5}) are captured, not just the star total. hasOwnerReply is computed on the spot from responseFromOwnerText, so a reputation-management queue can be built with one filter instead of a null check.

How does Google Maps Reviews Scraper & Place Contact Details differ from the official Google Places API?

Google's own Places API (New) can return a place's reviews and contact fields, but on stricter terms: the reviews[] field on the Place resource is capped at 5 reviews per place, sorted by relevance, with no pagination to reach older ones — and both reviews and the contact fields (nationalPhoneNumber, websiteUri, currentOpeningHours) live behind the paid Enterprise + Atmosphere SKU, which requires a Google Cloud project, an API key, and billing enabled.

FeatureGoogle Places API (New)Google Maps Reviews Scraper & Place Contact Details
Reviews per placeMax 5, sorted by relevance, no paginationUp to 1,000 (maxReviews), 4 sort orders
Date filtering on reviewsNoneAbsolute date or relative window
Contact fields (phone, website, hours)Enterprise + Atmosphere SKU onlyIncluded on every row by default
Owner replies / review context chipsNot returnedresponseFromOwnerText, reviewContext, reviewDetailedRating
SetupGoogle Cloud project, API key, billingApify account only
Cost modelPer-SKU API pricingOne charge per saved review row

Use the official API when you already operate inside Google Cloud and 5 recent reviews per place is enough for your use case. Use this Actor when you need review depth, review-level filtering, or owner-reply tracking that the API's 5-review cap can't give you.

(Places API reviews-field and SKU details verified against Google's current REST API reference and Place Details documentation.)

How to scrape Google Maps with Google Maps Reviews Scraper & Place Contact Details?

  1. Open the Actor's page on the Apify Store and click Try for free (or start it from your Apify Console if you already have access).
  2. Paste one or more Google Maps place URLs into startUrls, or raw Place IDs (ChIJ…) into placeIds — one of the two is the only thing you need to supply.
  3. Set the review controls that matter to you: maxReviews, reviewsSort, language, and optionally reviewsStartDateAbsolute or reviewsStartDateRelative to cap how far back it goes.
  4. Click Start.
  5. When the run finishes, open the Dataset tab and export the review + contact rows as JSON, CSV, Excel, or pull them via the Apify API.

How to run multiple places in one job

Add more than one entry to startUrls and/or placeIds — every entry in either array is scraped in the same run, with the same maxReviews, sort, language and filter settings applied to each place. maxPlacesToEnrich (default 100, max 1000) caps how many of those places receive a contact block if you paste a very large list; places past the cap still return their reviews.

⬇️ Input

startUrls and placeIds are both optional individually, but the Actor needs at least one entry across the two to have anything to scrape.

ParameterRequiredTypeConstraintsDescription
startUrlsNoarrayeditor: stringListGoogle Maps place URLs. Every review scraped from a URL here also carries that place's phone, website, opening hours, plus code, timezone and editorial summary. Plain strings and {"url": "..."} objects both work.
placeIdsNoarrayeditor: stringListRaw Google Place IDs (ChIJ...). Each one is resolved to its canonical Maps URL and enriched exactly like a pasted URL.
includePlaceContactNobooleandefault trueAttach the place's published contact block to every review row: placePhone, placePhoneInternational, placeWebsite, placePlusCode, placeTimezone, placeEditorialSummary and the weekly opening hours. This data rides along on the /maps/preview/place response the scraper already downloads, so it costs zero extra requests. Turn off only if you want review rows alone.
includeOpeningHoursNobooleandefault trueAdds placeOpeningHours (7 rows of day + hours + calendar date), placeOpeningHoursText (one readable line) and placeOpeningHoursToday (today's row, resolved in the place's own timezone). Turn off for a narrower table.
maxPlacesToEnrichNointegermin 1, max 1000, default 100Hard safety cap on how many distinct input places receive a contact block. It is a guard-rail, not a cost saver — the contact data is free. Places beyond the cap still return their reviews, with contactFetched: false and null contact columns, and the skip is logged.
onlyPlacesWithWebsiteNobooleandefault falseDrops every review row of a place whose Google listing has no website link. Dropped rows are never charged. The check runs after the place's reviews are collected, so a place with no website simply saves 0 rows and says so in the log.
onlyUnansweredReviewsNobooleandefault falseKeeps only rows where hasOwnerReply is false — the actual work queue for a reputation-management outreach list. Dropped rows are never charged and the drop count is logged.
maxReviewsNointegermin 1, max 1000, default 10Maximum number of reviews to extract per place. Reviews are read by scrolling the live Maps feed, so large values take proportionally longer (roughly 5 s of scrolling budget per requested review, capped at 55 minutes per place).
reviewsSortNostringenum: newest, mostRelevant, highestRanking, lowestRanking; default newestSort exactly like Google Maps: newest, most relevant, highest rating, or lowest rating.
reviewsStartDateAbsoluteNostringeditor: datepicker, default ""Exact calendar date (YYYY-MM-DD). Reviews older than this cutoff are skipped. Google publishes only a relative age per review ("3 months ago"), so this cutoff is applied to the derived date and is accurate to the published bucket, not to the day.
reviewsStartDateRelativeNostringenum: "" (No relative filter), 7 days, 1 month, 3 months, 6 months, 1 year, 2 years; editor: select, default ""Relative time window, used when the absolute date is empty. Same bucket-level accuracy as the absolute cutoff.
languageNostringenum: en, es, fr, de, it, pt, nl, bn, hi, ar, tr, id, ja, ko, zh-CN; editor: select, default enInterface language for the Maps pages that are scraped. Applied as hl=<code>&gl=us in the page URL, which is the only mechanism Google honours. Affects localized text such as publishAt, categories, price and the review-context chip labels. publishedAtDate is derived from the relative age and is most reliable with English.
personalDataNobooleandefault trueWhen disabled, name, reviewerId, reviewerUrl, reviewerPhotoUrl and reviewUrl are emitted as null in every row.
proxyNoobjecteditor: jsonOptional custom proxy. Set use_proxy: true together with host and port to route the browser through your own proxy; username/password may stay empty for unauthenticated proxies. Leave as-is to use Apify Residential (US), which is the default transport and includes 3 automatic IP rotations.

Example JSON input

{
"startUrls": [
"https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/data=!4m6!3m5!1s0x89c259a1ec5f5573:0x2fc6687f46f682d5!8m2!3d40.7372552!4d-73.9882246!16s%2Fg%2F11hbv5rh0_"
],
"placeIds": [],
"includePlaceContact": true,
"includeOpeningHours": true,
"maxPlacesToEnrich": 100,
"onlyPlacesWithWebsite": false,
"onlyUnansweredReviews": false,
"maxReviews": 25,
"reviewsSort": "newest",
"reviewsStartDateAbsolute": "",
"reviewsStartDateRelative": "3 months",
"language": "en",
"personalData": true,
"proxy": { "use_proxy": false, "host": "", "port": 0, "username": "", "password": "" }
}

Pitfall to avoid: date filtering is bucket-level accurate, not day-level accurate. Google only ever publishes a relative age ("29 days ago"), never an exact date, so a review at the edge of your cutoff can land on either side of it depending on which relative bucket Google happened to render. Use reviewsStartDateAbsolute/reviewsStartDateRelative to narrow the window, not to draw a hard line on a specific day.

⬆️ Output

Every run produces one dataset row per review — flat, typed JSON, consistent across runs — exportable from the Apify platform as JSON, CSV, Excel, HTML table, or RSS, or pulled directly through the Apify API. A row carries 59 keys: the review itself, the place record it belongs to, and (unless turned off) that place's contact block.

Scraped results

[
{
"searchString": "https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/...",
"reviewerId": "112233445566778899001",
"reviewerUrl": "https://www.google.com/maps/contrib/112233445566778899001",
"name": "Alex Morgan",
"reviewerNumberOfReviews": 87,
"isLocalGuide": true,
"reviewerPhotoUrl": "https://lh3.googleusercontent.com/a-/ALV-abc123=s1920",
"text": "Great steak, attentive service, would come back for the absinthe menu alone.",
"publishAt": "3 weeks ago",
"publishedAtDate": "2026-07-26T00:00:00.000Z",
"likesCount": 4,
"reviewId": "ChdDSUhNMG9nS0VJQ0FnSURBd2JpZTNBRRAB",
"reviewUrl": "https://www.google.com/maps/reviews/data=!4m6!14m5!1m4!2m3!1sChdDSUhNMG9nS0VJQ0FnSURBd2JpZTNBRRAB!2m1!1s0x0:0x2fc6687f46f682d5?hl=en",
"stars": 5,
"responseFromOwnerDate": "2 weeks ago",
"responseFromOwnerText": "Thank you Alex, hope to see you again soon!",
"reviewImageUrls": ["https://lh3.googleusercontent.com/p/AF1QipP..."],
"reviewContext": { "Service": "Dine in", "Meal type": "Dinner" },
"reviewDetailedRating": { "Food": 5, "Service": 5, "Atmosphere": 4 },
"originalLanguage": "en",
"placeId": "ChIJc1X17aFZwokRVYL2RH9oxi8",
"location": { "lat": 40.7372552, "lng": -73.9882246 },
"address": "225 Park Ave S, New York, NY 10003",
"neighborhood": "Gramercy Park",
"street": "225 Park Ave S",
"city": "New York",
"postalCode": "10003",
"state": "NY",
"countryCode": "US",
"categoryName": "French restaurant",
"categories": ["French restaurant", "Steak house", "Bar"],
"title": "Boucherie Union Square",
"totalScore": 4.6,
"reviewsCount": 3821,
"url": "https://www.google.com/maps/search/?api=1&query=Boucherie+Union+Square&query_place_id=ChIJc1X17aFZwokRVYL2RH9oxi8",
"price": "$50–100",
"cid": "3448396509128194261",
"fid": "0x89c259a1ec5f5573:0x2fc6687f46f682d5",
"imageUrl": "https://lh3.googleusercontent.com/p/AF1QipMain...=w408-h306-k-no",
"scrapedAt": "2026-08-16T14:02:11.481Z",
"language": "en",
"placeContact": {
"phone": "(212) 353-0200",
"phoneInternational": "+12123530200",
"phoneLink": "tel:+12123530200",
"website": "https://www.boucherieus.com/",
"websiteDomain": "boucherieus.com",
"plusCodeGlobal": "87G8P2P6+WP",
"plusCodeCompound": "P2P6+WP New York",
"timezone": "America/New_York",
"editorialSummary": "Bistro for dry-aged steaks and other French fare, with a bar that's strong on absinthe.",
"priceLevel": "$50–100",
"openingHours": [
{ "day": "Sunday", "hours": "10 AM–12 AM", "date": "2026-08-16" }
],
"openingHoursToday": "Sunday: 10 AM–12 AM"
},
"placePhone": "(212) 353-0200",
"placePhoneInternational": "+12123530200",
"placePhoneLink": "tel:+12123530200",
"placeWebsite": "https://www.boucherieus.com/",
"placeWebsiteDomain": "boucherieus.com",
"placePlusCode": "87G8P2P6+WP",
"placePlusCodeCompound": "P2P6+WP New York",
"placeTimezone": "America/New_York",
"placeEditorialSummary": "Bistro for dry-aged steaks and other French fare, with a bar that's strong on absinthe.",
"placeOpeningHours": [
{ "day": "Sunday", "hours": "10 AM–12 AM", "date": "2026-08-16" }
],
"placeOpeningHoursToday": "Sunday: 10 AM–12 AM",
"placeOpeningHoursText": "Sunday: 10 AM–12 AM; Monday: 11 AM–12 AM; Tuesday: 11 AM–12 AM; Wednesday: 11 AM–12 AM; Thursday: 11 AM–12 AM; Friday: 11 AM–12 AM; Saturday: 10 AM–12 AM",
"placeHasPhone": true,
"placeHasWebsite": true,
"hasOwnerReply": true,
"contactFetched": true,
"contactSource": "maps-preview-place-payload"
},
{
"searchString": "https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/...",
"reviewerId": "998877665544332211000",
"reviewerUrl": "https://www.google.com/maps/contrib/998877665544332211000",
"name": "Priya Nair",
"reviewerNumberOfReviews": 12,
"isLocalGuide": false,
"reviewerPhotoUrl": "https://lh3.googleusercontent.com/a-/ALV-def456=s1920",
"text": "Solid brunch spot, a bit loud on weekends.",
"publishAt": "2 months ago",
"publishedAtDate": "2026-06-01T00:00:00.000Z",
"likesCount": 0,
"reviewId": "ChdDSUhNMG9nS0VJQ0FnSURBd2plNEJGEAE",
"reviewUrl": "https://www.google.com/maps/reviews/data=!4m6!14m5!1m4!2m3!1sChdDSUhNMG9nS0VJQ0FnSURBd2plNEJGEAE!2m1!1s0x0:0x2fc6687f46f682d5?hl=en",
"stars": 4,
"responseFromOwnerDate": null,
"responseFromOwnerText": null,
"reviewImageUrls": [],
"reviewContext": {},
"reviewDetailedRating": {},
"originalLanguage": "en",
"placeId": "ChIJc1X17aFZwokRVYL2RH9oxi8",
"location": { "lat": 40.7372552, "lng": -73.9882246 },
"address": "225 Park Ave S, New York, NY 10003",
"neighborhood": "Gramercy Park",
"street": "225 Park Ave S",
"city": "New York",
"postalCode": "10003",
"state": "NY",
"countryCode": "US",
"categoryName": "French restaurant",
"categories": ["French restaurant", "Steak house", "Bar"],
"title": "Boucherie Union Square",
"totalScore": 4.6,
"reviewsCount": 3821,
"url": "https://www.google.com/maps/search/?api=1&query=Boucherie+Union+Square&query_place_id=ChIJc1X17aFZwokRVYL2RH9oxi8",
"price": "$50–100",
"cid": "3448396509128194261",
"fid": "0x89c259a1ec5f5573:0x2fc6687f46f682d5",
"imageUrl": "https://lh3.googleusercontent.com/p/AF1QipMain...=w408-h306-k-no",
"scrapedAt": "2026-08-16T14:02:14.902Z",
"language": "en",
"placeContact": { "phone": "(212) 353-0200", "phoneInternational": "+12123530200", "phoneLink": "tel:+12123530200", "website": "https://www.boucherieus.com/", "websiteDomain": "boucherieus.com", "plusCodeGlobal": "87G8P2P6+WP", "plusCodeCompound": "P2P6+WP New York", "timezone": "America/New_York", "editorialSummary": "Bistro for dry-aged steaks and other French fare, with a bar that's strong on absinthe.", "priceLevel": "$50–100", "openingHours": [{ "day": "Sunday", "hours": "10 AM–12 AM", "date": "2026-08-16" }], "openingHoursToday": "Sunday: 10 AM–12 AM" },
"placePhone": "(212) 353-0200",
"placePhoneInternational": "+12123530200",
"placePhoneLink": "tel:+12123530200",
"placeWebsite": "https://www.boucherieus.com/",
"placeWebsiteDomain": "boucherieus.com",
"placePlusCode": "87G8P2P6+WP",
"placePlusCodeCompound": "P2P6+WP New York",
"placeTimezone": "America/New_York",
"placeEditorialSummary": "Bistro for dry-aged steaks and other French fare, with a bar that's strong on absinthe.",
"placeOpeningHours": [{ "day": "Sunday", "hours": "10 AM–12 AM", "date": "2026-08-16" }],
"placeOpeningHoursToday": "Sunday: 10 AM–12 AM",
"placeOpeningHoursText": "Sunday: 10 AM–12 AM; Monday: 11 AM–12 AM; Tuesday: 11 AM–12 AM; Wednesday: 11 AM–12 AM; Thursday: 11 AM–12 AM; Friday: 11 AM–12 AM; Saturday: 10 AM–12 AM",
"placeHasPhone": true,
"placeHasWebsite": true,
"hasOwnerReply": false,
"contactFetched": true,
"contactSource": "maps-preview-place-payload"
},
{
"searchString": "https://www.google.com/maps/place/Boucherie+Union+Square/@40.7372552,-73.9882246,17z/...",
"reviewerId": null,
"reviewerUrl": null,
"name": null,
"reviewerNumberOfReviews": 3,
"isLocalGuide": false,
"reviewerPhotoUrl": null,
"text": "Kind of pricey for what it is, but the ambiance is nice.",
"publishAt": "5 months ago",
"publishedAtDate": "2026-03-01T00:00:00.000Z",
"likesCount": 1,
"reviewId": "ChdDSUhNMG9nS0VJQ0FnSURBd2p1NkNIEAE",
"reviewUrl": null,
"stars": 3,
"responseFromOwnerDate": null,
"responseFromOwnerText": null,
"reviewImageUrls": [],
"reviewContext": { "Service": "Take out" },
"reviewDetailedRating": {},
"originalLanguage": "en",
"placeId": "ChIJc1X17aFZwokRVYL2RH9oxi8",
"location": { "lat": 40.7372552, "lng": -73.9882246 },
"address": "225 Park Ave S, New York, NY 10003",
"neighborhood": "Gramercy Park",
"street": "225 Park Ave S",
"city": "New York",
"postalCode": "10003",
"state": "NY",
"countryCode": "US",
"categoryName": "French restaurant",
"categories": ["French restaurant", "Steak house", "Bar"],
"title": "Boucherie Union Square",
"totalScore": 4.6,
"reviewsCount": 3821,
"url": "https://www.google.com/maps/search/?api=1&query=Boucherie+Union+Square&query_place_id=ChIJc1X17aFZwokRVYL2RH9oxi8",
"price": "$50–100",
"cid": "3448396509128194261",
"fid": "0x89c259a1ec5f5573:0x2fc6687f46f682d5",
"imageUrl": "https://lh3.googleusercontent.com/p/AF1QipMain...=w408-h306-k-no",
"scrapedAt": "2026-08-16T14:02:17.335Z",
"language": "en",
"placeContact": { "phone": "(212) 353-0200", "phoneInternational": "+12123530200", "phoneLink": "tel:+12123530200", "website": "https://www.boucherieus.com/", "websiteDomain": "boucherieus.com", "plusCodeGlobal": "87G8P2P6+WP", "plusCodeCompound": "P2P6+WP New York", "timezone": "America/New_York", "editorialSummary": "Bistro for dry-aged steaks and other French fare, with a bar that's strong on absinthe.", "priceLevel": "$50–100", "openingHours": [{ "day": "Sunday", "hours": "10 AM–12 AM", "date": "2026-08-16" }], "openingHoursToday": "Sunday: 10 AM–12 AM" },
"placePhone": "(212) 353-0200",
"placePhoneInternational": "+12123530200",
"placePhoneLink": "tel:+12123530200",
"placeWebsite": "https://www.boucherieus.com/",
"placeWebsiteDomain": "boucherieus.com",
"placePlusCode": "87G8P2P6+WP",
"placePlusCodeCompound": "P2P6+WP New York",
"placeTimezone": "America/New_York",
"placeEditorialSummary": "Bistro for dry-aged steaks and other French fare, with a bar that's strong on absinthe.",
"placeOpeningHours": [{ "day": "Sunday", "hours": "10 AM–12 AM", "date": "2026-08-16" }],
"placeOpeningHoursToday": "Sunday: 10 AM–12 AM",
"placeOpeningHoursText": "Sunday: 10 AM–12 AM; Monday: 11 AM–12 AM; Tuesday: 11 AM–12 AM; Wednesday: 11 AM–12 AM; Thursday: 11 AM–12 AM; Friday: 11 AM–12 AM; Saturday: 10 AM–12 AM",
"placeHasPhone": true,
"placeHasWebsite": true,
"hasOwnerReply": false,
"contactFetched": true,
"contactSource": "maps-preview-place-payload"
}
]

The third row above shows what personalData: false does — reviewerId, reviewerUrl, name, reviewerPhotoUrl and reviewUrl are blanked to null while every other field is unchanged.

⚠️ Google throttles automated review-feed requests, and a meaningful share of first attempts render zero review cards. The Actor recovers most of these automatically — reloading the feed in-session, then rotating to a fresh residential IP — but a heavily-hammered place can still return fewer reviews than maxReviews asked for; the run log always states the actual yield, never silently truncates.

How can I use the data extracted with Google Maps Reviews Scraper & Place Contact Details?

  • Local lead-generation and sales teams: filter onlyUnansweredReviews and onlyPlacesWithWebsite for a call list where every row already carries placePhone and placeWebsite — no separate contact lookup step.
  • Reputation-management agencies: track hasOwnerReply and responseFromOwnerText across a client's locations to find exactly which reviews still need a response, ranked by stars.
  • AI engineers and LLM developers: the Actor's dataset is structured JSON on request — an agent can call it with a place URL, receive the review set and contact block, and ground a "should I recommend this place" or "draft a reply to this review" answer without scraping anything itself.
  • Local SEO consultants: combine totalScore, reviewsCount, categories and placeOpeningHours across a client's locations and competitors for a single audit table.
  • Market researchers: compare reviewDetailedRating sub-scores (food, service, atmosphere) across a category of businesses in one city to spot where a segment is systematically underperforming.

How do you monitor place reputation and contact details over time?

Reputation and contact information both drift — a business changes its hours, updates its website, or a fresh 1-star review sits unanswered for weeks. Run the same startUrls/placeIds list on a schedule and diff the new dataset against the previous one on the fields that actually change: hasOwnerReply (did this review get answered?), stars and reviewsCount (is the average moving?), placeOpeningHoursToday/placeOpeningHoursText (did the listed hours change?), and placePhone/placeWebsite (did the published contact info change or disappear?).

A typical workflow: schedule a run across a watchlist of place URLs, keep onlyUnansweredReviews: true so each run's dataset is only the new work queue, then alert whenever a new row appears with stars <= 2 and hasOwnerReply: false. Apify's built-in Scheduler runs an Actor on a recurring cron-style interval and writes each run to its own dataset, which is what makes the diff-between-runs pattern possible without any code running outside the platform.

Integrate Google Maps Reviews Scraper & Place Contact Details and automate your workflow

Google Maps Reviews Scraper & Place Contact Details works with any language or tool that can send an HTTP request, through the standard Apify API.

REST API with Python

import requests
run = requests.post(
"https://api.apify.com/v2/acts/scrapier~google-maps-reviews-scraper-and-place-contact-details/run-sync-get-dataset-items",
params={"token": "<YOUR_APIFY_TOKEN>"},
json={
"startUrls": ["https://www.google.com/maps/place/Boucherie+Union+Square/..."],
"maxReviews": 25,
"onlyUnansweredReviews": True,
},
)
rows = run.json()
for row in rows:
print(row["title"], row["stars"], row["placePhone"])

MCP for query-grounded AI agents

The Actor is reachable through Apify's hosted MCP server at https://mcp.apify.com, which exposes any Apify Actor as a callable tool for MCP-compatible agent clients (Claude Desktop, Cursor, Claude Code). Register it with apify mcp install claude-code in the Apify CLI, or add https://mcp.apify.com?tools=scrapier/google-maps-reviews-scraper-and-place-contact-details as a custom connector. The agent flow: the user asks about a place's reviews or reputation, the agent calls the tool with a place URL, receives structured JSON back, and grounds its answer in the actual review and contact data instead of guessing.

Scheduled monitoring and delivery

Attach an Apify Schedule to this Actor to run it on a recurring interval with the same input, or poll the Dataset and Run endpoints from your own service after triggering a run through the API. There is no built-in webhook payload defined by this Actor's own code, so polling the run/dataset endpoints (or configuring an Apify platform-level webhook on run completion) is the supported delivery pattern.

Yes — scraping publicly accessible Google Maps pages for reviews and business listings that any visitor can see without logging in is generally lawful, and this Actor returns only that same public information. In hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019), the court held that scraping data a website makes publicly available does not, by itself, violate the U.S. Computer Fraud and Abuse Act.

This Actor's output includes reviewer personal data — name, reviewerUrl, reviewerPhotoUrl and a derived reviewerId — so GDPR (EU/UK) and CCPA (California) obligations apply if you store or process it: minimize what you keep, and use the personalData: false input to blank all five reviewer-identity fields at the source if you only need the business and rating data. The place record itself (name, address, phone, website, hours) is business data published by the business, governed more by Google's own Terms of Service and database-rights considerations than by personal-data law. Scraping for one-off operational monitoring and scraping at scale for AI-training corpora carry different risk profiles. Consult your legal team for commercial use cases involving bulk data storage.

Frequently asked questions

What languages can I scrape Google Maps reviews in?

15: English, Spanish, French, German, Italian, Portuguese, Dutch, Bengali, Hindi, Arabic, Turkish, Indonesian, Japanese, Korean, and Chinese (Simplified), set via the language input. It's applied as hl=<code>&gl=us in the page URL — the only mechanism Google actually honors; cookies, browser locale and the Accept-Language header are ignored.

Can I sort or filter the reviews I get back?

Yes. reviewsSort gives you Google's own four orders — newest, most relevant, highest rating, lowest rating — and reviewsStartDateAbsolute / reviewsStartDateRelative limit how far back reviews go. onlyUnansweredReviews and onlyPlacesWithWebsite narrow further, before you're charged for the row.

How does Google Maps Reviews Scraper & Place Contact Details handle Google's anti-bot measures?

It drives a real Playwright Chromium browser (not a keyless API call — Google's listugcposts endpoint returns HTTP 403 without a session), through Apify Residential proxies by default with automatic IP rotation on a blocked or low-yield attempt, plus stealth patches that mask common automation signals. When a load renders zero review cards, it first reloads the same page in-session, and only rotates to a fresh IP if that doesn't recover the feed.

Does it extract the place's phone number and website?

Yes — every review row carries placePhone, placePhoneInternational, placeWebsite, placeWebsiteDomain and the rest of the placeContact object, read from the same place-preview response the scrape already downloads. contactFetched: false on a row means one of three things (and the run log states which): includePlaceContact was turned off, that place exceeded maxPlacesToEnrich, or Google's place record didn't arrive on that attempt — it never means the business simply has no listed contact info.

How many reviews does it return per place?

Up to maxReviews (default 10, maximum 1000), governed by how many the actual scroll of Google's live feed can harvest for that place — a place with fewer total reviews than requested simply returns what exists.

How do I monitor a place's reviews and contact info over time?

Run the same place list on a recurring Apify Schedule and diff each run's dataset against the previous one on hasOwnerReply, stars, reviewsCount, placeOpeningHoursToday and placePhone/placeWebsite — see "How do you monitor place reputation and contact details over time?" above for the full pattern.

Does it work with Claude, ChatGPT, and AI agent frameworks?

Yes. It's reachable through Apify's hosted MCP server (https://mcp.apify.com) for MCP-compatible clients, and as a plain HTTP endpoint via the Apify API for any other agent framework that can send a request — both let an agent retrieve live review and contact data before answering.

How does Google Maps Reviews Scraper & Place Contact Details compare to other Google Maps review scrapers?

As checked on 2026-08-16, Apify's most-used Google Maps reviews Actor (Compass' Google Maps Reviews Scraper) returns review and basic place metadata but explicitly does not include phone numbers, websites, or opening hours, and lists a rate of $0.30 per 1,000 scraped reviews on its own listing. This Actor attaches the full contact block — phone, website, opening hours, Plus Code, timezone, editorial summary — to every row by default, at no extra cost, on top of the same review fields.

Can I use this Actor without managing proxies or a Google account?

Yes. Apify Residential (US) proxies with automatic rotation are the default transport, no setup required; you only need to supply your own proxy in the proxy input if you specifically want to route through one. No Google account, login, or Places API key is needed at any point.

Your feedback

Found a bug, or a field that doesn't match what's documented here? Let Scrapier know through the Actor's Issues tab on Apify, or via the support link on the Actor's Store page — reports get read and the source gets fixed.