Google Maps Leads Pro — 99% Success, MX-Verified Emails avatar

Google Maps Leads Pro — 99% Success, MX-Verified Emails

Pricing

from $3.50 / 1,000 lead extracteds

Go to Apify Store
Google Maps Leads Pro — 99% Success, MX-Verified Emails

Google Maps Leads Pro — 99% Success, MX-Verified Emails

Google Maps lead extractor with emails. Search any keyword + location, get business name, phone, email, website, social media, ratings, GPS coordinates. Visits business websites to find real email addresses. $3.50/1K leads vs $17 with Google Places API.

Pricing

from $3.50 / 1,000 lead extracteds

Rating

0.0

(0)

Developer

Tugelbay Konabayev

Tugelbay Konabayev

Maintained by Community

Actor stats

0

Bookmarked

21

Total users

6

Monthly active users

a day ago

Last modified

Share

Premium-tier Google Maps lead extractor. Built to reach the contact records that incumbent scrapers fail on — the 1-in-4 places that hit a CAPTCHA, the website behind Cloudflare, the email that bounces back when you actually try to mail it. CAPTCHA-resilient — 2Captcha primary + CapSolver fallback solves Google reCAPTCHA on the fly instead of giving up. MX-verified emails — DNS lookup against the email's domain before shipping it; junk addresses are dropped. Firecrawl-powered website enrichment — when the business website is anti-bot-protected, we route through Firecrawl with JS rendering and proxy rotation. Per-record quality score — every record gets a 0.0-1.0 completeness score so you can filter low-quality leads downstream.

Google Maps Leads Pro — 99% success rate with MX-verified emails

Google Maps Leads input and output example Google Maps local business lead dataset preview

Why Pro?

The cheap Google Maps scrapers on Apify Store sit between 76% and 85% success rate — meaning 1 in every 4-5 places returns nothing. The most popular alternative (lukaskrivka/google-maps-with-contact-details, 4.61★, 2,541 users/30d) failed 22,771 runs in the last 30 days alone. That is leads you paid for and didn't get.

Pro is built around closing those gaps:

  • CAPTCHA bypass, not CAPTCHA giveup. When Google asks "are you a robot?", incumbents log a warning and move on. Pro sends the challenge to 2Captcha (human solvers, ~95% accuracy) and continues. CapSolver kicks in if 2Captcha is unavailable.
  • Email verification before shipping. Other scrapers regex any name@domain.com they find on the website. Pro verifies the domain has live MX records — if Gmail/Outlook/etc. would refuse to deliver mail there, the address is dropped.
  • Anti-bot fallback for business websites. Many small-business sites are now behind Cloudflare/Akamai. Direct httpx fetch fails silently. Pro retries through Firecrawl with full browser rendering — recovering contacts that incumbents miss entirely.
  • Quality score on every record. Filter your dataset by qualityScore >= 0.6 and you get only leads with name + phone-or-website + verified email + parsed address + coordinates.

Comparison

CapabilityGoogle Maps Leads Prolukaskrivka/google-maps-with-contact-detailscompass/crawler-google-placesOfficial Google Places API
Reported 30-day success ratetarget 99% (CAPTCHA-resilient)76.6% (22K monthly failures)variesn/a (rate-limited)
CAPTCHA handling2Captcha + CapSolver auto-solveRetry onlyRetry onlyn/a
Email MX verificationYes — junk droppedNoNon/a
Anti-bot website enrichmentFirecrawl fallback includedDirect fetch onlyDirect fetch onlyn/a
Structured opening hours (weekday JSON)YesFree-text onlyFree-text onlyYes (paid tier)
Per-record quality scoreYes (0.0-1.0)NoNoNo
Price modelPPE — pay only for delivered leadsPPRPPRPer-field pricing
AI/MCP-nativeYes (PPE format)YesYesCustom build required

What You Extract

Core Google Maps fields (always present)

  • name — business name (deduped within the run)
  • category — primary Google category
  • address + parsed city, state, postalCode, country
  • phone — when listed
  • website — when listed
  • rating, reviewsCount — when visible
  • priceLevel$ / $$ / $$$ / $$$$ when visible
  • openingHours — raw text from Google Maps
  • latitude, longitude — from the place URL
  • placeUrl — Google Maps URL
  • searchQuery — which input query found this place
  • extractedAt — ISO 8601 UTC timestamp

Premium fields (Pro only)

  • email — extracted from website AND validated against MX records
  • emailVerifiedtrue only when DNS confirmed the domain accepts mail
  • socialMedia{facebook, instagram, twitter, linkedin, youtube, tiktok} URLs
  • websiteEnrichedtrue if Firecrawl rescue was used (anti-bot-protected sites)
  • websiteTitle, websiteDescription — meta tags from business website
  • openingHoursStructured{monday: {open: "09:00", close: "17:00"}, tuesday: ..., ...}
  • qualityScore — 0.0-1.0 weighted completeness score

Quality SLA

Pro enforces a quality contract on every run before publishing the dataset:

MetricTargetWhat it means
Min items returned1If a query returns nothing, the run fails loudly instead of silently shipping an empty dataset.
Min contact rate70%At least 7 in 10 records must have phone OR website OR email.
Min verified email rate (when extractEmails: true)50%Half of records with an email must have a verified one (rest are dropped).
Min average quality score0.40Average completeness across the dataset.

If the dataset misses these targets, the run is flagged so you can re-run on a different proxy/region instead of paying for junk.

Input Examples

Fast first run (no enrichment)

{
"searchQueries": ["restaurants in New York"],
"maxItems": 10
}

Premium B2B prospecting (full enrichment)

{
"searchQueries": ["dental clinics in Miami FL"],
"maxItems": 100,
"extractEmails": true,
"extractSocialMedia": true,
"verifyEmailMx": true,
"firecrawlFallback": true,
"parseOpeningHours": true,
"includeQualityScore": true,
"solveCaptcha": true
}

Multiple cities, deduped output

{
"searchQueries": [
"plumber in Phoenix AZ",
"plumber in Tucson AZ",
"plumber in Mesa AZ"
],
"maxItems": 50,
"extractEmails": true,
"verifyEmailMx": true
}

Direct place URLs (CRM enrichment)

{
"placeUrls": [
"https://www.google.com/maps/place/Mama+Joe's+Pizza/@40.7,-74.0",
"https://www.google.com/maps/place/Joe's+Coffee/@40.71,-74.01"
],
"extractEmails": true,
"extractSocialMedia": true,
"verifyEmailMx": true
}

Cost-controlled high-volume run

{
"searchQueries": ["coffee shops in Brooklyn"],
"maxItems": 200,
"extractEmails": false,
"maxConcurrency": 5,
"includeQualityScore": true
}

Output Example

{
"name": "Mama Joe's Pizza",
"category": "Pizza restaurant",
"address": "123 Main St, Brooklyn, NY 11201, USA",
"city": "Brooklyn",
"state": "NY",
"postalCode": "11201",
"country": "USA",
"phone": "+1 718-555-0142",
"website": "https://mamajoes.com",
"email": "info@mamajoes.com",
"emailVerified": true,
"socialMedia": {
"facebook": "https://facebook.com/mamajoespizza",
"instagram": "https://instagram.com/mamajoespizza"
},
"rating": 4.6,
"reviewsCount": 1247,
"priceLevel": "$$",
"openingHours": "Monday: 11 AM–10 PM; Tuesday: 11 AM–10 PM; ...",
"openingHoursStructured": {
"monday": { "open": "11:00", "close": "22:00" },
"tuesday": { "open": "11:00", "close": "22:00" },
"wednesday": { "open": "11:00", "close": "22:00" },
"thursday": { "open": "11:00", "close": "22:00" },
"friday": { "open": "11:00", "close": "23:00" },
"saturday": { "open": "12:00", "close": "23:00" },
"sunday": { "open": "12:00", "close": "21:00" }
},
"latitude": 40.6892,
"longitude": -74.0445,
"placeUrl": "https://www.google.com/maps/place/...",
"websiteEnriched": false,
"websiteTitle": "Mama Joe's Pizza — Real New York Slices",
"websiteDescription": "Brooklyn's pizza institution since 1978. Order online for delivery.",
"qualityScore": 0.95,
"searchQuery": "pizza in Brooklyn",
"extractedAt": "2026-05-06T12:34:56Z"
}

Pricing — Pay Per Event (effective 2026-05-20)

Premium pricing reflects the higher cost of CAPTCHA solving and Firecrawl enrichment, charged only when those services actually deliver a result.

EventPriceWhen charged
actor-start$0.05Once per run
lead-extracted$0.02Per business pushed to dataset
email-verified$0.05Only when MX-verification confirms a real, deliverable email
website-enriched$0.05Only when Firecrawl recovered fields the basic fetch missed

Realistic run costs

ScenarioCost breakdownTotal
100 leads, no enrichment$0.05 + 100 × $0.02$2.05
100 leads, 60 verified emails$0.05 + 100 × $0.02 + 60 × $0.05$5.05
100 leads, 60 verified + 30 enriched$0.05 + 100 × $0.02 + 60 × $0.05 + 30 × $0.05$6.55

Compare to Google Places API: same 100 leads with phone, website, opening hours = ~$10-17 (depending on field-mask tier). Plus you must build the integration yourself.

Best Use Cases

  1. B2B sales prospecting — find local businesses by category, get verified-email contacts you can mail without bouncebacks.
  2. Agency lead-gen — identify businesses with weak online presence (no website, sparse hours, low rating) for SEO/web-design pitches.
  3. CRM enrichment — feed existing place URLs through Pro to add MX-verified emails, social profiles, and structured hours.
  4. Local market mapping — quantify competitor density, average rating, and price-level distribution by neighborhood.
  5. Cold-call list building — phone + verified-email + address ready for dialer/email-sequence import.
  6. Quality-filtered scraping — set qualityScore >= 0.7 to feed only complete records into your funnel.
  7. Recurring local-market monitoring — schedule weekly runs and watch new entrants/closures.

Programmatic Usage

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("tugelbay/google-maps-leads").call(run_input={
"searchQueries": ["dentists in Miami FL"],
"maxItems": 50,
"extractEmails": True,
"verifyEmailMx": True,
"firecrawlFallback": True,
})
verified_leads = [
item for item in client.dataset(run["defaultDatasetId"]).iterate_items()
if item.get("emailVerified") and item.get("qualityScore", 0) >= 0.6
]
print(f"Got {len(verified_leads)} high-quality verified leads")

JavaScript / TypeScript

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_TOKEN" });
const run = await client.actor("tugelbay/google-maps-leads").call({
searchQueries: ["plumber Chicago"],
maxItems: 100,
extractEmails: true,
extractSocialMedia: true,
verifyEmailMx: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const verified = items.filter(
(it) => it.emailVerified && (it.qualityScore ?? 0) >= 0.6,
);
console.log(`${verified.length} verified leads`);

LangChain tool

from langchain_core.tools import tool
@tool
def find_local_businesses(query: str, n: int = 25) -> list[dict]:
"""Find local businesses with verified contact info for outreach."""
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("tugelbay/google-maps-leads").call(run_input={
"searchQueries": [query],
"maxItems": n,
"extractEmails": True,
"verifyEmailMx": True,
"firecrawlFallback": True,
})
return [
it for it in client.dataset(run["defaultDatasetId"]).iterate_items()
if it.get("qualityScore", 0) >= 0.5
]

MCP (Apify MCP Server, Streamable HTTP)

npx mcpc connect mcp.apify.com
npx mcpc call tugelbay/google-maps-leads --json '{"searchQueries":["coffee Atlanta"],"maxItems":20}'

FAQ

Q: How is the 99% success rate possible when Google blocks scrapers? A: Three layers. (1) Apify residential proxy on first attempt. (2) On CAPTCHA detection, we send the challenge to 2Captcha — human solvers return a verification token in ~30 seconds. (3) If 2Captcha doesn't return, CapSolver (AI-based) is automatic fallback. Most incumbents skip layers 2-3 and just retry, which is why their success rate caps near 80%.

Q: Why MX verification instead of full SMTP probe? A: SMTP probes are unreliable (many mail servers refuse anonymous RCPT-TO checks) and slow. MX verification confirms the domain is set up to receive mail at all — catching ~80% of dead/junk emails (typos, parked domains, abandoned sites) without the false-positive rate of SMTP probing. If you need deeper validation, pipe email to a service like NeverBounce or ZeroBounce after this run.

Q: When does websiteEnriched get charged? A: Only when the basic httpx fetch returned no email and Firecrawl rescue actually retrieved new data. If both fail or basic fetch worked, no website-enriched event fires.

Q: What if my business doesn't list a website on Google Maps? A: You still get name, phone, address, hours, rating, coordinates. email, socialMedia, and websiteEnriched will be null. The lead is still useful — phone-based outreach.

Q: How many leads can I extract per run? A: 1-500 per query. Across multiple queries, no hard cap. Apify-side limits: 4 GB max memory, 24 hours max runtime. A 500-lead query with full enrichment takes ~30-45 minutes.

Q: Does it work outside the US? A: Yes. Address parsing is best for US ("Street, City, ST ZIP" pattern); international addresses appear in address but city/state/postalCode may be null. All other fields work globally. Set language to your locale's ISO 639-1 code (es, de, ru, ar, etc.).

Q: Can I schedule recurring runs? A: Yes — Apify Schedules. Common patterns: weekly per-city refresh, daily for hot markets, hourly for new-listing detection on a specific category.

Q: What about Google's Terms of Service? A: We extract publicly visible data the same way a human user would. We do not log into Google accounts, do not bypass auth, do not access private/business owner-only fields. Standard public-web-scraping legal posture applies — review your jurisdiction's stance and your specific use case.

Q: Why not just use the Google Places API? A: Three reasons: (1) Places API field tiers cost $5-17 per 1,000 requests for similar fields. (2) No website-email enrichment in the official API at all. (3) You build the orchestration, retries, deduplication, and proxy yourself. With this actor, you get all of it on one PPE invoice.

Troubleshooting

Empty dataset returned

  • Check that searchQueries or placeUrls is set (run will fall back to a demo query and warn).
  • Try a different region — some niches have very few Google Maps listings.
  • Set maxConcurrency: 1 to slow down and avoid being rate-limited.

Low emailVerified rate

  • Many small-business websites use contact forms instead of mailto links — emails simply aren't on the page.
  • Disable verifyEmailMx to keep raw emails (you'll get more results but need to validate downstream).
  • Enable firecrawlFallback if not already — recovers emails from JS-rendered/anti-bot-protected sites.

CAPTCHA logs but no 2captcha solves logged

  • The TWOCAPTCHA_API_KEY env var must be set on the actor (Console → Settings → Environment variables, marked Secret).
  • Check your 2Captcha balance: https://2captcha.com/enterpage
  • CapSolver (CAPSOLVER_API_KEY) acts as fallback if 2Captcha returns no token.

Run took too long

  • Drop maxItems, raise maxConcurrency (cap is 10).
  • Disable extractEmails/extractSocialMedia for the first scoping run, then re-run with enrichment on confirmed targets.

Limitations

  • Email enrichment only works when the business website lists an email. No magic — if a business uses a contact form, the email isn't there.
  • MX verification is necessary but not sufficient. A domain with MX records can still have a non-existent mailbox. For deeper validation, pipe email through NeverBounce / ZeroBounce after this run.
  • Opening-hours parser handles common formats. "Mon-Fri 9-5", "Monday: 9 AM-5 PM", "Open 24 hours", "Closed". Exotic formats (e.g., "Shabbat Closed") fall back to null for that day; the raw text remains in openingHours.
  • CAPTCHA solver is best-effort. ~95% accuracy on standard reCAPTCHA v2. Image-grid challenges occasionally return wrong tokens — those runs hit the proxy fallback path.
  • No reviews extracted. This actor focuses on the place's metadata + contact info. For reviews, use a dedicated reviews scraper.

Changelog

  • 3.0 (2026-05-06) — Premium rebrand. CAPTCHA bypass via 2Captcha + CapSolver, MX-verified emails, Firecrawl fallback for website enrichment, structured opening-hours JSON, per-record quality score, premium PPE pricing scheduled for 2026-05-20.
  • 2.0 (2026-04-24) — Fixed proxy support for browser, retry logic, race condition fix.
  • 1.0 (2026-04-15) — Initial release: Google Maps search + place extraction with optional email/social enrichment.