Google Maps Email Extractor avatar

Google Maps Email Extractor

Pricing

from $3.00 / 1,000 place founds

Go to Apify Store
Google Maps Email Extractor

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

16

Total users

2

Monthly active users

7 days ago

Last modified

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

FieldTypeDefaultPurpose
searchQuerystringdentistsBusiness keyword or niche to search in Google Maps
locationstringMiami, FLCity, region, or country used with the keyword query
maxResultsinteger20Maximum businesses to extract per run, up to the schema cap
skipWithoutEmailbooleanfalseReturn only businesses with a verified email when enabled
minRatingnumber0Minimum Google rating to include in the output
skipClosedPlacesbooleantrueSkip places marked permanently closed on Google Maps
languagestringenGoogle Maps interface language
startUrlsarray[]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.

FieldTypeMeaning
business_namestringpublic business name as shown on Google Maps
emailstring or nullPrimary public email extracted from the business website
phonestring or nullPhone number listed on Google Maps
websitestring or nullBusiness website URL
full_addressstringComplete street address
categorystringPrimary Google Maps category
ratingnumber or nullAverage Google rating
review_countintegerTotal Google review count
latitudenumberGPS latitude
longitudenumberGPS longitude
google_maps_urlstringDirect Google Maps link for the place
place_idstringUnique Google Place ID
facebookstring or nullFacebook URL found from the business website
instagramstring or nullInstagram URL found from the business website
linkedinstring or nullLinkedIn company page found from the business website
twitterstring or nullTwitter/X URL found from the business website
is_permanently_closedbooleanClosure flag from Google Maps
scraped_atstringISO timestamp for the record
source_querystringKeyword + 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

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.