LEAD GENERATIONAI

Google Maps Email Extractor

Search Google Maps for businesses by keyword and location, then scrape their websites for emails, phone numbers, and social media links. One search query in, enriched business contacts out.

Try on Apify Store
$0.15per event
0
Users (30d)
1
Runs (30d)
97
Actively maintained
Maintenance Pulse
$0.15
Per event

Maintenance Pulse

97/100
Last Build
Today
Last Version
1d ago
Builds (30d)
15
Issue Response
N/A

Cost Estimate

How many results do you need?

business-extracteds
Estimated cost:$15.00

Pricing

Pay Per Event model. You only pay for what you use.

EventDescriptionPrice
business-extractedCharged per business extracted with contact scraping.$0.15

Example: 100 events = $15.00 · 1,000 events = $150.00

Documentation

Google Maps Email Extractor finds local businesses on Google Maps and automatically visits their websites to extract contact emails, phone numbers, and social media profiles — combining map search and website scraping in a single run.

Marketing agencies, SDRs, and recruiters use it to build targeted local prospect lists without manual research. One input: a search query like "HVAC contractors in Denver". One output: a spreadsheet of businesses with emails attached.

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 Maps214
🌐 Website URLGoogle Mapsapexplumbingdenver.com
🔗 Google Maps URLGoogle Mapsmaps.google.com/place/…
📧 EmailsBusiness website[email protected]
📱 Website phonesBusiness website(303) 555-0182, (303) 555-0194
👥 Social linksBusiness websitelinkedin.com/company/apex-plumbing
📄 Pages scrapedInternal4

Why use Google Maps Email Extractor?

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 is several hours of work. For 200 it is a full workday, and the results are still a raw spreadsheet with no deduplication.

This actor automates the entire pipeline: one search query triggers a Google Maps scan, website visits, contact extraction, 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 proxy infrastructure rotates IPs so 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

Features

  • Two-phase pipeline — searches Google Maps via Compass's scraper (actor ID nwua9Gu5YrADL7ZDj), then visits each business website using a CheerioCrawler-based contact scraper
  • 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 before data hits the output
  • Three-layer email detection — extracts from mailto: link href attributes first, then applies a full-body regex scan (/\b[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,12}\b/g), 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, and company 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 via three separate regex patterns; 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 precise domain-anchored regex patterns
  • Per-domain page capmaxPagesPerSite (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 crawling at up to 10 workers — CheerioCrawler runs with maxConcurrency: 10 and maxRequestsPerMinute: 120, balancing speed against rate-limit risk
  • SSL error toleranceignoreSslErrors: true prevents SSL misconfigurations on older business sites from blocking extraction
  • Up to 2 automatic retries — failed pages are retried twice before being logged as warnings, maximising contact yield on flaky sites

Use cases for Google Maps email extractor

Sales prospecting for 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.

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.

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.

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.

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 and review counts are included in every record.

Data enrichment for 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.
  2. Set the maximum results — The default is 20 businesses. Raise it to 50 or 100 for larger batches. Note that Google Maps returns at most 120 results per query, so use multiple city queries for broad geographic coverage.
  3. Click Start and wait — The actor first queries Google Maps (roughly 1-2 minutes), then visits each business website (2-8 minutes depending on batch size and maxPagesPerSite). 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, and any emails or social links found.

Input parameters

ParameterTypeRequiredDefaultDescription
querystringYesGoogle Maps search query combining a business type and location, e.g. "plumbers in Chicago"
maxResultsintegerNo20Maximum businesses to extract (1–100). Higher values find more leads but cost more.
languagestringNo"en"Language code for Google Maps results, e.g. "en", "es", "de"
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 are contact/about/team pages only

Input examples

Standard local prospecting — most common use case:

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

Large batch with deeper website crawl:

{
  "query": "law firms in Chicago IL",
  "maxResults": 100,
  "language": "en",
  "scrapeWebsites": true,
  "maxPagesPerSite": 10
}

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 multiple runs for broad coverage — Google Maps caps results at ~120 per query. For statewide coverage, run separate queries per major city.
  • 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/...",
  "emails": [
    "[email protected]",
    "[email protected]"
  ],
  "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
emailsstring[]Deduplicated emails extracted from the business website; empty array if none found
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 Email Extractor 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
Maximum batch200*$0.15$30.00

*Run two 100-result queries to reach 200 businesses.

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 Hunter.io at $49/month (500 searches) or Clay at $149/month — with Google Maps Email Extractor, most users spend $5–15 per campaign with no monthly commitment and no seat fees.

Extract Google Maps emails using the 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("emails", [])) 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.emails?.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 Email Extractor works

Phase 1 — Google Maps search

The actor calls Compass's Google Maps Scraper (nwua9Gu5YrADL7ZDj) with your query, requesting up to maxResults places. Images and reviews are disabled (maxImages: 0, maxReviews: 0) to keep the Maps phase fast. The scraper returns structured business records including name, address, category, phone, rating, review count, website, and Maps URL. The actor filters for records that have a website URL before proceeding to Phase 2.

Phase 2 — Website contact extraction

Business websites are passed to a CheerioCrawler instance 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), then SUBPAGE for any contact, about, team, leadership, management, executives, company, or people pages found. Up to maxPagesPerSite pages are scraped per domain. Apify proxy rotation is applied automatically.

Phase 3 — Contact data extraction and filtering

Each page is parsed with Cheerio. Email extraction operates in three passes: mailto: link attributes are parsed first (highest precision), then a full-body regex scan for email-shaped strings, then a scan of all a[href] attributes. Results from all three passes are merged into a per-domain Set. Fifteen junk-email patterns then filter the Set — removing noreply prefixes, test addresses, image file extensions misidentified as email TLDs, and known infrastructure domains like sentry.io and wixpress.com. Phone extraction prioritises tel: link attributes, then searches footer and contact-area HTML for three phone number formats. Social media links are extracted using domain-anchored regex patterns for LinkedIn, Twitter/X, Facebook, Instagram, and YouTube.

Phase 4 — Output assembly and billing

Contact data is joined back to the original Maps record by domain (www-stripped). The assembled BusinessRecord is pushed to the dataset. In pay-per-event mode, a business-extracted charge event fires before each push; if the user's spending limit is reached, the loop breaks cleanly and a summary log is written.

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 multiple city queries for regional coverage. Google Maps caps results at roughly 120 per search. For a full state campaign, run separate queries for each major city, then deduplicate the combined dataset by website field.
  5. Pass emails directly to Bulk Email Verifier. A significant fraction of extracted emails bounce. Verifying before sending protects sender reputation.
  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 prioritising outreach.

Combine with other Apify actors

ActorHow to combine
Bulk Email VerifierVerify extracted emails via MX + SMTP checks before sending outreach to protect sender reputation
B2B Lead QualifierScore each business 0–100 using rating, review count, and website quality signals to prioritise the best prospects
Website Contact ScraperRe-scrape individual websites from Maps results with more aggressive crawling for higher email yield
Email Pattern FinderDetect the company's email naming convention (firstname.lastname@) so you can 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
B2B Lead Gen SuiteFull pipeline actor that combines Maps search, website scraping, email verification, and lead scoring in one run

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).
  • 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 crawler runs at maxRequestsPerMinute: 120. A batch of 100 businesses with maxPagesPerSite: 5 can take 20-30 minutes total depending on server response times.
  • Businesses without a website listed on Google Maps are returned without email data. The emails 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.

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 personalised 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 are 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 "Google Maps search failed" error. This indicates the upstream Compass Google Maps Scraper timed out. The actor sets a 300-second timeout for the Maps phase. Retry the run; transient failures in the upstream actor resolve on retry.
  • 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 only accesses publicly available business information from Google Maps and publicly accessible business websites.
  • Respect website terms of service and robots.txt directives.
  • Comply with GDPR, CAN-SPAM, and other applicable data protection laws when using extracted contact data for outreach.
  • Do not use extracted data for spam, harassment, or unauthorized commercial communication.
  • For guidance on web scraping legality, see Apify's guide.

FAQ

How many emails can I extract from Google Maps in one run? The actor is capped at 100 businesses per run (maxResults maximum). Each business can yield multiple emails — typically 1–3 per site. A 100-business run commonly returns 60–80 unique emails, depending on how many businesses have working websites and text-based contact pages.

Does Google Maps Email Extractor work for any country? Yes. The query field accepts any location on Google Maps, including cities outside the US. Use the language parameter to receive Maps data in the local language. Website scraping works on any domain regardless of country.

How accurate are the extracted emails? Emails from mailto: link attributes are highly accurate — they were placed there intentionally by the website owner. Emails from body text regex scans are slightly lower precision because the junk-filter patterns must handle edge cases. Run results through Bulk Email Verifier before sending outreach for the best deliverability.

How long does a typical Google Maps email extraction run take? A 20-business run with default settings (5 pages per site) takes 5–10 minutes. A 100-business run takes 20–35 minutes depending on website response times. Disabling website scraping reduces the run to under 3 minutes.

What types of emails are filtered out? The actor removes: noreply@, no-reply@, donotreply@, example@, test@, admin@, webmaster@, postmaster@, mailer-daemon@, root@ prefixes; strings ending in image file extensions (.png, .jpg, .jpeg, .gif, .svg, .css, .js, .webp, .ico); addresses on example.com, example.org, example.net; and addresses at known infrastructure domains like sentry.io, wixpress.com, and placeholder domains.

Can I schedule this actor to run automatically? Yes. Use the Apify Scheduler to run it daily or weekly. This is useful for monitoring new businesses entering a local market or keeping a sales territory list current.

How is this different from Compass's Google Maps Scraper? Compass's Google Maps Scraper (317K users) is a comprehensive tool focused on extracting everything Google Maps offers — reviews, photos, check-ins, place details, and more. Google Maps Email Extractor is narrowly focused on email prospecting: it uses Compass's scraper for the Maps phase, then adds a dedicated website-scraping layer to extract email addresses, phone numbers, and social links from each business's own website. If you want emails, this actor is the direct path.

Is it legal to scrape Google Maps and business websites for emails? Scraping publicly available information from Google Maps and business websites is generally considered legal in most jurisdictions. The legality of using extracted emails for marketing outreach is governed by CAN-SPAM (US), CASL (Canada), and GDPR (EU). Always include an unsubscribe mechanism and honour opt-out requests. See Apify's web scraping legality guide for more detail.

Can I use this actor with Make or Zapier to push leads into a CRM? Yes. Connect the Apify Make integration or Zapier app to trigger on run completion, map the output fields to your CRM contact fields, and create or update records automatically. The structured output format maps cleanly to HubSpot, Salesforce, Pipedrive, and most CRM contact schemas.

What happens if a business website is down or returns an error? The CheerioCrawler retries failed requests twice before logging a warning. If a site consistently fails, the record is still saved with the Google Maps data intact — emails and websitePhones will be empty arrays, and pagesScraped will be null.

Can I extract emails for a specific neighborhood or zip code? Yes. Google Maps supports highly specific location queries. Try "restaurants in Williamsburg Brooklyn", "contractors near 60614", or "lawyers in SoHo New York" for sub-city targeting.

Why are some businesses missing a website in the output? Not all Google Maps listings include a website. Businesses without a website are included in the output with website: null and empty emails and websitePhones arrays. The Maps phone number is still captured in the phone field.

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.

How it works

01

Configure

Set your parameters in the Apify Console or pass them via API.

02

Run

Click Start, trigger via API, webhook, or set up a schedule.

03

Get results

Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.

Use cases

Sales Teams

Build targeted lead lists with verified contact data.

Marketing

Research competitors and identify outreach opportunities.

Data Teams

Automate data collection pipelines with scheduled runs.

Developers

Integrate via REST API or use as an MCP tool in AI workflows.

Ready to try Google Maps Email Extractor?

Start for free on Apify. No credit card required.

Open on Apify Store