Google Maps B2B Leads & Contact Scraper
Pricing
from $3.00 / 1,000 results
Google Maps B2B Leads & Contact Scraper
Extract business leads from Google Maps including names, addresses, websites, phone numbers, ratings, direct emails, and social media profiles.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Richie C. Tungadi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Share
An Apify Actor that discovers businesses on Google Maps, opens their detail panels, and optionally visits their public websites for contact emails and social profiles.
Input
{"queries": ["Digital marketing agency Jakarta"],"maxResults": 20,"extractEmails": true,"language": "en","proxyConfiguration": {"useApifyProxy": true}}
queries: non-empty search strings; exact duplicate queries are removed.maxResults: 1–500 leads per query, default 20. This is a limit, not a guarantee.extractEmails: default true; checks the homepage and at most one same-host contact/about page. Email deliverability and ownership are not verified.language: defaulten. Card parsing recognizes English/Indonesian opening statuses and comma/dot decimal ratings. Other languages may leave fields empty.proxyConfiguration: default{"useApifyProxy": true}. Supports Apify proxy groups or custom proxy URLs. Set{"useApifyProxy": false}for a direct run. A requested proxy must initialize successfully; there is no silent direct fallback. The same configured proxy is used for browser and contact-site requests.
Output
The default dataset contains query, title, category, address, phone,
website, emails, socials, rating, reviewsCount, status, latitude,
longitude, and googleMapsUrl. Missing source fields may be null or absent.
Coordinates come from the business URL, never the map viewport center.
Apify can export the dataset as JSON/CSV/Excel. No CRM integration is included.
Per-lead detailError or contactErrors records incomplete extraction. The
RUN_SUMMARY key-value record contains totals and per-query outcomes. Failed
queries cause a failed run after other queries finish; already saved leads remain
available. Website failures preserve the business lead and show up in the summary.
An explicit no-results page is a completed query with zero leads. An unknown or
blocked page is a query failure, not a successful empty result.
Local development
Use Python 3.12+ and an isolated environment:
python -m venv .venv.\.venv\Scripts\python.exe -m pip install -r requirements.txt.\.venv\Scripts\python.exe -m playwright install chromium.\.venv\Scripts\python.exe -m unittest discover -s tests -v
To include browser integration fixtures, set $env:RUN_BROWSER_TESTS = "1"
and rerun the unittest command above. These fixtures use routed local HTML.
For a small direct smoke test, save the following as
storage/key_value_stores/default/INPUT.json:
{"queries":["Coffee shops Jakarta"],"maxResults":3,"extractEmails":false,"proxyConfiguration":{"useApifyProxy":false}}
Then run .\.venv\Scripts\python.exe -m src. Results are in local Apify storage.
For deployment, connect this repository in Apify Console and build the Actor.
The Docker image and Python Playwright package are both pinned to 1.60.0; update
both together. The Actor uses root Dockerfile/README auto-discovery.
Operational limits
This uses Google Maps DOM selectors, which can change. CAPTCHA/consent pages and regional layouts can prevent extraction; proxies do not guarantee access. Maps and website visits are sequential; contact requests run in a worker thread so Actor/browser events remain responsive. No high-volume throughput is promised. Data is deduplicated within each query by Maps URL; a business matching different queries may appear once for each query. There is no cross-run resume/deduplication. Website JavaScript is not rendered for contact discovery. Runtime input validation and regression tests do not replace a live Apify smoke test on your target region.