Google Maps Scraper Pro
Pricing
from $1.20 / 1,000 scraped places
Google Maps Scraper Pro
Extract businesses from Google Maps by search term and location, URL or place ID: name, address, phone, website, rating, reviews count and distribution, opening hours, categories, coordinates, reviews, images and emails from websites. No API key. Pay per place.
Pricing
from $1.20 / 1,000 scraped places
Rating
0.0
(0)
Developer
Badr Bouargan
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
9 days ago
Last modified
Categories
Share
Google Maps Scraper Pro – Places, Reviews, Emails & Leads
Google Maps Scraper Pro extracts business data from Google Maps without an API key: names, addresses, phone numbers, websites, ratings, reviews count and distribution, opening hours, categories, coordinates, reviews, images, and emails and social profiles from business websites. Build lead lists, track competitors and analyse local markets in a few clicks — and pay only for the places you get, about 20% less than the market reference.
It goes past Google Maps' 120-results limit: a city or a region is split automatically into smaller squares, and places found twice are delivered (and billed) only once.
What can it do?
- 🎯 Generate leads: business names, phones, websites, emails and social profiles
- 📊 Track competitors: ratings, reviews count, reviews distribution and review topics
- 🗺️ Analyse markets: every pizzeria of a city, every dentist of a region, places with no website
- 🔗 Scrape any input: search term + location, Google Maps URLs, place IDs, custom GeoJSON areas
- ⭐ Reviews and images of each place (add-ons)
- 📤 Export to JSON, CSV, Excel, XML or HTML, or use the API, webhooks, Make, Zapier, n8n and the Apify MCP server
What data does it extract?
| 🔗 Title, category, all categories | 📍 Address, street, city, state, postal code, country | 🌍 Coordinates, plus code |
| ☎️ Phone (formatted and international) | 🌐 Website | ⭐ Rating (totalScore) and reviews count |
| 📊 Reviews distribution (1–5 stars) | 🏷️ Review topics (reviewsTags) | 🕒 Opening hours, open at scrape time |
| 🔒 Temporarily / permanently closed | ➕ Additional info (services, accessibility, payments…) | 📝 Description and owner description |
| 🆔 placeId, cid, fid, kgmid | 🖼️ Main image and images | 💬 Reviews: text, stars, date, reviewer, owner response, photos |
| 📧 Emails from the website | 👥 Facebook, Instagram, LinkedIn, X, YouTube, TikTok | 🛵 Order online link |
How to use it in 3 steps
- Type one or more search terms (restaurant, dentist, hotel…) — or directly
dentist in Chicago, a Google Maps link or a place ID. - Type a location (New York, USA) — or use country / city / postal code, GPS coordinates or a custom GeoJSON area.
- Click Start, then download your data (set the number of places and the add-ons first if you want).
Tip: use distinct search terms (restaurant, bar, cafe) rather than synonyms (restaurant, restaurants): synonyms only make the run longer.
Every input you can paste
The input is tidied silently — extra spaces, duplicates, bullets, a list pasted on one line — so you can paste straight from a spreadsheet.
| You paste | What happens |
|---|---|
restaurant + location New York, USA | Restaurants in New York |
dentist in Chicago, plombier à Lyon | The location is read from the search term |
restaurant, bar, cafe on one line | Three search terms |
https://www.google.com/maps/search/pizza/@40.75,-73.98,14z | "pizza" in the area shown on the map |
https://www.google.com/maps/search/pizza (no coordinates) | "pizza" in your Location |
Place link …/maps/place/…, ?cid=…, maps.app.goo.gl/…, ?q=place_id:… | That place with its details, one row |
ChIJ… or place_id:ChIJ… | That place with its details, one row |
Location 40.7128, -74.0060 or 10001, USA | Searched around that point / postal code |
Entries that cannot be used (non-Google link, expired short link, unknown location, malformed place ID) are skipped with a warning and listed in FAILED_INPUTS — never billed, and they never make the run fail. An empty input runs the demo search (20 restaurants in New York) instead of failing.
Input example
{"searchStringsArray": ["restaurant"],"locationQuery": "New York, USA","maxCrawledPlacesPerSearch": 50,"language": "en","placeMinimumStars": "four","website": "withWebsite","scrapeContacts": true,"maxReviews": 5}
The input uses the same field names as the most popular Google Maps scraper of the Store, so an existing input works as it is.
Output example
{"searchString": "pizza","rank": 2,"title": "SIMÒ PIZZA - MIDTOWN","categoryName": "Pizza restaurant","address": "…, New York, NY 10018","city": "New York","postalCode": "10018","countryCode": "US","phone": "(646) 000-0000","website": "https://simopizza.com/","totalScore": 4.7,"reviewsCount": 610,"reviewsDistribution": { "oneStar": 12, "twoStar": 6, "threeStar": 14, "fourStar": 60, "fiveStar": 518 },"plusCode": "Q26C+7F New York","placeId": "ChIJ…","cid": "9027705500530585310","kgmid": "/g/11v3yv8j5s","email": "info@simopizza.com","openingHours": [{ "day": "Monday", "hours": "11 AM–11 PM" }],"reviews": [{ "stars": 5, "text": "…", "publishAt": "3 months ago", "isLocalGuide": true }]}
Views: Overview, Contacts (leads) and Reviews (one review per row, also via &view=reviews in the API). Every run writes RUN_SUMMARY (places, add-ons billed, searches) and FAILED_INPUTS (inputs that gave nothing — never billed).
Pricing
Pay per event. Platform usage is included. Add-ons are billed only when you turn them on, and only for what is actually delivered.
| Event | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Scraped place | $3.20 / 1,000 | $2.40 / 1,000 | $1.60 / 1,000 | $1.20 / 1,000 |
| Add-on: Filter applied (per place, any filter) | $0.80 / 1,000 | $0.80 / 1,000 | $0.60 / 1,000 | $0.424 / 1,000 |
| Add-on: Place details (per detailed place) | $1.60 / 1,000 | $1.60 / 1,000 | $1.20 / 1,000 | $0.84 / 1,000 |
| Add-on: Company contacts (per website read) | $1.60 / 1,000 | $1.60 / 1,000 | $1.20 / 1,000 | $0.84 / 1,000 |
| Add-on: Review scraped | $0.40 / 1,000 | $0.40 / 1,000 | $0.296 / 1,000 | $0.208 / 1,000 |
| Add-on: Image scraped | $0.40 / 1,000 | $0.40 / 1,000 | $0.296 / 1,000 | $0.208 / 1,000 |
| Actor start | $0.00004 | $0.00004 | $0.00004 | $0.00004 |
Example: 1,000 restaurants with emails on the Free plan = $3.20 + $1.60 (contacts, only for places with a website) ≈ $4.80. Cap any run with the number of places or a maximum cost per run.
Good to know (limits)
- Reviews: Google sends the most relevant reviews with each place — usually about 5 per place, which is the maximum here. For all reviews of a place, a dedicated reviews scraper is needed.
- Images: a few images per place (those Google sends with the place).
- Not available (accepted in the input, ignored, never billed): business leads enrichment, email verification, social media profile enrichment, AI competitor analysis, popular times, questions & answers, table reservation providers, places inside malls, web results, "scrape all places" without a search term.
- One area per search: a location must be given with search terms (or a custom area / search URL).
- Counts are a snapshot at the time of the run and can be lower than what you see when signed in to Google.
FAQ
How does it work? It reads the same public data your browser loads when you search Google Maps, splits large areas into smaller squares, and opens the place detail only when you ask for details, reviews or images.
Do I need a proxy? No. The Actor reads Google directly and switches to Apify datacenter addresses only when Google slows it down.
Can I scrape a whole country? Yes: set the country (or a large region) as the location; the area is split automatically. Large areas take longer — start with a city to check the results.
Is it legal? It collects publicly available data. Reviews and contacts can include personal data protected by the GDPR: collect them only for a legitimate reason, and turn off reviewers' data if you do not need it.
Can I get one specific business? Yes: paste its Google Maps link (place link, ?cid= or maps.app.goo.gl) or place ID into Search term(s) or Google Maps URLs. One row, with its details.
Something does not work? Open an issue on the Issues tab with your run ID.
Troubleshooting
| Symptom | Fix |
|---|---|
| Fewer places than expected | Leave Number of places empty (all) and start with a city rather than a country |
Location not found on OpenStreetMap in FAILED_INPUTS | Write city, region, country or use GPS coordinates |
Google refused the requests | Run again, or set Proxy to the RESIDENTIAL group. Refused searches are not billed |
A link is listed in FAILED_INPUTS | Expired short link or non-Google link: open it in a browser and paste the full Google Maps address |
| Only ~5 reviews per place | That is what Google sends with a place (see limits above) |
| Warning about unknown or unavailable input fields | Options from another Actor: they are ignored and never billed |
Use it via API
Replace YOUR_API_TOKEN with your token from Apify Console → Settings → API & Integrations.
Python (pip install apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("badr_xba/google-maps-scraper-pro").call(run_input={"searchStringsArray": ["restaurant"],"locationQuery": "New York, USA","maxCrawledPlacesPerSearch": 50,"scrapeContacts": True,})for place in client.dataset(run["defaultDatasetId"]).iterate_items():print(place["title"], place["phone"], place.get("email"))
JavaScript (npm install apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('badr_xba/google-maps-scraper-pro').call({startUrls: [{ url: 'https://www.google.com/maps/search/pizza/@40.75,-73.98,14z' }],maxCrawledPlacesPerSearch: 20,maxReviews: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((p) => [p.title, p.totalScore, (p.reviews || []).length]));
cURL (waits for the run and returns the places)
curl -X POST "https://api.apify.com/v2/acts/badr_xba~google-maps-scraper-pro/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchStringsArray": ["dentist in Chicago"], "maxCrawledPlacesPerSearch": 20}'
Integrations
- Make, Zapier and n8n: start a run and send the places to any of their apps.
- Google Sheets, CRM (HubSpot, Salesforce, Pipedrive…): from the Integrations tab, or through Make, Zapier, n8n or the API.
- Webhooks: notify your service or Slack when a run finishes; read
RUN_SUMMARYfor the numbers. - AI agents (MCP): add the Actor to Claude, Cursor or any MCP client through the Apify MCP server —
https://mcp.apify.com/?actors=badr_xba/google-maps-scraper-pro.