Google Maps Scraper

  • compass/crawler-google-places
  • Modified
  • Users 42.6k
  • Runs 4.4M
  • Created by Author's avatarCompass

Extract data from hundreds of Google Maps businesses and locations in seconds. Get Google Maps data including reviews, images, opening hours, location, popular times & more. Go beyond the limits of the official Google Places API. Download data with Google Maps extractor in JSON, CSV, Excel and more.

📍 What is Google Maps Scraper?

This tool expands Google Maps data extraction beyond the official Google Places API's limitations. It offers greater speed and enables scraping of various details like names, contact info, reviews, popular times, ratings, geolocation, and more. You can scrape by search query, location, coordinates, or URL, targeting a few places, a city, or an entire area.

🗺 How can I use Google Maps Scraper?

This tool can be used on the Apify platform or locally; it covers the following features:

  • Scraping data from Google Maps - by URL or search query
  • Getting over the limitation of Google Maps of showing no more than 120 places per map
  • Defining search area for scraping by country, state, US county, city, or postal code
  • Scraping areas by coordinates and arbitrary locations present on OpenStreetMap
  • Language & translation settings
  • City-focused scraping
  • Automatic zooming by searched area
  • Reviews scraping, sorting and filtering
  • Browser & scraping configuration
  • API, webhooks and integrations with other tools
  • Visual representation of scraped data on a map

With this unofficial Google Maps API, you can extract all of the following data from Google Maps: (see many more output examples in Output examples ⬇️). Here's the amount of data you'd get for a single scraped place (this one 📍 so you can compare)

Example of 1 scraped restaurant in New York: [ { "url": "'s+Island/@40.5107736,-74.2482624,17z/data=!4m6!3m5!1s0x89c3ca9c11f90c25:0x6cc8dba851799f09!8m2!3d40.5107736!4d-74.2482624!16s%2Fg%2F1tmgdcj8?hl=en&entry=ttu", "searchString": null, "rank": null, "searchPageUrl": null, "searchPageLoadedUrl": null, "isAdvertisement": false, "title": "Kim's Island", "description": null, "price": "$", "categoryName": "Chinese restaurant", "address": "175 Main St, Staten Island, NY 10307, United States", "neighborhood": "175 Main St", "street": "175 Main St", "city": "Staten Island", "postalCode": "10307", "state": "New York", "countryCode": "US", "website": "", "phone": "+1 718-356-5168", "phoneUnformatted": "+17183565168", "claimThisBusiness": false, "location": { "lat": 40.5107736, "lng": -74.2482624 }, "locatedIn": null, "plusCode": "GQ62+8M New York, USA", "menu": "", "totalScore": 4.6, "permanentlyClosed": false, "temporarilyClosed": false, "placeId": "ChIJJQz5EZzKw4kRCZ95UajbyGw", "categories": [ "Chinese restaurant", "Meal delivery" ], "cid": "7838756667406262025", "reviewsCount": 83, "reviewsDistribution": { "oneStar": 3, "twoStar": 3, "threeStar": 3, "fourStar": 9, "fiveStar": 65 }, "imagesCount": 28, "scrapedAt": "2023-06-13T18:05:20.602Z", "reserveTableUrl": null, "googleFoodUrl": null, "hotelStars": null, "hotelDescription": null, "checkInDate": null, "checkOutDate": null, "similarHotelsNearby": null, "openingHours": [ { "day": "Monday", "hours": "Closed" }, { "day": "Tuesday", "hours": "11 AM to 9:30 PM" }, { "day": "Wednesday", "hours": "11 AM to 9:30 PM" }, { "day": "Thursday", "hours": "11 AM to 9:30 PM" }, { "day": "Friday", "hours": "11 AM to 10:30 PM" }, { "day": "Saturday", "hours": "11 AM to 10:30 PM" }, { "day": "Sunday", "hours": "12 to 9:30 PM" } ], "peopleAlsoSearch": [ { "category": "People also search for", "title": "Peking Taste", "reviewsCount": 53, "totalScore": 3.5 }, { "category": "People also search for", "title": "New Island", "reviewsCount": 94, "totalScore": 4 }, { "category": "People also search for", "title": "Chef Hong II", "reviewsCount": 114, "totalScore": 4.3 }, { "category": "People also search for", "title": "Pacific Kitchen", "reviewsCount": 99, "totalScore": 4.4 }, { "category": "People also search for", "title": "Foo Sing", "reviewsCount": 44, "totalScore": 4 } ], "placesTags": [], "reviewsTags": [ { "title": "prices", "count": 6 }, { "title": "delivery", "count": 4 }, { "title": "spareribs", "count": 3 } ], "additionalInfo": { "Service options": [ { "Delivery": true }, { "Takeaway": true }, { "Dine-in": true } ], "Popular for": [ { "Lunch": true }, { "Dinner": true }, { "Solo dining": true } ], "Accessibility": [ { "Wheelchair-accessible entrance": true } ], "Offerings": [ { "Comfort food": true }, { "Healthy options": true }, { "Quick bite": true }, { "Small plates": true } ], "Dining options": [ { "Lunch": true }, { "Dinner": true } ], "Amenities": [ { "Good for kids": true } ], "Atmosphere": [ { "Casual": true } ], "Payments": [ { "Credit cards": true }, { "Debit cards": true }, { "NFC mobile payments": true }, { "Credit cards": true } ] }, "gasPrices": [], "questionsAndAnswers": null, "updatesFromCustomers": null, "webResults": [], "orderBy": [ { "name": "", "url": "" } ], "imageUrls": [], "reviews": [] ] } ]

💰 How much will scraping Google Maps cost you?

In our experience, you can get between 15,000 and 20,000 results within the $49 Starter plan. However, when it comes to scraping, it can be challenging to estimate the resources needed to extract data as use cases may vary significantly. That's why the best course of action is to run a test scrape with a small sample of input data and limited output. You’ll get your price per scrape, which you’ll then have to multiply by the number of scrapes you intend to do.

Watch this video for a few helpful tips. And don't forget that choosing a higher plan will save you money in the long run.

⬇️ Input example

The input for Google Maps Scraper should be either a Google Maps URL or a location + search term combo. You can also set up extracting any details on top such as images, reviews, amenities, and so on. For a full explanation of input, head over to the input tab.

You can set up the input programmatically or use the fields in scraper’s interface:

⬆️ Output example

The results will be wrapped into a dataset which you can find in the Storage tab. Note that the output is organized in table and tabs for viewing convenience:

Once the run is finished, you can download the dataset in various data formats (JSON, CSV, Excel, and more). Note that you can always set up additional fields for specific Google Maps data.

The scraper also automatically creates a map page that visualizes the scraped places and stores that into the Key-Value Store of the run.

This is what you’d get for:

⭐️ Reviews

"reviews": [ { "name": "Richard Chan", "text": "This place has incredible service. The food here is great and the dumplings are immaculate. All the staff members are incredibly nice and friendly. You can also tell that they reguraly change their oil based on the taste. They also offer to bring my food out too me due to me being to big to fit through the door. This place is a 10/10 and I would recommend friends and family coming to eat in this place.", "textTranslated": null, "publishAt": "11 months ago", "publishedAtDate": "2022-06-16T18:22:02.601Z", "likesCount": 3, "reviewId": "ChdDSUhNMG9nS0VJQ0FnSUNPcmE2YXRRRRAB", "reviewUrl": "[!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSUNPcmE2YXRRRRAB!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgICOra6atQE|CgwIyumtlQYQkMDpngI|?hl=en-US](!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSUNPcmE2YXRRRRAB!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgICOra6atQE%7CCgwIyumtlQYQkMDpngI%7C?hl=en-US)", "reviewerId": "115487239877451343603", "reviewerUrl": "", "reviewerPhotoUrl": "", "reviewerNumberOfReviews": 3, "isLocalGuide": false, "stars": 5, "rating": null, "responseFromOwnerDate": null, "responseFromOwnerText": null, "reviewImageUrls": [], "reviewContext": {}, "reviewDetailedRating": {} }, { "name": "Katelyn Cohen", "text": "I been going here for 11 years me and my family love the food it has good prices I go here all the time best place to get Chinese food in the world and NY", "textTranslated": null, "publishAt": "2 years ago", "publishedAtDate": "2020-12-24T01:36:17.156Z", "likesCount": 3, "reviewId": "ChdDSUhNMG9nS0VJQ0FnSURTNXMzdjRnRRAB", "reviewUrl": "[!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSURTNXMzdjRnRRAB!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgIDS5s3v4gE|CgsIkeGP_wUQ4OfsSg|?hl=en-US](!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSURTNXMzdjRnRRAB!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgIDS5s3v4gE%7CCgsIkeGP_wUQ4OfsSg%7C?hl=en-US)", "reviewerId": "104641749393917170180", "reviewerUrl": "", "reviewerPhotoUrl": "", "reviewerNumberOfReviews": 2, "isLocalGuide": false, "stars": 5, "rating": null, "responseFromOwnerDate": "2021-01-23T20:14:35.853Z", "responseFromOwnerText": "Thank you for your support and trust,it’s our pleasure!😊", "reviewImageUrls": [ "", "" ], "reviewContext": {}, "reviewDetailedRating": {} }, { "name": "Christina Salama", "text": "Have been coming here for years! Always friendly and helpful! Great service and delicious food", "textTranslated": null, "publishAt": "5 months ago", "publishedAtDate": "2022-12-16T02:37:24.946Z", "likesCount": 1, "reviewId": "ChZDSUhNMG9nS0VJQ0FnSUNCcUp2Y0JREAE", "reviewUrl": "[!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUNCcUp2Y0JREAE!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgICBqJvcBQ|CgwI5LPvnAYQwLHEwwM|?hl=en-US](!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUNCcUp2Y0JREAE!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgICBqJvcBQ%7CCgwI5LPvnAYQwLHEwwM%7C?hl=en-US)", "reviewerId": "107079941106356720274", "reviewerUrl": "", "reviewerPhotoUrl": "", "reviewerNumberOfReviews": 4, "isLocalGuide": false, "stars": 5, "rating": null, "responseFromOwnerDate": null, "responseFromOwnerText": null, "reviewImageUrls": [], "reviewContext": {}, "reviewDetailedRating": {} }, { "name": "Elliot G", "text": "Best place in Tottenville area. Foods allways good. And comes on time.", "textTranslated": null, "publishAt": "4 months ago", "publishedAtDate": "2023-01-29T19:03:54.247Z", "likesCount": 1, "reviewId": "ChdDSUhNMG9nS0VJQ0FnSURCdThTZGdRRRAB", "reviewUrl": "[!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSURCdThTZGdRRRAB!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgIDBu8SdgQE|CgsImobbngYQsJ2Gdg|?hl=en-US](!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSURCdThTZGdRRRAB!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgIDBu8SdgQE%7CCgsImobbngYQsJ2Gdg%7C?hl=en-US)", "reviewerId": "115712866476698751099", "reviewerUrl": "", "reviewerPhotoUrl": "", "reviewerNumberOfReviews": 7, "isLocalGuide": false, "stars": 5, "rating": null, "responseFromOwnerDate": null, "responseFromOwnerText": null, "reviewImageUrls": [], "reviewContext": {}, "reviewDetailedRating": { "Food": 4, "Service": 5, "Atmosphere": 4 } }, { "name": "Joan", "text": "I just ordered the boneless spareribs combo. I just want you to know the spareribs were great, but the fried rice tastes disgusting. Maybe it is old and shouldn't be used anymore or it was just a bad day.", "textTranslated": null, "publishAt": "10 months ago", "publishedAtDate": "2022-08-02T22:06:02.619Z", "likesCount": 0, "reviewId": "ChZDSUhNMG9nS0VJQ0FnSUN1dGVPU0xBEAE", "reviewUrl": "[!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUN1dGVPU0xBEAE!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgICuteOSLA|CgwIyr-mlwYQqJWwpwI|?hl=en-US](!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUN1dGVPU0xBEAE!2m1!1s0x0:0x6cc8dba851799f09!3m1!1s2@1:CIHM0ogKEICAgICuteOSLA%7CCgwIyr-mlwYQqJWwpwI%7C?hl=en-US)", "reviewerId": "110503721202693066085", "reviewerUrl": "", "reviewerPhotoUrl": "", "reviewerNumberOfReviews": 9, "isLocalGuide": false, "stars": 3, "rating": null, "responseFromOwnerDate": null, "responseFromOwnerText": null, "reviewImageUrls": [], "reviewContext": { "Service": "Delivery", "Meal type": "Dinner", "Price per person": "$10–20" }, "reviewDetailedRating": {} }, ]

📊 Popular times

"popularTimesHistogram": { "Su": [ { "hour": 6, "occupancyPercent": 0 }, // etc... ], "Mo": [ { "hour": 6, "occupancyPercent": 0 }, // etc... ], // etc... },

⌚️ Opening hours

"openingHours": [ { "day": "Monday", "hours": "10:30 AM to 11 PM" }, { "day": "Tuesday", "hours": "10:30 AM to 11 PM" }, { "day": "Wednesday", "hours": "10:30 AM to 11 PM" }, { "day": "Thursday", "hours": "10:30 AM to 11 PM" }, { "day": "Friday", "hours": "10:30 AM to 12 AM" }, { "day": "Saturday", "hours": "11 AM to 12 AM" }, { "day": "Sunday", "hours": "11 AM to 10 PM" } ]

🧑‍🦽Additional info

"additionalInfo": { "Service options": [ { "Outdoor seating": true }, { "Delivery": true }, { "Takeout": true }, { "Dine-in": true } ], "Accessibility": [ { "Wheelchair accessible entrance": true }, { "Wheelchair accessible parking lot": true }, { "Wheelchair accessible restroom": true }, { "Wheelchair accessible seating": true } ], "Offerings": [ { "Alcohol": true }, { "Beer": true }, { "Coffee": true }, { "Happy hour food": true }, { "Hard liquor": true }, { "Wine": true } ], "Dining options": [ { "Lunch": true }, { "Dinner": true }, { "Dessert": true }, { "Seating": true } ], "Amenities": [ { "Bar onsite": true }, { "Good for kids": true }, { "Restroom": true }, { "Free Wi-Fi": true } ], "Atmosphere": [ { "Casual": true }, { "Cozy": true } ], "Crowd": [ { "Groups": true } ], "Planning": [ { "Accepts reservations": true } ], "Payments": [ { "Debit cards": true }, { "NFC mobile payments": true }, { "Credit cards": true } ] }

🏨 Hotels

"moreHotelsOptions": [ { "url": "<>", "title": "", "price": "$303" }, { "url": "<>", "title": "", "price": "$303" }, ], "similarHotelsNearby": [ { "name": "Residence U Malvaz", "rating": 4.3, "reviews": 406, "description": "Cozy hotel offering a restaurant", "price": "$70" }, { "name": "Hotel U Zlatého Stromu", "rating": 3.6, "reviews": 656, "description": "Refined rooms, plus breakfast & dining", "price": "$64" }, ], "hotelReviewSummary": { "overall": { "rating": 4.3, "rooms": { "rating": 3.4, "reviews": [ "Guests liked the large rooms, though some said they were dated & maintenance could be improved", "Rooms had views", "Some guests mentioned bathroom cleanliness could be improved" ] }, "location": { "rating": 4.35, "reviews": [ "Near the city center; shopping, sightseeing, restaurants & bars nearby", "Near public transit & the train station", "Easily accessible by car" ] }, "servicesAndFacilities": { "rating": 4.2, "reviews": [ "Guests appreciated the friendly, professional staff", "Conference space", "Some guests said management could be improved" ] } }, }

✍️ Updates from customers

"updatesFromCustomers": { "text": "Disneyland California Adventure small area with large park all inclusive celebrations. This is a glimpse into Los Reyes parade. I'm a true fan. Thanks", "language": "en", "postDate": "a week ago", "postedBy": { "name": "Kayla Arredondo", "url": "<>", "title": "Local Guide", "totalReviews": 225 }, "media": [ { "link": "<>", "postTime": "a week ago" } ] }

❓Questions and answers

"questionsAndAnswers": { "question": "Which is the best easier way to drop off a family to Disneyland Park", "answer": "best way for drop off family is at down town Disney. Drop them off then you can take a short walk to the park. ", "askDate": "5 years ago", "askedBy": { "name": "Cecilia Salcedo", "url": "<>" }, "answerDate": "5 years ago", "answeredBy": { "name": "Gabby Lujan", "url": "<>" } }

🌐 Web results

"webResults": [ { "title": "Hotel & restaurant SIGNAL, Pardubice – Updated 2023 Prices", "displayedUrl": "<> › hotel › signal", "description": "Located 1.2 mi from Pardubice city center, this hotel offers a ... Josefa Janáčka 708, Pardubice, 53012, Czech Republic – Great location - show map." }, { "title": "Hotel & restaurant SIGNAL, Pardubice -", "displayedUrl": "<> › signal.en-gb.html", "description": "Located 2 km from Pardubice city centre, this hotel offers a traditional ... Josefa Janáčka 708, Pardubice, 53012, Czech Republic – Great location - show ..." }, { "title": "Hotel & restaurant SIGNAL, Pardubice - 2023 Reviews ...", "displayedUrl": "<> › ... › Pardubice Hotels", "description": "Hotel & restaurant SIGNAL. Josefa Janáčka 708, Pardubice III, Pardubice, Czech Republic, 53012 - See map." } ],

🏩 External places (hotels)
Google sometimes shows these places when searching in certain locations, mainly for hotels. They are however not regular places with pins on the map and offer only some of the regular output fields. These places are marked with 3 extra output fields:

{ "url": " Eairy Furnished Apartments Al Madinah 9/@24.4857006,39.6083984,14z/data=!3m1!4b1!4m9!3m8!5m2!4m1!1i2!8m2!3d24.4857006!4d39.6083984!16s%2Fg%2F11pkhzvq1s!17BQ0FF", "isExternalServicePlace": true, "externalServiceProvider": "SuperTravel", "externalId": "/g/11pkhzvq1s" }

🧑‍🏫 How do I use Google Maps Scraper?

To understand how to set up and run the scraper, you can follow our step-by-step guide or watch a short video tutorial ▷ on YouTube.

You can also follow our extended guide on how to use the Google Maps Scraper geolocation features (scraping by coordinates or applying map zoom) 🛰 .

Location, country, state, county, city, and postal code

Using free text locationQuery (or Location field) should normally be enough. But you can instead use a combination of country, state, county, city, and postalCode if Location isn’t specific enough for your search.

This scraper uses Open Street Map for geolocation API. You can easily check the location matching your geolocation input on the official Open Street Map page.

📡 Define the search area

This section will teach you to customize geolocation features, overcome the 120 results limit or skip large areas such as lakes or forests. You can also follow this video guide or this step-by-step explanation.

🔎 Automatic zooming to overcome the Google Maps limit

If you look at Google Maps website, you’ll notice that when zooming out, you can see less of Google places pins. You'll also notice that zooming in on smaller areas (making zoom higher) can uncover many of those hidden pins. The advantage of higher zoom is that it can find - and scrape - more places (shown as pins). However, locations with higher zoom also take significantly longer to scrape and are more computationally expensive. Generally, there are diminishing returns for increasing zoom.

By default, you don’t have to set up this parameter. The scraper automatically zooms on the location on Google Maps to ensure the most efficient scraping based on the size of the scraped area. But of course, you can override the default zoom. zoom can be any number between 1 (a whole globe) and 21 (a few houses). Currently, example zoom values for various locations are (maximum for automatic is 17):

  • United States - 10 zoom (10,371,139 km2)
  • Germany - 12 zoom (380,878 km2)
  • London - 15 zoom (1,595 km2)
  • Manhattan - 16 zoom (87.5 km2)
  • Soho - 17 zoom (0.35 km2)

If you need guidance on how to run the Google Maps Scraper with zoom, follow our step-by-step tutorial 🔗 or video guide ▷ on YouTube.

🏙 Deeper city scrape

Enabling deeperCityScrape option enables you to extract significantly more places from larger areas because each city in the region usually has a thicker concentration of Google places. It also helps the Google Maps Scraper to skip areas without any population such as deserts, mountains, or oceans. The scraper simply won’t be wasting any of your time or compute units for those and will focus on the cities instead. This option is especially useful for scraping places in countries with vast unpopulated areas such as Australia or Canada.

Note that enabling this feature will increase the runtime (by extracting more places). This feature will likely become a default setting in the near future but is currently opt-in to allow for a smooth transition.

🛰 Custom search area

If your location can’t be found on Google Maps or you want to customize it for a specific area, you can use the Custom search area function. You’ll have to provide coordinate pairs for an area and the scraper will create start URLs out of them. As an example, see the geojson field in Nominatim Api (example of Cambridge in Great Britain).

There are several types of search area geometry that you can use in Google Maps Scraper: Polygon, MultiPolygon and Point (Circle). All of them follow the official Geo Json RFC and all types are supported. We’ve found the polygons and circle to be the most useful ones when it comes to scraping.

Note that the order of longitude and latitude is reversed in GeoJson 🔄 compared to the Google Maps website. The first field must be longitude ↕️, the second field must be latitude ↔️.

We recommend using to create customGeolocation of any type/shape in correct format. You can watch this video on how to use it together with our scraper.

💠 Polygon

The most common type is a polygon, which is a set of points that define the scraped area. Note that the first and last pair of coordinates must be identical (to close the polygon). This example covers most of the city of London, UK:

{ "type": "Polygon", "coordinates": [ [ [ // Must be the same as last one -0.322813, // Longitude 51.597165 // Latitude ], [ -0.314990, 51.388023 ], [ 0.060493, 51.389199 ], [ 0.051936, 51.600360 ], [ // Must be the same as the first one -0.322813, 51.597165 ] // ... ] ] }

💠💠 MultiPolygon

MultiPolygon can combine more polygons that are not continuous together (can be an island + part of mainland). Same as with the polygon, make sure the first and the last pair of coordinates in each polygon are identical.

{ "type": "MultiPolygon", "coordinates": [ [ // first polygon [ [ 12.0905752, // Longitude 50.2524063 // Latitude ], [ 12.1269337, 50.2324336 ], // ... ] ], [ // second polygon // ... ] ] }

🔘 Circle

For a circle, we can use the Point type with our custom parameter radiusKm. Don't forget to change the radius to fit your needs. This example covers the city of Basel in Switzerland:

{ "type": "Point", "coordinates": ["7.5503", "47.5590"], "radiusKm": 8 }

🛠 Advanced configuration

One review per row

Normally, each result item will contain data about a single place. Each item is displayed as one row in tabulated formats. There is a lot of data about each place, so the tabulated formats get very messy and hard to analyze. Fortunately, there is a solution.

You can tick on the oneReviewPerRow input toggle to get one review per row as output. If you already have a dataset and need to adjust its format, read further.

For example, if you need to analyze reviews, you can configure the download to only contain the data you need and adjust the row/column format. Here's how to get a list of reviews with a place title for one review per row:

  • copy the download link in the format you need
  • paste it to a different tab
  • add &unwind=reviews&fields=reviews,title at the end of the link URL
  • then press Enter to download it.

unwind=reviews part here means that each review will have its own row. fields=reviews,title means that only reviews and titles will be downloaded, skipping the other data. Otherwise, the output would be very big. However, it might not be a problem if you don't use fields at all.

The whole download link for, e.g. CSV would look like this (together with dataset ID):,title

If you don't use oneReviewPerRow, each output place item can contain a maximum of 5,000 reviews. So if there are more reviews for that place, a duplicate place will be stored with the next 5,000 reviews, and so on. For instance, in a case of 50,000 reviews, the resulting dataset will have 10 items for the same place. We have this limitation due to the size limit of a single item in the Apify dataset.


📚 Resources on how to scrape Google Maps

  1. Step-by-step guide on how to use Google Maps Scraper.
  2. Video tutorial ▷ on how to use Google Maps Scraper.
  3. Input tab with all the technical parameters of this scraper.
  4. Is web scraping legal? - your extended reference to ethical scraping.
  5. Step-by-step guide on how to use geolocation features.
  6. Video tutorial ▷ on how to use geolocation features.
  7. Platform pricing page with pricing specifications.
  8. Video guide ▷ on how to choose the right subscription plan.
  9. Webinar on scraping Google Maps with detailed answers on data extraction cases from Google Maps. 10.Comprehensive guide on Google Maps scraping: images, restaurants, franchises, placeid, scraping the places from the whole country or city.

What Google Maps data can I scrape?

With this Google Maps scraper, what you see is what you get. You can use this tool to get the following data from Google Maps:

🔗 Title/name 📝 Subtitle, category, place ID, and URL
📍 Address🌍 Location, plus code and exact coordinates
☎️ Phone🌐 Website, if available
🏷 Menu💲 Price bracket
🔒 Temporarily or permanently closed status⛽️ Gas prices
⭐️ Average rating (totalScore)📊 Review count and review distribution
➕ List of detailed characteristics (additionalInfo)📸 List of images
🧑‍🍳 Opening hours⌚️ Popular times - histogram & live occupancy
🏨 Hotel booking URL and price + nearby hotels🔍 People also search
🙋 Updates from customers & Questions and answers🌐 Web results

Can I use the Google Maps scraper to extract Google reviews?

Yes. This Google Maps scraper also supports the extraction of detailed information about reviews on Google Maps. Note that Personal data extraction about reviewers is also possible but has to be explicitly enabled in input (see the Legality of scraping Google Maps section).

📝 Review text📅 Published date
🌟 Stars🆔 Review ID & URL
✅ Response from the owner - text📷 List of review images
💬 Review context📊 Detailed rating per service
🧛 Reviewer’s name ✍️ Reviewer’s number of reviews
🖼 Reviewer’s ID, URL & photo 👋 IsLocalGuide

How does Google Maps Scraper work?

It works exactly as if you were searching through Google Maps and copying information from each page you find. It opens the Google Maps website, goes to a specified location, then writes your search query into the search bar. Then it scrolls down until it reaches the final page or maxCrawledPlacesPerSearch. It enqueues all the places as separate pages and then copypastes all visible data into an organized document. To understand the process fully, just try it out in your browser - the scraper does exactly the same thing, only much faster.

Can I scrape places from multiple locations?

While Google Maps Scraper supports only single location query, you can use Google Maps Scraper Orchestrator to scrape multiple locations with a single list. It will automatically run the Google Maps Scraper for each location in the list and merge the results. It also fully uses your Apify account memory for maximum speed.

How can I increase the speed of the scraper?

You can increase the run memory up to 32 GB per run. To speed up the scraping even more, you can run several runs at once to fully utilize all your account memory. To make this simpler, you can use the Google Maps Scraper Orchestrator to split locations or search terms over multiple runs, deduplicate the results and collect them to a single dataset.

What are the disadvantages of the Google Maps API?

With the Google Maps API, you get $200 worth of credit usage every month free of charge. That means 28,500 map loads per month. However, the Google Maps API caps your search results to 60, regardless of the radius you specify. So, if you want to scrape data for bars in New York, for example, you'll get results for only 60 of the thousands of bars in the area.

Google Maps Scraper imposes no rate limits or quotas and provides more cost-effective, comprehensive results, and also scrapes histograms for popular times, which aren't available in the official API.

Web scraping is legal if you are extracting publicly available data which is most data on Google Maps. However, you should respect boundaries such as personal data and intellectual property regulations. You should only scrape personal data if you have a legitimate reason to do so, and you should also factor in Google's Terms of Use.

Want to build your own Google Maps scraper?

Google Maps Scraper doesn’t exactly do what you need? You can always build your own! We have various scraper templates in Python, JavaScript, and TypeScript to get you started. Alternatively, you can write it from scratch using our open-source library Crawlee. You can keep the scraper to yourself or make it public by adding it to Apify Store (and find users for it).

Or let us know if you need a custom scraping solution.

What are other tools for scraping Google Maps services?

Use the dedicated scrapers below if you want to scrape specific Google Maps data. Each of them is built particularly for the relevant map scraping case be it reviews only, gas prices, OCR from pins, or itineraries. Feel free to browse them:

📩 Google Maps Email Extractor⭐️ Google Maps Reviews Scraper
📍 Google Places API Radar Search⛽️ Gas Prices Scraper

Can I integrate Google Maps Scraper with other apps?

Last but not least, Google Maps Scraper can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. You can integrate with Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and more. Or you can use webhooks to carry out an action whenever an event occurs, e.g. get a notification whenever Google Maps Scraper successfully finishes a run.

Can I use Google Maps Scraper with the API?

The Apify API gives you programmatic access to the Apify platform. The API is organized around RESTful HTTP endpoints that enable you to manage, schedule, and run Apify actors. The API also lets you access any datasets, monitor actor performance, fetch results, create and update versions, and more.

To access the API using Node.js, use the apify-client NPM package. To access the API using Python, use the apify-client PyPI package.

Check out the Apify API reference docs for full details or click on the API tab for code examples or this videoguide.

What can I use the extracted data from Google Maps for?

📊 Create a potential customer base and prospection files

🔍 Find new clients

🎯 Generate leads

🔎 Search and analyze businesses similar to yours

📈 Monitor brand sentiment and service quality, and identify fake reviews

🛒 Find where to buy products

🌍 Analyze geospatial data for scientific or engineering work

💼 Develop a working market strategy

Your feedback

We’re always working on improving the performance of our Actors. So if you’ve got any technical feedback for Google Maps Scraper or simply found a bug, please create an issue on the Actor’s Issues tab in Apify Console.