Guide, 2026-11-05, from runs measured 2026-10-05
Google Maps email extractor: where the emails come from, and how many you get
Google Maps gives most places a phone number and a website, and no email field. Every Google Maps email extractor therefore does the same thing: it opens each place's website and reads the addresses printed there. How many you get depends on which sites can be read, which pages are read, and above all on the trade. Here is how our Actor does it, with the fill we measured on 1,000-place runs: an email for 20.1% of Chicago restaurants and about 61% of Berlin dentists.
Google Maps shows a website, not an email
In the answer Google Maps sends its own page, each place carries a name, categories, an address, a phone, a website, its rating and hours: there is no email field to read. On three 1,000-place runs of 2026-10-05, the phone was filled on 88% to 97% of places and the website on 73% to 78% (Lyon restaurants 75%, Berlin dentists 78%, Chicago restaurants 73%).
That sets the ceiling. A place with no website on Google Maps has no site to read, so roughly one place in four is out of reach before any email extractor starts. Those rows come back with the phone and the rest of the listing, and with contactsStatus: "no-website" so you can tell them apart.
How the Actor reads each place's website
With Emails and social profiles from websites switched on (scrapeContacts), each place's website is read in parallel with the map search, at the same price per place:
- The homepage first. The Actor reads the addresses in its
mailto:links and the ones printed in the page, plus the links to the place's Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest profiles. - Then up to three more pages, only if the homepage shows no email. Pages on the same site that the homepage links as contact pages first (contact, kontakt, contacto, contatti), then imprint and legal pages (impressum, imprint, mentions), then about pages. It stops at the first page with an email. Never a crawl, never another site.
- Social profiles and link-in-bio pages as listed. When the website on Google Maps is itself a Facebook or Instagram page, that link is returned as a social profile and nothing else is read. A Linktree-style page is read alone, never the platform's own pages.
- Only the business's addresses, own domain first. Addresses that are not the business's are dropped: error-tracking keys in scripts, a font designer's email in a CSS licence, theme credits, placeholders. An address on the site's own domain is listed first; a web agency's or ordering platform's address printed on the page is kept after it.
- 80 seconds per website, every redirect checked. The whole read of one site, every page and redirect counted, gives up after 80 seconds, and each redirect hop must point to a public address.
Every row then says what happened: contactsStatus is ok, no-website or failed, and contactsError gives the reason for a failure, such as website answered HTTP 403. An empty email column is explained, not silent.
The pages are read over plain HTTP with a desktop browser's User-Agent, without a browser engine. An address that a page assembles only in the browser, to hide it from robots, is not seen; one kept in the page's script data is, which is why scripts are read (ignoring them lost 25 real addresses in one Chicago test run).
Measured: 20.1% of Chicago restaurants, about 61% of Berlin dentists
Two cloud runs on Apify with contacts on, 2026-10-05, residential proxy for Google, 1,000 places each:
| Restaurants, Chicago | Dentists, Berlin | |
|---|---|---|
| Run, build | 4kCnYIZRqGsz3kUD3, 0.1.16 | VjC2swFfx60IWRtR4, 0.1.10 |
| Places returned | 1,000 in 341 s | 1,000 in 309 s |
| With a website on Google Maps | 740 (74%) | 780 (78%) |
| Websites read | 596 of 740 (80.5%) | 711 of 780 (91.2%) |
| Websites with an email | 201 (27.2% of websites) | about 608 (78% of websites) |
| Of the websites read, with an email | 33.7% | about 85% |
| Places with an email | 20.1% | about 61% |
The Berlin run used build 0.1.10, before the browser User-Agent for websites and the cleanup of vendor addresses; a later run of 100 Berlin dentists (build 0.1.12) had an email on 77% of websites. A social profile link was found on 32% of Chicago restaurant rows and 23% of Berlin dentist rows (build 0.1.10 runs). Each place counts once however many addresses its site prints.
Why the fill varies by trade
The two runs split the gap into two steps.
- Fewer restaurant sites can be read. 80.5% of Chicago restaurant websites were read, against 91.2% of Berlin dentists'. Most refusals are bot protection: 84 answered HTTP 403 out of 740 in Chicago, hotel and restaurant chains among them (Marriott, Accor and Toast pages). In an earlier run of the same search (B3mMmnllhDa6tFVJ0), the 152 failed reads were 87 HTTP 403, 21 timeouts, 17 connection errors, 10 HTTP 429, 7 HTTP 404 and 7 DNS errors. Sending a browser's User-Agent read 1 to 2 points more sites and almost no more emails (28.2% then 28.3% on the same 689 sites); the sites that still refuse check more than that, and the Actor goes no further.
- Far fewer restaurant sites print an email. Of the sites read, 33.7% of Chicago restaurants' showed an address, against about 85% of Berlin dentists'. Restaurant sites also print their ordering platform's address more often (one Chicago site built on a platform showed
contact@grubbio.com), which the Actor lists after the business's own.
Our runs measure the gap, not its cause. One factor we can source: in Germany, section 5 of the Digitale-Dienste-Gesetz requires providers of commercial digital services to keep a set of information easy to find and always available, including an email address ("Adresse für die elektronische Post", § 5 DDG, read 2026-11-05), and the Actor reads imprint pages (Impressum) when a homepage shows no email. The two runs differ in trade and in country at once, so they cannot say how much of the gap is the trade and how much is Germany.
The practical answer: before a large run, run 50 or 100 places of your trade in your city with contacts on and read the Contacts view. At $0.0015 a place, 100 places cost $0.15.
What you pay for, and what you are never charged for
One event, one price per place: $1.50 per 1,000 places on Apify's Free and Starter plans, $1.35 on Scale and $1.20 on Business. The emails and social profiles are in that price: switching contacts on does not change it.
- Duplicates removed before the charge. A place found by two search terms, two locations or two overlapping map views is delivered and charged once per run: 0 duplicates in 6,000 rows across six 1,000-place runs.
- A strict area boundary. Each location is resolved to its real boundary on OpenStreetMap. Google pads its answers with places nearby; a place outside the shape is dropped before it is delivered or charged (
strictBoundary, on by default). - Free filters.
requireWebsite,requirePhone,minRating,skipClosedPlacesandcategoryFilterWordscost nothing, and a place they drop is never charged and does not count towardmaxPlacesPerSearch. For an email list,requireWebsitemeans you pay only for places that have a site to read. - Never past your limits. Nothing past
maxPlacesPerSearchis charged, and a maximum cost per run, set in the run options, stops the run cleanly.
What that comes to per place that carries an email, from the two runs above:
| Per 1,000 places with an email, Free plan | Restaurants, Chicago | Dentists, Berlin |
|---|---|---|
| Every place charged (1,000) | $7.46 | about $2.47 |
| Only places with a website charged (requireWebsite) | $5.52 | about $1.92 |
| compass, same places, if it found the same emails | $27.26 | about $9.14 |
| compass with its website filter, same assumption | $25.77 | about $8.98 |
Computed from the counts above at $1.50 per 1,000 places; the second row assumes the same places without those that have no website. The compass rows use its Free prices read on 2026-11-05 (below) and assume it finds the same emails on the same places, which was not measured. Apify's free plan includes $5 of monthly usage, about 3,300 places.
Against the most used Google Maps scraper
compass/crawler-google-places, read on 2026-11-05 from its public record in the Apify API (its current pricing entry and its stats): 47,872 users in the last 30 days. It sells the place and the contacts as separate events: $4.00 per 1,000 places on Free ($3.00 Starter, $2.00 Scale, $1.50 Business), its contacts add-on at $2.00 per 1,000 on Free and Starter ($1.50 Scale, $1.05 Business), and $1.00 per 1,000 places for each filter on Free and Starter. The add-on is not charged on a place without a website: "We won't charge you any additional fees for places that don't have websites" (Apify's help article on its pricing, dated 2025-03-18, read 2026-11-05). The same article recommends its website filter for contact scraping, which is one more event per place.
| Per 1,000 places with emails | compass, place + contacts add-on | compass, plus its website filter | lukaskrivka (Google Maps Email Extractor) | This Actor |
|---|---|---|---|---|
| Free | $6.00 ($4.00 + $2.00) | $7.00 | $7.50 | $1.50 |
| Starter | $5.00 ($3.00 + $2.00) | $6.00 | $6.00 | $1.50 |
| Scale | $3.50 ($2.00 + $1.50) | $4.25 | $4.50 | $1.35 |
| Business | $2.55 ($1.50 + $1.05) | $3.08 | $3.10 | $1.20 |
compass read 2026-11-05, rounded to the cent; both compass columns assume every place has a website, since its add-on skips places without one. Without the filter, at the 73% to 78% website share of our runs, its place with contacts comes to about $5.50 per 1,000 on Free. lukaskrivka/google-maps-with-contact-details as our README read it on 2026-10-26: 2,473 users in 30 days, its contacts add-on on by default with no switch to turn it off; its README says nothing about places without a website, so the column counts every place.
The Store cards hide the gap. Each card shows the Business price: compass's reads "from $1.50", its place without emails, and ours "from $1.20", with emails included (our README, 2026-10-26).
Where the leader wins: it also sells reviews, images, popular times, business leads enrichment (named people with job titles) and email verification as add-ons, and takes Google Maps URLs or place IDs as input. We did not run it, so no email fill is compared.
A worked example: Berlin dentists with emails
Up to 1,000 dentists inside Berlin's boundary, each with a website, each with "dent" in one of its categories, with their emails and social profiles:
{
"searchTerms": ["dentist"],
"locations": ["Berlin, Germany"],
"maxPlacesPerSearch": 1000,
"scrapeContacts": true,
"requireWebsite": true,
"categoryFilterWords": ["dent"]
}It costs at most $1.50 on the Free plan: 1,000 places at $0.0015. Places with no website, or whose categories hold no "dent", are dropped free and do not count toward the 1,000. On the 2026-10-05 run of the same search without those filters, 78% of the dentists' websites printed an email. The run's SUMMARY record says how many websites were read and how many places each filter dropped.
The contact fields of a row look like this one, from a real Chicago run (trimmed; every row also has the address, coordinates, rating, review count, hours and Google's IDs):
{
"name": "El Tecolote Restaurant",
"category": "Mexican restaurant",
"phone": "(773) 277-1490",
"website": "http://tecolotechicago.com/",
"emails": ["tecolote.ostioneria@gmail.com"],
"socials": {
"facebook": ["https://www.facebook.com/tecoloterestaurant"],
"instagram": [], "linkedin": [], "x": [], "youtube": [], "tiktok": [], "pinterest": []
},
"contactsStatus": "ok",
"contactsError": null,
"searchTerm": "restaurant",
"searchArea": "Chicago, South Chicago Township, Cook County, Illinois, United States",
"scrapedAt": "2026-10-05T11:55:15.168Z"
}In Apify Console, the run's Contacts view shows phone, website, emails, social profiles and why a website was not read, and exports as CSV, Excel, JSON or XML.
The same run through the Apify API
A small sample in one HTTP call, places back in the response: 100 Berlin dentists with contacts took 55 seconds on Apify. Replace YOUR_APIFY_TOKEN with your token from Settings > API & Integrations in Apify Console.
curl -X POST "https://api.apify.com/v2/acts/agenttoolworks~google-maps-places-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["dentist"], "locations": ["Berlin, Germany"], "maxPlacesPerSearch": 100, "scrapeContacts": true}'For the full 1,000, start the run and read its dataset when it finishes. With the official apify-client for Python, writing one CSV line per place:
import csv
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agenttoolworks/google-maps-places-scraper").call(run_input={
"searchTerms": ["dentist"],
"locations": ["Berlin, Germany"],
"maxPlacesPerSearch": 1000,
"scrapeContacts": True,
"requireWebsite": True,
})
with open("dentists-berlin.csv", "w", newline="") as f:
out = csv.writer(f)
out.writerow(["name", "phone", "website", "email", "contactsStatus", "contactsError"])
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
email = (place["emails"] or [""])[0]
out.writerow([place["name"], place["phone"], place["website"], email,
place["contactsStatus"], place["contactsError"]])Ready-to-run examples on the Apify Store, input filled in: Dentists in Lyon with emails and phone numbers, Plumbers in London with emails and social profiles.
GDPR and business emails
The Actor reads what a business publishes on its own website to be contacted, and its public Google Maps listing. It does not log in, guess addresses from a name pattern or look people up. That makes the rows public business contact data, which is not the same as data you are free to use as you like.
- An email that names a person is personal data. A sole trader's address, or a dentist's first-name address at a practice, falls under the GDPR even though it is printed on a public site.
- You are the controller. Whoever exports the rows decides what is done with them, and answers for it. For contacts in the EU, Article 14 of the GDPR requires informing them at the latest at your first message (14(3)(b)), including where their data came from (14(2)(f)). Each row keeps its source:
website,searchTerm,searchAreaandscrapedAt. - Respect objections. Someone who objects is taken off the list and not written to again.
- Marketing email has its own rules. On top of the GDPR, sending unsolicited commercial email is regulated country by country: check the rules where your recipients are.
- Google's terms. Google's Maps terms restrict bulk downloads and using Maps to build business-listing databases or mailing lists. How you use the data is your responsibility.
This describes how the Actor works and the rules we follow; it is not legal advice. For a campaign, ask a lawyer in the country of your contacts.
What it does not do
- No email without a website. About one place in four in our runs had none on Google Maps.
- No guessed or verified addresses. Only addresses printed on the site; no name patterns, no mail-server check, no named employees.
- No way past a refusal. A site that answers HTTP 403 to a browser's User-Agent stays unread, with the reason in
contactsError. - No contact forms. A site that offers only a form and prints no address gives no email.
Run it
Our Google Maps scraper and email extractor does all of the above in one run: many search terms and many locations, the real city boundary, one row per place, emails and social profiles from each website, and a reason on every row without one, at $1.50 per 1,000 places with contacts and filters included. How the map side works (the request behind the result list, the cap per view, capped proxy answers) is in how to scrape Google Maps.
Questions
Can you extract emails from Google Maps?
Not from the listing itself: in the answer Google Maps sends its own page, a place has a phone and a website, and no email field. The emails come from the business's own website. Our Actor reads the homepage and, if no email is there, up to three contact, imprint or about pages the site links. On 1,000 places, that gave an email for 20.1% of Chicago restaurants and about 61% of Berlin dentists.
How many emails does a Google Maps email extractor find?
It depends on the trade and the country more than on the tool. In our runs, 73% to 78% of places had a website; 80.5% of Chicago restaurant websites could be read against 91.2% of Berlin dentists', and of the sites read, 34% of the restaurants' and about 85% of the dentists' printed an email. Run 50 or 100 places of your own trade first and read the Contacts view.
Do the emails cost extra?
No. The Actor charges one event per place, $1.50 per 1,000 places on Apify's Free and Starter plans ($1.35 on Scale, $1.20 on Business), with or without emails and social profiles. Duplicates, places outside your area and places dropped by a filter are never charged.
Why is the email empty on some rows?
Each row says why in two fields. contactsStatus is ok (the site was read; it may simply print no email), no-website (Google Maps lists none) or failed, and contactsError gives the reason for a failure, for example website answered HTTP 403 or website read gave up after 80 s.
Is it legal to use emails scraped from Google Maps under the GDPR?
An email that names a person, such as a sole trader's, is personal data even when it is public. Whoever exports the rows is the controller of what they do with them; for contacts in the EU, Article 14 of the GDPR requires informing them at the latest at the first message, including where the data came from, and an objection must be respected. This is not legal advice.
Does it verify emails or find employees' addresses?
No. It returns the addresses printed on the business's own website, never one guessed from a name pattern, and it does not check them by mail server or look people up. The most used Google Maps scraper on Apify sells business leads enrichment and email verification as add-ons; this Actor does neither.
Public business listings and business websites only: no login, no account, no reviewer data. Area boundaries: Data © OpenStreetMap contributors. Not affiliated with Google or Apify.