Google Maps Scraper with Emails avatar

Google Maps Scraper with Emails

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Google Maps Scraper with Emails

Google Maps Scraper with Emails

Scrapes Google Maps for any search query in any country. Extracts business name, phone, email, website, address, category, and rating. Visits each place's website to find email addresses. Built for mass scraping.

Pricing

from $2.00 / 1,000 results

Rating

5.0

(1)

Developer

Ayoub Mansouri

Ayoub Mansouri

Maintained by Community

Actor stats

1

Bookmarked

17

Total users

3

Monthly active users

10 days ago

Last modified

Share

The only Google Maps scraper that breaks Google's 120-result cap.

Most Google Maps scrapers hit a wall at 120 results per search — that's Google's built-in limit, not a bug. This one uses a geo-grid to slice your target area into cells and scrape each one independently, finding thousands of businesses per city instead of 120.

Then it visits every business website and extracts emails — even the ones hidden inside contact forms (WordPress Contact Form 7, Formspree, mailto actions, hidden inputs, inline scripts). Most scrapers can't see those. This one can.

Built for lead-gen agencies, SDR teams, and anyone who needs lead lists that don't end at 120.

Why this scraper beats the alternatives

1. Breaks the 120-result cap. Geo-grid splits any city into ~30 cells at the optimal zoom level. Each cell runs its own search. Real result: 500+ unique dentists in NYC, not 120. 2,800+ restaurants in Paris, not 120.

2. Finds emails ~90% of the time. Crawls homepages, contact pages, and about pages. Extracts emails from inside HTML forms — the ones every other scraper misses because the email isn't visible on the page.

3. Cheaper per lead than competitors. Direct HTTP for website crawls (no proxy cost). Resource blocking cuts Google Maps bandwidth ~70%. Browser tabs open only when strictly necessary. $2 per 1,000 places.

4. Survives long runs. State persists across Apify machine migrations. A 10,000-result job resumes exactly where it stopped.

Who this is for

  • Lead-gen agencies doing territory sweeps for clients
  • SDR teams building outbound lists at scale
  • Local SEO agencies prospecting their target verticals
  • Sales ops seeding CRMs with verified business contacts

If you need 100 leads, any scraper works. If you need 5,000+, you need a geo-grid.

What you get

FieldExample
nameJohn's Plumbing & Drain Services
categoryPlumber
phone+1 323-422-7485
emailinfo@johnsplumber.com
websitehttps://johnsplumber.com/
address1247 Riverside Dr, Los Angeles, CA 90039
cityLos Angeles
stateCA
zip90039
rating4.9
reviewsCount53
facebookhttps://www.facebook.com/johnsplumbing
instagramhttps://www.instagram.com/johnsplumbing/
twitterhttps://twitter.com/johnsplumbing
linkedinhttps://www.linkedin.com/company/johnsplumbing
lat34.1184341
lng-118.3003935
plusCode4F9P+CG Los Angeles, CA, USA
placeId0x80c2bf3d6722abc1:0x73bcdee27ad53d30
googleMapsUrlhttps://www.google.com/maps/place/...

Phone, website, full address, category, and Plus Code are pulled from each place's Google Maps profile page. Email and social media links are extracted from the business website. Coordinates and place ID come from the place URL.

Input examples

Simple search — one keyword, one city

{
"searchStringsArray": ["dentist"],
"locationQuery": "Chicago"
}

Multiple keywords — lead generation campaign

{
"searchStringsArray": [
"plumber",
"electrician",
"HVAC contractor",
"roofer"
],
"locationQuery": "Houston, TX",
"scrapeEmails": true,
"skipClosedPlaces": true
}

International — any language, any country

{
"searchStringsArray": ["restaurant", "café"],
"locationQuery": "Paris",
"language": "fr"
}

Mass scraping — cover an entire metro area

{
"searchStringsArray": ["therapist", "psychologist", "counselor"],
"locationQuery": "New York City",
"maxCrawledPlacesPerSearch": 0,
"maxConcurrency": 5
}

The geo-grid automatically splits the area into ~30 cells at the optimal zoom level, scraping each one to find every listing.

Location baked into keywords

{
"searchStringsArray": [
"dentist Chicago",
"dentist Houston",
"dentist Phoenix"
],
"scrapeEmails": true
}

Fast mode — skip email extraction

{
"searchStringsArray": ["gym", "fitness"],
"locationQuery": "Miami",
"scrapeEmails": false
}

Runs faster. You still get the full Google Maps profile: name, phone, website, address, category, rating, and coordinates. Set scrapePhones to false as well for the fastest feed-only mode (name, category, rating, and Google Maps URL only).

How place details are scraped

For every place found in the search results, the actor opens its Google Maps profile page and extracts the complete profile: phone number, website, full address (with city/state/ZIP), exact category, and Plus Code. Failed pages are automatically retried, so detail coverage is near 100% even on large runs.

How email extraction works

The scraper uses a 3-step pipeline to maximize email discovery:

  1. Homepage scan — Visits the business website via fast HTTP request. Uses Crawlee's social.parseHandlesFromHtml to find mailto links, email patterns, phone numbers, and social media profiles.
  2. Contact form extraction — Scans for hidden emails inside <form> elements: action="mailto:...", hidden input values, data attributes, and inline script configurations (catches WordPress Contact Form 7, Formspree, and similar setups).
  3. Sub-page crawl — If no email found on the homepage, automatically discovers and scans contact/about pages on the same domain.

This catches emails that basic scrapers miss — many businesses only expose their email inside a contact form, not as visible text on the page.

How the geo-grid works

Google Maps only returns ~120 results per search. To get full coverage of a city or region:

  1. The actor geocodes your location into a bounding box (via OpenStreetMap Nominatim)
  2. It picks the optimal zoom level based on the area size
  3. It splits the bounding box into a grid of cells
  4. Each cell gets its own Google Maps search, finding results in that specific area
  5. Results are automatically deduplicated by Google Maps place ID

For a city like New York, this creates ~30 cells and can find 500+ unique businesses per keyword.

Tips for getting the most results

  • Use multiple related keywords — "plumber", "plumbing service", "emergency plumber" will each find some unique listings
  • Set maxCrawledPlacesPerSearch to 0 — No limit per grid cell means maximum coverage
  • Increase maxConcurrency to 5-10 for faster runs (default is 5)
  • Deduplication is automatic — The same business found across multiple keywords or grid cells is only included once

Input reference

ParameterTypeDefaultDescription
searchStringsArraystring[]requiredKeywords to search on Google Maps
locationQuerystringCity, region, or country. Auto-geocoded into a geo-grid
startUrlsobject[]Google Maps URLs to scrape directly
maxCrawledPlacesPerSearchinteger0Max results per grid cell. 0 = no limit
placeMinimumStarsnumber0Minimum star rating filter (0-5)
skipClosedPlacesbooleanfalseSkip closed businesses
scrapeEmailsbooleantrueExtract emails and social media from websites
scrapePhonesbooleantrueOpen each place's profile page for phone, website, full address, Plus Code
languagestring"en"Google Maps language code
maxConcurrencyinteger5Parallel browser pages (3-10 recommended)
zoominteger0Geo-grid zoom. 0 = auto-detect

Export

Download results from the Apify console as CSV, JSON, or Excel. Connect to Google Sheets, Slack, CRMs, or webhooks via Apify integrations.

Cost

Pay Per Event: $0.002 per result ($2 per 1,000 results), plus a small Actor start fee. You only pay for places actually saved to the dataset.