Google Maps Scraper Full - Phone, Website, Emails & Reviews avatar

Google Maps Scraper Full - Phone, Website, Emails & Reviews

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Google Maps Scraper Full - Phone, Website, Emails & Reviews

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

deusex machine

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

4 days ago

Last modified

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-FieldMask header 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

FieldTypeDescription
namestringBusiness display name as shown on Google Maps
categorystringPrimary business category (e.g. "Pizza restaurant", "Chiropractor")
placeIdstringGoogle Place ID — stable unique identifier across Google services
mapsUrlstringDirect Google Maps URL for the listing

Contact data (the lead-gen gold)

FieldTypeDescription
phonestringPhone number in E.164-friendly display format
websitestringBusiness website URL
emailsarrayEmails scraped from the business website (when includeWebsiteEmails=true)

Reputation signals

FieldTypeDescription
ratingnumberAverage star rating on a 0–5 scale
reviewsCountintegerTotal number of Google reviews

Location and hours

FieldTypeDescription
addressstringFull formatted street address
latnumberGPS latitude
lngnumberGPS longitude
openingHoursarrayArray of {day, hours} objects, one per day of the week

Imagery

FieldTypeDescription
imageUrlsarrayPhoto URLs from the Google business profile

Run metadata

FieldTypeDescription
searchQuerystringThe search term used to find this business
locationQuerystringThe location filter applied
scrapedAtstringISO 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

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

ParameterTypeDefaultDescription
searchQueriesarraySearch terms, e.g. ["restaurants", "dentists"] (required)
locationQuerystring""City or region. Leave empty if the city is already in each query
maxResultsinteger100Max businesses per query (1–500)
includeWebsiteEmailsbooleanfalseVisit 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 ApifyClient
client = 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 → ExportCSV. 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 requests
from apify_client import ApifyClient
client = 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.

FeatureThis scraperAlternative AAlternative BAlternative C
Phone number extractionYesYesYesYes
Website extractionYesYesPartialYes
Emails from websiteYes (built-in)Separate actor ($)NoNo
Opening hours per dayYes (structured array)Text blobYesPartial
GPS coordinatesYes (lat/lng)YesYesYes
Place IDYesYesNoYes
PhotosYesYesPartialYes
Max results per query500120100300
Multi-query per runYes (array)YesSingle onlyYes
Multi-location per runYes (query-embedded)YesSingle onlyPartial
Official Places API key neededNoNoNoNo
Code examples in READMEPython / Node / curl / HubSpotNoneNoneNone
Price per result (full profile with email)Competitive mid-marketHigherCheaper, no emailsHigher

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

  1. Sign up for Apify — go to apify.com and create a free account with $5 trial credit.
  2. Open the actor — click Google Maps Lead Scraper → "Try for free".
  3. Fill the input form — set searchQueries to something concrete like ["dentists"]. Set locationQuery to your target city. Enable includeWebsiteEmails.
  4. Click "Start" — the actor runs. 100 results with email enrichment usually takes 1–2 minutes.
  5. View the dataset — the Dataset tab shows name, category, rating, phone, website, emails and hours. Click Export to grab CSV for your CRM.
  6. AutomateSchedulesCreate 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:

PlanPrice per 1K results (full + emails)10K results100K results1M results
FREE trial$0 (up to $5 credit)N/AN/AN/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 openingHours array 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.

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.