Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $0.40 / 1,000 results

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

Extract business data from Google Maps: names, ratings, reviews, phone numbers, addresses, websites, and Plus Codes. Deep extraction visits each business for accurate, complete data. Ideal for lead generation, market research, and local SEO analysis.

Pricing

from $0.40 / 1,000 results

Rating

0.0

(0)

Developer

Fer

Fer

Maintained by Community

Actor stats

0

Bookmarked

73

Total users

3

Monthly active users

3 days ago

Last modified

Share

🗺️ Google Maps Scraper - Fast Business Data Extractor

A fast, browser-free Google Maps scraper - with reviews included at no extra cost. Type a search like dentists in Austin TX and get a clean table of businesses with ratings, review counts, phone numbers, websites, full addresses, opening hours, coordinates, Google place IDs and up to 50 individual reviews per place. Built for lead generation, market research, reputation monitoring, competitor analysis and local SEO.

⭐ Reviews are included in the per-place price. You pay per place, not per review: each place can carry up to 50 reviews (text, stars, reviewer, date, photos, owner response) for no extra charge. Need more? Up to 500 reviews per place, with reviews beyond the first 50 at $0.10 per 1,000.

Apify Store Price


✨ Features

  • ⚡ Fast and lightweight - no browser: the Actor reads Google's own data over plain HTTP. A typical 5-place run with reviews finishes in seconds. Runs use 512 MB of memory by default, enough for 500 reviews per place.
  • ⭐ Reviews included at no extra cost - up to 50 reviews per place with text, stars, date, reviewer, Local Guide flag, photos, owner response and Google's translation. Sort by newest, most relevant, highest or lowest rating.
  • 🎯 Rich business data - name, categories, rating, review count, phone, website, structured address, opening hours, coordinates, Plus Code, place ID and CID, photo.
  • 📄 Pagination - up to 500 places per search term (see limits below), de-duplicated by place ID.
  • 🌍 Any language and location - choose the result language and optionally append a location to every search term.
  • 🧹 Clean output - real website URLs (no Google redirect links) and null for anything Google doesn't show.
  • 🔁 Resilient - automatic retries with fresh proxy sessions, clear error logs if Google changes its format.

🚀 Quick Start

  1. Enter your search terms, exactly as you'd type them into Google Maps (e.g. coffee shops in Brooklyn, lawyers in Miami).
  2. Set "Max places per search term" (default: 5).
  3. Choose how many reviews you want per place (default: 5; up to 50 included free, up to 500 in total) or switch reviews off.
  4. Run the Actor.
  5. Download the data as JSON, CSV, Excel, or use the API and integrations.

Example input

{
"searchTerms": ["dentists", "orthodontists"],
"location": "Austin TX",
"maxItems": 60,
"language": "en",
"includeReviews": true,
"maxReviewsPerPlace": 20,
"reviewsSort": "newest",
"proxyConfiguration": { "useApifyProxy": true }
}

Example output

{
"title": "Blue Brown Cafe",
"rank": 1,
"placeId": "ChIJKzSxhq9ZwokRORBmuUsFrlY",
"cid": "6245935556000616505",
"category": "Coffee shop",
"categories": ["Coffee shop", "Bakery", "Breakfast restaurant", "Cafe"],
"rating": 4.9,
"reviewsCount": 324,
"priceLevel": null,
"address": "45 Havemeyer St, Brooklyn, NY 11211",
"street": "45 Havemeyer St",
"city": "Brooklyn",
"state": "New York",
"postalCode": "11211",
"countryCode": "US",
"neighborhood": "Williamsburg",
"plusCode": "87G8P28W+4F",
"latitude": 40.7152536,
"longitude": -73.953849,
"phone": null,
"phoneUnformatted": null,
"website": "http://www.bluebrowncafe.com/",
"openingHours": [
{ "day": "Monday", "hours": "7:30 AM–4:30 PM" },
{ "day": "Saturday", "hours": "8 AM–5 PM" }
],
"permanentlyClosed": false,
"temporarilyClosed": false,
"imageUrl": "https://lh3.googleusercontent.com/...=w800-h600-k-no",
"googleUrl": "https://www.google.com/maps/place/?q=place_id:ChIJKzSxhq9ZwokRORBmuUsFrlY",
"reviews": [
{
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xoMGNHaDVTRFJRT0hCMlQxWjFkM05IV1VkSlJFRRAB",
"reviewerName": "Wuttichai Kailum",
"reviewerId": "105895146313287772912",
"reviewerUrl": "https://www.google.com/maps/contrib/105895146313287772912/reviews",
"reviewerPhotoUrl": "https://lh3.googleusercontent.com/a-/...",
"reviewerNumberOfReviews": 106,
"isLocalGuide": true,
"stars": 5,
"text": "Absolutely loved this little neighborhood cafe...",
"textTranslated": null,
"originalLanguage": "en",
"publishedAt": "2026-05-18T04:23:52.144Z",
"publishedAtText": "4 months ago",
"likesCount": null,
"reviewImageUrls": ["https://lh3.googleusercontent.com/grass-cs/...=k-no"],
"ownerResponseText": "Thank you so much for your review!",
"ownerResponseTextTranslated": null,
"ownerResponsePublishedAt": null,
"ownerResponsePublishedAtText": "4 months ago",
"reviewUrl": "https://www.google.com/maps/reviews/data=..."
}
],
"searchTerm": "coffee shops in Brooklyn",
"scrapedAt": "2026-10-08T02:30:00.000Z"
}

(openingHours and reviews are shortened here; the real output lists all seven days and the requested number of reviews.)


📋 Input

ParameterTypeRequiredDescriptionDefault
searchTermsArray of strings✅ YesWhat to search for, as typed into Google Maps["coffee shops in Brooklyn"]
maxItemsIntegerNoMax places per search term (1–500)5
locationStringNoText appended to every search term, e.g. Austin TXempty
languageStringNoGoogle language code for results (en, es, de, fr, pt-BR, ...)en
includeReviewsBooleanNoAttach individual reviews to every place (no extra cost)true
maxReviewsPerPlaceIntegerNoReviews per place, 0–500. Up to 50 reviews per place included free; additional reviews $0.10 per 1,0005
reviewsSortStringNonewest, mostRelevant, highestRating or lowestRatingnewest
reviewsLanguageStringNoLanguage code for reviews; Google favors reviews in this language and translates the restsame as language
proxyConfigurationObjectNoProxy settings (Apify Proxy recommended){ "useApifyProxy": true }

Search tips

  • Include a location in the term or use the location field: pizza in SoHo Manhattan, plumbers 78701.
  • Need more than ~120 places? Google Maps returns at most about 120–160 places per query. Split the area into several terms (neighborhoods, ZIP codes, nearby cities).
  • Multiple terms are scraped independently; a place found by several terms is returned only once.

📊 Output fields

Every place has the fields below. Anything Google Maps doesn't show for a place (no phone, no website, no reviews yet, no hours) is null; the only exception is reviews, which is always an array (empty when there are none).

FieldDescription
titleBusiness name
rankPosition in the Google Maps results for the search term
placeIdGoogle Place ID (use with the Google Places API)
cidGoogle CID; https://maps.google.com/?cid=<cid> opens the place
categoryMain category
categoriesAll categories (array)
ratingAverage rating, 0–5
reviewsCountTotal number of reviews
priceLevelPrice level such as $$ when Google provides it
addressFull address
street, city, state, postalCode, countryCode, neighborhoodStructured address parts
plusCodePlus Code (Open Location Code) computed from the coordinates
latitude, longitudeCoordinates
phonePhone number as shown on Google Maps
phoneUnformattedPhone number in international E.164 format
websiteBusiness website (clean URL, not a Google redirect)
openingHoursOpening hours per day: [{ "day": "Monday", "hours": "9 AM–5 PM" }, ...]
permanentlyClosed, temporarilyClosedClosure flags
imageUrlMain photo
googleUrlLink to the place on Google Maps
reviewsIndividual reviews (array, see below). Empty [] when reviews are switched off or the place has none
searchTermThe search term that found the place
scrapedAtWhen the place was scraped (ISO 8601)

Review fields

Each entry in reviews has the fields below; missing values are null.

FieldDescription
reviewIdGoogle's review ID
reviewerName, reviewerId, reviewerUrl, reviewerPhotoUrlWho wrote the review
reviewerNumberOfReviewsHow many reviews the reviewer has written
isLocalGuideWhether the reviewer is a Google Local Guide
starsRating given, 1–5
textReview text in its original language (null for rating-only reviews)
textTranslatedGoogle's translation into the reviews language, when the review is in another language
originalLanguageLanguage code of the review, e.g. en, es
publishedAtPublication date (ISO 8601)
publishedAtTextDate as Google shows it, e.g. 3 months ago
likesCountAlways null: Google doesn't expose "helpful" votes in this data
reviewImageUrlsPhotos attached to the review
ownerResponseText, ownerResponseTextTranslatedThe owner's reply and its translation
ownerResponsePublishedAtTextReply date as Google shows it (ownerResponsePublishedAt is null: Google only gives a relative date)
reviewUrlDirect link to the review on Google Maps

If a search term returns nothing, no row is added to the dataset (so you are never charged for an empty search). Instead, the log shows a warning and the run's default key-value store gets a RUN_SUMMARY record with per-term counts, for example:

{
"status": "completed",
"stopReason": null,
"places": 60,
"totalReviews": 1200,
"freeReviews": 1200,
"extraReviewsCharged": 0,
"searchTerms": [
{ "searchTerm": "dentists in Austin TX", "places": 60, "status": "ok" },
{ "searchTerm": "qwzxkjv plorfnax", "places": 0, "status": "no_results" }
]
}

If no search term finds anything, the run still finishes successfully with a status message explaining that nothing was found.

The dataset has four views in Apify Console: Overview, Contacts & location, Reviews (one row per review) and All fields.


💡 Use cases

  • Lead generation - build lists of local businesses with phone numbers and websites for outreach.
  • Reputation monitoring and sentiment analysis - collect the newest or lowest-rated reviews of your locations or competitors.
  • Market research - map competitors, their ratings and review volume in a city or neighborhood.
  • Local SEO - check NAP (name, address, phone) consistency and track rankings for a search term via rank.
  • Location analytics - use coordinates and categories to analyze business density.

💰 Pricing

  • $0.40 per 1,000 places, reviews (up to 50 per place) included at no extra cost.
  • Need more reviews? Up to 500 per place; every review beyond the first 50 of a place costs $0.10 per 1,000.
  • Searches that find nothing are free: they never create a paid dataset row.
  • Spending limits are respected: when a run reaches your maximum cost per run (or maximum number of paid results), it stops cleanly, keeps everything collected so far and finishes as Succeeded with a status message.
  • Use maxItems and maxReviewsPerPlace to cap the results (and cost) of each run.
  • Memory: runs use 512 MB by default, which covers up to 500 reviews per place. Runs with up to 50 reviews per place also work on 256 MB if you want to lower platform usage. Large runs can take several minutes, so keep the run timeout at 1 hour or more.

💡 How it compares: many Google Maps scrapers charge per place and again per review, or sell reviews as a separate, pricier add-on. Here a place with 50 reviews costs the same as a place without reviews, and because the Actor doesn't run a browser, platform usage stays minimal.


❓ FAQ and limits

How fast is it? A run with the default input (5 places with 5 reviews each) usually takes a few seconds of scraping, plus the container start-up time on Apify. Each page of 20 places is one HTTP request, and the reviews of each place are fetched in parallel (one request per 50 reviews).

Why do I get fewer places than maxItems? Google Maps stops returning results after roughly 120–160 places per query, and some queries simply have fewer matches. Use more specific or more numerous search terms to cover a larger area.

Why is reviewsCount or phone sometimes null? null means Google Maps doesn't show that value for the place (e.g. no phone listed, no reviews yet). Google occasionally answers with a reduced response without review counts; the Actor detects this and retries with a new proxy session, so this should be rare.

Do reviews cost extra? Not up to 50 per place: those are included in the per-place price. If you set maxReviewsPerPlace above 50, each additional review costs $0.10 per 1,000 (e.g. 200 reviews for one place = 150 paid reviews = $0.015). Set maxReviewsPerPlace to 0 or includeReviews to false if you don't need reviews.

What happens when my spending limit is reached? The Actor stops starting new work, saves the places in progress (fetching only as many extra reviews as the remaining budget allows) and finishes as Succeeded with a status message. RUN_SUMMARY shows "status": "stopped_at_limit".

Why does a place have fewer reviews than maxReviewsPerPlace? The place has fewer reviews than requested. If Google temporarily fails to return reviews for a place, the place is still saved (with the reviews collected so far) and the log shows a warning.

Why are some reviews in other languages? Google favors reviews in reviewsLanguage (or language) but also returns reviews written in other languages; for those, textTranslated holds Google's translation.

Is priceLevel always filled? No. Google doesn't include price information in many search responses, so it is often null.

What about CAPTCHAs and blocking? Requests go through Apify Proxy with automatic session rotation and retries. If Google changes its response format, the run log shows a clear error.

Is scraping Google Maps legal? Scraping publicly available data is generally allowed, but you are responsible for how you use it. Respect Google's terms and data protection laws (GDPR, CCPA) when processing personal data.


📝 Changelog

October 2026 (reviews)

  • New: individual reviews included at no extra cost - up to 50 per place, with sort order and language options (includeReviews, maxReviewsPerPlace, reviewsSort, reviewsLanguage).
  • New dataset view: Reviews (one row per review).
  • Up to 500 reviews per place (reviews beyond 50 per place: $0.10 per 1,000).
  • Empty searches no longer create a dataset row; see RUN_SUMMARY in the key-value store.
  • Spending limits are respected: runs stop cleanly and succeed when the limit is reached.
  • Lower platform cost: reviews are fetched without extra request-queue writes.
  • Fixed: out-of-memory crashes on large runs with many reviews; memory now stays flat (300 places × 50 reviews fit in 256 MB, 500 reviews per place in 512 MB). Default memory is 512 MB.
  • If a run fails unexpectedly, it ends with a status message saying how many places were saved, and RUN_SUMMARY records the error.

October 2026

  • Rewritten to plain HTTP (no browser): much faster and lighter.
  • New fields: placeId, cid, categories, latitude/longitude, structured address, openingHours, closure flags, priceLevel, imageUrl, rank, phoneUnformatted.
  • New inputs: language and location. Pagination up to 500 places per term, de-duplicated by place ID.
  • Fixed: reviewsCount no longer copies the rating digits; website URLs are clean; missing values are null.
  • Fixed: Actor passes the Apify automated quality test with the default input.

April 2026

  • Initial release.

🛟 Support

Report bugs or request features in the Actor's Issues tab in Apify Console.


Enjoying this Actor?

If it saved you time, a quick review on the Apify Store helps others find it and helps us keep improving it.

Found a bug or need a feature? Open an issue — we reply fast.