Google Maps Scraper Full - Phone, Website, Emails & Reviews
Pricing
from $2.00 / 1,000 results
Google Maps Scraper Full - Phone, Website, Emails & Reviews
Scrape Google Maps with full details: phone, website, emails, reviews count, opening hours, images, coordinates. Affordable at $2/1000 results. Perfect for lead generation.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
deusex machine
Actor stats
0
Bookmarked
5
Total users
3
Monthly active users
4 days ago
Last modified
Categories
Share
Google Maps Lead Scraper — Phone, Email, Website, Reviews & Hours API
⭐ Useful? Leave a review — it takes 10 seconds and is the single biggest thing that helps other B2B sales teams, lead-gen agencies, local SEO consultants and field-sales ops managers find this Google Maps scraper.
A comprehensive Google Maps scraper that extracts full business contact data from Google Maps — business name, category, rating, review count, full street address, phone number, website URL, emails scraped from each site, opening hours per day, photo URLs, GPS coordinates (latitude / longitude), Place ID and Maps permalink. No Google Maps API key, no Places API quota, no OAuth dance. Just pass search queries like "dentists", "restaurants", "personal injury lawyers" plus a location like "Miami, FL" or "Mexico City" and get back clean JSON or CSV ready for your CRM, outbound-sequencer, data warehouse or local SEO dashboard.
Built for B2B lead generation teams, cold outbound SDRs, marketing agencies prospecting small businesses, local SEO consultants, citation-building tools, field-sales ops, data enrichment vendors, franchise development teams, academic market researchers and anyone who needs Google Maps business data at scale without burning through Google's paid Places API budget.
What this Google Maps scraper does
Given a list of search queries and an optional location, this actor queries Google Maps, paginates through the results list, opens each business detail panel and extracts the full public business profile. In "full" mode it additionally visits the business website and parses out contact emails from the homepage, contact page and common mailto: patterns — the single most valuable signal for cold-email outbound.
Every run pulls fresh data from live Google Maps — businesses open and close daily, phone numbers change, websites get rebuilt, reviews pile up. The scraper hits live results each time so your CRM never goes stale. A typical run of 100 results per query completes in roughly 1–2 minutes.
Why use this Google Maps scraper instead of the official Places API
Google's Places API is the sanctioned way to pull business data, but it has serious trade-offs for lead-gen use cases:
- Cost — Place Details requests cost $17 per 1,000 calls. A full contact profile (basic + contact + atmosphere) can run $35+ per 1K. Email enrichment is not even available.
- No email addresses — the Places API never returns emails. You'd still need a second scraper that visits each website. This actor does both in a single run.
- Field mask complexity — the Places API v1 requires a correctly formatted
X-Goog-FieldMaskheader for every request and silently charges more when you add fields. Easy to misconfigure. - Quotas — default quotas are tight. Bursting past them requires a billing review and often a quota increase form.
This scraper reads the public Google Maps business listings — the same data any user sees in a browser — and adds website-email enrichment on top. The result: a Google Maps lead-generation API that's typically 5–10× cheaper per verified-contact than the Places API, with email coverage that the Places API can't provide at any price.
Data fields the Google Maps scraper extracts
One item per business, flat JSON. Maps cleanly to a CRM column layout, a Google Sheet or a SQL table.
Business identity
| Field | Type | Description |
|---|---|---|
name | string | Business display name as shown on Google Maps |
category | string | Primary business category (e.g. "Pizza restaurant", "Chiropractor") |
placeId | string | Google Place ID — stable unique identifier across Google services |
mapsUrl | string | Direct Google Maps URL for the listing |
Contact data (the lead-gen gold)
| Field | Type | Description |
|---|---|---|
phone | string | Phone number in E.164-friendly display format |
website | string | Business website URL |
emails | array | Emails scraped from the business website (when includeWebsiteEmails=true) |
Reputation signals
| Field | Type | Description |
|---|---|---|
rating | number | Average star rating on a 0–5 scale |
reviewsCount | integer | Total number of Google reviews |
Location and hours
| Field | Type | Description |
|---|---|---|
address | string | Full formatted street address |
lat | number | GPS latitude |
lng | number | GPS longitude |
openingHours | array | Array of {day, hours} objects, one per day of the week |
Imagery
| Field | Type | Description |
|---|---|---|
imageUrls | array | Photo URLs from the Google business profile |
Run metadata
| Field | Type | Description |
|---|---|---|
searchQuery | string | The search term used to find this business |
locationQuery | string | The location filter applied |
scrapedAt | string | ISO 8601 timestamp of extraction |
Use cases for this Google Maps data API
- B2B cold outbound — build targeted prospect lists with verified phone and email. A campaign of "500 dentists in Miami with websites but no online booking" becomes one query instead of a week of list-building.
- Agency lead generation — find businesses without websites (
website == null) or with poor ratings (rating < 3.5) as targets for marketing agency outreach. Segmenting on reputation is trivial with this data shape. - Local SEO audits — pull every pizza place in a ZIP code, rank by reviews, identify NAP (name/address/phone) inconsistencies across the competitive set. Feed into Google Business Profile optimization reports.
- Field sales territory planning — aggregate businesses by category and GPS. Build heat maps, plan routes, assign reps by cluster.
- CRM enrichment — given a partial record (name + city), pull the Place ID and enrich with phone, email, hours and coordinates.
- Data products and directories — power a vertical directory (plumbers, mechanics, chiropractors) with fresh Maps data. Monetize via featured listings or lead-forwarding fees.
- Market sizing and competitive analysis — "how many artisanal coffee shops opened in Austin in the last 12 months?" Join scraped data across snapshots to measure market dynamics.
- Franchise development — scout territories for franchise expansion. Find under-served ZIPs by category density.
- Due diligence and investment research — for PE and SMB acquisition firms, a scan of public Google Maps data on every location a target operates is surprisingly valuable.
- Academic and journalism — reproducible business-census snapshots for economic geography research or local journalism projects.
How to use this Google Maps scraper
Mode 1 — basic Google Maps search
Pass an array of categories and a single location.
{"searchQueries": ["dentists", "chiropractors"],"locationQuery": "Miami, FL","maxResults": 100}
Mode 2 — full lead profile with email enrichment
Add includeWebsiteEmails: true to visit each business website and extract emails.
{"searchQueries": ["personal injury lawyers"],"locationQuery": "Los Angeles, CA","maxResults": 50,"includeWebsiteEmails": true}
Mode 3 — multi-city expansion in one run
Embed the location in the query when each category lives in a different city.
{"searchQueries": ["dentists in Chicago, IL","dentists in Houston, TX","dentists in Phoenix, AZ"],"maxResults": 75,"includeWebsiteEmails": true}
Mode 4 — high-volume territory scan
Up to 500 results per query when you need volume for an outbound campaign.
{"searchQueries": ["HVAC contractors", "plumbers", "electricians"],"locationQuery": "Dallas-Fort Worth, TX","maxResults": 500,"includeWebsiteEmails": true}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQueries | array | — | Search terms, e.g. ["restaurants", "dentists"] (required) |
locationQuery | string | "" | City or region. Leave empty if the city is already in each query |
maxResults | integer | 100 | Max businesses per query (1–500) |
includeWebsiteEmails | boolean | false | Visit each business website to extract email addresses |
Output example (JSON)
{"name": "Joe's Pizza","category": "Pizza restaurant","rating": 4.5,"reviewsCount": 12847,"address": "7 Carmine St, New York, NY 10014","phone": "+1 212-366-1182","website": "https://joespizzanyc.com","emails": ["info@joespizzanyc.com", "hello@joespizzanyc.com"],"openingHours": [{ "day": "Monday", "hours": "11 am–11 pm" },{ "day": "Tuesday", "hours": "11 am–11 pm" },{ "day": "Wednesday", "hours": "11 am–11 pm" },{ "day": "Thursday", "hours": "11 am–11 pm" },{ "day": "Friday", "hours": "11 am–12 am" },{ "day": "Saturday", "hours": "11 am–12 am" },{ "day": "Sunday", "hours": "11 am–11 pm" }],"imageUrls": ["https://lh3.googleusercontent.com/..."],"lat": 40.7305,"lng": -74.0021,"placeId": "0x89c2598f57ae9429:0x89b3e834c0ae8612","mapsUrl": "https://www.google.com/maps/place/...","searchQuery": "pizza restaurants","locationQuery": "New York, NY","scrapedAt": "2026-04-22T20:00:00.000Z"}
Export the full dataset as CSV, Excel, XML, JSONL or HTML table directly from the Apify console run page, or via the Apify API.
How to call this Google Maps scraper from your code
curl
curl -X POST 'https://api.apify.com/v2/acts/makework36~google-maps-scraper-full/run-sync-get-dataset-items?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"searchQueries": ["dentists"],"locationQuery": "Miami, FL","maxResults": 100,"includeWebsiteEmails": true}'
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("makework36/google-maps-scraper-full").call(run_input={"searchQueries": ["personal injury lawyers", "criminal defense attorneys"],"locationQuery": "Los Angeles, CA","maxResults": 100,"includeWebsiteEmails": True,})for biz in client.dataset(run["defaultDatasetId"]).iterate_items():if biz.get("emails"):print(biz["name"], biz["phone"], biz["emails"][0])
Node.js (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('makework36/google-maps-scraper-full').call({searchQueries: ['HVAC contractors'],locationQuery: 'Dallas, TX',maxResults: 200,includeWebsiteEmails: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const withEmail = items.filter((b) => b.emails && b.emails.length);console.log(`${withEmail.length}/${items.length} businesses have an email.`);
Export to CSV for CRM import
From the run page → Export → CSV. Or via API:
https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN
Load straight into HubSpot / Salesforce via webhook
import requestsfrom apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("makework36/google-maps-scraper-full").call(run_input={"searchQueries": ["dentists"], "locationQuery": "Austin, TX","maxResults": 100, "includeWebsiteEmails": True,})for biz in client.dataset(run["defaultDatasetId"]).iterate_items():if biz.get("emails"):requests.post("https://hooks.hubspot.com/your-webhook", json={"company": biz["name"], "email": biz["emails"][0],"phone": biz["phone"], "website": biz["website"],})
Performance & cost
- ~$2 per 1,000 results in full mode (phone, website, hours, photos, coordinates, Place ID)
- Email extraction hit rate typically 30–60% of businesses — depends on whether the site displays a contact email
- 1–2 minutes per 100 results in full mode
- No proxy required for most searches — the actor ships with sensible defaults
- Runs fine on Apify's 256 MB tier
Google Maps scraper comparison
Several Google Maps scrapers exist on the Apify Store. Here's how this one stacks up on what actually matters for lead-generation workflows.
| Feature | This scraper | Alternative A | Alternative B | Alternative C |
|---|---|---|---|---|
| Phone number extraction | Yes | Yes | Yes | Yes |
| Website extraction | Yes | Yes | Partial | Yes |
| Emails from website | Yes (built-in) | Separate actor ($) | No | No |
| Opening hours per day | Yes (structured array) | Text blob | Yes | Partial |
| GPS coordinates | Yes (lat/lng) | Yes | Yes | Yes |
| Place ID | Yes | Yes | No | Yes |
| Photos | Yes | Yes | Partial | Yes |
| Max results per query | 500 | 120 | 100 | 300 |
| Multi-query per run | Yes (array) | Yes | Single only | Yes |
| Multi-location per run | Yes (query-embedded) | Yes | Single only | Partial |
| Official Places API key needed | No | No | No | No |
| Code examples in README | Python / Node / curl / HubSpot | None | None | None |
| Price per result (full profile with email) | Competitive mid-market | Higher | Cheaper, no emails | Higher |
The honest take: if you don't need email enrichment and only want name / address / rating, a cheaper basic scraper will do. If you need a single run that delivers an outbound-ready lead with phone, website and email all in one dataset item, this actor removes an entire enrichment step from your pipeline.
Step-by-step tutorial — your first run in 3 minutes
- Sign up for Apify — go to apify.com and create a free account with $5 trial credit.
- Open the actor — click Google Maps Lead Scraper → "Try for free".
- Fill the input form — set
searchQueriesto something concrete like["dentists"]. SetlocationQueryto your target city. EnableincludeWebsiteEmails. - Click "Start" — the actor runs. 100 results with email enrichment usually takes 1–2 minutes.
- View the dataset — the Dataset tab shows name, category, rating, phone, website, emails and hours. Click Export to grab CSV for your CRM.
- Automate — Schedules → Create new schedule. Run weekly to keep your lead list fresh as new businesses open.
That's it. No Google Cloud billing account, no Places API key, no quota form.
Advanced usage patterns
Pattern 1 — no-website audit for agency outreach
Pull every business in a category/city combination with maxResults=500 and email enrichment on. Filter client-side for !website || website == "". These are agency-outreach gold: businesses that are visible on Google Maps but have no web presence.
Pattern 2 — poor-reputation repair leads
Filter for rating < 3.5 && reviewsCount > 20. These businesses are actively losing customers to reviews. Reputation-management services, review-gating platforms and local SEO firms all sell to exactly this list.
Pattern 3 — ZIP-level competitive density
Scrape every business in a specific category inside a metro area. Aggregate by ZIP using the lat/lng fields. Output a heat map of category density. Franchise teams use this for territory planning; investors use it for market sizing.
Pattern 4 — fresh-listings alert
Run the actor weekly on the same query. Diff this week's placeId set against last week's. New IDs = new businesses that opened or got listed. Notify your sales team — first to reach out, first to close.
Pattern 5 — CRM enrichment by Place ID
If your CRM already stores placeId for each account, schedule the actor to re-scrape a target list weekly and update hours, rating and reviews count. Keeps your CRM truthful without any manual data-hygiene work.
Troubleshooting
emails array is empty
Either includeWebsiteEmails is false, the business has no website, or the website exists but doesn't publish an email on the homepage / contact page. Rate of coverage is typically 30–60% across industries.
Fewer results than maxResults
Google Maps caps any single search at around 120 organic results. To go beyond that, split your query by sub-area (ZIP, neighborhood) and combine client-side.
Address format varies by country
address is returned exactly as Google formats it. For structured parts (street, city, state, postal code) pipe the field through libpostal or the Google Geocoding API.
Phone number format Google returns phones in the display format used on Maps. For programmatic calling or E.164 normalization, pipe through libphonenumber.
Business that closed permanently Google marks them "Permanently closed". The scraper still returns the listing but the hours and phone may be stale. Filter client-side if freshness matters.
Large-run timeouts
maxResults=500 with includeWebsiteEmails on a slow category can take 10+ minutes. Split into several runs or raise the Apify run timeout in the console.
Pricing
Pay-per-result model:
| Plan | Price per 1K results (full + emails) | 10K results | 100K results | 1M results |
|---|---|---|---|---|
| FREE trial | $0 (up to $5 credit) | N/A | N/A | N/A |
| BRONZE | $2.00 | $20 | $200 | $2,000 |
| SILVER | $1.80 | $18 | $180 | $1,800 |
| GOLD | $1.60 | $16 | $160 | $1,600 |
| DIAMOND | $1.40 | $14 | $140 | $1,400 |
Apify gives every new user a $5 trial credit — enough for ~2,500 Google Maps results. No subscription, no minimum commitment, no egress fees.
FAQ
Do I need a Google Maps or Places API key? No. This scraper reads public Google Maps pages — no API key, no OAuth, no billing account on Google Cloud.
Is scraping Google Maps legal? This actor only reads publicly visible data on google.com/maps. Review Google's Terms of Service and your local privacy / data-protection laws. Don't store personal data beyond your legal basis. For sensitive use cases, consult legal counsel.
How accurate are the emails?
Emails come straight from each business's website — homepage, contact page and mailto: patterns. Accuracy is high for emails actually published on the site; the 30–60% coverage reflects that not every small business publishes a contact email.
What's the difference versus the basic Google Maps scraper? A basic scraper ($1 per 1K) typically returns name, address, rating and coordinates. This one adds phone, website, emails, reviews count, hours and photos in a single run — removing the need to chain multiple scrapers.
Can I scrape multiple cities in one run?
Yes. Embed the city in each query — ["dentists in Chicago", "dentists in Houston"] — or set locationQuery and let it apply to every query.
Can I filter by rating or review count on the server side?
Not in the input. Filter client-side on the rating / reviewsCount fields — Google's ranking already surfaces the best-rated businesses near the top of each query.
Can I scrape reviews themselves?
This actor returns reviewsCount and rating but not individual review text. For the reviews bodies, drop a feature request on the issues tab.
How often should I re-scrape to keep data fresh? Weekly is enough for most lead-gen workflows. Monthly is fine if you mostly care about discovering new businesses. Daily is overkill unless you're running a real-time directory.
Do I need a residential proxy? No. Works without proxies for most queries. For very high-volume scans, Apify Proxy can be enabled to rotate IPs automatically.
Changelog
- v1.0 (2026-04-22) — Full SEO rewrite, pricing tiers, comparison table, HubSpot webhook example, advanced patterns.
- v0.4 (2026-03-15) — Increased max results to 500 per query.
- v0.3 (2026-02-10) — Structured
openingHoursarray per day. - v0.2 (2026-01-18) — Website email extraction.
- v0.1 (2025-12-20) — Initial release — full business profile with phone, website, hours and GPS.
Related scrapers from the same author
- Google Play Reviews Scraper — Android app reviews
- YouTube Shorts Scraper — trending Shorts with engagement metrics
- Telegram Channel Scraper — public Telegram channel messages
- Fast Airbnb Price Scraper — Airbnb listings, prices and coordinates
- Reddit MCP Server — Reddit data via MCP for AI agents
- Google Maps Basic Scraper — the lightweight name/address/rating variant
Legal & ethics note
This scraper accesses only publicly available pages on google.com/maps and publicly available business websites — the same pages any anonymous browser visitor can read. Email addresses are extracted only from pages the business owner published on their own site. Output follows open conventions described at schema.org/LocalBusiness and schema.org/Organization. You are responsible for complying with Google's Terms of Service, the CAN-SPAM Act, the EU's ePrivacy Directive, GDPR, CCPA, Mexico's LFPDPPP and any similar regulations in your jurisdiction. Don't email people who opted out; honor unsubscribes; include physical address and opt-out link in every message.
🙏 Ran this scraper successfully? Leaving a review helps the algorithm surface this to other B2B lead-gen teams and local SEO consultants. Much appreciated.