Skip to content

Google Maps Email Extractor

Try for free

Find local businesses on Google Maps and pull emails, phone numbers, and social profile links from their websites. Build B2B lead lists by niche and city in minutes.

📩 Google Maps Email Extractor

Turn a Google Maps search into a lead list: place name, address, phone, website, and the public emails and social profiles printed on that website.

Built for sales teams, agencies, and operators who already know the trade or the city and need contacts they can load into a CRM the same day.

✨ Features

  • 🔍 Search the way you search Maps. searchStringsArray plus locationQuery, a city/state/postal combination, a GeoJSON customGeolocation, or Google Maps startUrls. A place_id:ChIJ... search term opens that place directly.
  • 📧 Emails from the business website. The homepage is fetched over HTTP, then each contact, impressum, and about page linked from that homepage on the same site. Cloudflare-protected mailto addresses already in that HTML are included. A wall or a page with no address leaves the email fields empty. Addresses are not guessed.
  • 📞 Phones you can dial. Google’s displayed number and unformatted number stay on the place. Website tel: links and numbers written on the homepage or those contact pages are added as phones and phonesUncertain.
  • 🔗 Social profile URLs. Public LinkedIn, X, Instagram, Facebook, YouTube, TikTok, Pinterest, and Discord links found on the homepage or those contact pages. Share buttons and post URLs are skipped.
  • 📍 The place record Maps already shows. Title, categories, rating, address parts, coordinates, website, photo, image count, place id, cid, fid, and Maps URL, when that search card contains them.
  • 🎯 Filters that match the form. Minimum stars (placeMinimumStars), places with or without a website, skip permanently or temporarily closed places, exact or partial name match (searchMatching), and category words (categoryFilterWords).
  • 🌍 Language. language is sent as the Maps hl parameter, so category names and hours come back in the language you pick.
  • 📄 Past the first screen. Each search walks the Maps list 20 places at a time. One list stops near 120. A higher maxCrawledPlacesPerSearch continues in neighboring map tiles that still overlap a 25 km radius around the geocoded query. Places farther out are not stored. One search reads at most 160 map tiles, because the places of a run are held in memory until they are saved.
  • 🗺️ A results map. Places with coordinates are written to the key-value record results-map.

🚀 Why teams use this

  • Request-based, not a browser. Maps pages are plain HTTP GETs. Websites are fetched with Chrome’s TLS fingerprint.
  • One bad URL does not kill the run. A Maps URL that returns no payload is logged and skipped. The rest of the list still lands in the dataset. A website that blocks the fetch leaves the Maps place in place and simply omits the email fields.
  • No invented blanks. Missing review counts, hours, emails, and closed flags are left off the item. A real false or a real 0 stays. You can trust an empty column to mean “the page did not say.”
  • Production shape. The same input names as the Google Maps Email Extractor form, a dataset view for overview, contact info, and social links, and a residential proxy session inside the Scrapely run.
  • Fits a scheduled workflow. Point it at a search term and a city, cap maxCrawledPlacesPerSearch, and export JSON or CSV. Run it again next week for the next territory.

💡 Use cases

  • Turn a Maps search into a contact list with emails, phones, and social profiles.
  • Find the Instagram, Facebook, or LinkedIn page behind each local business.
  • Qualify outbound leads by rating, category, and whether they have a website.

🧪 Example input

{
  "language": "en",
  "locationQuery": "New York, USA",
  "maxCrawledPlacesPerSearch": 20,
  "scrapeSocialMediaProfiles": {
    "facebooks": false,
    "instagrams": false,
    "tiktoks": false,
    "twitters": false,
    "youtubes": false
  },
  "searchStringsArray": [
    "restaurant"
  ]
}

🧾 Sample output

One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.

{
  "title": "Buena Vista Restaurant & Bar",
  "placeId": "ChIJJaOjl3VZwokRmGLCoIs-LgU",
  "address": "88 2nd Ave, New York, NY 10003",
  "categoryName": "Latin American restaurant",
  "categories": [
    "Latin American restaurant",
    "Cocktail bar"
  ],
  "totalScore": 4.9,
  "reviewsCount": 157,
  "location": {
    "lat": 40.726813899999996,
    "lng": -73.9886355
  },
  "street": "88 2nd Ave",
  "city": "New York",
  "postalCode": "10003",
  "state": "New York",
  "neighborhood": "Manhattan",
  "countryCode": "US",
  "phone": "+1 555 0100",
  "phoneUnformatted": "+1 555 0100",
  "website": "https://www.buenavistany.com/",
  "openingHours": [
    {
      "day": "Monday",
      "hours": "11 AM to 11 PM"
    },
    {
      "day": "Tuesday",
      "hours": "11 AM to 11 PM"
    }
  ],
  "imageUrl": "https://lh3.googleusercontent.com/…",
  "imagesCount": 238,
  "fid": "0x89c2597597a3a325:0x52e3e8ba0c26298",
  "cid": "373304588536799896",
  "kgmid": "/g/11yzl1xj4d",
  "businessProfileId": "14681402408299020922",
  "url": "https://www.google.com/maps/search/?api=1&query=Buena+Vista+Restaurant+%26+Bar&query_place_id=ChIJJaOjl3VZwokRmGLCoIs-LgU"
}

📥 Input

Provide a search term and a location, or paste Google Maps URLs. URLs take priority over search terms.

{
  "searchStringsArray": ["zahnarzt"],
  "locationQuery": "Konstanz, Germany",
  "maxCrawledPlacesPerSearch": 8,
  "language": "en",
  "website": "withWebsite",
  "skipClosedPlaces": false
}
FieldWhat it does
searchStringsArrayTerms you would type into Maps. Also accepts place_id:ChIJ....
locationQueryCity, address, or region. This wins over the geolocation fields below.
maxCrawledPlacesPerSearchPlaces to keep per search term. Above one list, the run continues in neighboring tiles. Empty uses 20.
languageMaps UI language, default en.
searchMatchingall, only_includes, or only_exact against the place name.
placeMinimumStarstwo through fourAndHalf. Places with no rating are skipped when this is set.
websiteallPlaces, withWebsite, or withoutWebsite.
skipClosedPlacesDrop places Maps marks permanently or temporarily closed.
categoryFilterWordsKeep a place when one of its categories matches. Used as the search text when no search terms are set.
city, state, county, postalCode, countryCodeCombined into the location when locationQuery is empty. countryCode also selects the residential proxy country.
customGeolocationGeoJSON point or polygon. Coordinates are [longitude, latitude]. Used as the map center when no location text is set.
startUrlsGoogle Maps search or place URLs. Each bad URL is skipped.
scrapePlaceDetailPageAlso open the Maps place preview and fill any extra fields that preview contains.

scrapePlaceDetailPage, scrapeTableReservationProvider, scrapeOrderOnline, scrapeDirectories, and maxQuestions open the Maps place preview and keep fields that preview already contains, including reserveTableUrl when a reservation link is there. scrapeSocialMediaProfiles opens profile URLs found on the website and keeps a follower or subscriber count only when that page shows an integer. Empty lists stay off the item.

📤 Output

Each dataset item is one place. These fields are present when Maps or the website sent them:

Contact. emails, phones, phonesUncertain, phone, phoneUnformatted, website, linkedIns, twitters, instagrams, facebooks, youtubes, tiktoks, pinterests, discords.

Place. title, placeId, url, address, street, neighborhood, city, postalCode, state, countryCode, location (lat, lng), categories, categoryName, totalScore, reviewsCount, reviewsDistribution, imageUrl, imagesCount, openingHours, description, additionalInfo, subTitle, reserveTableUrl, claimThisBusiness, permanentlyClosed, temporarilyClosed, wasOpenAtScrapeTime.

Identity. fid, cid, kgmid, businessProfileId, searchString, searchPageUrl, language, rank, scrapedAt.

openingHours is included when the card has at least five weekdays. Review counts and the star histogram are included when the Maps payload has them. scrapePlaceDetailPage is the switch that fetches the preview for a fuller card. The default search does not invent them.

The key-value store record results-map is an HTML list of the places that had coordinates.

💰 Pricing

You pay per event, plus platform usage (compute and proxy traffic). Reading each place's website for emails, phones and social links is included in the place price.

EventWhen it is chargedPrice
Place scrapedEach place saved to the dataset, with its website contacts$0.004
Filter appliedEach saved place when a filter is on (category words, minimum stars, closed places, website)$0.0008
Place details scrapedEach place whose detail page was opened and read (scrapePlaceDetailPage)$0.0016
Social profile scrapedEach social profile returned with its follower or subscriber count$0.008

Add-ons are charged only when you turn the option on and only for places where it returned data.

Example: 1,000 places with no add-ons cost $4.00 in event fees plus platform usage. In our test runs platform usage was about $0.28 to $0.51 per 1,000 places. The default 20-place search costs $0.08 in event fees.

If you set a maximum cost per run, the run saves as many places as that budget pays for and then stops cleanly.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.