Google Maps Scraper — Business Emails, Phones & Leads
Pricing
from $6.69 / 1,000 lead records
Google Maps Scraper — Business Emails, Phones & Leads
Turn any Google Maps search into B2B leads: name, address, phone, website, GPS, hours + website-harvested emails & socials, each email MX-verified. Built-in contact enrichment closes the email gap. Apify residential proxy — no external key.
Pricing
from $6.69 / 1,000 lead records
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
63
Total users
11
Monthly active users
10 days ago
Last modified
Categories
Share
Google Maps Leads — Verified Email, Phone & GPS Contacts
Turn any Google Maps search into a ready-to-use B2B lead list. Every business comes back as a full contact record — name, address, phone, website, GPS, hours, rating — plus a public email harvested from the business website and MX-verified, so the list you export is the list you can actually email. One flat price per lead. No Google API key, no external proxy key — it runs on Apify's residential proxy.
This is the leads-first sibling of a general Maps scraper: contact enrichment and email verification are always on and bundled into one price, not stacked as paid add-ons.
What you get per lead
primary_email— the single best public email for the business, picked after verification.email_status—valid(domain accepts mail),role(shared mailbox likeinfo@),risky(disposable domain), orinvalid. You always know what you're emailing.emails— every public email found, de-duplicated and ranked (on-domain +mailto:first).social_links— Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, Pinterest, Yelp profiles from the site.- Full place record — phone, website, address, GPS, category, rating, review count, opening hours, price level, owner-verified flag, and more (32+ fields).
Why this beats the alternatives
- Closes the email gap. General Maps-contact scrapers land an email on roughly half of businesses because they only read the homepage. This actor walks the highest-yield contact pages (
/contact,/about,/kontakt,/impressum, …) and de-obfuscates hidden addresses (info [at] domain [dot] com, HTML-entity forms) — lifting the fill rate where the lead actually lives. - Email verification is built in, not a surprise add-on. Each harvested email is checked at the MX layer (does the domain accept mail at all?) and flagged disposable/role/valid — bundled into the per-lead price. Competing stacks charge a separate per-verification fee on top of a separate per-contact fee on top of the base place price.
- One flat price. You pay one rate per lead record delivered — no base-place fee + contacts add-on + verification add-on arithmetic.
- Breaks the 20-result ceiling. Auto-paginates (via the Maps
!8ioffset) up to 300 places per query, deduplicated by place ID. - A real B-plan against format drift. Google reshuffles its internal Maps layout between releases — the silent killer that makes index scrapers return zero results that look like an empty area. A secondary regex/structural parser recovers places by stable anchors and flags them (
parse_path: "fallback", lowerparse_confidence) so degradation is visible, never silent. - Self-rotating against blocks. On a CAPTCHA / consent wall / poisoned IP it rotates to a fresh residential exit (up to 3×) — and never charges you for a blocked or empty query.
- No external key, $0 setup. Uses the Apify residential proxy pool included with your account.
How it compares
| This actor | General Maps + contacts scraper | |
|---|---|---|
| Price model | one flat rate per lead | base place + contacts add-on + verification add-on |
| Email verification | ✅ MX-verified, email_status per lead | ➕ extra per-verification fee |
| Contact-page crawl + de-obfuscation | ✅ multi-page + decode | homepage-only (≈50% fill) |
| Best-email pick | ✅ primary_email | — (raw list only) |
| Results per query | up to 300 (auto-paginate) | ~120 |
| Format-drift fallback parser | ✅ regex B-plan | — |
| External key required | ❌ none | ❌ none |
(Competitor behaviour as observed on the Apify Store, 2026-06; verify current pricing on each listing.)
Input
| Field | Type | Required | Description |
|---|---|---|---|
queries | array of strings | ✅ | Search queries, e.g. ["marketing agencies in Austin TX", "dentists near Denver CO"]. Each query is paginated up to maxResults. |
maxResults | integer | — | Max places per query, 1–300 (default 20). Google caps a single area near 120–300; split into narrower queries for fuller coverage. |
verifyEmails | boolean | — | MX-verify every harvested email and surface a primary_email + email_status. Default true. Contact enrichment itself is always on. |
language | string | — | Result language code (BCP-47). Default en. |
country | string | — | Country code for result localisation. Default us. |
proxyConfiguration | object | — | Apify proxy settings. Must be residential — Google Maps blocks datacenter IPs. Default: Apify RESIDENTIAL group. (The GOOGLE_SERP group does not support Maps.) |
Output (key lead fields)
| Field | Type | Description |
|---|---|---|
name | string | Business name |
primary_email | string | Best verified public email — the lead's contact |
email_status | string | valid / role / risky / invalid / none |
emails | array | All public emails found (ranked) |
email_count | int | Number of distinct emails found |
has_email | bool | Whether at least one email was harvested |
email_checks | array | Per-email MX / role / disposable verification detail |
email_source_page | string | URL the primary email was found on |
social_links | object | {platform: url} social profiles |
phone | string | Phone number |
website | string | Business website URL |
address | string | Full street address |
latitude / longitude | float | Coordinates |
category | string | Primary category (e.g. "Marketing agency") |
rating / reviews_count | float / int | Star rating and review count |
opening_hours | array | Structured weekly hours [{day, hours}] |
is_claimed | bool | Owner-verified listing |
maps_url | string | Direct Google Maps link |
parse_confidence | float | Per-record data-quality score 0.0–1.0 |
scraped_at | string | ISO-8601 UTC timestamp |
(Plus place_id, plus_code, price_level, summary, description, image_url, amenities, categories, work_status, parse_path, warnings, query, rank.)
Use cases
- Cold-email lead lists — pull restaurants, agencies, contractors, dentists, gyms by city with a verified email per business, export straight to your sequencer.
- Sales prospecting — name + phone + website +
primary_emailinto your CRM in one pass. - Local SEO / agency outreach — find businesses with weak
is_claimed/ rating signals and reach the owner directly. - Market research — category, price tier, and amenity distribution across a metro.
Frequently asked questions
Do I need a Google API key or a proxy key? No. Runs on the Apify residential proxy pool included with your account.
How is the email found and verified? The actor fetches each business website over the same residential proxy — homepage plus the highest-yield contact pages — extracts public emails (decoding common [at]/[dot] obfuscation), then checks each at the MX layer to confirm the domain can receive mail and flags role/disposable addresses. The best one is surfaced as primary_email.
Why MX verification and not a full mailbox probe? Outbound SMTP (port 25) is blocked on most cloud infrastructure, so a per-mailbox RCPT probe is unreliable there. MX verification is fast, robust, and honest: it confirms the domain accepts mail and screens disposable/role addresses, which removes the bulk of dead and junk addresses.
What if a business has no website or no public email? You still get the full place record; has_email is false and email_status is none. You're never charged extra for enrichment that found nothing.
How many results per query? Up to 300, paginated automatically. Split large cities into narrower queries for exhaustive coverage.
Will I get charged for failed queries? No. You pay per lead record pushed, after the push. Blocked, empty, or errored queries push nothing and cost nothing.
Pricing
Pay-per-result: $0.0069 per lead record — Google Maps place data plus website email harvesting plus MX email verification, all in one flat rate, no add-on fees. You pay only for lead records actually delivered to your dataset.
Integrations
- n8n / Make / Zapier — trigger a run or pipe every new lead into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your CRM) with no code: n8n, Make, Zapier.
- Webhooks — fire your endpoint the moment a run finishes (docs).
- MCP server — expose this actor as a tool to Claude, Cursor, or any MCP client so an AI agent can pull leads mid-conversation (guide).
- API & SDKs — fetch the dataset as JSON, CSV, or Excel via the Apify REST API or the Python / JS SDKs.
See all Apify integrations.
Not affiliated with Google
This actor is not affiliated with, endorsed by, or sponsored by Google LLC. Google Maps and Google are trademarks of Google LLC. Scrape responsibly and in compliance with applicable laws and terms.
More scrapers from our toolkit
Building a data pipeline? These actors pair well with this one — each runs on your own Apify account with the same pay-per-result pricing, no subscription:
- Google Maps Scraper
- Hiring Signal Monitor
- Linkedin Profile Scraper
- PagesJaunes Directory Scraper
- Skip Trace People Finder
- Trustpilot Reviews Scraper
Chain any of them together from the Integrations tab (the Run succeeded trigger) to build a multi-step workflow — one actor's output feeds the next.
Usage statistics
This Actor creates a small, content-free summary at the end of each run. It is used only to monitor reliability and improve this Actor. A copy is saved as USAGE_STATS in your own Apify key-value store, so you can see the exact record created for your run.
Set disableUsageStats to true in the input to opt out. Nothing is sent then; your USAGE_STATS record only says that statistics were disabled.
Only these fields are recorded:
- schema version, Actor name and build number;
- UTC start and finish hour (not a precise timestamp);
- run duration, number of results and time to the first result, each as a coarse range;
- whether the result was empty, the end status, and an error type from a fixed list;
- memory setting and counts of charged events;
- names of the input fields you set, never their values;
- the selected option for input fields that offer a fixed list of choices (for example a sort order).
We do not collect input text, search terms, URLs, domains, usernames, email addresses, names, proxy credentials, tokens, scraped records, output items, raw error messages, stack traces, or hashes of any of those values. Records are kept for no longer than 13 months, used only as aggregated operational statistics, and never sold or shared.
Additional fields (Phase 2)
This Actor also records your Apify user ID, whether Apify marks the account as paying, the size range of list inputs, the selected country when the input offers a fixed list of countries, and one category from a fixed Actor taxonomy. We use these fields only for aggregate reliability, repeat-use and cross-Actor analysis; reports suppress any cell with fewer than five distinct users.
The same disableUsageStats: true input flag turns these fields off too. The user ID is removed after 13 months; we do not export, sell, share, or attempt to re-identify this data.
Run-outcome signals (v2)
To learn whether a run did what it was asked to do, the record also holds a few more coarse ranges and yes/no flags. None of them contains content:
- the result limit you asked for (a range, when the input has one) and what share of it was delivered;
- results delivered per input item you listed (a range);
- output quality as ranges: how fully the result fields were filled, the share of rows that look like errors, the share of duplicate rows, and how many different fields appeared. These are counted in memory while results are saved; no result content is kept;
- how the run was started (console, API, schedule, webhook, another Actor);
- how it ended: stopped by you, timed out, reached the requested limit, stopped by the charge limit, and how many times the platform moved the run;
- if this Actor reports it: how many items to process worked or failed (ranges) and one failure reason from a fixed list;
- a short code made from the names of the input fields you set, never their values.
Repeat-run fingerprint (v2)
When your Apify user ID is recorded (see above), the record also holds an 8-character one-way code made from your input (proxy settings left out) and this Actor's name. It only lets us see that the same account ran the same input again soon after an unsatisfying run; we never see the input itself. It is stored only in the database, never published, and reports use it in aggregate with the same five-user minimum. It is the one exception to the statement above that no hashes are collected, and disableUsageStats: true turns it off.