Google Maps Email Scraper — Business Emails & Contacts
Pricing
from $1.60 / 1,000 business founds
Google Maps Email Scraper — Business Emails & Contacts
Search Google Maps for a kind of business in an area and get each one's contact details: the phone and address from the listing, plus the emails and social profiles found by crawling its website. Covers areas larger than one map view by tiling them.
Pricing
from $1.60 / 1,000 business founds
Rating
0.0
(0)
Developer
The Netaji
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
The Actor searches Google Maps for a kind of business in an area and returns each one's contact details: the phone and address published on the listing, plus the email addresses and social profiles found by crawling that business's own website. One business produces one record, whether or not it has a website.
{"query": "dentist","location": "Austin, Texas","spanMetres": 20000,"maxPlaces": 20}
Accepted input
query is what would be typed into Google Maps — dentist, hardware store, plumber, or a business name. Google's own interpretation of the phrase applies.
location is where to search — a town, city, district or address such as Austin, Texas or Shoreditch, London. It is resolved to a point once at the start of the run. latitude and longitude are optional and override it, for a search centred on an exact point rather than a named place; they must be given together.
spanMetres is how wide a map view to search around that point, and defaults to 20,000 m — roughly a metro area. areaMetres defaults to 0, which searches one view at the centre. Anything larger walks a grid of views across that area.
The grid is the reason areaMetres exists. One search term at one map view returns about 182 distinct businesses, and that ceiling belongs to the question rather than to the site: covering an area holding more than that is a matter of asking several narrower views instead of one wide one. A city walked at a 2,000 m span enumerates it. maxPlaces stops the walk after a given number of businesses; 0 means no limit.
contactTypes, includeContactText, smartDiscovery, maxPagesPerWebsite, useStealth and solveCloudflare control the website crawl and behave as they do in the Website Email Scraper. maxPagesPerWebsite defaults to 3 here, because a business website only has to be read as far as its contact page.
enrichSocialProfiles is off by default. Turned on, each social account linked from a business website is read for follower counts, category, verification and biography — and for the contact email or phone that business accounts publish and their website often does not.
Response fields
One record per business, in one shape. The shape does not change with any input.
| Field | Contents |
|---|---|
schemaVersion | Version of this output contract |
url | The business website, or empty when it has none |
domain | Domain of that website |
status | ok when contacts were found, empty when none were, failed when the business could not be read at all |
scrapedAt | When the business finished being processed |
place | The Google Maps listing: name, address, phone, categories, rating, hours, coordinates and map link |
company | Name, description and website read from the business's own pages |
emails, phones, socials, addresses | Every contact found, from the listing and the website together |
stats | pagesScanned, pagesFailed, browserPages, durationMs |
error | code and message when the business could not be read, otherwise null |
Every entry in every collection carries the same five keys: value (always a string), sourceUrl, foundBy, confidence and attributes. foundBy says where the detail came from — google-maps for the listing's own phone and address, mailto or dom for the website, and the platform name for anything a social profile published.
A business with no website still returns a record, with its listing phone and address as ordinary entries. Those are frequently the only contact details a small business publishes anywhere, so they are the result rather than a consolation for one.
Reshaping the results
The dataset export handles the common reshapes without changing what the Actor writes.
| Wanted | Export setting |
|---|---|
| One row per email | unwind=emails — the record's url and place merge onto each row |
| Businesses and their emails only | fields=place,emails with unwind=emails |
| Flat CSV for a CRM | unwind=emails, flatten=place,attributes, format CSV |
| One row per business | The default; change nothing |
Charging
| Event | When |
|---|---|
| Business found | Once per distinct business the search returned, including businesses with no website |
| Add-on: contacts from the business website | Once per business whose website was crawled, however many pages that took |
| Add-on: social profile | Once per social account read, and only when the account returned data |
Website crawling is charged once per business rather than per page, so the cost of a run is the number of businesses it found and not how large their websites happen to be. maxPagesPerWebsite is what keeps that offer safe, and smartDiscovery spends those pages on contact and about pages first.
The pages of one search overlap, and a business that appears on several of them is charged once.
Questions
How precise does the location need to be?
A city or district is enough for most searches — it is resolved to a point, and spanMetres decides how far around that point the search reaches. A name that matches several places resolves to the best match, so add the region or country when that matters: Cambridge, England rather than Cambridge. When an exact centre is needed, set latitude and longitude instead and the name is ignored.
Why did a wide search return fewer businesses than expected?
One query at one map view stops at about 182 distinct businesses however wide the view is — a wider view reaches further out rather than returning more. Set areaMetres to the area to cover and lower spanMetres, and the run walks a grid of narrower views instead.
What happens to a business with no website?
It is returned as a record with its listing phone, address and categories, and url is empty. status is ok when the listing itself carried a contact.
Why did a business return no email when its website clearly has one?
Only the first few pages of each website are read, ranked so contact and about pages come first. Raising maxPagesPerWebsite reads further. Some sites also publish contact details only behind a form, which is not something a crawl can read.
Related Actors
For crawling websites you already have a list of, see Website Email Scraper. For Google Maps business listings without the contact crawl, see Google Maps Scraper.