Google Maps Scraper — Leads, Emails, Reviews avatar

Google Maps Scraper — Leads, Emails, Reviews

Pricing

from $25.00 / 1,000 results

Go to Apify Store
Google Maps Scraper — Leads, Emails, Reviews

Google Maps Scraper — Leads, Emails, Reviews

Scrape Google Maps business listings without an API key. Extract names, phones, emails, websites, ratings, reviews (5K/place), photos (200/place), GPS, opening hours, social profiles. Five input modes: keyword+location, URLs, Place IDs, GeoJSON, coordinate explore.

Pricing

from $25.00 / 1,000 results

Rating

0.0

(0)

Developer

Scrapeify

Scrapeify

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

Google Maps Business Scraper — Extract Leads, Reviews, Contacts & Coordinates at Scale

Scrape Google Maps local business listings without a Google Places API key or API quota management. The Scrapeify Google Maps Scraper runs a browser-based crawler supporting five distinct input modes — keyword + location, direct URLs, Place IDs, GeoJSON area grids, and map exploration by coordinates — and returns structured business records: names, addresses, ratings, phone numbers, websites, coordinates, reviews (up to 5,000 per place), photos (up to 200), optional Q&A data, and optional contact enrichment from business websites.

Results export to Dataset rows, RESULTS_CSV (Excel-compatible UTF-8), RESULTS_JSON, and a run OUTPUT summary with validation metadata.

Built for sales teams running territory sweeps, agencies building local SEO reports, researchers mapping market coverage, and AI pipelines that need structured place data with review text.


Features

CapabilityDetail
Five input modesKeyword + location; Google Maps URLs; Place IDs (ChIJ...); GeoJSON polygon/point grid; coordinate explore mode
Multi-query supportPrimary query + searchTerms array for batch keyword processing in one run
Review depthUp to 5,000 reviews per place with sort (newest, relevant) and text filter
Photo extractionUp to 200 photos per listing
Contact enrichmentOptional crawl of business websites for email addresses, phone numbers, and social profile URLs
Post-filtersMinimum rating; skip closed places; website present/absent filter; name keyword match
Language selectionlanguageCode for UI locale (e.g. en, de, es, ja)
Explore modeOpen Maps at lat/lng/zoom and scroll visible listings without a keyword
Legacy aliasessearchStringsArray, locationQuery, mapsUrls, scrapeContacts, city/state still normalized
Multiple exportsDataset rows; RESULTS_CSV; RESULTS_JSON; OUTPUT_VALIDATION; REVIEWS_ROWS (flat review view)
Result capUp to 500 unique businesses per run (enforced by input validation)

Use Cases

Local Business Lead Generation

Territory sweeps for outbound sales. Pull phone numbers, websites, email addresses, and coordinates for every dentist, HVAC contractor, or restaurant within a ZIP code, city boundary, or custom GeoJSON polygon. Export to CSV for CRM import in minutes.

Local SEO & Competitive Analysis

Map which businesses rank in Google Maps for your target keywords in target markets. Track rating distributions, review counts, photo presence, and website adoption among competitors. Schedule weekly runs to detect ranking shifts.

Multi-Location Brand Monitoring

Track ratings, review volume, and listing health across franchise or chain locations. Detect stores with declining ratings or missing website links before they affect brand perception.

Market Coverage Research

Use GeoJSON input to define custom market boundaries (ZIP codes, postal areas, counties). Count businesses by category, analyze geographic density, and identify underserved market segments.

Review Sentiment & Intelligence

Pull up to 5,000 reviews per place. Feed reviews[].text into sentiment analysis, topic modeling, or LLM classifiers to extract service themes, recurring complaints, and competitive differentiators.

Real Estate & Site Selection

Analyze business density, competitor presence, and category mix around candidate sites. Pull POI data for any lat/lng with explore mode to understand the commercial environment.

AI-Powered Sales Enrichment

Enrich prospect lists with Maps-derived signals: rating, review count, website URL, email addresses from contact enrichment, and coordinates for territory assignment.

Store displayName, listSnippet, and reviews[].text as retrieval chunks with googleMapsUri as citation metadata. Enable semantic place queries and AI-generated local market summaries.

Agency Reporting

Automate Google Maps data collection for client local SEO audits. Export CSV for client-ready reports. Schedule monthly runs to track client ranking improvements.

Competitive Intelligence

Monitor competitor review trajectories, Q&A activity, and photo freshness. Identify businesses with surging review counts indicating marketing campaigns or new openings.


Why Choose This Actor

  • No Google API key — uses the consumer Maps experience; no quota management
  • Five discovery modes — one actor for keyword searches, URL lists, Place ID lookups, geo-area coverage, and coordinate exploration
  • Depth on demand — list-only mode for speed; detail + contact enrichment when full signals are needed
  • Production outputs — Dataset + CSV + JSON cover BI, engineering, and client-reporting workflows
  • Schema validationOUTPUT_VALIDATION and outputValidation in run summary catch data quality issues early
  • Apify-native — standard storage, logging, scheduling, and REST API integration

Quick Start

  1. Open the Scrapeify Google Maps Scraper on Apify Console.
  2. Choose your input mode:
    • Keyword: enter query (e.g. dentist) and location (e.g. Austin, TX, USA)
    • URLs: paste startUrls (full Google Maps search or place links)
    • Place IDs: enter placeIds list
    • GeoJSON: paste a polygon or point + radius in customGeolocation
    • Explore: enable exploreMapInsteadOfSearch and set mapCenter
  3. Set maxResults (1–500). Enable scrapePlaceDetailPage for phones, reviews, and full addresses.
  4. After the run: export Dataset or download RESULTS_CSV from Storage → Key-value store.

Tip: Always start with maxResults: 20 and validate that the filter combination returns the expected business types before scaling to 500.


Input Schema

{
"query": "dentist",
"location": "Austin, TX, USA",
"maxResults": 50,
"languageCode": "en",
"scrapePlaceDetailPage": true,
"maxReviews": 100,
"reviewsSort": "newest",
"enrichContactsFromWebsite": true,
"website": "withWebsite",
"skipClosedPlaces": true,
"minRating": 4.0
}
FieldTypeDefaultDescription
querystringPrimary search phrase (e.g. coffee shop)
searchTermsarrayAdditional search phrases — each becomes its own Maps search
locationstringCity or region appended to keyword searches
startUrlsarrayFull Google Maps search or place URLs
placeIdsarrayPlace IDs (typically start with ChIJ)
customGeolocationobjectGeoJSON Point + radiusKm, Polygon, or MultiPolygon
exploreMapInsteadOfSearchbooleanfalseOpen Maps at mapCenter and scroll visible listings
mapCenterobject{ "lat": number, "lng": number, "zoom": 1–21 }
maxResultsinteger100Unique businesses to collect (1–500)
languageCodestringenMaps UI locale
scrapePlaceDetailPagebooleanLoad place detail pages for phones, reviews, full address
maxReviewsintegerReviews per place, up to 5,000
reviewsSortstringnewest or relevant
maxImagesintegerPhotos per place, up to 200
enrichContactsFromWebsitebooleanCrawl business websites for emails, phones, social URLs
websitestringFilter: withWebsite, withoutWebsite, or omit
skipClosedPlacesbooleanExclude permanently closed listings
minRatingnumberMinimum star rating filter (0–5)
categoriesarrayPost-filter: keep rows mentioning these keywords in name/snippet

Legacy aliases accepted: searchStringsArray, locationQuery, mapsUrls, scrapeContacts, city, state, country.


Output Schema

Dataset Row (one row per business)

{
"position": 1,
"displayName": "Austin Smile Dental Group",
"rating": 4.8,
"userRatingsTotal": 342,
"formattedAddress": "1234 South Congress Ave, Austin, TX 78704",
"internationalPhoneNumber": "+1 512-555-0100",
"websiteUri": "https://austinsmiledental.com",
"latitude": 30.2672,
"longitude": -97.7431,
"googleMapsUri": "https://www.google.com/maps/place/?q=place_id:ChIJXXXXXXXX",
"listSnippet": "Family and cosmetic dentistry in South Austin.",
"priceLevel": null,
"primaryType": "dentist",
"categories": ["Dentist", "Cosmetic Dentist"],
"openingHours": {
"weekdayDescriptions": ["Monday: 8:00 AM – 5:00 PM", "..."]
},
"reviews": [
{
"reviewId": "abc123def456",
"stars": 5,
"text": "Friendly staff and painless cleanings. Best dentist I've had.",
"publishTime": "2026-04-15T00:00:00Z",
"reviewerName": "Alex M.",
"reviewerPhotoUrl": null
}
],
"photos": ["https://lh3.googleusercontent.com/p/..."],
"emails": "hello@austinsmiledental.com",
"socialLinks": {
"facebook": "https://www.facebook.com/austinsmiledental",
"instagram": null
},
"reservationLinks": []
}
FieldTypeDescription
positionintegerSearch result position
displayNamestringBusiness name
ratingnumberStar rating (1.0–5.0)
userRatingsTotalintegerTotal review count
formattedAddressstringFull formatted address
internationalPhoneNumberstringPhone in E.164 format
websiteUristringBusiness website URL
latitude / longitudenumberGeographic coordinates
googleMapsUristringStable place URL with Place ID
reviewsarrayReview objects with text, stars, date, reviewer
photosarrayImage URLs
emailsstringEmail(s) found via website enrichment
socialLinksobjectFacebook, Instagram, YouTube, TikTok, X links if found

Run Summary (OUTPUT key in default KV store)

{
"ok": true,
"query": "dentist",
"searchTerms": ["dentist"],
"categories": [],
"maxResults": 50,
"returnedCount": 48,
"meta": {
"listingsScanned": 52,
"detailPagesLoaded": 48,
"reviewsCollected": 4800
},
"outputValidation": {
"passed": true,
"warnings": []
},
"scrapedAt": "2026-05-07T04:00:00.000Z",
"note": "Full rows are in Dataset and RESULTS_CSV."
}
FieldTypeDescription
okbooleantrue if places returned
returnedCountintegerActual places after post-filters
metaobjectDiagnostics: listings scanned, detail pages, reviews collected
outputValidationobjectSchema/data quality check results
scrapedAtstringISO 8601 timestamp

Additional KV keys: RESULTS_CSV (UTF-8 with BOM), RESULTS_JSON, OUTPUT_VALIDATION, REVIEWS_ROWS (flat review export when includeReviewsDatasetView enabled).


API Examples

cURL

curl "https://api.apify.com/v2/acts/scrapeify~google-maps-scraper-advance/runs?token=$APIFY_TOKEN" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"query": "coffee shop",
"location": "Brooklyn, NY",
"maxResults": 25,
"scrapePlaceDetailPage": true,
"enrichContactsFromWebsite": true
}'

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("scrapeify/google-maps-scraper").call(
run_input={
"query": "coffee shop",
"location": "Brooklyn, NY",
"maxResults": 25,
"scrapePlaceDetailPage": True,
"maxReviews": 50,
"enrichContactsFromWebsite": True,
}
)
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
print(place["displayName"], place.get("emails"), place.get("rating"))

JavaScript / Node.js

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("scrapeify/google-maps-scraper").call({
query: "coffee shop",
location: "Brooklyn, NY",
maxResults: 25,
scrapePlaceDetailPage: true,
maxReviews: 50,
enrichContactsFromWebsite: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Collected ${items.length} businesses with ${items.reduce((sum, p) => sum + (p.reviews?.length || 0), 0)} reviews`);

Integration Examples

ChatGPT / Custom GPT

Return top N businesses as a JSON tool response. Include googleMapsUri for human-verifiable links. Let the model answer "best-rated plumber near me" style queries with grounded local data.

Claude Tool Use

@tool
def search_local_businesses(query: str, location: str, max_results: int = 20) -> list:
"""Search Google Maps for local businesses with ratings, phones, and website contacts."""
run = client.actor("scrapeify/google-maps-scraper").call(
run_input={"query": query, "location": location, "maxResults": max_results,
"scrapePlaceDetailPage": True, "enrichContactsFromWebsite": True}
)
return client.dataset(run["defaultDatasetId"]).list_items().items

LangChain

Wrap as a LangChain tool returning a list of business dicts. Use in a retrieval chain for local market analysis, competitive benchmarking, or lead scoring agents.

CrewAI

TerritoryResearchAgent pulls business leads for a sales territory. LeadScoringAgent ranks by rating + review count + website presence. OutreachAgent drafts personalized emails using emails and displayName.

AutoGen

Multi-agent workflow: UserProxyAgent specifies market; DataAgent collects Maps data; AnalysisAgent clusters businesses by rating and review sentiment; ReportAgent summarizes findings.

n8n / Make.com / Zapier

HTTP module → trigger Apify run → iterate Dataset items → upsert into HubSpot, Salesforce, or Airtable by googleMapsUri (stable Place ID URL) as dedup key.

RAG Systems

Chunk reviews[].text with parent displayName, rating, and googleMapsUri as metadata. Index in Pinecone or Weaviate. Support queries like "what do customers complain about at competitor X?"

BI & Analytics

Schedule weekly CSV export to S3 via Apify integrations. Load into BigQuery or Redshift for rating trend analysis, geographic density mapping, and market share tracking.


Frequently Asked Questions

1. Do I need a Google Maps Platform API key? No. This actor uses the consumer Maps experience in a browser context — no API key, no quota management.

2. What is the maximum businesses per run? 500 unique businesses after post-filters. Set maxResults at or below 500.

3. How many reviews can I collect per business? Up to 5,000 per listing when maxReviews is set to 5000. Google Maps may cap lower for some listings in practice.

4. Can I scrape a whole city or custom geographic area? Yes — use customGeolocation with a GeoJSON Polygon or MultiPolygon. The actor samples grid points inside the shape.

5. Why are email addresses sometimes empty? Contact enrichment depends on business websites having parseable email strings. Many businesses don't publish email addresses on their sites.

6. Should I use residential proxies? Not mandatory, but Apify RESIDENTIAL proxy groups improve results when datacenter IPs see empty listing cards or blocking.

7. What is REVIEWS_ROWS in the KV store? A flat, one-row-per-review export enabled by includeReviewsDatasetView. Useful for direct SQL ingestion without JSON parsing.

8. How do I handle closed businesses appearing? Enable skipClosedPlaces. Some closure statuses only appear after loading the detail page — ensure scrapePlaceDetailPage: true is set.

9. Can I mix keywords and direct URLs in one run? Yes — startUrls and query + location are normalized together.

10. Is this GDPR compliant? Reviewer names and review text are personal data. Disable scrapeReviewsPersonalData if GDPR obligations require it.

11. How does the GeoJSON grid mode work? The actor generates a grid of search points inside your polygon and runs Maps searches at each point. Coverage density depends on point spacing.

12. What is explore mode useful for? Discovering businesses visible at a specific lat/lng/zoom without a keyword — useful for POI extraction and site selection analysis.

13. Can I extract opening hours? Opening hours are in openingHours.weekdayDescriptions when available. Field presence varies by listing type and locale.

14. How do I deduplicate across multiple runs? Key on googleMapsUri (contains stable Place ID) or the raw Place ID from the URL.

15. Does the scraper support restaurants, hotels, and retail? Yes — any business category indexed in Google Maps. Use specific category keywords for best results.

16. What social profiles can contact enrichment find? Facebook, Instagram, YouTube, TikTok, and X/Twitter links when present on the business website.

17. How do I scrape multiple cities in one run? Use searchTerms array with multiple location-embedded queries (e.g. ["dentist Austin TX", "dentist Houston TX"]), or run parallel actor instances per city.

18. Does it handle hotel chains or multi-entity venues? Directory-style duplicates may appear. Normalize on Place ID for dedup when processing chain locations.

19. Is there an API-compatible Places API field mapping? No — field coverage follows what the Maps UI exposes, not Google's Places API schema. Expect some field gaps.

20. What does outputValidation contain? Schema and data quality check results — passed boolean and warnings array for issues like missing required fields.

21. How large can RESULTS_CSV get? KV item size limits may truncate very large CSVs. The Dataset export is authoritative for full tables.

22. Can I filter results by category after scraping? Yes — use the categories post-filter input. Keeps rows whose name or snippet matches any of the provided keywords.

23. What does enrichContactsFromWebsite cost in run time? Each business website requires an additional HTTP fetch. Enabling this significantly increases run time for large maxResults values. Start with a small subset.

24. Does the actor respect robots.txt for contact enrichment? The actor performs lightweight website crawls for contact data. Your use of enriched data must comply with applicable terms of service and privacy regulations.

25. Is this affiliated with Google? No. This actor is not affiliated with, endorsed by, or connected to Google LLC. Comply with Google Maps Terms of Service and applicable laws in your jurisdiction.


Best Practices

  • Start small — validate filter combinations with maxResults: 20 before geo-wide jobs
  • Proxies — route through Apify RESIDENTIAL if datacenter IPs return empty listing cards
  • Detail cost — enabling detail pages + reviews + contact enrichment significantly increases run time; batch by region
  • Deduplication — key on googleMapsUri or Place ID downstream to avoid duplicates across overlapping geographic queries
  • Scheduling — stagger heavy geo jobs to avoid peak concurrency; spread across time windows
  • Privacy — disable scrapeReviewsPersonalData for GDPR-sensitive deployments
  • Validation — check outputValidation.passed in OUTPUT as part of automated pipeline quality gates

Performance & Scalability

FactorGuidance
ThroughputBrowser-based; slower than HTTP scrapers — plan for minutes per 50 businesses with detail + enrichment
Review volumeLarge maxReviews on many businesses multiplies run time linearly
Contact enrichmentOne HTTP request per business website — adds latency, adds value
Horizontal scalingMultiple parallel actor runs per city or keyword shard
MemorymaxResults cap keeps single-run memory predictable
Large CSVUse Dataset export as authoritative source; KV CSV may truncate for 500-business runs

AI & Automation Workflows

Lead scoring pipeline: Pull 200 local businesses → score by rating × review count × website presence → sort top-50 → draft personalized outreach using displayName, emails, and listSnippet.

Competitive review intelligence: Pull reviews for top 10 competitors → embed reviews[].text → cluster by topic → identify unmet customer needs for product positioning.

Territory mapping: Pull businesses in GeoJSON polygons for 5 sales territories → assign latitude/longitude to reps → update CRM territory assignments automatically.

Market entry analysis: Pull all businesses in target category within new market boundary → analyze rating distribution, review density, and website adoption → grade market attractiveness.


Error Handling

ScenarioBehavior
Invalid inputError push + OUTPUT.ok: false with descriptive message
No results after crawlStructured no_places message; OUTPUT.returnedCount = 0
Partial enrichment failureEmpty contact fields on affected rows — run continues
KV size exceededRESULTS_CSV may truncate; use Dataset export
Proxy blockingEmpty listing cards in crawl; switch to RESIDENTIAL proxy groups

Trust & Reliability

Scrapeify builds this actor for operations teams that need repeatable, structured Maps-derived tables. The architecture includes:

  • Explicit result caps and validation hooks
  • Multiple export paths for BI and engineering handoff
  • Legacy input key normalization for backwards-compatible migrations
  • OUTPUT_VALIDATION for automated pipeline quality checks

Explore the full Scrapeify suite — chain these actors together for end-to-end automation pipelines:

ActorWhat it does
Amazon ScraperASINs, prices, sponsored flags across 23 marketplaces
Instagram Ad Library ScraperInstagram-only ads from Meta Ad Library
Meta Ad Library ScraperFacebook & Instagram ads with sort options
WhatsApp Ad ScraperClick-to-WhatsApp ad creatives
YouTube Video DownloaderVideos & audio to Apify Key-Value Store
Meta Brand & Page ID FinderResolve brand names to numeric Page IDs
Google News ScraperHeadlines, sources, article URLs (up to 2K)

Google Maps is a trademark of Google LLC. This actor is not affiliated with or endorsed by Google.