Google Maps Scraper - Business Data, Reviews & Leads
Pricing
from $4.00 / 1,000 results
Google Maps Scraper - Business Data, Reviews & Leads
Scrape Google Maps business listings without an API key — name, address, phone, website, rating, reviews, photos, hours, amenities & GPS. Precision targeting (batch, map URLs, custom area) + optional add-ons: emails, socials, contacts & ad intelligence. Export to CSV, Excel & JSON.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
yossef Nagy
Maintained by CommunityActor stats
1
Bookmarked
131
Total users
44
Monthly active users
19 hours ago
Last modified
Categories
Share
Google Maps Scraper — Places, Leads, Reviews & Contact Data
Extract business data from Google Maps at scale — names, addresses, phone numbers, websites, ratings, reviews, photos, opening hours, amenities, coordinates and more — for any type of business in any location. No browser required: the Actor talks to Google Maps' internal endpoints directly over HTTP, so it's fast and cheap.
It also ships powerful, optional layers: precise targeting (batch queries, map URLs, or a drawn area), deep reviews, complete place data, plus experimental lead enrichment (emails, socials, people/contacts) and ad intelligence (is the business advertising on Meta / Google right now?).
What does it do?
- Searches Google Maps for your query and covers the whole area with a grid search, finding businesses that a single search page misses.
- Extracts a clean record for every business — the full place profile.
- Optionally enriches each business with deeper place data, full reviews, website contact data, the people who work there, and live ad-spend signals.
Features
- 🗺️ Comprehensive place data — name, address, phone, website, rating, review count, category list, coordinates, opening hours, price level, photos, amenities, Plus Code, permanently-closed status.
- 🎯 Precise targeting — search by a plain query, a batch of queries, Google Maps URLs, or a custom area (lat/lng + radius, or a GeoJSON polygon).
- ⭐ Deep reviews — review text, rating, date, author, owner responses, reviewer stats, language, review photos, plus rating / keyword filters.
- 📩 Lead enrichment (experimental) — emails (MX-validated) and social profiles harvested from each business's own website.
- 👤 People / contacts (experimental) — the actual people at a business with their own name, title, email, phone and LinkedIn.
- 📣 Ad intelligence (experimental) — detect which businesses are actively running ads on Meta (Facebook/Instagram) and Google (Search/YouTube/Display), with sample creatives.
- ⚡ No browser — pure HTTP, residential proxy by default, automatic IP rotation and retry; built to keep running against Google's defenses.
Quick start
Just enter what you'd type in the Google Maps search box — include the location:
restaurants in New York
dentists in Miami, FL
coffee shops 90210
That's it. Everything else has a sensible default. Turn on the optional layers below only when you need them.
Targeting (how to choose what to scrape)
You can target in four ways — use whichever fits:
| Input | Use it for |
|---|---|
query | A single search, e.g. plumbers in Chicago. The location is auto-detected. |
searchQueries | A batch of searches in one run, e.g. ["dentists in Miami", "dentists in Orlando"]. Results are de-duplicated across queries. |
startUrls | Direct Google Maps URLs (place or search URLs). |
customGeolocation | A custom area — either a point + radius { "lat": 25.77, "lng": -80.19, "radiusMeters": 1500 } or a GeoJSON Polygon / MultiPolygon (coordinates in [lng, lat] order). |
If you provide an advanced targeting input you can leave query empty.
Output
Each business is one dataset item. Base fields (always present when Include Place Details is on):
{"name": "Joe's Pizza","address": "7 Carmine St, New York, NY 10014","phone": "+1 212-366-1182","website": "https://www.joespizzanyc.com","rating": 4.5,"reviews_count": 12847,"category": "Pizza restaurant","categories": ["Pizza restaurant", "Italian restaurant"],"latitude": 40.7304,"longitude": -74.0022,"place_id": "ChIJr3k0v6VZwokRPCxBJnIcdTA","google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJr3k0v6VZwokRPCxBJnIcdTA","hours": { "monday": "10 AM-2 AM", "tuesday": "10 AM-2 AM" },"price_level": "$10-20","photos": ["https://lh3.googleusercontent.com/..."],"amenities": ["Outdoor seating", "Takeout", "Wheelchair accessible entrance"],"plus_code": "76QXQR66+RC"}
Additional fields appear when the matching option is enabled: reviews, permanently_closed, popular_times, found_via (which target produced the row), the lead-enrichment columns (email, emails, facebook … whatsapp, website_reachable), the people columns (business_lead, contacts), and the ad-intelligence columns (meta_ads_*, google_ads_*). Anything not found is null — the base scrape is never affected.
Input reference
Results & detail
| Field | Type | Default | Description |
|---|---|---|---|
maxResults | integer | 100 | Max businesses to extract (0 = unlimited). |
language | string | en | Two-letter result language (Google hl). |
zoom | integer | 13 | Search granularity (1–21). Lower = wider area, higher = more detail. |
includeDetails | boolean | true | Fetch full place details (hours, phone, website, price level, photos…). |
Complete place data
| Field | Type | Default | Description |
|---|---|---|---|
includePhotos | boolean | true | Include up to 10 photo URLs per place. |
includePlaceExtras | boolean | true | Include amenities, Plus Code and permanently-closed status. |
includePopularTimes | boolean | false | Include the weekly popular-times histogram when available (experimental). |
Reviews
| Field | Type | Default | Description |
|---|---|---|---|
includeReviews | boolean | false | Extract reviews for each business. |
reviewsLimit | integer | 5 | Max reviews per business (up to 1000). |
minReviewRating | integer | 0 | Keep only reviews rated ≥ this (1–5; 0 = off). |
reviewKeyword | string | — | Keep only reviews whose text contains this keyword. |
reviewsSort | select | newest | newest or relevant. |
Each review includes author, rating, date, text, review_id, author_photo, plus (when present) owner_response_text, owner_response_date, reviewer_review_count, reviewer_is_local_guide, review_language and review_images.
Lead enrichment (experimental add-on)
Visits each business's own website (plus contact/about/imprint pages) to extract contact data. Off by default; never changes the base scrape.
| Field | Type | Default | Description |
|---|---|---|---|
includeEmails | boolean | false | Find email addresses (deduplicated and MX-validated). |
includeSocials | boolean | false | Find social profiles (Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, WhatsApp). |
emailOnly | boolean | false | Keep only businesses with an email (implies includeEmails). |
socialOnly | boolean | false | Keep only businesses with a social profile (implies includeSocials). |
onlyWithWebsite | boolean | false | Keep only businesses that have a real website. |
onlyWithoutWebsite | boolean | false | Keep only businesses without a website (prospects for web/design agencies). |
maxPagesPerSite | integer | 4 | Advanced: max pages crawled per website (1–10). |
People / contacts (experimental add-on)
| Field | Type | Default | Description |
|---|---|---|---|
includePersonnel | boolean | false | Extract the people at each business (name, title, their own email/phone/LinkedIn). |
maxContactsPerBusiness | integer | 10 | Max contacts per business (highest-confidence first). |
personnelMinConfidence | select | low | Drop contacts below this tier (low/medium/high). |
onlyWithPersonnel | boolean | false | Keep only businesses with at least one contact. |
Each business gains business_lead (org-level email/phone/socials) and contacts[] (people with name, title, email, phone, linkedin, confidence, tier, source_urls).
Ad intelligence (experimental add-on)
| Field | Type | Default | Description |
|---|---|---|---|
includeMetaAds | boolean | false | Check the Meta Ad Library — is the business running Facebook/Instagram ads? With sample creatives. |
includeGoogleAds | boolean | false | Check the Google Ads Transparency Center — is it running Search/YouTube/Display ads? |
onlyRunningAds | boolean | false | Keep only businesses currently running ads. |
adCountry | string | US | Two-letter country code for where the ads are shown (applies to both sources). |
Proxy
| Field | Type | Default | Description |
|---|---|---|---|
proxyConfiguration | object | Apify Residential | Recommended — Google blocks datacenter IPs on Maps. Leave as-is. |
proxyUrl | string | — | Advanced: a single custom HTTP proxy used instead of Apify Proxy. |
Recipes
Web-design leads (businesses with no website):
{ "query": "restaurants in Austin, TX", "onlyWithoutWebsite": true, "includePersonnel": true }
Warm leads — businesses advertising right now, with their contacts:
{ "query": "dentists in Miami, FL", "includeMetaAds": true, "includeGoogleAds": true,"onlyRunningAds": true, "includeEmails": true, "includePersonnel": true }
Reputation / review mining (5★ reviews mentioning a topic):
{ "query": "hotels in Paris", "includeReviews": true, "reviewsLimit": 50,"minReviewRating": 5, "reviewKeyword": "breakfast" }
Whole-area sweep with a custom radius:
{ "query": "gyms", "customGeolocation": { "lat": 34.0522, "lng": -118.2437, "radiusMeters": 5000 } }
Tips
- Include a location in your query (
plumbers in Chicago); plain phrases likeplumbers Chicagoorcoffee 90210also work. - Keep the residential proxy — Google blocks datacenter IPs on Maps search.
- Start with a small
maxResultsto test, then scale up. - The optional enrichment / ad-intelligence layers add run time and are off by default — they never change the base scrape.
Limitations
- Results depend on what Google Maps returns for your query and location; some businesses have incomplete data.
popular_timesis experimental and not available for every place.- The Google Ads Transparency Center does not expose the text of search ads (only creative previews/metadata).
- For ad lookups outside the US, set
adCountryto the business's country (e.g.GB,DE) for accurate results.
Frequently asked questions
Do I need a Google Maps API key?
No. This is a scraper, not the Google Places API — there is no API key, no OAuth and no Google Cloud project. It talks to Google Maps' public endpoints over HTTP, so you just enter a search query and run it.
Can it scrape emails and contact details from Google Maps?
Yes, with the optional experimental add-ons. Turn on includeEmails, includeSocials or includePersonnel and the Actor visits each business's own website to find emails (MX-validated), social profiles and the people who work there. Off by default and billed separately.
Does it extract Google Maps reviews?
Yes. Enable includeReviews to pull review text, author, rating, date and owner responses, with reviewsLimit, minReviewRating and reviewKeyword filters. Reviews are an optional layer — the base place scrape runs without them.
Is it legal to scrape Google Maps?
The Actor reads only Google's public, unauthenticated listings — the same data any visitor sees. Scraping public data is broadly treated as lawful (e.g. hiQ v. LinkedIn), and Google's Terms are civil, not criminal. Use the output within applicable privacy laws.
How many businesses can I get from one search?
The Actor runs a grid search over the whole area, so it finds far more places than a single Google Maps page (which caps out quickly). Set maxResults to your target (0 = unlimited), and split very dense areas with a custom area or batch queries.
How is this different from the Google Places API?
No API key, no OAuth and no per-call quota. Pricing is simple pay-per-result, and the grid search returns more places than the API's per-search cap. You also get optional reviews, emails, contacts and ad intelligence the API does not provide.
Can I scrape a custom area, radius or Google Maps URL?
Yes. Target with a single query, a batch of searchQueries, direct Google Maps startUrls, or a customGeolocation (point + radius, or a GeoJSON polygon). Use whichever fits — leave query empty when using advanced targeting.
Can I find businesses without a website, or ones running ads?
Yes — both are built for agencies. Use onlyWithoutWebsite to find web-design prospects, and the ad-intelligence add-ons (includeMetaAds, includeGoogleAds, onlyRunningAds) to keep only businesses currently advertising on Meta or Google.
What formats can I export to?
Every run saves to an Apify dataset you can download as CSV, Excel (XLSX), JSON, JSONL or HTML, or pull via the Apify API and the official Python / JavaScript clients — ready for spreadsheets, CRMs and data pipelines.
Other Actors by buff_pineapple
- Google Reviews Scraper — every Google Maps review for a place, with reviewer details and owner replies.
- Meta Ad Library Scraper — spy on Facebook & Instagram ads (creatives, spend, landing pages), no login.
- Yelp Scraper — Yelp business profiles and reviews.
- Trustpilot Reviews Scraper — every Trustpilot review plus the company TrustScore.
- Shopify Store Leads Scraper — detect Shopify stores and pull product + contact leads.
- Zillow Listings Scraper — homes for sale, rent and sold with full details.
- TikTok Top Ads Scraper — TikTok Creative Center top-ads intelligence.
Privacy & anonymous usage information
This Actor records a small amount of anonymous, aggregate usage information so the maintainer can understand which features are used and keep the Actor reliable. At the end of a run it may record, in the run's own storage on the Apify platform: the run ID, build number, run status/outcome, how the run was started, the number of results collected / pushed / filtered / skipped, and which optional features (reviews, emails, socials, personnel, ad-intelligence, etc.) were enabled, plus non-personal numeric settings (such as the result limit, reviews limit, language, and ad country).
What is never recorded: your search query, your geolocation or targeting inputs, any scraped business data or contact details, your account identity, or your IP address / user-agent. The account ID, if present, is reduced to a one-way, salted, non-reversible hash so distinct runs can be counted without identifying anyone. This information consists solely of run metadata and counters and is stored on the Apify platform — it is not transmitted to any external service. The same per-feature usage is also reflected in the Actor's standard pay-per-event billing line items. The recording is best-effort and fail-open: if it cannot be written, your run proceeds normally and is never slowed or affected.