Google Maps Email Extractor
Pricing
from $3.00 / 1,000 place founds
Google Maps Email Extractor
Extract verified business emails from Google Maps places at scale, billed only when an email is found. Works with Apify MCP and the API.
Pricing
from $3.00 / 1,000 place founds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
2
Monthly active users
7 days ago
Last modified
Categories
Share
What is π© Google Maps Email Extractor β Business Emails by City?
This Apify Actor accepts a business keyword and a city or region, or a Google Maps URL in startUrls, and returns one record per business from Google Maps. Each record represents a single place and can include the business name, email, phone, website, full address, category, rating, review count, coordinates, social links, closure status, scrape timestamp, and source query. It is an Apify Actor that can also be used through Apify MCP for agent workflows.
Best fit and connected workflows
This Actor fits workflows that start with a local business niche and a target area, then turn Google Maps results into structured contact data. It is well suited for:
- local lead collection by city, region, or country
- email-first prospecting lists for B2B outreach
- CRM enrichment from public business listings
- market research on local businesses, ratings, and websites
- agent workflows that need an Apify Actor through Apify MCP
A common routing pattern is to search for a niche such as dentists, plumbers, or real estate agents in one city, then export the dataset into a spreadsheet, CRM, or downstream enrichment step.
Google Maps Email Extractor β Business Emails by City is designed as a focused workflow.
Practical scenario
Maya is building a prospect list for a dental campaign in Austin, TX. She starts with searchQuery: "dentists" and location: "Austin, TX", then keeps skipWithoutEmail turned on so the dataset contains businesses with a verified public email. Her resulting records include fields such as business_name, email, website, phone, full_address, and rating. She uses the email and website fields to decide which businesses belong in her outreach queue, then sends the dataset into her CRM.
Input fields
| Field | Type | Default | Purpose |
|---|---|---|---|
searchQuery | string | dentists | Business keyword or niche to search in Google Maps |
location | string | Miami, FL | City, region, or country used with the keyword query |
maxResults | integer | 20 | Maximum businesses to extract per run, up to the schema cap |
skipWithoutEmail | boolean | false | Return only businesses with a verified email when enabled |
minRating | number | 0 | Minimum Google rating to include in the output |
skipClosedPlaces | boolean | true | Skip places marked permanently closed on Google Maps |
language | string | en | Google Maps interface language |
startUrls | array | [] | Optional Google Maps search or place URLs instead of keyword search |
Focused JSON example
{"searchQuery": "plumbers","location": "Austin, TX","maxResults": 25,"skipWithoutEmail": true,"minRating": 4,"skipClosedPlaces": true,"language": "en","startUrls": []}
Output fields
The dataset contains one record per business place. The schema supports the following fields.
| Field | Type | Meaning |
|---|---|---|
business_name | string | public business name as shown on Google Maps |
email | string or null | Primary public email extracted from the business website |
phone | string or null | Phone number listed on Google Maps |
website | string or null | Business website URL |
full_address | string | Complete street address |
category | string | Primary Google Maps category |
rating | number or null | Average Google rating |
review_count | integer | Total Google review count |
latitude | number | GPS latitude |
longitude | number | GPS longitude |
google_maps_url | string | Direct Google Maps link for the place |
place_id | string | Unique Google Place ID |
facebook | string or null | Facebook URL found from the business website |
instagram | string or null | Instagram URL found from the business website |
linkedin | string or null | LinkedIn company page found from the business website |
twitter | string or null | Twitter/X URL found from the business website |
is_permanently_closed | boolean | Closure flag from Google Maps |
scraped_at | string | ISO timestamp for the record |
source_query | string | Keyword + location or URL that produced the record |
Illustrative JSON record
{"business_name": "Relax and Smile Dental Care","email": "info@relaxandsmiledental.com","phone": "+1 305-555-0123","website": "https://relaxandsmiledental.com","full_address": "123 Ocean Dr, Miami, FL 33139, USA","category": "Dentist","rating": 4.7,"review_count": 238,"latitude": 25.7617,"longitude": -80.1918,"google_maps_url": "https://www.google.com/maps/place/?q=place_id:...","place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4","facebook": "https://facebook.com/relaxandsmiledental","instagram": "https://instagram.com/relaxandsmiledental","linkedin": "https://linkedin.com/company/relaxandsmiledental","twitter": null,"is_permanently_closed": false,"scraped_at": "2026-04-24T12:33:20.286Z","source_query": "dentists in Miami, FL"}
How it works
This Actor uses Google Maps search results as the starting point, then opens each business place and extracts structured listing data. It also checks the business website for a public email address and can follow common contact pages such as the home page, /contact, and /about when enriching records. The live contract shows a Playwright-based implementation, residential proxy usage, and controlled concurrency. It also shows a reachability check at run start, a global run budget, and a try-catch wrapper so the run can exit cleanly with partial results.
The dataset and execution artifacts are available in Apify storage, including the default dataset, terminal output, and run summary.
Pricing
Google Maps Email Extractor β Business Emails by City uses Pay per event plus Apify platform usage. The charging model includes an Actor start event, a Place found event for each business extracted, and an Email found event when a verified email is extracted from a business website.
For a simple example, if a run finds twenty places and eight verified emails, the charged events include the start event, twenty place-found events, and eight email-found events, alongside normal Apify platform usage for the run. For current pricing details, check the live Pricing tab on the Actor page.
Use with AI agents (MCP)
This Actor is available as an Apify Actor usable through Apify MCP. In agent workflows, it acts as a tool for turning a search prompt into structured business contact records from Google Maps.
Actor identity: khadinakbar/google-maps-email-extractor
Tool description: search Google Maps by keyword and city or by Google Maps URL, then return structured business records with public contact data and extracted emails.
Find dentists in Austin, TX, return only businesses with a verified email, and keep the result set focused to a small sample for review.
The output is easiest to interpret as a dataset of one-record-per-business items. Each record provides provenance through google_maps_url, place_id, scraped_at, and source_query. When skipWithoutEmail is enabled, the dataset contains only businesses with a verified email. The maxResults input controls the size of each run, and the startUrls field can replace keyword search with specific Google Maps URLs when needed. Cost scales with extracted places and verified emails, so smaller test runs are useful before expanding to larger batches.
Apify API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const actorRun = await client.actor('khadinakbar/google-maps-email-extractor').call({searchQuery: 'dentists',location: 'Miami, FL',maxResults: 5,skipWithoutEmail: true,minRating: 4,skipClosedPlaces: true,language: 'en',startUrls: [],});const dataset = await client.dataset(actorRun.defaultDatasetId).listItems();console.log(dataset.items);
Best results and outcome guidance
Use one clear niche and one location per run when you want a focused local list. Keep the query specific, such as a profession or business type plus a city. Use skipWithoutEmail when the goal is an email-ready dataset. Use minRating when you want to focus on higher-rated places. If you already have Google Maps links, place them in startUrls so each URL acts as its own search seed. For larger projects, split work across cities or neighborhoods and combine the resulting datasets downstream.
Continue the workflow
- Then use Google Maps Extractor - Places, Phones & Websites to extend π© Google Maps Email Extractor β Business Emails by City research with a complementary content contract.
- Then use Local Business Lead Generator β Google Maps to extend π© Google Maps Email Extractor β Business Emails by City research with a complementary enrichment contract.
Design note
I found that the dataset schema requires business_name, full_address, category, google_maps_url, place_id, scraped_at, and source_query, which makes provenance a core part of every record.
FAQ
Can I use keyword search or Google Maps URLs?
Yes. You can search with searchQuery plus location, or you can provide Google Maps URLs in startUrls.
What information comes back in each record?
Each record can include contact data, rating data, coordinates, social links found from the business website, and the Google Maps identifiers that tie the record back to its source.
How does email filtering work?
When skipWithoutEmail is enabled, the output keeps only businesses with a verified email address extracted from the business website.
Does the language setting change the email extraction step?
The language input affects the Google Maps interface language and the displayed business details such as names, categories, and addresses. It does not change the website email extraction logic.
How should I use the source fields downstream?
Use google_maps_url, place_id, scraped_at, and source_query for traceability, deduplication, and audit trails in your own workflow.
Responsible use
Use the extracted data in ways that fit applicable law, platform terms, and your outreach policies. Review local privacy, email, and marketing rules before using the data for outbound messaging. Keep the output for legitimate business, research, or operational workflows, and handle contact data with care.
Supported URLs and bounded runs
Explicit start URLs must use HTTPS on google.com, www.google.com, or maps.google.com with a /maps path. Regional Google domains and shortlinks are not supported; expand them to a supported full Google Maps URL first. URLs with credentials or custom ports are rejected before network work. Keyword-and-city input remains supported.
Runs use the actual cloud timeout to reserve browser shutdown and terminal-output time. A bounded deadline stops scheduling new requests; useful records remain PARTIAL if coverage is interrupted, and upstream failures with no usable data remain failures. The initial direct HTTP probe is advisory because the browser uses a separate proxy route.