Google Maps Lead Extractor with Website Email Enrichment avatar

Google Maps Lead Extractor with Website Email Enrichment

Pricing

$150.00 / 1,000 business extracteds

Go to Apify Store
Google Maps Lead Extractor with Website Email Enrichment

Google Maps Lead Extractor with Website Email Enrichment

Extract emails from Google Maps businesses. Searches by keyword + location, scrapes each business website for emails, phones, and social links. Classifies personal vs generic emails. Batch queries, deduplication, sorted by data richness. $0.15/business, no subscription.

Pricing

$150.00 / 1,000 business extracteds

Rating

0.0

(0)

Developer

ryan clinton

ryan clinton

Maintained by Community

Actor stats

1

Bookmarked

12

Total users

4

Monthly active users

6 days ago

Last modified

Categories

Share

Google Maps Lead Extractor with Website Email Enrichment is an Apify actor that searches Google Maps for local businesses, then crawls each business website to extract email addresses, phone numbers, and social media profiles β€” a Google Maps scraper plus a website contact extractor combined into a single pipeline. Emails are extracted from business websites, not from Google Maps itself.

Marketing agencies, SDRs, and recruiters use Google Maps Lead Extractor with Website Email Enrichment to build targeted local prospect lists without manual research. Enter a search query like "HVAC contractors in Denver", get a structured dataset of businesses with emails attached. The actor handles batch queries, automatic deduplication, email classification (personal vs generic), and sorts results by contact richness so the best leads appear first.

What it does: Searches Google Maps by keyword + location, opens each business website, extracts emails/phones/social links, returns structured leads. Best for: Local lead generation, SDR prospecting, agency outreach, recruiter sourcing, franchise research, CRM enrichment. Speed: 20 businesses in ~2 minutes (Maps only). With website scraping: 5-10 minutes. With enrichWithReviews: adds ~10 seconds per listing. Pricing: $0.15 per business extracted. No subscription. Budget cap supported. Output: CSV/JSON with Google Maps business data plus website-enriched emails, phones, social links, coordinates, hours, and contact classification.

Typical results

  • 60-80% of businesses with websites return at least one email
  • 20 businesses in ~5-10 minutes runtime
  • Best niches: contractors, dentists, agencies, law firms, restaurants
  • Lower results for: businesses without websites or using contact forms only

What is a Google Maps lead extractor?

A Google Maps lead extractor is a tool that searches Google Maps for businesses in a specific location and category, then enriches those listings with contact data such as emails, phone numbers, and social profiles. Unlike basic scrapers that only return Maps listing data, Google Maps Lead Extractor with Website Email Enrichment performs both data collection and website enrichment in one run, making it suitable for direct outreach workflows without needing a separate email-finding tool.

What data can you extract?

Data PointSourceExample
🏒 Business nameGoogle MapsApex Plumbing & Heating
πŸ“ AddressGoogle Maps1420 W 32nd Ave, Denver, CO 80211
🏷️ CategoryGoogle MapsPlumber
πŸ“ž Phone (Maps)Google Maps(303) 555-0182
⭐ RatingGoogle Maps4.7
πŸ’¬ Reviews countGoogle Maps (requires enrichWithReviews)214
🌐 Website URLGoogle Mapsapexplumbingdenver.com
πŸ”— Google Maps URLGoogle Mapsmaps.google.com/place/...
πŸ“Œ Place IDGoogle MapsChIJN1t_tDeuEmsRUsoyG83frY4
πŸ—ΊοΈ CoordinatesGoogle Mapslat: 39.7621, lng: -105.0055
πŸ• Opening hoursGoogle Maps (requires enrichWithReviews)Monday: 7 AM-6 PM, Tuesday: 7 AM-6 PM
πŸ’² Price levelGoogle Maps$$
πŸ“§ Personal emailsBusiness websitesarah.chen@apexplumbingdenver.com
πŸ“§ Generic emailsBusiness websiteinfo@apexplumbingdenver.com
πŸ“± Website phonesBusiness website(303) 555-0182, (303) 555-0194
πŸ‘₯ Social linksBusiness websitelinkedin.com/company/apex-plumbing
πŸ“„ Pages scrapedInternal4

Why use Google Maps Lead Extractor with Website Email Enrichment?

Building a prospect list manually means opening Google Maps, clicking each result, visiting the website, hunting the contact page, and copy-pasting an email. For 50 businesses that takes several hours. For 200 it is a full workday, and the results are still a raw spreadsheet with no deduplication or email classification.

This actor automates the entire pipeline: one search query triggers a Google Maps scan with a headless browser, website visits via high-speed HTTP crawling, contact extraction with junk filtering, and a clean structured export. A list of 50 businesses with emails typically completes in under 15 minutes.

  • Scheduling β€” run daily or weekly to monitor new businesses entering a market or keep lead lists current
  • API access β€” trigger runs from Python, JavaScript, or any HTTP client to fit into existing sales workflows
  • Proxy rotation β€” built-in Apify residential proxy infrastructure rotates IPs so Google Maps and website visits do not get blocked at scale
  • Monitoring β€” configure Slack or email alerts when runs fail or return fewer results than expected
  • Integrations β€” connect to Zapier, Make, Google Sheets, HubSpot, or webhooks to push leads directly into your CRM

How does this compare to other Google Maps scrapers?

FeatureGoogle Maps Lead ExtractorCompass Google Maps ScraperOutscraperPhantomBuster
Google Maps data extractionYesYesYesYes
Website email extractionYes (built-in Phase 2)NoGeneric emails onlyNo
Personal vs generic email splitYesNoNoNo
Social link extractionYes (5 platforms)NoNoNo
Pricing model$0.15/business~$2.10/1k results~$3.00/1k results$56-239/month
Subscription requiredNoNoNoYes
Junk email filtering15 patternsN/AN/AN/A
Contact-priority page crawling18 keyword patternsN/AN/AN/A
Maps + website enrichment pipelineYesNoNoNo
Best for local lead generation with emailsYesMaps data onlyMaps data onlyMaps data only

Features

  • Direct Google Maps scraping via PlaywrightCrawler β€” no external dependencies or third-party scrapers; the actor controls a headless Chromium browser with residential proxies to search Google Maps directly
  • Two-phase pipeline β€” Phase 1 scrolls and clicks through Google Maps results using Playwright, Phase 2 visits each business website using a CheerioCrawler-based contact scraper at high concurrency
  • Batch query support β€” pass up to 50 search queries in searchStringsArray to cover multiple cities, categories, or niches in a single run
  • Email classification β€” separates emails into personalEmails (likely belonging to a person) and genericEmails (info@, contact@, support@, sales@, hello@, admin@, office@, team@, help@, enquiries@, mail@)
  • Automatic junk email filtering β€” 15 junk-email patterns remove noreply@, donotreply@, test@, webmaster@, image file extensions mistaken for emails, sentry.io addresses, wixpress.com, and placeholder domains
  • Three-layer email detection β€” extracts from mailto: link href attributes first, then applies a full-body regex scan, then scans all a[href] attributes to catch obfuscated emails
  • Contact-priority crawling β€” after scraping the homepage, the actor follows links to contact, about, team, leadership, management, executives, company, and people pages (18 keyword patterns) before scraping generic pages
  • Phone number extraction from three formats β€” international +1 (303) 555-0182, US (303) 555-0182, and plain 303-555-0182; repeating-digit strings and sequential numbers are filtered as fake
  • Social media link extraction β€” captures LinkedIn (company and personal), Twitter/X, Facebook, Instagram, and YouTube profiles via domain-anchored regex patterns
  • Results sorted by data richness β€” businesses with the most emails, phones, and social links appear first in the output
  • Per-domain page cap β€” maxPagesPerSite (default 5) prevents runaway crawls on large sites; homepage is always page 1
  • Automatic deduplication β€” emails, phones, and social links are deduplicated per domain using Set-based merging across all pages scraped
  • Pay-per-event billing with spending cap β€” charges one event per extracted business; stops immediately when the user-set spending limit is reached
  • Concurrent website crawling at up to 10 workers β€” CheerioCrawler runs with maxConcurrency: 10 and maxRequestsPerMinute: 120, balancing speed against rate-limit risk
  • SSL error tolerance β€” ignoreSslErrors: true prevents SSL misconfigurations on older business sites from blocking extraction
  • Run summary in key-value store β€” a SUMMARY record with query count, businesses found/pushed, email totals, and phone totals is saved for monitoring workflows

Use cases for Google Maps email extraction

Best for: Sales prospecting in local markets

SDRs and BDRs targeting local verticals β€” HVAC, law firms, dental practices, restaurants β€” can run a query like "family dentists in Phoenix AZ" and get a ready-to-import CSV with business names, addresses, ratings, and direct email addresses. No manual clicking. The list goes straight into an outreach sequence.

Best for: Marketing agency lead generation

Agencies building prospect databases for clients in specific cities or industries use this actor to generate hundreds of qualified leads per hour. Run "marketing agencies in Austin TX" to find potential white-label clients, or "gyms in Miami" for a fitness equipment supplier. The social links output surfaces LinkedIn pages for multi-channel outreach.

Best for: Recruiting and talent sourcing

Recruiters prospecting hiring managers at SMBs can identify businesses in a target sector and geography, then reach decision-makers directly via email instead of cold-calling switchboards. Combine with B2B Lead Qualifier to score businesses by size signals before outreach.

Best for: Competitive intelligence and market mapping

Analysts mapping the competitive landscape in a city or region can extract every business in a category, complete with ratings, review counts, and websites. Feeding this into Trustpilot Review Analyzer gives a reputation layer on top of the location data.

Best for: Franchise and territory research

Franchise development teams use Google Maps searches to identify existing operators in a territory, evaluate market saturation by review volume, and find gaps where new locations could succeed. Ratings, review counts, and coordinates are included in every record for geographic analysis.

Best for: Data enrichment of existing CRM records

If you have a list of business names but are missing email addresses, pass each name plus city as a query. The actor returns the website email alongside the Maps record for manual matching. For high-volume enrichment pipelines, see Waterfall Contact Enrichment.

How to extract emails from Google Maps

  1. Enter your search query β€” Type a business type and location into the query field, for example "landscaping companies in Nashville TN" or "accountants near Brooklyn NY". Specific queries return more relevant results. For multiple searches, use searchStringsArray.
  2. Set the maximum results β€” The default is 20 businesses per query. Raise it to 50 or 100 for larger batches. Google Maps returns at most ~120 results per query, so use multiple queries for broad geographic coverage.
  3. Click Start and wait β€” The actor first searches Google Maps via a headless browser (1-3 minutes), then visits each business website (2-8 minutes depending on batch size). A 50-business run typically finishes in 10-15 minutes.
  4. Download results β€” Open the Dataset tab and export to JSON, CSV, or Excel. Every record includes the business name, address, rating, phone, website, emails classified as personal or generic, and social links.

Typical performance

Batch sizeApproximate timeEmail hit rateApproximate cost
5 businesses~50 seconds60-80% of sites with websites~$0.75
20 businesses5-10 minutes60-80% of sites with websites~$3.00
50 businesses10-15 minutes60-80% of sites with websites~$7.50
100 businesses20-35 minutes60-80% of sites with websites~$15.00

Email hit rate refers to the percentage of businesses that have a website where the actor finds at least one email address. Businesses without a Google Maps website link return no emails. Performance measured on US business listings in March 2026.

Example campaigns

QueryBusinesses foundWith websitesEmails foundPersonal emails
"Dentists in Austin TX"3026189
"Roofers in Dallas TX"50382511
"Marketing agencies in Miami FL"2018137
"HVAC contractors in Denver CO"40312210

Representative test results from March 2026 on US business listings. Results vary by niche and geography. Service businesses with dedicated websites (contractors, law firms, agencies, clinics) produce the highest email hit rates. Businesses using only contact forms, social media pages, or third-party platforms return fewer emails.

Input parameters

ParameterTypeRequiredDefaultDescription
querystringNo*β€”Google Maps search query combining a business type and location, e.g. "plumbers in Chicago"
searchStringsArrayarrayNo*β€”Array of up to 50 Google Maps search queries for batch processing
maxResultsintegerNo20Maximum businesses to extract per query (1-120). Higher values find more leads but cost more.
languagestringNo"en"Language code for Google Maps results, e.g. "en", "es", "de"
enrichWithReviewsbooleanNofalseVisit each listing's detail page to extract review counts, opening hours, and plus codes. Adds ~10 seconds per listing.
scrapeWebsitesbooleanNotrueWhen true, visits each business website to extract emails, phones, and social links
maxPagesPerSiteintegerNo5Pages to scrape per website (1-20). Homepage is always scraped; additional pages target contact/about/team pages

*Provide either query or searchStringsArray. If both are provided, searchStringsArray takes priority.

Input examples

Standard local prospecting β€” most common use case:

{
"query": "roofing contractors in Dallas TX",
"maxResults": 50,
"scrapeWebsites": true,
"maxPagesPerSite": 5
}

Batch queries across multiple cities:

{
"searchStringsArray": [
"dentists in Austin TX",
"dentists in San Antonio TX",
"dentists in Houston TX",
"dentists in Dallas TX"
],
"maxResults": 30,
"scrapeWebsites": true,
"maxPagesPerSite": 3
}

Maps data only β€” fast, no website scraping:

{
"query": "coffee shops in Seattle WA",
"maxResults": 20,
"scrapeWebsites": false
}

Input tips

  • Be specific with location β€” "dentists in Austin TX" outperforms "dentists". City + state produces the most consistent results.
  • Use searchStringsArray for regional coverage β€” Google Maps caps results at ~120 per query. For statewide campaigns, pass separate queries per major city in a single run.
  • Lower maxPagesPerSite for speed β€” Setting it to 2 (homepage + contact page) cuts website scraping time by 50-60% while still capturing most emails.
  • Disable website scraping for research runs β€” Set scrapeWebsites: false to get Maps data instantly for competitive mapping, then re-run with scraping enabled on the filtered list.
  • Batch in one run β€” Processing 50 businesses in a single run is faster and cheaper than 50 individual runs due to crawler warm-up overhead.

Output example

{
"businessName": "Apex Plumbing & Heating",
"address": "1420 W 32nd Ave, Denver, CO 80211, USA",
"category": "Plumber",
"phone": "(303) 555-0182",
"rating": 4.7,
"reviewsCount": 214,
"website": "https://apexplumbingdenver.com",
"googleMapsUrl": "https://www.google.com/maps/place/Apex+Plumbing+%26+Heating/@39.7621,-105.0055,17z/...",
"placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"coordinates": {
"lat": 39.7621,
"lng": -105.0055
},
"openingHours": [
"Monday: 7 AM-6 PM",
"Tuesday: 7 AM-6 PM",
"Wednesday: 7 AM-6 PM",
"Thursday: 7 AM-6 PM",
"Friday: 7 AM-5 PM",
"Saturday: 8 AM-2 PM",
"Sunday: Closed"
],
"priceLevel": "$$",
"plusCode": "86FR+QG Denver, Colorado",
"emails": [
"info@apexplumbingdenver.com",
"sarah.chen@apexplumbingdenver.com",
"scheduling@apexplumbingdenver.com"
],
"personalEmails": [
"sarah.chen@apexplumbingdenver.com",
"scheduling@apexplumbingdenver.com"
],
"genericEmails": [
"info@apexplumbingdenver.com"
],
"websitePhones": [
"(303) 555-0182",
"(303) 555-0194"
],
"socialLinks": {
"facebook": "https://www.facebook.com/apexplumbingdenver",
"instagram": "https://www.instagram.com/apexplumbing/",
"linkedin": "https://www.linkedin.com/company/apex-plumbing-heating"
},
"pagesScraped": 4,
"extractedAt": "2026-03-19T14:22:08.441Z"
}

Output fields

FieldTypeDescription
businessNamestringBusiness name from Google Maps
addressstring | nullStreet address from Google Maps
categorystring | nullGoogle Maps business category (e.g. "Plumber", "Dentist")
phonestring | nullPhone number listed on the Google Maps listing
ratingnumber | nullGoogle Maps star rating, 1.0-5.0
reviewsCountinteger | nullTotal number of Google Maps reviews
websitestring | nullBusiness website URL from Google Maps
googleMapsUrlstring | nullDirect URL to the business Google Maps listing
placeIdstring | nullGoogle Maps Place ID in ChIJ format
coordinatesobject | null{ lat, lng } β€” latitude and longitude of the business
openingHoursstring[] | nullBusiness opening hours per day, e.g. "Monday: 7 AM-6 PM"
priceLevelstring | nullGoogle Maps price level indicator (e.g. "$", "$$", "$$$")
plusCodestring | nullGoogle Plus Code for the business location
emailsstring[]All deduplicated emails extracted from the business website
personalEmailsstring[]Non-generic emails likely belonging to a person (filtered from emails)
genericEmailsstring[]Generic role-based emails: info@, contact@, support@, sales@, hello@, admin@, office@, team@, help@, enquiries@, mail@
websitePhonesstring[]Phone numbers extracted from the business website
socialLinks.linkedinstringLinkedIn company or personal profile URL
socialLinks.twitterstringTwitter/X profile URL
socialLinks.facebookstringFacebook page URL
socialLinks.instagramstringInstagram profile URL
socialLinks.youtubestringYouTube channel URL
pagesScrapedinteger | nullNumber of website pages scraped; null if website scraping was disabled
extractedAtstringISO 8601 timestamp of when the record was assembled

How much does it cost to extract emails from Google Maps?

Google Maps Lead Extractor with Website Email Enrichment uses pay-per-event pricing β€” you pay $0.15 per business extracted. Platform compute costs are included.

ScenarioBusinessesCost per businessTotal cost
Quick test5$0.15$0.75
Small batch20$0.15$3.00
Medium batch50$0.15$7.50
Large batch100$0.15$15.00
Enterprise500$0.15$75.00

You can set a maximum spending limit per run to control costs. The actor stops when your budget is reached, so you never pay more than you intend.

Compare this to Outscraper at $3.00 per 1,000 results (Maps-only, no emails), Hunter.io at $49/month (500 searches), or PhantomBuster at $56-239/month (no email extraction included). With Google Maps Lead Extractor, most users spend $5-15 per campaign with no monthly commitment and no seat fees.

Run Google Maps Lead Extractor via API

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/google-maps-email-extractor").call(run_input={
"query": "roofing contractors in Dallas TX",
"maxResults": 50,
"scrapeWebsites": True,
"maxPagesPerSite": 5,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
emails = ", ".join(item.get("personalEmails", [])) or "none found"
print(f"{item['businessName']} | {item.get('phone', 'no phone')} | {emails}")

JavaScript

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/google-maps-email-extractor").call({
query: "roofing contractors in Dallas TX",
maxResults: 50,
scrapeWebsites: true,
maxPagesPerSite: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
const emails = item.personalEmails?.join(", ") || "none found";
console.log(`${item.businessName} | ${item.phone ?? "no phone"} | ${emails}`);
}

cURL

# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~google-maps-email-extractor/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "roofing contractors in Dallas TX",
"maxResults": 50,
"scrapeWebsites": true,
"maxPagesPerSite": 5
}'
# Fetch results (replace DATASET_ID from the run response above)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"

How Google Maps Lead Extractor works

Phase 1 β€” Google Maps search via headless browser

The actor launches a PlaywrightCrawler with a headless Chromium browser using Apify residential proxies (RESIDENTIAL proxy group). It navigates to google.com/maps/search/{query}?hl={language} and waits for the results feed (div[role="feed"]) to load. The crawler then enters a scroll loop β€” using mouse wheel events to incrementally load results β€” up to 30 scroll attempts, stopping when maxResults listings are visible or Google displays "You've reached the end of the list." CAPTCHA detection checks the page title and body text for bot-detection signals; if detected, the request is retried up to 3 times with a fresh proxy.

Phase 2 β€” Listing detail extraction

For each listing in the feed, the crawler navigates directly to the listing URL and waits for the detail pane h1 element. It runs a single page.evaluate() call to extract all structured fields in one round-trip: rating from span[role="img"][aria-label*="star"], review count from button[aria-label*="review"] with parenthesized-number fallback, category from button[jsaction*="category"] with sibling traversal fallback, address from button[data-item-id="address"], phone from button[data-item-id^="phone:"] with tel: link fallback, website from a[data-item-id="authority"] with aria-label and external-link fallbacks, opening hours from table tr rows matching day-of-week patterns, price level from [aria-label*="Price"], and plus code from button[data-item-id="oloc"]. Place ID is extracted via regex from the URL (!1s(ChIJ...)) and coordinates from the @lat,lng URL pattern. Human-like delays (1.5-3 seconds randomized) are applied between listings.

Phase 3 β€” Website contact extraction

Business websites are passed to a CheerioCrawler running at up to 10 concurrent workers with a 120-request-per-minute cap. Each site is scraped in two-label routing mode: HOMEPAGE first (which extracts contacts and discovers contact-priority subpages via 18 keyword patterns including contact, about, team, leadership, management, executives), then SUBPAGE for discovered internal pages. Up to maxPagesPerSite pages are scraped per domain. Email extraction operates in three passes: mailto: link attributes first, then full-body regex scan (/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,12}/), then all a[href] attributes. Results are merged into a per-domain Set and filtered through 15 junk patterns. Phone extraction prioritizes tel: links, then searches footer and contact-area HTML (elements matching [class*="contact"], [class*="phone"], address, footer). Social links are captured via domain-anchored regex for LinkedIn, Twitter/X, Facebook, Instagram, and YouTube.

Phase 4 β€” Output assembly and billing

Contact data is joined back to the original Maps records by domain (www-stripped hostname). Emails are classified: any matching ^(info|contact|hello|support|admin|office|sales|team|help|enquiries|mail)@ are placed in genericEmails; the rest go to personalEmails. Records are sorted by data richness (email count + phone count + social link count, descending). In pay-per-event mode, a business-extracted charge event fires after each push; if the spending limit is reached, the loop breaks cleanly. A summary record is saved to the key-value store with totals for queries searched, businesses found/pushed, emails, phones, and unique domains.

Tips for best results

  1. Include the state abbreviation in your query. "electricians in Portland OR" is more precise than "electricians in Portland" β€” Google disambiguates the city correctly and returns tighter geographic results.

  2. Run a no-scrape pass first for large campaigns. Set scrapeWebsites: false, export the CSV, filter to businesses you actually want to contact, then re-run with only those website URLs using Website Contact Scraper.

  3. Set maxPagesPerSite: 2 for broad coverage on a budget. Homepage plus one contact/about page captures the majority of business email addresses. Moving from 2 to 5 pages adds roughly 15% more emails at 2.5x the scraping time per site.

  4. Use searchStringsArray for regional coverage. Google Maps caps results at roughly 120 per search. For a full state campaign, pass separate city queries in one batch run instead of running each individually.

  5. Pass emails directly to Bulk Email Verifier. A significant fraction of extracted emails bounce. Verifying before sending protects sender reputation. At $0.005 per email, verification adds minimal cost.

  6. Push directly to HubSpot using HubSpot Lead Pusher. Connect the two actors via a webhook or Make scenario to create contacts automatically on run completion.

  7. Score leads before outreach. Feed results into B2B Lead Qualifier to rank businesses by rating, review volume, and website quality signals before prioritizing outreach.

  8. Focus on personalEmails for cold outreach. Personal emails have higher response rates than generic addresses like info@ or contact@. The actor pre-classifies these for you.

Combine with other Apify actors

ActorHow to combine
Bulk Email VerifierVerify extracted emails via MX + SMTP checks before sending outreach to protect sender reputation ($0.005/email)
B2B Lead QualifierScore each business 0-100 using rating, review count, and website quality signals to prioritize the best prospects
Website Contact ScraperRe-scrape individual websites from Maps results with deeper crawling for higher email yield on sites that returned empty
Email Pattern FinderDetect the company's email naming convention (firstname.lastname@) to construct emails for contacts not listed on the website
HubSpot Lead PusherPush extracted business records into HubSpot CRM contacts automatically via webhook on run completion
Waterfall Contact EnrichmentRun a 10-step enrichment cascade on records that returned no email to find contacts via alternative sources
Google Maps Lead EnricherFull pipeline: Maps search, website scraping, email verification, and lead scoring combined in one actor

Limitations

  • Google Maps caps results at roughly 120 per search query. To collect more than 120 businesses for a given niche, run multiple queries with different geographic sub-areas (cities, neighborhoods, zip codes) using searchStringsArray.
  • Website scraping uses HTTP-only Cheerio parsing. Websites that render contact information via JavaScript (React SPAs, Angular apps) will not yield emails. For JS-rendered sites use Website Contact Scraper Pro.
  • No email found does not mean no email exists. Many businesses list contact forms rather than email addresses, or put contact details only in images. This actor extracts text-based emails; image-embedded text is not supported.
  • Phone numbers on the website may duplicate the Maps phone. The phone field comes from Google Maps; websitePhones comes from the website itself. Both are included so you can choose the source you trust.
  • Language affects Google Maps results, not website scraping. The language parameter controls the locale of the Maps search response. Business websites are scraped as-is regardless of language.
  • Rate limits may slow large batches. The website crawler runs at maxRequestsPerMinute: 120. A batch of 100 businesses with maxPagesPerSite: 5 can take 20-30 minutes depending on server response times.
  • Businesses without a website on Google Maps are returned without email data. The emails, personalEmails, genericEmails, and websitePhones fields will be empty arrays for these records.
  • Social link extraction captures the first matching URL per platform. If a site has multiple Facebook links (e.g. a share button and a profile link), only the first match is captured.
  • Google Maps layout changes can temporarily affect extraction. The actor uses CSS selectors for the Maps detail pane; if Google updates their HTML structure, some fields may return null until selectors are updated.

Integrations

  • Zapier β€” trigger a run on a schedule and push new business emails directly into Mailchimp, Salesforce, or any Zapier-connected CRM
  • Make β€” build a pipeline that runs the actor weekly, filters results by minimum rating, and creates HubSpot contacts for qualified leads
  • Google Sheets β€” append extracted business records to a live Google Sheet for team review and manual enrichment
  • Apify API β€” embed the actor in a Node.js or Python sales tool that triggers a Maps search whenever a new territory is opened
  • Webhooks β€” send a Slack notification when a run completes with the count of emails found, or POST results to a custom endpoint
  • LangChain / LlamaIndex β€” feed extracted business data into an AI agent that writes personalized outreach emails based on the business category and rating

Troubleshooting

  • Run returned businesses but emails array is empty for most. The most common cause is JavaScript-rendered websites where email addresses are injected by the browser and not present in the raw HTML. This actor uses Cheerio (HTTP-based). For better results on JS-heavy sites, use Website Contact Scraper Pro on the website URLs that returned no emails.

  • Run took much longer than expected. Large batches with high maxPagesPerSite values can take 30+ minutes. Set maxPagesPerSite: 2 for faster runs. You can also reduce maxResults and run multiple smaller batches in parallel.

  • Fewer results returned than maxResults. Google Maps may return fewer businesses than requested for niche queries in small markets. Try broadening the query (e.g. "contractors in Texas" instead of a specific city) or running adjacent category queries.

  • Run failed with CAPTCHA or bot-detection error. The actor detects when Google shows a CAPTCHA page and retries up to 3 times with fresh proxies. If the error persists, reduce maxResults to under 50 and retry. Residential proxies are used automatically.

  • Some websites show SSL errors in logs. The actor sets ignoreSslErrors: true and will still scrape these sites. SSL warnings in the log are expected for older business websites and do not indicate data loss.

Responsible use

  • This actor accesses publicly listed business information on Google Maps and publicly accessible business websites. It does not bypass login walls, paywalls, or access any private data.
  • Extracted emails are from public web pages that businesses have chosen to publish. The actor does not guess, generate, or infer email addresses.
  • If you use extracted emails for outreach in the US, comply with CAN-SPAM: include a physical address, an unsubscribe mechanism, and honor opt-outs within 10 business days.
  • For outreach to EU contacts, GDPR requires a lawful basis (e.g. legitimate interest for B2B prospecting). Document your basis and respond to data subject access requests.
  • In Canada, CASL requires implied or express consent for commercial electronic messages to business addresses.
  • Do not use extracted data for spam, harassment, or unauthorized purposes.
  • For more detail on web scraping legality, see Apify's guide.

Recent updates

  • Email classification β€” output now splits emails into personalEmails and genericEmails so you can prioritize decision-maker contacts
  • Direct Google Maps scraping β€” the actor now controls its own headless browser instead of depending on third-party scrapers, reducing cost and improving reliability
  • Batch query support β€” pass up to 50 search queries in a single run via searchStringsArray
  • New output fields β€” Place ID, coordinates, opening hours, price level, and plus code now included in every record
  • Data richness sorting β€” results with the most contact data appear first in the dataset
  • Budget cap β€” actor stops immediately when your per-run spending limit is reached

FAQ

What is the difference between a Google Maps scraper and a Google Maps lead extractor? A Google Maps scraper extracts business data from Google Maps listings β€” names, addresses, phone numbers, ratings, reviews. A Google Maps email extractor does that AND visits each business website to find email addresses, phone numbers, and social links. This actor combines both phases in one run: Maps scraping (Phase 1) plus website contact extraction (Phase 2).

Does this actor scrape emails directly from Google Maps or from business websites? Emails come from business websites, not from Google Maps itself. Google Maps does not display email addresses. The actor extracts the website URL from each Google Maps listing, then visits that website with a CheerioCrawler to find emails in mailto: links, page text, and href attributes.

Can I use Google Maps Lead Extractor for local lead generation by city and category? Yes. The actor is built for exactly this use case. Enter a query like "plumbers in Chicago" or "dentists in Austin TX" to get a structured list of local businesses with contact data. Use searchStringsArray to cover multiple cities or categories in a single run.

Can I separate generic emails from personal emails? Yes. Every output record includes three email fields: emails (all found), personalEmails (non-generic, likely belonging to a specific person), and genericEmails (role-based addresses like info@, contact@, support@, sales@). The classification happens automatically using 11 generic-prefix patterns.

How many pages of each business website does the actor scrape? The maxPagesPerSite parameter controls this (default: 5, range: 1-20). The homepage is always scraped first. Additional pages are chosen by contact-priority crawling β€” the actor follows links to pages matching 18 keyword patterns (contact, about, team, leadership, etc.) before visiting other pages.

Can I run Google Maps Lead Extractor without scraping websites? Yes. Set scrapeWebsites: false to skip the website crawling phase entirely. The actor will return Google Maps data only β€” business name, address, phone, rating, reviews, coordinates, opening hours β€” without emails or social links. This is faster and useful for competitive mapping or market research.

What output fields are included in the dataset? Each record includes 22 fields: businessName, address, category, phone, rating, reviewsCount, website, googleMapsUrl, placeId, coordinates, openingHours, priceLevel, plusCode, emails, personalEmails, genericEmails, websitePhones, socialLinks (with linkedin, twitter, facebook, instagram, youtube sub-fields), pagesScraped, and extractedAt.

Can I send Google Maps email results to Google Sheets, HubSpot, Zapier, or webhooks? Yes. Apify integrates with Zapier, Make, Google Sheets, and webhooks natively. You can set up automatic exports on run completion. For HubSpot specifically, use HubSpot Lead Pusher to create CRM contacts directly from the output.

What kinds of businesses work best with Google Maps email extraction? Service businesses with dedicated websites produce the best results: contractors, law firms, dental practices, marketing agencies, real estate offices, restaurants, and medical clinics. Businesses that rely on third-party platforms (e.g. Etsy shops, food trucks without websites) or use contact forms instead of published emails will return fewer email results.

What are the limitations of Google Maps email extraction? Key limitations: Google Maps returns at most ~120 results per query; website contact scraping uses HTTP-only parsing (no JavaScript rendering); some businesses use contact forms instead of email addresses; image-embedded emails are not detected. See the Limitations section above for the full list.

How is Google Maps Lead Extractor different from Outscraper or PhantomBuster? Outscraper charges ~$3/1,000 results for Maps data but does not classify emails as personal vs generic. PhantomBuster charges $56-239/month and does not extract emails from websites at all. This actor combines Maps scraping with website email extraction at $0.15/business, with no subscription and automatic email classification.

Is it legal to scrape Google Maps and business websites for email addresses? This actor accesses publicly listed business information on Google Maps and publicly accessible business websites. It does not access private data, bypass authentication, or require solving login-gated challenges. The US Ninth Circuit ruled in hiQ v. LinkedIn (2022) that accessing public data does not violate the CFAA. However, legality depends on jurisdiction and intended use. If you use extracted emails for commercial outreach, comply with CAN-SPAM (US), CASL (Canada), or GDPR (EU) as applicable. Consult legal counsel for your specific use case. See Apify's web scraping legality guide.

Help us improve

If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:

  1. Go to Account Settings > Privacy
  2. Enable Share runs with public Actor creators

This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.

Support

Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom solutions or enterprise integrations, reach out through the Apify platform.