Google Maps Scraper & Email Extractor (no login) avatar

Google Maps Scraper & Email Extractor (no login)

Pricing

Pay per usage

Go to Apify Store
Google Maps Scraper & Email Extractor (no login)

Google Maps Scraper & Email Extractor (no login)

Scrapes Google Maps places and pulls emails from each business website - no login. Every email gets a confidence label, so a contact-form placeholder like user@gmail.com is never passed off as the business address. You are charged only for emails whose domain matches the business.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Samurai Hart

Samurai Hart

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

Google Maps Scraper — it tells you what it could not get

Most scrapers hand you a list and let you assume it is complete. This one doesn't.

Ask for 30 places and Google only has 20? You get this alongside the data:

"requested": 30,
"places_returned": 20,
"pages_fetched": 2,
"not_observed": [
{ "field": "coverage",
"reason": "20件で新規が出なくなった。Google側の該当がこれ以上無い可能性。全件と読まない" }
]

That single field is the point of this Actor. "How do you calculate coverage?" is an open question on the biggest Google Maps scrapers, and an unanswered one. A list of 20 that silently stood in for 30 is how a lead list quietly becomes wrong.

What you get per place

FieldExample
nameWOODBERRY COFFEE 渋谷店
address〒150-0011 東京都渋谷区東2丁目20−18
phone03-5962-7518
websitehttp://woodberrycoffee.com/
rating4.4
categories["コーヒーショップ・喫茶店"]
latitude / longitude35.6539429 / 139.7094
place_id + maps_urlstable identifiers for dedupe

Measured on a live run: name, address, coordinates, rating and website came back for 100% of places; phone for 85–100% depending on the query.

Emails, with a confidence label on every one

Turn on extractEmails and it visits each business website and pulls emails and phone links.

Here is what a plain regex extractor hands you, from four real runs on 2026-08-09:

String it foundWhat it actually is
user@gmail.comthe example text inside a contact form
email@example.comthe same, on a Brooklyn restaurant
filler@godaddy.comleft over in a GoDaddy template
hi@typemade.mxthe agency that built the site's theme

All four are on the page. None is the business. This Actor labels them LIKELY_PLACEHOLDER, still returns them, and refuses to put them in best_email. best_email is only filled when the email's domain matches the business's own website.

"contacts": {
"best_email": "hello@ideapeddler.com",
"best_email_confidence": "DOMAIN_MATCH",
"emails": [
{ "email": "hello@ideapeddler.com", "confidence": "DOMAIN_MATCH",
"found_on": "https://ideapeddler.com/contact" }
],
"phones": [],
"pages_examined": ["https://ideapeddler.com/", "https://ideapeddler.com/contact"]
}

The hit rate is not the same everywhere, so here it is measured

8 places per query, homepage plus /contact only:

QueryDomain-matching email found
marketing agency in Austin Texas5 of 8
restaurant in Brooklyn New York4 of 8
hair salon in London4 of 8
dentist in Shibuya Tokyo0 of 8

Japanese clinics publish a phone number and a form, and no email at all. If someone sells you "emails from Google Maps" as a flat promise, that row is the one they are not showing you. Each record tells you which case it is: a verified email, an unverified candidate, no published email, or a site that could not be read.

You are charged for verified emails only

The usual arrangement bills per enrichment attempt, so the misses cost the same as the hits. Here the email charge counts only records where the domain actually matched. A site visited with nothing to show for it is free — on the Shibuya dentist run above, the email charge would have been zero.

Input

{
"searchQueries": ["marketing agency in Austin Texas"],
"maxPlacesPerQuery": 30,
"language": "en",
"countryCode": "us",
"extractEmails": true
}

Put the location in the query. Works the same for pizza in Brooklyn New York or hair salon in London.

What it refuses to do

A dataset that quietly rounds off inconvenient facts is worse than a smaller honest one.

  1. It never presents a short result as a complete one. Requested versus returned is always in the output, with the reason paging stopped.
  2. It never invents a review count. Google's search response does not carry one, so review_count is null with an explicit reason — not 0.
  3. It never returns an empty list when Google changes format. If the response no longer matches the expected shape, response_shape_changed is true and you are told, instead of receiving "no results".
  4. It never reports a missing rating as 0. A new place with no reviews and a place rated 0 are different things.
  5. It never logs in. No cookies, no tokens, no account. Only a public endpoint.
  6. It never calls an unreachable website "no email found". A site that timed out and a site with no published address are two different records, and they say so.
  7. It never promotes an email it cannot tie to the business. A gmail.com address with the shop's name in it is returned and labelled FREE_MAIL — visible to you, but not passed off as verified.

Every place carries its own not_observed list, so you can see per-record which fields Google simply does not publish for that business.

Notes

  • Google serves 20 places per page; more are fetched by paging, and results are de-duplicated by place_id.
  • Opening hours and review counts are not part of this response. They are declared as not observed rather than omitted silently.
  • No proxy is required. One is available in the input if your own runs hit rate limits.