Google Maps Scraper Pro avatar

Google Maps Scraper Pro

Pricing

from $1.20 / 1,000 scraped places

Go to Apify Store
Google Maps Scraper Pro

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

Badr Bouargan

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

9 days ago

Last modified

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

  1. Type one or more search terms (restaurant, dentist, hotel…) — or directly dentist in Chicago, a Google Maps link or a place ID.
  2. Type a location (New York, USA) — or use country / city / postal code, GPS coordinates or a custom GeoJSON area.
  3. 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 pasteWhat happens
restaurant + location New York, USARestaurants in New York
dentist in Chicago, plombier à LyonThe location is read from the search term
restaurant, bar, cafe on one lineThree 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, USASearched 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.

EventFreeStarterScaleBusiness
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

SymptomFix
Fewer places than expectedLeave Number of places empty (all) and start with a city rather than a country
Location not found on OpenStreetMap in FAILED_INPUTSWrite city, region, country or use GPS coordinates
Google refused the requestsRun again, or set Proxy to the RESIDENTIAL group. Refused searches are not billed
A link is listed in FAILED_INPUTSExpired short link or non-Google link: open it in a browser and paste the full Google Maps address
Only ~5 reviews per placeThat is what Google sends with a place (see limits above)
Warning about unknown or unavailable input fieldsOptions 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 ApifyClient
client = 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_SUMMARY for 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.