How to get Google Maps business data: contacts, ratings and leads for any city
2 Nov 2026 · benthepythondev
Say you need a list of every dentist in Austin or every restaurant in San Francisco, with phone numbers, websites and ratings. The Google Maps Business Scraper returns the places Google Maps shows for a search. You give it a query like "dentist" and a location like "Austin, TX". You don't need a Google login or an API key.
If you also need the email address for each place, read the Berlin tax advisor case study on the Google Maps Email Extractor. This page covers the business data itself.
What you get
Each place comes back as one row with these fields:
- Business: name, the main category plus all categories, a short description, price range, and whether Google marks the place as permanently closed.
- Contact: phone in local format and in international format, website, and the website's domain.
- Address: the full address, plus street, neighborhood, city, state, postal code, country code and plus code as separate fields.
- Position: latitude, longitude and time zone.
- Reputation: rating, number of reviews, and a lead score from 0 to 100.
- Opening hours: one entry for each weekday.
- "About" tab: groups such as accessibility, service options, payments and parking, each given as a list of what the place has.
- Identifiers: place id, CID, feature id, Knowledge Graph id, and the Google Maps link.
- Media: the main photo and the number of photos. Photo links are available on request.
- With full details turned on: how many 1, 2, 3, 4 and 5 star reviews the place has, plus up to eight reviews with author, rating, text and date.
Every row also records the query it came from, its rank in the results, and when it was scraped.
Example output
This is a trimmed row from a real run of "restaurants San Francisco, CA":
{
"name": "Piccolo Forno",
"rating": 4.7,
"review_count": 2435,
"address": "725 Columbus Ave, San Francisco, CA 94133",
"phone": "(415) 757-0087",
"phone_international": "+1 415-757-0087",
"website": "https://piccolo-forno-sf.com/",
"domain": "piccolo-forno-sf.com",
"category": "Italian restaurant",
"description": "Casual neighborhood trattoria with Italian classics & espresso in colorful, contemporary quarters.",
"price": null,
"latitude": 37.801362999999995,
"longitude": -122.412033,
"neighborhood": "Russian Hill",
"city": "San Francisco",
"state": "California",
"postal_code": "94133",
"country_code": "US",
"timezone": "America/Los_Angeles",
"permanently_closed": false,
"lead_score": 90,
"place_id": "ChIJLeYyO_CAhYAR6j9XsEIm3GI",
"cid": "7123610778461487082",
"photo_count": 1877,
"attributes": {
"Accessibility": ["Wheelchair accessible entrance", "Wheelchair accessible restroom", "Wheelchair accessible seating"]
},
"query": "restaurants San Francisco, CA",
"rank": 1
}
The same run also returned Lazy Bear (Mission District, 1,211 reviews) and Rich Table (Lower Haight, 1,622 reviews). The opening_hours field, left out above, has one object per day such as {"day": "Tuesday", "hours": "Closed"}.
Use cases
Building local lead lists. You get phone, website, a lead score and a split address for every place, so you can export a city's businesses to CSV or Excel and send them straight to outreach. The websiteFilter input can keep only places with a website, or only places without one.
Covering a whole city, not just the first page. A single Google list stops at somewhere between 120 and 240 places. When you ask for more, the Actor searches the map tile by tile and splits any crowded tile into four. It also looks the location up in OpenStreetMap, so places outside the city, district or state you named are not saved. The README gives an example: a search for restaurants in Los Angeles returned 4,000 places in about two minutes, and none of them came from Pasadena, Glendale or Long Beach.
Running many cities or categories in one go. queries and locations both take lists, and every query is searched in every location.
Monitoring for new places. Run it on a schedule with onlyNew and a monitor name, or pass excludePlaceIds, and you'll only get places you haven't seen before. Results can also go to Make, Zapier or n8n.
How to run it
On Apify: open the Actor page and enter a query and a location. Set maxResults (the default is 10 and the maximum is 20,000 per search). You can also filter with minRating, minReviews or websiteFilter. If you already have specific places, pass them in startUrls as links, place ids or feature ids and set mode to direct_urls. You can export results as JSON, CSV or Excel, call the Actor through the Apify API, or run it on a schedule.
The price is $1.50 per 1,000 places, or $1.20 per 1,000 on the Gold plan and above. Filters, full details and reviews don't cost extra, and you aren't charged for places a filter drops.
As an API on RapidAPI: the same scraper is listed as Google Maps Scraper on RapidAPI. Use it if you'd rather call an HTTP endpoint with a RapidAPI key.
Honest limits
- The boundary filter isn't perfect at the edges. In the Los Angeles example, 16 of the 4,000 places sat on the city line and had a neighboring town in their address.
- Some fields are often empty.
pricewasnullfor all three San Francisco rows above, and fields like website or description only appear when Google has them. - Google sometimes sends answers without review counts. The Actor notices and asks again. In a test run of 260 places, every place with a rating also had its review count, but that is one test, not a guarantee.
- Reviews are limited to up to eight per place, and only when full details are turned on. Use a separate tool if you need every review.
- The README doesn't explain how the lead score is calculated. Use it as a rough way to sort, not as a measured value.
- The data is whatever Google Maps shows when the run happens. Hours, closures and phone numbers can change after that.
Affiliate if you still need an Apify account: apify.com/?fpr=qolupv. I may earn a commission; the price you pay does not change.