Google Maps B2B Leads Scraper
Pricing
from $4.00 / 1,000 business leads
Google Maps B2B Leads Scraper
Find businesses by category and city on the first Google Maps results page. Get addresses, phones, websites and optional published company emails. Supports US/en and GB/en; pass known lead IDs to skip them without another charge.
Pricing
from $4.00 / 1,000 business leads
Rating
0.0
(0)
Developer
Vadim Bezrukov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get unique business rows for a category and territory, one per Google Maps location: name, category, address, phone, website, and optional emails copied from public company pages with the URL where they were found.
For a later batch, pass previously collected lead_id values in
excludeLeadIds to skip those businesses without another charge. Each search
reports its outcome in RUN_SUMMARY, including empty results, blocked requests
and the first-page limit. Supported locales are US/en and GB/en.
The first published version is described in the changelog.
This is an independent tool, not Google Places API or a Google-licensed product. Review the source-use limits below before collecting data.
30-second quickstart
- Keep the default input (Austin plumbers, 10 places, Maps fields only).
- Click Start.
- Wait for the run to finish. Unique business rows land in the Dataset; totals and per-search status land in
RUN_SUMMARY.
{"searches": [{"query": "plumbers","location": "Austin, Texas, United States","countryCode": "US","language": "en"}],"maxPlacesPerSearch": 10,"maxResults": 10,"contactMode": "none","maxPagesPerWebsite": 3,"excludeLeadIds": []}
contactMode defaults to none, so a run is two Maps HTTP requests per search, not a website crawl. Set contactMode to website when you want published emails from company pages.
Supported locales in this version: US/en and GB/en. Both were checked against the live first page on 2026-09-16 (Austin, Texas and Manchester, United Kingdom): names, phones, websites and structured addresses (US city, state and ZIP; UK city and postcode) parse for both. Other country or language combinations are rejected by the input schema.
This version returns the first Maps listing page for each search (about 20 listings when the page is full), so maxPlacesPerSearch stops at 20. It does not invent a continuation cursor. When the page is full and your limit was not reached, the search is PARTIAL with FIRST_PAGE_CAP and the run is PARTIAL; the rows you received are still charged normally.
Service-area businesses that Maps lists without a street address are not emitted in this version. They are counted per search as skipped_no_address in RUN_SUMMARY so you can see how much of the page they were (in the Manchester check, 10 of 20 listings).
Sample output (synthetic)
The following row is a synthetic fixture, not a live Maps response and not a real business.
{"schema_version": 1,"record_type": "BUSINESS","status": "SUCCESS","lead_id": "gm:place:fixture-place-001","source": "google_maps","source_id": "fixture-place-001","name": "Example Plumbing","primary_email": "office@plumbing.example.test","website_url": "https://plumbing.example.test/"}
Two billable results exist:
business-lead- one unique business row with valid Maps fields, no billable published email (orcontactMode=none).business-lead-with-email- the same business row when at least one organisation or location email with provenance is present. This replacesbusiness-leadfor that row. The two events are never added together.
Searches, website HTTP, retries, extra emails, duplicate rows and excluded lead IDs are not charged. Prices (platform usage included): $0.004 per business-lead, $0.006 per business-lead-with-email. Prefill ten Maps-only rows is about $0.04. See the Apify Pricing tab for current charges.
How emails are collected
When contactMode=website, the Actor fetches the website linked by the source, then a few contact/about/imprint pages on the same registrable domain. It copies mailto:, visible text and JSON-LD emails. It does not execute JavaScript, guess addresses from names, probe SMTP/MX, or scrape staff directories. Free-mailbox addresses (gmail.com, outlook.com, yahoo.com and similar) found on a company page are reported as UNCONFIRMED: they are not billed, not listed as primary_email, and the row carries the unconfirmed_emails_excluded warning.
NOT_FOUND_ON_VISITED_PAGES means no published email on the pages that were fetched. It does not mean the business has no email anywhere. JS_REQUIRED, BLOCKED and FAILED are different from a clean miss. A JS-only site stays incomplete; there is no Playwright fallback. When the run timeout is about to expire, the remaining businesses are still written as Maps rows with enrichment SKIPPED / RUNTIME_LIMIT (row status PARTIAL, charged as business-lead) instead of being dropped; the run ends PARTIAL with RUNTIME_LIMIT.
Deduplication and later runs
The same Maps location found in two searches is one business row and one billing event. Two branches of a chain are two rows even when they share a domain or phone. Pass previous lead_id values in excludeLeadIds to skip them. This Actor does not remember other users' runs or your last run unless you pass those ids.
A Monday morning schedule that reuses last week's ids:
{"cron": "0 8 * * 1","timezone": "America/Chicago"}
Webhook after a successful run (replace the URL):
{"eventTypes": ["ACTOR.RUN.SUCCEEDED"],"requestUrl": "https://example.com/webhooks/maps-leads"}
Schedules and webhooks are created in Console; this Actor does not create them by itself.
API / n8n / Make
- Start the Actor with the JSON input above.
- Wait for a terminal run status.
- Read
RUN_SUMMARYin the default key-value store (queries,emitted_rows,error_code). - If the run succeeded, fetch Dataset items.
NO_RESULTSmeans the search was checked and empty.SOURCE_FAILED/SOURCE_BLOCKEDmean Maps could not be checked.SOURCE_NOT_CONFIGUREDis reserved for a missing adapter, not an empty city.
Direct MCP entry (requires your own Apify authentication): https://mcp.apify.com?tools=automa-flow/google-maps-b2b-leads-scraper. Ask it to collect unique plumber locations in Austin, Texas, with optional website emails. MCP presence is not a tested authenticated agent run.
Limits and source use
- This Actor is not affiliated with Google and has no Google licence.
- Google Maps End User Additional Terms restrict bulk feeds, resale and competing listings databases. This Actor stays on the first listing page and does not paginate, but limiting a search to one page does not remove those restrictions. Check that your intended use is permitted.
- Default Dataset contains only business rows. Query failures and
skipped_no_addresscounts live inRUN_SUMMARY. NO_RESULTSis a verified empty search.SOURCE_FAILED/SOURCE_BLOCKEDmean the source could not be checked.- A 429 or HTML challenge is
SOURCE_BLOCKED, not “no plumbers”. - Public contact data is not consent to email marketing and is not a GDPR-compliance guarantee.
- Website crawls honour robots.txt of the company site, stay on-site, and block private/metadata IPs.