Google Maps Lead Scraper
Pricing
from $4.00 / 1,000 place scrapeds
Google Maps Lead Scraper
Scrapes businesses from Google Maps search results and enriches each lead with public emails from the business website.
Pricing
from $4.00 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
Elena Vance
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Turns Google Maps searches into a clean lead list: business name, category, address, phone, website, rating, coordinates — plus public email addresses discovered on each business's own website.
Built for lead generation, local market research and territory analysis.
What you get
One dataset row per business, including:
| Field | Example |
|---|---|
name | ATX Family Dental |
category / categories | Dentist / Dentist, Cosmetic dentist, … |
phone / phoneUnformatted | +1 512-717-3147 / +15127173147 |
website / websiteDomain | https://www.atxfamilydental.com/ |
primaryEmail / emails | info@atxfamilydental.com |
address, street, city, state, postalCode, countryCode | 1700 S 1st St, Austin, TX 78704 |
rating | 4.9 |
coordinates | { "lat": 30.2482, "lng": -97.7560 } |
googlePlaceId | ChIJb5gBC-u0RIYRHkntaUcdJGs |
openingHours, hoursText, businessStatus, permanentlyClosed | Open · Closes 5 PM |
attributes | Wheelchair-accessible entrance |
Quick start
{"searchQueries": ["dentists in Austin"],"maxResultsPerQuery": 120,"includeEmails": true}
Reuse one set of queries across cities with locationQuery:
{"searchQueries": ["dentists", "orthodontists"],"locationQuery": "Austin, Texas","requireWebsite": true,"minRating": 4.5}
Target an exact map area instead of relying on the query text:
{"searchQueries": ["coffee shop"],"customGeolocation": { "latitude": 51.5072, "longitude": -0.1276, "zoom": 13 },"countryCode": "gb"}
Input reference
| Field | Default | Notes |
|---|---|---|
searchQueries | required | One search per line. |
locationQuery | – | Appended to every query unless already present. |
maxResultsPerQuery | 120 | See the result-limit note below. |
maxTotalResults | 10000 | Hard cap across all queries. |
includeEmails | true | Crawls each business website for public emails. |
maxWebsitePagesPerPlace | 5 | Homepage plus contact/about style pages. |
minRating | – | Places with no rating are excluded when set. |
requireWebsite / requirePhone | false | Keep only contactable businesses. |
skipClosed | false | Drop permanently/temporarily closed places. |
categoryIncludes | – | Case-insensitive substring match on categories. |
language / countryCode | en | Localizes categories and hours wording. |
customGeolocation | – | { latitude, longitude, zoom }. |
proxyConfiguration | Apify Proxy | Strongly recommended. |
maxConcurrency | 10 | Lower it if you hit rate limits. |
How many results can I get?
Google itself stops serving results at typically 100–400 places per query, no matter how the search is run. Setting maxResultsPerQuery to 500 will not exceed what Google returns.
To collect more places in an area, split the search rather than raising the limit:
- by neighbourhood or suburb —
"dentists in North Austin","dentists in South Austin" - by related terms —
"dentist","dental clinic","orthodontist" - by map area — run the same query with several
customGeolocationcentres
Duplicates are removed automatically across all queries in a run, using the Google place ID.
Email enrichment
For each business with a website, the Actor fetches the homepage and up to maxWebsitePagesPerPlace - 1 further same-domain pages whose link text or path suggests contact, about, team, impressum or similar. It reads mailto: links, visible text, lightly obfuscated forms (name [at] domain [dot] com) and Cloudflare-protected addresses.
Addresses are lowercased, deduplicated, and filtered to drop placeholders (you@example.com), platform noise (@sentry.io, @wixpress.com) and no-reply mailboxes. primaryEmail prefers an address on the business's own domain, then a role mailbox such as info@ or contact@.
Roughly half of small businesses publish an email; the rest use contact forms only. Set requireWebsite: true to concentrate the run on businesses that can be enriched.
Pricing
$4.00 per 1,000 businesses — email enrichment included.
You are charged one place-scraped event for each business saved to the
dataset, whether or not it turned out to have an email. There is no separate
add-on fee for finding emails, and no charge for places skipped by your filters.
Set a maximum cost per run in the Actor's run options to cap spending; the run stops cleanly once it is reached.
Speed and cost
The Actor reads Google's Maps data over plain HTTP with no browser, so it is cheap to run. A measured run of 80 businesses across two queries, with email enrichment on:
| Memory | Runtime | Compute units |
|---|---|---|
| 1024 MB | 219 s | 0.061 |
| 2048 MB (default) | 125 s | 0.069 |
| 4096 MB | 88 s | 0.097 |
Peak memory use is around 500 MB. Apify allocates CPU in proportion to memory, so lower settings are slightly cheaper but noticeably slower. 2048 MB is the default because it is close to the cheapest option at roughly half the runtime.
Notes and limitations
reviewCountis usually empty. Google removed review counts from the data behind Maps search results; the field remains in the schema and will populate again if Google restores it.openingHourscovers the current day only, which is all Google includes in search results.- Rows where extraction was incomplete are still saved, with
extractionStatusset topartialand a diagnosticerrorMessage, so a run never silently drops a lead.
Compliance
This Actor collects publicly listed business information and publicly published business contact details. It does not scrape personal profiles or reviews, and it does not bypass logins or access controls. You are responsible for using the results lawfully, including under GDPR, CAN-SPAM and local marketing rules, and for honouring the terms of any site you contact.
Local development
npm installnpm test # unit tests, no network requiredapify run # live run using .actor/input_schema.json defaults