Google Maps Scraper with Reviews avatar

Google Maps Scraper with Reviews

Pricing

from $2.00 / 1,000 place scrapeds

Go to Apify Store
Google Maps Scraper with Reviews

Google Maps Scraper with Reviews

Google Places API alternative. Get 60+ business attributes per place: names, phones, websites, hours, reviews, and coordinates. JSON, CSV, or Excel. Unlimited results per area, no per-request quota.

Pricing

from $2.00 / 1,000 place scrapeds

Rating

0.0

(0)

Developer

Thodor

Thodor

Maintained by Community

Actor stats

4

Bookmarked

149

Total users

23

Monthly active users

a day ago

Last modified

Share

A Google Places API alternative that returns Google Maps places and reviews as clean JSON, CSV, or Excel. No Google Cloud project, no API key, no per-SKU billing: phone, website, hours, coordinates, and 60+ business attributes are all included in the base rate.

Google's Places API (New) bills per request per SKU and caps every query at 60 results. This actor bills one rate per place with everything included, breaks Google Maps' 120-result cap by subdividing the target area automatically, and pulls full review history on demand instead of the API's 5 reviews per place.

📋 How to export Google Maps places to a spreadsheet

  1. Type what you're looking for in Search Query: dentist, restaurant, plumber.
  2. Type the area in Location: a city, region, address, or country. It is geocoded automatically.
  3. Click Start.
  4. Open the Output tab and click Export for CSV, Excel, JSON, or HTML. Google Sheets works through the Console integrations.

🎁 So what do you get?

📞 Phone, local and international🌐 Website⭐ Rating and review count
🕐 Full weekly opening hours📍 Coordinates and full address🏷️ Categories and price level
📝 Full review history, optional🎛️ 60+ business attributes🖼️ Primary photo
🆔 Stable place ID and CID🕒 Open or closed right now🌍 IANA timezone

⚖️ Compared to the Google Places API

Google Places API (New)This actor
💰 1,000 places❌ ~$32, contact and atmosphere data billed on top$2.00-3.00, everything included
📝 Reviews❌ 5 per place, maximum✅ Full history at $0.40 per 1,000
🖼️ Results per query❌ 60 max✅ Limited by area size, not a fixed cap
🔑 Access❌ Google Cloud project, API key, billing account✅ Register on Apify, $5 free monthly credit
📤 Output❌ JSON only✅ JSON, CSV, Excel, Google Sheets

Google's $32 is Place Details Pro on the 2026 price list, before the Photos, Contact Data, and Atmosphere Data SKUs stack on top.

🎯 Three things people run this for

How
📇 B2B lead listsTurn reviews off and you get every business in an area with its phone, website, and address, fast and cheap. Need emails too? Maps doesn't show them, so run the websites through the Email Scraper
📈 Local SEO monitoringRecurring run on a Schedule, diff rating, review_count, and opening_hours between runs to catch competitor movement
🗺️ Market research and store locatorsPull every business in a city, not just the 120 Google Maps normally stops at. Each place comes with coordinates, so the results drop straight onto a map or into your own app

📥 Input

{
"query": "dentist",
"location": "Austin, TX",
"max_results": 200
}
  • query: what to search for, like the Maps search bar
  • location: city, region, address, or country. Geocoded automatically
  • max_results: default 100. Caps billable places
  • scrape_reviews: default true. Fetch full review history per place, billed separately per review
  • max_reviews_per_place: default 500. Review cap per place
  • hl, gl: language and country codes, default en and us

📇 Fast lead list, no reviews

{"query": "dentist", "location": "Austin, TX", "max_results": 500, "scrape_reviews": false}

📝 Full review history for a market

{"query": "coffee shop", "location": "Brooklyn, NY", "max_results": 100, "max_reviews_per_place": 200}

🍕 Every review of one specific place

{"query": "La Donna Re's", "location": "Brooklyn, NY", "max_results": 1, "max_reviews_per_place": 5000}

📤 Output

One flat JSON object per place. Fields the business has not filled in come back null rather than being dropped, so CSV columns stay aligned.

Google Maps scraper output in the Apify console: business name, phone number, website, opening hours, rating and review count for every place, a Google Places API alternative result set
{
"name": "La Donna Re's",
"place_id": "0x89c25d8a10261a7d:0x148b4752f2b99ae2",
"full_address": "La Donna Re's, 325 Lewis Ave, Brooklyn, NY 11221",
"city": "Bedford-Stuyvesant",
"lat": 40.684546,
"lng": -73.9351578,
"phone": "(347) 601-8264",
"phone_intl": "+1 347-601-8264",
"website": null,
"rating": 4.7,
"review_count": 117,
"price_level": "$$",
"categories": ["Soul food restaurant", "Restaurant"],
"hours_status": "Open · Closes 9 PM",
"opening_hours": [
{"day": "Friday", "hours": "3–9 PM"},
{"day": "Monday", "hours": "Closed"}
// HIDDEN: the other 5 days
],
"additional_info": [
{"category": "Service options", "name": "Delivery", "value": true},
{"category": "Payments", "name": "NFC mobile payments", "value": true}
// HIDDEN: 60+ more attributes
]
// HIDDEN: cid, gmap_path, address_parts, street, neighborhood, country,
// timezone, website_domain, photo_url, type, reviews
}

Reviews sit inside each place, in its reviews field. A single review looks like this:

{
"name": "Isatta Bassie",
"stars": 5,
"published_at_date": "2026-01-11T02:01:27Z",
"text": "10/10! Super friendly staff and everything was delicious...",
"review_detailed_rating": [
{"category": "Food", "rating": 5},
{"category": "Service", "rating": 5}
],
"is_local_guide": false,
"likes_count": 1,
"response_from_owner_text": null,
"review_image_urls": ["https://lh3.googleusercontent.com/geougc-cs/ABOP9pu..."]
// HIDDEN: review_id, reviewer_id, reviewer_url, reviewer_photo_url,
// reviewer_number_of_reviews, publish_at, text_translated, review_url,
// review_origin, response_from_owner_date, review_context
}

Fields

FieldTypeDescription
namestringBusiness name
place_id, cidstringGoogle Maps hex place ID and CID
categoriesstring[]Business categories
full_addressstringFull formatted address
street, city, neighborhood, countrystringAddress components
lat, lngfloatLatitude and longitude
timezonestringIANA timezone
phone, phone_intlstringLocal and international phone
website, website_domainstringBusiness website and bare domain
rating, review_countfloat, intAverage rating and number of reviews
price_levelstring$, $$, €€
opening_hours{day, hours}[]Full weekly schedule
hours_statusstringOpen or closed at scrape time
photo_urlstringPrimary photo
additional_info{category, name, value}[]60+ business attributes
reviewsobject[]Review history, when enabled

⚙️ Use it as a Google Places API

One synchronous POST returns the dataset directly. No polling, no SDK required.

Python

import requests
resp = requests.post(
"https://api.apify.com/v2/acts/thodor~google-maps-scraper-with-reviews/run-sync-get-dataset-items",
params={"token": "YOUR_APIFY_TOKEN"},
json={"query": "dentist", "location": "Austin, TX", "max_results": 200, "scrape_reviews": False},
)
for place in resp.json():
print(place["name"], place.get("phone"), place.get("website"))

Node.js

import axios from "axios";
const { data } = await axios.post(
"https://api.apify.com/v2/acts/thodor~google-maps-scraper-with-reviews/run-sync-get-dataset-items",
{ query: "dentist", location: "Austin, TX", max_results: 200, scrape_reviews: false },
{ params: { token: process.env.APIFY_TOKEN } }
);
console.log(data.length, data[0].name, data[0].phone);

curl

curl -X POST "https://api.apify.com/v2/acts/thodor~google-maps-scraper-with-reviews/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"dentist","location":"Austin, TX","max_results":200,"scrape_reviews":false}'

Swap run-sync-get-dataset-items for runs to fire async and collect results by webhook; large areas with reviews on can outlive the 5-minute sync window. The apify-client SDK works too, in Python and JavaScript.

💡 Tip: no need to write the JSON by hand. Fill in the form on the Input tab, switch the editor from Form to JSON, and copy the result into your code.

💰 How much does it cost to scrape Google Maps?

Billing is per place returned, at the rate on the price card on this page. Reviews are billed separately per review and only when scrape_reviews is on. Page fetches, geocoding, and the grid subdivision are not billed.

⚠️ Reviews are the cost lever. A 500-place list with reviews off bills as 500 places. The same 500 places with reviews on at 200 each can bill up to 100,000 reviews. Leaving max_reviews_per_place open on a city full of high-review restaurants is the usual cause of a surprise bill; Apify's per-run charge limit stops a run at whatever cap you set.

❓ FAQ

How do I bypass the 120-result limit on Google Maps? Automatically. The actor subdivides your target area into sub-regions, searches each, then merges and deduplicates. No configuration needed.

Do I need a Google Maps API key? No.

Can I use this Google Maps scraper for free? Yes. Registering on Apify comes with $5 of free platform credit every month, no credit card needed.

Can I get business email addresses? Not from Google Maps. Listings do not carry them, so no Maps scraper can return them. Pipe the website column into an email finder instead.

Can I scrape all reviews for a specific restaurant? Yes, see the recipe above: search it by name and city with a high max_reviews_per_place. If you already have place URLs and want reviews only, the Google Maps Reviews Scraper is cheaper for that job and handles about 25,000 reviews per place.

How is this different from Outscraper, Phantombuster, or Bright Data? They typically charge a base listing rate plus a second per-1,000 charge for hours, service options, and attributes. All 60+ attributes are in the base rate here.

🛟 Support

Something not working, or a field missing? Message me in the Issues tab and I'll look into it quickly. I'm a solo dev, so don't hesitate. Custom variants are available on request.

Only need reviews for places you already have? The Google Maps Reviews Scraper is built for exactly that.

  • Thodor