Google Maps Email Extractor avatar

Google Maps Email Extractor

Pricing

from $3.00 / 1,000 lead with an emails

Go to Apify Store
Google Maps Email Extractor

Google Maps Email Extractor

Google Maps email extractor: local business leads with emails and contact details from their own websites (phones, contact page, Facebook, Instagram, LinkedIn, X, YouTube, TikTok) plus Maps data: name, address, rating, reviews. Pay only per lead with an email. Export to JSON, CSV, Excel or API.

Pricing

from $3.00 / 1,000 lead with an emails

Rating

0.0

(0)

Developer

Steady Scrape

Steady Scrape

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Google Maps Email Extractor — local business leads with emails

This Google Maps email extractor finds local businesses on Google Maps — dentists, plumbers, accountants, roofers, any trade, in any city, area or postcode, within a radius you choose — and reads each business's own website for its email addresses, phone numbers, contact page and social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok). Every lead also carries the Google Maps data: name, categories, address, phone, rating, review count, opening hours, whether the profile is claimed, and its Maps link.

You only pay for leads with an email. Businesses whose website shows none are skipped for free — or delivered at a lower price if you ask for them.

What the Google Maps email extractor is for

  • Agencies and freelancers selling to local businesses (web design, SEO, ads, reviews, bookkeeping): a cold email list of every dentist in a city, with the owner's address on the practice's own domain first.
  • Lead resellers and SMMA teams: many trades × many cities in one run, scheduled weekly with only the new leads.
  • B2B sales teams building territory lists: email, phone, website and social profiles in one row, ready for a CRM.
  • Market research: how many businesses of a kind there are around a point, and how many publish an email.

How it works

  1. You give search terms (dentist, plumber), locations (Austin, TX, Leeds, 78701, or latitude, longitude) and a radius.
  2. Each location is looked up on Google Maps. The Actor reads Google Maps' results around its centre, page after page, then around more points spread across the circle, so it reaches past the ~120–240 places a single Google Maps search shows. Places outside the radius are dropped.
  3. For each place with a website of its own (a Facebook page or a Yelp listing in the website field is not one), the Actor reads that page like a visitor — then the contact page it links to (or the homepage, when Maps points to a deep page; or /contact when the menu is drawn by script). At most a handful of plain page requests per site.
  4. Emails come from mailto: links, the page text (also info [at] domain [dot] com), Cloudflare's email protection and the page's structured data. Junk is filtered out: error-tracker ids, the site builder's or plugin's own addresses, template placeholders (your@email.com), image names (logo@2x.png), noreply@ senders and domain-sale pages. Addresses on the business's own domain come first, then Gmail/Outlook-style mailboxes, then the rest.
  5. A business found by two searches, two branches linking one page, and branch pages that only repeat emails already delivered are charged once. One free summary row per search term and location tells you how many places were checked, how many had no website, how many websites were read, and how many leads came out.

Measured on 2026-11-03 (from a home connection): dentists in central Austin: 10 leads from 17 websites read; plumbers in Austin: 40 leads, 17 websites without an email and 17 that refused or were down, out of 75 read; accountants in Leeds: 10 leads from 10 websites.

Input example

{
"searchTerms": ["dentist", "orthodontist"],
"locations": ["Austin, TX", "San Antonio, TX"],
"radius": 15,
"distanceUnit": "km",
"maxLeadsPerSearch": 200,
"minReviews": 5,
"onlyNewLeads": true
}

Output example

{
"rowType": "lead",
"name": "Toothbar",
"email": "info@toothbar.com",
"emails": ["info@toothbar.com"],
"websitePhones": ["5129498202"],
"contactPageUrl": "https://toothbar.com/contact/",
"facebook": "https://www.facebook.com/toothbar",
"instagram": "https://www.instagram.com/thetoothbar",
"linkedin": "https://www.linkedin.com/in/tooth-bar-90b898170",
"x": null,
"youtube": null,
"tiktok": null,
"pagesRead": 2,
"website": "https://www.toothbar.com/",
"domain": "toothbar.com",
"category": "Dentist",
"categories": ["Dentist", "Cosmetic dentist", "Dental implants provider", "Emergency dental service"],
"address": "211 Walter Seaholm Dr LR 160, Austin, TX 78701",
"street": "211 Walter Seaholm Dr LR 160",
"city": "Austin",
"postalCode": "78701",
"state": "Texas",
"countryCode": "US",
"phone": "(512) 607-4268",
"phoneInternational": "+15126074268",
"rating": 4.9,
"reviewCount": 735,
"claimed": true,
"closed": false,
"openingHours": ["Monday: 8 AM–5 PM", "Tuesday: 8 AM–5 PM", "Wednesday: 8 AM–5 PM", "Thursday: 8 AM–5 PM", "Friday: Closed", "Saturday: Closed", "Sunday: Closed"],
"placeId": "ChIJO0xN0RG1RIYRIDFDZYJkYjA",
"cid": "3486459572745613600",
"mapsUrl": "https://www.google.com/maps?cid=3486459572745613600",
"lat": 30.2671177,
"lng": -97.7527535,
"distance": 0.93,
"distanceUnit": "km",
"searchTerm": "dentist",
"location": "Austin, TX",
"scrapedAt": "2026-11-03T12:00:00.000Z"
}

Lead fields

fieldmeaning
rowTypelead (charged), or one of the other rows below
emailthe best address found: on the website's own domain first, then a free mailbox (Gmail, Outlook…), then any other
emailsevery address found on the pages read, best first (up to 10), junk removed
websitePhonesnumbers the website shows (its tel: links first, then numbers written on the page; fax numbers left out)
contactPageUrlthe contact page that was read, or null when the site has none the Actor could find
facebook, instagram, linkedin, x, youtube, tiktokthe business's profiles linked from its website (share buttons and posts are not profiles); null when not linked
pagesReadhow many pages of the website were read (1–3)
website, domainthe website the Google profile links to (tracking parameters removed), and its host
name, category, categoriesthe business and its Google categories (the first is the main one)
address, street, city, postalCode, state, countryCodeas Google Maps shows them; null for a service-area business that hides its address
phone, phoneInternationalthe Google profile's phone as displayed and in international format
rating, reviewCountGoogle stars and number of reviews; null when nobody has reviewed it
claimed, closedfalse when Google offers "Claim this business"; true when Google marks the place closed
openingHoursone line per day, Monday first
placeId, cid, mapsUrl, lat, lng, distance, distanceUnitGoogle's ids, the profile link, the pin, and how far from the location's centre, in your unit (km or mi)
searchTerm, location, scrapedAtwhich search found it, and when (UTC)

Other rows

  • rowType: "place" — only with Include places without an email: a business whose website was read and showed no email, with the same fields (email is null) — its phones and social profiles are often still there.
  • rowType: "unreadable" (free) — only with Include places without an email: a business whose website could not be read, with its Maps fields, a reason (unreachable: down, no such domain, an error page; blocked: the site refused or showed a bot check) and a message.
  • rowType: "search" (free) — one per search term and location: status (ok, blocked, location_not_found, not_searched), resolvedLocation, placesInRadius, withoutWebsite, filteredOut, websitesRead, withoutEmail, unreadableWebsites, foundByEarlierSearch, sameWebsiteAsEarlier, sameEmailsAsEarlier, deliveredInEarlierRuns, leads, places, maxLeadsReached, and a reason when something stopped it.

The dataset has three views: Leads, Websites not read and Searches.

Filters (never charged)

  • Phone number required, minimum rating, minimum reviews, categories to keep (a keyword match on Google's categories), include closed businesses (off by default). Filtered businesses' websites are not read.
  • Only new leads: on scheduled runs, skip every business an earlier run already delivered to you; their websites are not read again. The list is kept in a key-value store of your own account (steadyscrape-google-maps-email-extractor-state), saved as the run goes.

Pricing

Pay per event, no start fee:

eventprice
lead — a business whose own website showed at least one emailUS$0.003 (US$3 per 1,000 leads)
place — a business whose website showed no email, only when you turn on "Include places without an email"US$0.001

Businesses without a website, filtered businesses, websites that could not be read, duplicates, places outside the radius, search summaries, unknown locations and blocked searches are free. Your run's spending limit is respected: no website is read once the limit cannot pay for another lead, and the summary row says the run stopped there.

  • Businesses without a website: Google Maps Businesses Without a Website sells the other half of a Google Maps search — the places this Actor leaves out — for web designers.
  • German, Austrian and Swiss companies: Impressum Scraper reads the legal notice of DACH websites for the company's register number, VAT ID and managing directors.

When Google asks for verification

The Actor reads the same answers Google Maps gives its own web page, one search at a time. If Google asks an IP for verification — its "unusual traffic" page, a CAPTCHA, a JavaScript check, or any answer that is not Google Maps' normal data — that IP is done for the run: nothing more is sent from it, and the run goes on from another IP of Apify's datacenter proxy. It never solves, bypasses or replays a challenge. Plain overloads (HTTP 429 or 5xx without a challenge) take the same way. When every IP the run can use has been refused, the searches left are free blocked rows that say so, and the run still finishes cleanly with the leads found so far. Websites are read at a visitor's pace (at least half a second between two requests to one site); a website that refuses gets one more try from another IP, and one that shows a bot check (Cloudflare's "Just a moment…", DataDome and the like) is never retried — it is a free row.

Limits

  • Up to 20 search terms and 20 locations per run; radius 0.5–50 km (or miles); up to 5,000 leads per search.
  • Only what the website shows in its HTML: an address drawn only by JavaScript, shown as an image or behind a contact form is not found. Websites of big chains often have no email at all (only a form).
  • websitePhones can include a number that is not the business's own (a licensing board some states require in the footer); the Google profile's phone is the business's.
  • Location names resolve as Google Maps resolves them: an ambiguous or misspelt name can land on Google's closest guess, even a business in another state. Check resolvedLocation in the search row, add the state, or give latitude, longitude. The country setting biases short names.

It reads publicly visible Google Maps listings and the public pages of the businesses' own websites — the addresses and numbers businesses publish so customers can reach them — without logging in. Use the leads in line with the laws that apply to your outreach (for example CAN-SPAM, GDPR, CASL, PECR), and honour opt-outs. This Actor is not affiliated with, endorsed by or sponsored by Google.