Google Maps Scraper & Email Extractor (no login)
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
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
| Field | Example |
|---|---|
name | WOODBERRY COFFEE 渋谷店 |
address | 〒150-0011 東京都渋谷区東2丁目20−18 |
phone | 03-5962-7518 |
website | http://woodberrycoffee.com/ |
rating | 4.4 |
categories | ["コーヒーショップ・喫茶店"] |
latitude / longitude | 35.6539429 / 139.7094 |
place_id + maps_url | stable 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 found | What it actually is |
|---|---|
user@gmail.com | the example text inside a contact form |
email@example.com | the same, on a Brooklyn restaurant |
filler@godaddy.com | left over in a GoDaddy template |
hi@typemade.mx | the 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:
| Query | Domain-matching email found |
|---|---|
marketing agency in Austin Texas | 5 of 8 |
restaurant in Brooklyn New York | 4 of 8 |
hair salon in London | 4 of 8 |
dentist in Shibuya Tokyo | 0 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.
- It never presents a short result as a complete one. Requested versus returned is always in the output, with the reason paging stopped.
- It never invents a review count. Google's search response does not carry one, so
review_countisnullwith an explicit reason — not0. - It never returns an empty list when Google changes format. If the response no longer matches the expected shape,
response_shape_changedistrueand you are told, instead of receiving "no results". - It never reports a missing rating as
0. A new place with no reviews and a place rated 0 are different things. - It never logs in. No cookies, no tokens, no account. Only a public endpoint.
- 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.
- It never promotes an email it cannot tie to the business. A
gmail.comaddress with the shop's name in it is returned and labelledFREE_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.
