Google Maps Scraper — Business Emails, Phones & Leads avatar

Google Maps Scraper — Business Emails, Phones & Leads

Pricing

from $6.69 / 1,000 lead records

Go to Apify Store
Google Maps Scraper — Business Emails, Phones & Leads

Google Maps Scraper — Business Emails, Phones & Leads

Collect Google Maps business leads with names, contact details, place data, and public website emails and social links. Run with search queries, residential proxy, and optional email verification. Pricing: $0.0069 per lead-record event on Free.

Pricing

from $6.69 / 1,000 lead records

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

66

Total users

11

Monthly active users

3 days ago

Last modified

Features

Limited permissions

Share

Google Maps Leads Scraper

Runs need Apify's RESIDENTIAL proxy group, which is the default setting, and no key of your own. Google Maps Leads then extracts business place data from Google Maps and enriches business websites with public emails and social links. On the Free plan, the Actor costs $0.0069 per lead-record event.

  • Build B2B lead lists with names, addresses, phones, websites, GPS coordinates, ratings, hours, and email fields.
  • Extract public business emails and social profiles without a Google API key or external proxy key.
  • Scrape restaurants, agencies, contractors, dentists, gyms, and other local businesses for prospecting.
  • Compare categories, ratings, price levels, amenities, and ownership signals for local research.

What you get

Each dataset record is a flat business lead with place data, website contact enrichment, email verification details, and provenance fields.

Field familyFieldsTypeWhat it contains
Identityplace_id, place_id_raw, namestringBusiness identifiers and name
Locationaddress, latitude, longitude, plus_codestring, float, float, stringAddress, coordinates, and Open Location Code when available
Contactphone, websitestringBusiness phone and website
Email discoveryemails, primary_email, email_source_pagearray, string, stringFound emails, selected email, and source page
Email verificationemail_status, email_checksstring, arrayResult and syntax, MX, role, and disposable checks
Email summaryemail_count, has_emailinteger, booleanEmail count and whether one was harvested
Website enrichmentsocial_links, contact_enrichedobject, booleanSocial URLs and enrichment status
Business classificationcategory, categoriesstring, arrayPrimary and additional categories
Ratingsrating, reviews_countfloat, integerStar rating and review count
Price and statusprice_range, price_level, work_statusstring, integer, stringPrice text, numeric level, and listing status
Hoursopening_hoursarrayWeekly entries such as {day, hours}
Listing detailsis_claimed, maps_urlboolean, stringOwner-verified flag and Maps URL
Contentsummary, description, image_url, amenitiesstring, string, string, arrayListing text, image URL, and attributes
Qualityparse_confidence, parse_path, warningsfloat, string, arrayConfidence, parser path, and warnings
Provenancequery, rank, scraped_atstring, integer, stringQuery, result position, and UTC scrape timestamp

With MX verification, email_status can be valid, role, risky, or invalid; records without an email use none. With verification disabled, an unverified email can use found.

Sample output

The following is a shortened view of the second real dataset record. Fields such as phone, email_checks, opening_hours, maps_url, and the parse_* fields are omitted; shown values are unchanged. The business email address is shown as <hidden for privacy>; the real record holds the public address found on the website.

{
"place_id": "ChIJTfb1d_uHhYARRpn5d_Fk1SU",
"name": "The Coffee Movement",
"address": "1737 Balboa St, San Francisco, CA 94121",
"latitude": 37.7764721,
"longitude": -122.47782249999999,
"website": "https://www.thecoffeemovement.com/",
"emails": ["<hidden for privacy>"],
"primary_email": "<hidden for privacy>",
"email_status": "valid",
"has_email": true,
"email_source_page": "https://www.thecoffeemovement.com/",
"social_links": {"instagram":"https://www.instagram.com/thecoffeemovementsf/","yelp":"https://www.yelp.com/biz/the-coffee-movement-san-francisco"},
"category": "Coffee shop",
"rating": 4.8,
"reviews_count": 647,
"query": "coffee shops in San Francisco CA",
"rank": 2,
"scraped_at": "2026-10-31T07:42:12.678995+00:00"
}

Pricing

This Actor uses pay-per-event billing. The lead-record event is one business lead with place data and a verified email when one is found on the website. Only records pushed to the dataset are charged; blocked, empty, or fetch-failed queries push no records and are not charged. Website harvesting, social links, and MX checks are included.

PlanPrice per lead-record event
Free$0.0069
Bronze$0.006831
Silver$0.006762
Gold$0.006693
Platinum$0.006624
Diamond$0.006555

Worked examples on the Free plan at $0.0069 per lead record: 1,000 x $0.0069 = $6.90, and 10,000 x $0.0069 = $69.00.

Apify includes $5 of monthly platform usage credit on its Free plan. At $0.0069 per event, $5 divided by $0.0069 equals 724 whole lead-record events if applied only to this Actor. Compute, Apify Proxy traffic including residential traffic, and storage are included in the event prices and paid by the Actor developer for this Actor, not separately by the buyer.

How to use

  1. Enter one or more Google Maps search strings in queries.
  2. Set maxResults to the places wanted from each query; pagination uses 20-result pages.
  3. Keep the default Apify RESIDENTIAL proxy configuration.
  4. Enable verifyEmails for MX, role, and disposable checks and best-email ranking, then start the Actor. Without it, primary_email is still set to the first email found.
  5. Review email_status, parse_confidence, parse_path, and warnings, then repeat the run through Apify Schedules; daily is a suitable starting point.
{
"queries": ["coffee shops in San Francisco CA"],
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
},
"maxResults": 20,
"verifyEmails": true,
"language": "en",
"country": "us"
}

Export the dataset as JSON or CSV, or read it through the Apify dataset API.

Input parameters

ParameterWhat it doesDefault
queriesRequired array of Google Maps search strings; each is processed separately.No default; required
proxyConfigurationApify proxy settings. Google Maps requires residential proxy; GOOGLE_SERP does not support Maps URLs.Apify RESIDENTIAL proxy
maxResultsMaximum places per query; 1–300, with 20 places per page.20
verifyEmailsMX-verifies harvested emails, runs role and disposable checks, and ranks the best email for primary_email; website enrichment remains enabled.true
languageResult language: en, es, fr, de, it, pt, ja, ko, or zh.en
countryResult localisation: us, gb, ca, au, de, fr, es, it, jp, br, mx, or in.us
disableUsageStatsDisables the usage-statistics record described below.false

Limits and edge cases

ConditionWhat you seeWhat to do
You need more than 300 places for one queryThe input schema limits maxResults to 300 per query.Split locations into neighborhoods or subcategories.
An area contains more places than the source returnsGoogle caps a single area at roughly 120–300 places.Use narrower queries.
A business has no websiteThe place remains; enrichment is false, email fields are empty, has_email is false, and email_status is none.Use available place fields.
A website has no public emailThe place remains without a harvested email.Filter on has_email or email_status.
verifyEmails is falseEmails and social links are harvested without MX checks; an email can use primary_email with status found.Keep verification enabled for MX, role, and disposable signals.
CAPTCHA, consent wall, or blocked responseThe Actor tries up to three residential-IP attempts; a still-blocked query is skipped with no records.Keep residential proxy and retry later.
No places or fetch errorThe query pushes no records and produces no lead-record charge.Check query, location, proxy, and source availability.
Primary Maps response changesSecondary-parser records have parse_path: "fallback" and lower parse_confidence.Inspect parse_path, parse_confidence, and warnings.
Residential proxy unavailable or setup failsThe run records proxy_init_failed or no_proxy and does not proceed with collection.Ensure the account can use the RESIDENTIAL group.
Proxy authentication failsThe run stores proxy_auth_failed in OUTPUT and aborts. The failing query is not charged; records already delivered from earlier queries stay in the dataset and are charged.Check the account's Apify proxy access, then rerun.

FAQ

How much does it cost to scrape Google Maps leads?

The price is per lead-record event and depends on your Apify plan. See the Pricing section above for the full plan table and worked examples.

What happens if a query returns no results or stops working?

An empty query, fetch failure, or blocked query pushes no records and has no lead-record charge. A blocked query receives up to three residential-IP attempts. Check the query, proxy configuration, and warnings or run output.

What does the email verification confirm?

The Actor checks syntax, MX or mail-capable A records, role addresses, and a fixed list of disposable domains. It does not perform a full mailbox SMTP probe. valid means the syntax and mail-domain checks passed and the address was not classified as role or disposable.

The Actor collects public data from Google Maps and public business websites. Whether a collection or outreach use is allowed depends on source terms and applicable law for the use case, so review those requirements before running it. This Actor is not affiliated with, endorsed by, or sponsored by Google LLC.

Rate this Actor

If Google Maps Leads saved you time, please rate it on the Apify Store. A rating takes a few seconds and helps other people find a working scraper.

Usage statistics

This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.

A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.

To opt out, set disableUsageStats to true in the input. Nothing is sent then.

Full list of collected fields