B2B Leads List Builder — Maps + Email + Phone Enrichment
Pricing
from $4.75 / 1,000 b2b leads
B2B Leads List Builder — Maps + Email + Phone Enrichment
Collect B2B leads from Google Maps and public business websites. Return flat records with company, website, email, phone, and address. Run with queries and Apify residential proxy; no target-site login. Free pricing: $0.0049 per enriched lead.
Pricing
from $4.75 / 1,000 b2b leads
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
20
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Features
Share
Google Maps B2B Leads Scraper
Scrape public Google Maps business listings and visit public business websites. Maps supplies company, phone, address, and industry; websites supply emails and social links. Output is flat B2B lead rows. Run it from your Apify account with no target-site login; it requires the Apify residential proxy, which is the default proxyConfiguration.
- Build SDR and outbound lists for an industry and city.
- Research local markets with categories, ratings, review counts, and contacts.
- Find recruiting or agency prospects with reachable business contacts.
- Export flat rows for CRM enrichment or sequencing workflows, using public source data only.
What you get
Each returned lead is one flat row. A field is null when its source does not provide a value.
| Field | Type | Description |
|---|---|---|
company_name | string | Google Maps business name; null when absent. |
website | string | Business website URL; null when unavailable. |
email | string | Best harvested email; null when none is found. With verifyEmails, selection uses MX verification. |
phone | string | Phone from the Google Maps place record only; null when Maps has no phone. |
address | string | Full place-record address; null when unavailable. |
city | string | City parsed from the address; null when it cannot be parsed. |
state | string | State or region parsed from the address; null when it cannot be parsed. |
country | string | Country code parsed from the address or taken from the selected country. |
industry | string | Primary Google Maps category; null when unavailable. |
maps_rating | number | Google Maps rating, normalized from 0 to 5; null when unusable. |
maps_review_count | integer | Google Maps review count; null when unusable. |
linkedin_url | string | LinkedIn profile found in website social links; null when absent. |
all_emails | array of strings | Distinct harvested emails; empty when none are found. |
email_status | string | valid, role, risky, invalid, found, or none. |
email_source | string | website_contact or website; null when no email is found. |
social_links | object | Recognized social profile URLs; empty when none are found. |
place_id | string | Encoded Google Maps place ID; null when unavailable. |
maps_url | string | Google Maps place link; null when unavailable. |
parse_confidence | number | Quality signal from 0 to 1; populated for each processed row. |
query | string | Search query that produced the lead. |
scraped_at | ISO 8601 string | UTC timestamp for the run. |
Website enrichment visits the homepage and, when needed, up to three additional high-yield contact pages. It extracts public emails and recognized social links, including common [at] and [dot] forms.
With the default requireContact setting, only rows with a company name and at least one email or phone are returned. Name-only listings are left out.
Sample output
The email and LinkedIn values are hidden to avoid exposing personal data.
{"company_name": "Blackhawk Digital Marketing","website": "https://www.blackhawkdm.com/","email": "<hidden for privacy>","phone": "(512) 736-0127","address": "410 Baylor St Unit b, Austin, TX 78703","city": "Austin", "state": "TX", "country": "US","industry": "Marketing agency", "maps_rating": 4.9, "maps_review_count": 62,"linkedin_url": "<hidden for privacy>","all_emails": ["<hidden for privacy>"],"email_status": "role", "email_source": "website_contact","social_links": {"linkedin": "<hidden for privacy>"},"place_id": "ChIJhxZPAgm1RIYRB2h0ieTUr1I","maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJhxZPAgm1RIYRB2h0ieTUr1I","parse_confidence": 1, "query": "marketing agencies in Austin TX","scraped_at": "2026-10-29T04:55:23.413448+00:00"}
Pricing
This Actor uses pay-per-event pricing. The primary event is b2b-lead: one enriched B2B lead.
The Actor also charges an apify-actor-start event once per GB of run memory, minimum one event.
| Plan | Actor Start | B2B lead |
|---|---|---|
| Free | $0.00005 | $0.0049 |
| Bronze | $0.0000495 | $0.004851 |
| Silver | $0.000049 | $0.004802 |
| Gold | $0.0000485 | $0.004753 |
| Platinum | $0.000048 | $0.004704 |
| Diamond | $0.0000475 | $0.004655 |
For example, 100 results = $0.49005 on Free, assuming one Actor Start event: 100 × $0.0049 on Free for B2B lead events, plus $0.00005 on Free for the start event.
At Free-plan rates, 1,000 b2b-lead events = $4.90 and 10,000 b2b-lead events = $49.00, before Actor Start events.
With requireContact: false, places without a contact are also pushed and charged as b2b-lead events.
You pay only for the events listed above. This Actor does not use the Pay per event + usage option, so run platform usage (compute, proxy traffic, and storage) is not billed separately.
How to use
- Enter one or more Google Maps search strings, usually combining an industry with a city.
- Configure the default Apify residential proxy in
proxyConfiguration. - Set
maxResults,requireContact,verifyEmails,language, andcountry. - Run the Actor to search Maps, enrich websites, collect contacts, and save flat rows.
- Review
email_status,parse_confidence, ratings, and review counts. - Repeat the run through Apify Schedules; weekly is a starting point for prospect-list refreshes.
{"queries": ["marketing agencies in Austin TX"],"proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]},"maxResults": 20,"requireContact": true,"verifyEmails": true,"language": "en", "country": "us"}
Input parameters
| Parameter | What it does | Default |
|---|---|---|
queries | Required list of Google Maps search strings, typically an industry and city. Non-paying (Free) accounts: only the first query is used. | Required |
proxyConfiguration | Apify proxy settings for Maps and website requests; residential access is required for Maps. | useApifyProxy: true, apifyProxyGroups: ["RESIDENTIAL"] |
maxResults | Maximum places processed per query; accepted values are 1–300 and pagination is automatic. Non-paying (Free) accounts: at most 5 places per run. | 20 |
requireContact | Returns only rows with an email or phone when enabled. Disable to include places without harvested contacts. | true |
verifyEmails | MX-verifies harvested emails and assigns verification statuses when enabled. | true |
language | Two-letter result-language code: en, es, fr, de, it, pt, ja, ko, or zh. | en |
country | Two-letter result-localization and default-country code: us, gb, ca, au, de, fr, es, it, jp, br, mx, or in. | us |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
| The account is not paying (Free) | Only the first query is run and maxResults is capped at 5 places; the log shows "Free run limits applied". Paying accounts are not limited this way. | Use a paying Apify account for more queries or more than 5 places. |
maxResults is below 1 or above 300 | The accepted range is 1–300 per query. | Use 1–300; split broad searches into narrower city, neighborhood, or subcategory queries. |
| One area has more places than Maps returns | Google itself caps a single area at roughly 120–300 places. | Split the search into narrower queries. |
| Datacenter proxy access is used for Maps | Google Maps can block datacenter IPs; the run can fail or return no usable results. | Use the Apify RESIDENTIAL group. GOOGLE_SERP does not support Maps URLs. |
| Proxy initialization fails | OUTPUT contains proxy_init_failed or no_proxy, and no places are processed. | Give the Actor access to the Apify residential proxy and keep the default configuration. |
| Google blocks a query or shows a consent wall | The Actor tries up to three residential-IP rotations. If still blocked, the query is skipped with result count zero; earlier rows remain. | Try a narrower query or run again with residential proxy configuration. |
| A Maps fetch fails for a query | That query has result count zero and processing continues; earlier rows remain. | Check query and proxy, then retry. |
| A query returns no places | No lead rows are saved for that query. | Check industry, city, country, and language; try a more specific string. |
| A place has no website or its website request fails | No website contacts are harvested. Website requests use a 20-second timeout and return empty contact lists on failure. | Use requireContact: false to include places without harvested contacts. |
| A website has no email address | The row may still contain a Maps phone; with requireContact: true, an email or phone is required. | Review phone, email_status, and all_emails. |
verifyEmails is disabled | Harvested addresses are returned without MX verification; a found address can have status found. | Enable it for MX-layer status fields. |
| MX verification reports a positive result | It indicates that the domain accepts mail, not that a specific mailbox exists. | Treat email_status as a screening signal, not a delivery guarantee. |
| Proxy authentication fails during a Maps fetch | OUTPUT contains proxy_auth_failed and the run stops; earlier rows remain. | Check your Apify proxy access or subscription, then rerun. |
| The input contains no usable query | OUTPUT contains {"error": "no_queries"} and no places are processed. | Provide at least one non-empty string in queries. |
| Public Google Maps listings and public business websites are used | See the legal FAQ below. | Review applicable law and source terms before using the output. |
FAQ
How much does it cost to scrape B2B leads?
See Pricing for every plan-labelled event rate.
Why is my result empty?
Possible causes include no Maps places, a skipped blocked query, no reachable contact while requireContact is enabled, or failed proxy initialization. Check the query and residential proxy, and try requireContact: false if you also need places without harvested contacts. For no_queries, proxy_init_failed, or no_proxy, inspect OUTPUT.
Why are some emails marked role, risky, invalid, or found?
With verification enabled, harvested addresses receive statuses such as valid, role, risky, or invalid. With verification disabled, an address can be found. MX verification is not a mailbox delivery guarantee.
Is it legal to scrape these public business contacts?
The Actor collects public data from Google Maps listings and public business websites. Legality depends on your use case, applicable law, and source terms or ToS; review them before using the output.
Related actors
- Google Maps Leads — related Google Maps business leads with email and phone enrichment.
- Yelp Business Leads — business leads with email and contact enrichment from Yelp.
- Europages B2B Directory — B2B supplier leads from the Europages directory.
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.