Google Maps Scraper with Emails
Pricing
from $2.00 / 1,000 results
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
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Google Maps Scraper with Emails & Phone Numbers
Extract business leads from Google Maps at scale. Get name, phone, email, address, rating, website, and social media links for any business type in any location worldwide.
Why this scraper?
- Breaks the 120-result limit — Uses geo-grid technology to split large areas into cells and scrape each one, finding thousands of businesses instead of Google's default 120 cap.
- Finds emails other scrapers miss — Crawls business websites, scans contact/about pages, and extracts emails hidden inside contact forms (mailto actions, hidden inputs, inline scripts).
- Extracts social media profiles — Facebook, Instagram, Twitter/X, LinkedIn pulled from business websites automatically.
- Fast 3-phase pipeline — Phase 1: bulk extraction from search feed. Phase 2: parallel HTTP enrichment for email + social (no browser overhead). Phase 3: targeted browser visits only where needed for phone numbers.
- Cost-optimized — Website crawling uses direct HTTP (no proxy cost). Resource blocking cuts Google Maps bandwidth by ~70%. Only opens browser tabs when strictly necessary.
- Crash recovery — State persists across Apify migrations. Large runs resume exactly where they left off.
What you get
| Field | Example |
|---|---|
name | John's Plumbing & Drain Services |
category | Plumber |
phone | +1 323-422-7485 |
email | info@johnsplumber.com |
website | https://johnsplumber.com/ |
address | 1247 Riverside Dr, Los Angeles, CA 90039 |
city | Los Angeles |
state | CA |
zip | 90039 |
rating | 4.9 |
reviewsCount | 53 |
facebook | https://www.facebook.com/johnsplumbing |
instagram | https://www.instagram.com/johnsplumbing/ |
twitter | https://twitter.com/johnsplumbing |
linkedin | https://www.linkedin.com/company/johnsplumbing |
googleMapsUrl | https://www.google.com/maps/place/... |
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 significantly faster. You still get name, phone, address, category, rating, and website.
How email extraction works
The scraper uses a 3-step pipeline to maximize email discovery:
- Homepage scan — Visits the business website via fast HTTP request. Uses Crawlee's
social.parseHandlesFromHtmlto find mailto links, email patterns, phone numbers, and social media profiles. - 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). - 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:
- The actor geocodes your location into a bounding box (via OpenStreetMap Nominatim)
- It picks the optimal zoom level based on the area size
- It splits the bounding box into a grid of cells
- Each cell gets its own Google Maps search, finding results in that specific area
- 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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchStringsArray | string[] | required | Keywords to search on Google Maps |
locationQuery | string | — | City, region, or country. Auto-geocoded into a geo-grid |
startUrls | object[] | — | Google Maps URLs to scrape directly |
maxCrawledPlacesPerSearch | integer | 0 | Max results per grid cell. 0 = no limit |
placeMinimumStars | number | 0 | Minimum star rating filter (0-5) |
skipClosedPlaces | boolean | false | Skip closed businesses |
scrapeEmails | boolean | true | Extract emails and social media from websites |
language | string | "en" | Google Maps language code |
maxConcurrency | integer | 5 | Parallel browser pages (3-10 recommended) |
zoom | integer | 0 | Geo-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.005 per place ($5 per 1,000 results).