Google Maps Business Lead & Email Finder
Find business leads on Google Maps by category, keyword, or location and collect name, address, phone, website, rating, review count, and coordinates. Optionally adds emails and social links found on each business's own website.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Search Google Maps, look up specific places, or enrich a list of websites you already have. |
searchQueries | array | optional | Natural-language searches such as 'coffee shops in Austin TX'. Include the place in each phrase, or use the location field below. |
locationQuery | string | optional | Adds a shared location to every search phrase, for example 'Austin, TX, USA'. Leave empty when your phrases already name the place. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Search Google Maps, look up specific places, or enrich a list of websites you already have. |
searchQueries | array | optional | Natural-language searches such as 'coffee shops in Austin TX'. Include the place in each phrase, or use the location field below. |
locationQuery | string | optional | Adds a shared location to every search phrase, for example 'Austin, TX, USA'. Leave empty when your phrases already name the place. |
category | string | optional | Business category such as bakery, dentist or plumber. Used when keyword and search phrases are empty. |
keyword | string | optional | Custom search term such as 'boutique coffee' or 'pet grooming'. Takes priority over category. |
state | string | optional | US state for the search. Choose 'All' for nationwide. Ignored for non-US countries. |
country | string | optional | Country for the search. Other countries can be named directly in a search phrase. |
websites | array | optional | Websites to read for contact details, one per line. Bare domains such as example.com are accepted. |
placeUrls | array | optional | Google Maps place links copied from the address bar or a previous export. |
placeIds | array | optional | Canonical Google Place IDs starting with 'ChIJ'. |
max_results | integer | optional | Maximum number of leads to save. Google returns a ranked window of roughly 150-220 businesses per search phrase, so a larger request may end when that window ends. |
minRating | number | optional | Keep only businesses rated at least this value (1.0-5.0). Leave empty for any rating. |
extractEmails | boolean | optional | Visit each business website for public emails, phone numbers and social profiles. Turn off for a faster Maps-only run. |
maxEmailsPerWebsite | integer | optional | Maximum email addresses to keep for one business website. |
maxContactPagesPerWebsite | integer | optional | Homepage plus contact, about, legal, privacy or careers pages to read. More pages find more contacts but take longer. |
onlySaveResults | string | optional | Save every business, only businesses with an email, or only businesses with any contact detail. |
categoryFilter | array | optional | Keep places whose Google Maps category contains all words of at least one entry. Leave empty for no category filter. |
websiteFilter | string | optional | Keep all places, only places with a website, or only places without one. |
skipClosedPlaces | boolean | optional | Check Google's public status and leave out permanently or temporarily closed places. |
language | string | optional | Language of the Google Maps interface and listing text. |
Download the published input schema
View complete JSON
{
"description": "Find local businesses on Google Maps and read their own websites for emails, phone numbers and social profiles.",
"properties": {
"category": {
"default": "bakery",
"description": "Business category such as bakery, dentist or plumber. Used when keyword and search phrases are empty.",
"editor": "textfield",
"prefill": "bakery",
"title": "Category",
"type": "string"
},
"categoryFilter": {
"description": "Keep places whose Google Maps category contains all words of at least one entry. Leave empty for no category filter.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "Category filter words",
"type": "array"
},
"country": {
"default": "US",
"description": "Country for the search. Other countries can be named directly in a search phrase.",
"editor": "select",
"enum": [
"US",
"GB",
"CA",
"AU",
"DE",
"FR",
"IN",
"BR",
"MX",
"JP",
"KR",
"CN",
"AE",
"SG"
],
"enumTitles": [
"United States",
"United Kingdom",
"Canada",
"Australia",
"Germany",
"France",
"India",
"Brazil",
"Mexico",
"Japan",
"South Korea",
"China",
"United Arab Emirates",
"Singapore"
],
"prefill": "US",
"title": "Country",
"type": "string"
},
"extractEmails": {
"default": true,
"description": "Visit each business website for public emails, phone numbers and social profiles. Turn off for a faster Maps-only run.",
"prefill": true,
"sectionCaption": "Contact extraction",
"title": "Find emails and social profiles",
"type": "boolean"
},
"keyword": {
"description": "Custom search term such as 'boutique coffee' or 'pet grooming'. Takes priority over category.",
"editor": "textfield",
"title": "Keyword (overrides category)",
"type": "string"
},
"language": {
"default": "en",
"description": "Language of the Google Maps interface and listing text.",
"editor": "select",
"enum": [
"en",
"af",
"az",
"id",
"ms",
"bs",
"ca",
"cs",
"da",
"de",
"et",
"es",
"es-419",
"eu",
"fil",
"fr",
"gl",
"hr",
"zu",
"is",
"it",
"sw",
"lv",
"lt",
"hu",
"nl",
"no",
"uz",
"pl",
"pt-BR",
"pt-PT",
"ro",
"sq",
"sk",
"sl",
"fi",
"sv",
"vi",
"tr",
"el",
"bg",
"ky",
"kk",
"mk",
"mn",
"ru",
"sr",
"uk",
"ka",
"hy",
"iw",
"ur",
"ar",
"fa",
"am",
"ne",
"hi",
"mr",
"bn",
"pa",
"gu",
"ta",
"te",
"kn",
"ml",
"si",
"th",
"lo",
"my",
"km",
"ko",
"ja",
"zh-CN",
"zh-TW",
"zh",
"pt"
],
"enumTitles": [
"English",
"Afrikaans",
"azərbaycan",
"Bahasa Indonesia",
"Bahasa Melayu",
"bosanski",
"català",
"Čeština",
"Dansk",
"Deutsch",
"eesti",
"Español",
"Español (Latinoamérica)",
"euskara",
"Filipino",
"Français",
"galego",
"Hrvatski",
"isiZulu",
"íslenska",
"Italiano",
"Kiswahili",
"latviešu",
"lietuvių",
"magyar",
"Nederlands",
"norsk",
"oʻzbekcha",
"polski",
"Português (Brasil)",
"Português (Portugal)",
"română",
"shqip",
"Slovenčina",
"slovenščina",
"Suomi",
"Svenska",
"Tiếng Việt",
"Türkçe",
"Ελληνικά",
"български",
"кыргызча",
"қазақ тілі",
"македонски",
"монгол",
"Русский",
"српски",
"Українська",
"ქართული",
"հայերեն",
"עברית",
"اردو",
"العربية",
"فارسی",
"አማርኛ",
"नेपाली",
"हिन्दी",
"मराठी",
"বাংলা",
"ਪੰਜਾਬੀ",
"ગુજરાતી",
"தமிழ்",
"తెలుగు",
"ಕನ್ನಡ",
"മലയാളം",
"සිංහල",
"ไทย",
"ລາວ",
"ဗမာ",
"ខ្មែរ",
"한국어",
"日本語",
"简体中文",
"繁體中文",
"中文 (Chinese)",
"Português"
],
"prefill": "en",
"title": "Language",
"type": "string"
},
"locationQuery": {
"description": "Adds a shared location to every search phrase, for example 'Austin, TX, USA'. Leave empty when your phrases already name the place.",
"editor": "textfield",
"prefill": "",
"title": "Location (optional)",
"type": "string"
},
"maxContactPagesPerWebsite": {
"default": 3,
"description": "Homepage plus contact, about, legal, privacy or careers pages to read. More pages find more contacts but take longer.",
"maximum": 10,
"minimum": 1,
"prefill": 2,
"sectionCaption": "Filters and results",
"title": "Pages checked per website",
"type": "integer"
},
"maxEmailsPerWebsite": {
"default": 5,
"description": "Maximum email addresses to keep for one business website.",
"maximum": 20,
"minimum": 1,
"prefill": 3,
"title": "Emails per website",
"type": "integer"
},
"max_results": {
"default": 100,
"description": "Maximum number of leads to save. Google returns a ranked window of roughly 150-220 businesses per search phrase, so a larger request may end when that window ends.",
"maximum": 100000,
"minimum": 1,
"prefill": 3,
"sectionCaption": "Limits and language",
"title": "Maximum leads",
"type": "integer"
},
"minRating": {
"description": "Keep only businesses rated at least this value (1.0-5.0). Leave empty for any rating.",
"maximum": 5,
"minimum": 1,
"title": "Minimum rating",
"type": "number"
},
"mode": {
"default": "searchPlaces",
"description": "Search Google Maps, look up specific places, or enrich a list of websites you already have.",
"editor": "select",
"enum": [
"searchPlaces",
"specificPlaces",
"enrichWebsites"
],
"enumTitles": [
"Search Google Maps for businesses",
"Look up specific Google Maps places",
"Get contacts from a list of websites"
],
"prefill": "searchPlaces",
"sectionCaption": "How to find businesses",
"title": "What do you want to do?",
"type": "string"
},
"onlySaveResults": {
"default": "allPlaces",
"description": "Save every business, only businesses with an email, or only businesses with any contact detail.",
"editor": "select",
"enum": [
"allPlaces",
"onlyWithEmails",
"onlyWithContacts"
],
"enumTitles": [
"All matching businesses",
"Only businesses with an email",
"Only businesses with any contact detail"
],
"prefill": "allPlaces",
"title": "Which places to save",
"type": "string"
},
"placeIds": {
"description": "Canonical Google Place IDs starting with 'ChIJ'.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "Google Place IDs",
"type": "array"
},
"placeUrls": {
"description": "Google Maps place links copied from the address bar or a previous export.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"sectionCaption": "Look up specific places",
"sectionDescription": "Used when the selected mode is 'Look up specific Google Maps places'. Provide links, Place IDs, or both.",
"title": "Google Maps place URLs",
"type": "array"
},
"searchQueries": {
"description": "Natural-language searches such as 'coffee shops in Austin TX'. Include the place in each phrase, or use the location field below.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"sectionCaption": "Search Google Maps",
"sectionDescription": "Used when the selected mode is 'Search Google Maps for businesses'.",
"title": "Search phrases",
"type": "array"
},
"skipClosedPlaces": {
"default": false,
"description": "Check Google's public status and leave out permanently or temporarily closed places.",
"prefill": false,
"title": "Skip closed places",
"type": "boolean"
},
"state": {
"default": "All",
"description": "US state for the search. Choose 'All' for nationwide. Ignored for non-US countries.",
"editor": "select",
"enum": [
"All",
"AL",
"AK",
"AZ",
"AR",
"CA",
"CO",
"CT",
"DE",
"FL",
"GA",
"HI",
"ID",
"IL",
"IN",
"IA",
"KS",
"KY",
"LA",
"ME",
"MD",
"MA",
"MI",
"MN",
"MS",
"MO",
"MT",
"NE",
"NV",
"NH",
"NJ",
"NM",
"NY",
"NC",
"ND",
"OH",
"OK",
"OR",
"PA",
"RI",
"SC",
"SD",
"TN",
"TX",
"UT",
"VT",
"VA",
"WA",
"WV",
"WI",
"WY"
],
"enumTitles": [
"All (nationwide)",
"Alabama",
"Alaska",
"Arizona",
"Arkansas",
"California",
"Colorado",
"Connecticut",
"Delaware",
"Florida",
"Georgia",
"Hawaii",
"Idaho",
"Illinois",
"Indiana",
"Iowa",
"Kansas",
"Kentucky",
"Louisiana",
"Maine",
"Maryland",
"Massachusetts",
"Michigan",
"Minnesota",
"Mississippi",
"Missouri",
"Montana",
"Nebraska",
"Nevada",
"New Hampshire",
"New Jersey",
"New Mexico",
"New York",
"North Carolina",
"North Dakota",
"Ohio",
"Oklahoma",
"Oregon",
"Pennsylvania",
"Rhode Island",
"South Carolina",
"South Dakota",
"Tennessee",
"Texas",
"Utah",
"Vermont",
"Virginia",
"Washington",
"West Virginia",
"Wisconsin",
"Wyoming"
],
"prefill": "CA",
"title": "US state",
"type": "string"
},
"websiteFilter": {
"default": "allPlaces",
"description": "Keep all places, only places with a website, or only places without one.",
"editor": "select",
"enum": [
"allPlaces",
"withWebsite",
"withoutWebsite"
],
"enumTitles": [
"All places",
"Only places with a website",
"Only places without a website"
],
"prefill": "allPlaces",
"title": "Website filter",
"type": "string"
},
"websites": {
"description": "Websites to read for contact details, one per line. Bare domains such as example.com are accepted.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"sectionCaption": "Enrich a list of websites",
"sectionDescription": "Used when the selected mode is 'Get contacts from a list of websites'.",
"title": "Business websites",
"type": "array"
}
},
"required": [],
"schemaVersion": 1,
"title": "Google Maps Business Leads Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
results | string | optional | One row per business with Maps listing data, website contact details, email provenance and social profiles. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Dataset of Google Maps business leads with contact details, website emails (source and MX-checked), extra phones, and social profiles.",
"properties": {
"results": {
"description": "One row per business with Maps listing data, website contact details, email provenance and social profiles.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Business Leads",
"type": "string"
}
},
"title": "Google Maps Business Lead & Email Finder Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"city": {
"format": "text",
"label": "City"
},
"contactPageUrl": {
"format": "link",
"label": "Contact page"
},
"country": {
"format": "text",
"label": "Country"
},
"countryCode": {
"format": "text",
"label": "Country code"
},
"email": {
"format": "text",
"label": "Email"
},
"emailProvenance": {
"format": "text",
"label": "Email sources"
},
"emails": {
"format": "text",
"label": "Emails"
},
"emailsMxValid": {
"format": "text",
"label": "MX-valid emails"
},
"facebook": {
"format": "link",
"label": "Facebook"
},
"featureId": {
"format": "text",
"label": "Feature ID"
},
"googleBusinessCategories": {
"format": "text",
"label": "Categories"
},
"googleMapsUrl": {
"format": "link",
"label": "Google Maps"
},
"instagram": {
"format": "link",
"label": "Instagram"
},
"linkedin": {
"format": "link",
"label": "LinkedIn"
},
"location": {
"format": "text",
"label": "Coordinates"
},
"name": {
"format": "text",
"label": "Business"
},
"phoneNumber": {
"format": "text",
"label": "Phone"
},
"pinterest": {
"format": "link",
"label": "Pinterest"
},
"placeId": {
"format": "text",
"label": "Place ID"
},
"plusCode": {
"format": "text",
"label": "Plus Code"
},
"priceLevel": {
"format": "text",
"label": "Price level"
},
"recordType": {
"format": "text",
"label": "Record type"
},
"reviewScore": {
"format": "number",
"label": "Rating"
},
"reviewsNumber": {
"format": "number",
"label": "Reviews"
},
"scrapedAt": {
"format": "text",
"label": "Scraped at"
},
"sourceUrl": {
"format": "link",
"label": "Source URL"
},
"state": {
"format": "text",
"label": "State / region"
},
"street": {
"format": "text",
"label": "Street"
},
"telegram": {
"format": "link",
"label": "Telegram"
},
"threads": {
"format": "link",
"label": "Threads"
},
"tiktok": {
"format": "link",
"label": "TikTok"
},
"twitter": {
"format": "link",
"label": "X / Twitter"
},
"url": {
"format": "link",
"label": "Website"
},
"websitePagesCrawled": {
"format": "number",
"label": "Website pages crawled"
},
"websitePhones": {
"format": "text",
"label": "Website phones"
},
"websiteType": {
"format": "text",
"label": "Website type"
},
"whatsapp": {
"format": "link",
"label": "WhatsApp"
},
"youtube": {
"format": "link",
"label": "YouTube"
},
"zip": {
"format": "text",
"label": "Postal code"
}
}
},
"title": "Business Leads",
"transformation": {
"fields": [
"recordType",
"name",
"googleBusinessCategories",
"street",
"city",
"state",
"zip",
"country",
"countryCode",
"phoneNumber",
"url",
"email",
"emails",
"reviewScore",
"reviewsNumber",
"placeId",
"featureId",
"googleMapsUrl",
"priceLevel",
"plusCode",
"location",
"facebook",
"instagram",
"linkedin",
"twitter",
"youtube",
"tiktok",
"websitePhones",
"contactPageUrl",
"websitePagesCrawled",
"scrapedAt",
"sourceUrl",
"emailsMxValid",
"emailProvenance",
"pinterest",
"threads",
"whatsapp",
"telegram",
"websiteType"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Google Maps Business Lead & Email Finder
Build a local prospecting list without a Google account, browser cookie or developer key. The actor searches Google Maps for the businesses you describe, then visits each business's own public website to collect the email addresses, extra phone numbers and social profiles that the business publishes.
Three ways to use it
- Search Maps by category or phrase. One row per business with its listing details and Google Maps link.
- Look up places you already have. Paste Google Maps place links or Place IDs.
- Enrich a website list. Bring your own domains and skip the Maps search entirely.
What you get
Each lead carries the business name, Google Maps categories, a split address, phone, website, rating, review count, Place ID, coordinates and a clean Google Maps URL. With contact extraction on, the row also carries emails found on the business's website, an MX-checked subset, the source page for each email, additional website phone numbers and up to ten social profiles.
Maps itself has no email field. An address is only reported when the business publishes it on its own site, and every missing field is left out rather than guessed.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
select | searchPlaces |
Search Maps, look up specific places, or enrich websites |
searchQueries |
string[] | – | Phrases for Maps, such as roofers in Dallas TX |
locationQuery |
string | – | Shared location appended to each phrase |
category |
string | bakery |
Category used when keyword and phrases are empty |
keyword |
string | – | Custom term that takes priority over category |
state |
select | All |
US state, or All for nationwide |
country |
select | US |
Country for the search |
websites |
string[] | – | Domains for website mode; bare domains are accepted |
placeUrls |
string[] | – | Google Maps place links for specific-place mode |
placeIds |
string[] | – | Place IDs starting with ChIJ |
max_results |
integer | 100 |
Total lead cap (1–100,000) |
minRating |
number | – | Keep places rated at least this value (1.0–5.0) |
extractEmails |
boolean | true |
Read business websites for contact details |
maxEmailsPerWebsite |
integer | 5 |
Email cap per business website |
maxContactPagesPerWebsite |
integer | 3 |
Homepage plus contact/about/legal/privacy pages |
onlySaveResults |
select | allPlaces |
All places, only with an email, or only with contacts |
categoryFilter |
string[] | – | Keep categories containing all words of any entry |
websiteFilter |
select | allPlaces |
All places, with a website, or without one |
skipClosedPlaces |
boolean | false |
Leave out permanently or temporarily closed places |
language |
select | en |
Maps interface language (74 options plus two legacy codes) |
Examples
{"mode":"searchPlaces","searchQueries":["bakeries in London"],"max_results":50,"extractEmails":true}
{"mode":"specificPlaces","placeIds":["ChIJ…"],"extractEmails":true}
{"mode":"enrichWebsites","websites":["example-bakery.com","example-dentist.de"]}
Output
- Listing:
name,googleBusinessCategories,street,city,state,zip,country,countryCode,phoneNumber,url,reviewScore,reviewsNumber,placeId,featureId,googleMapsUrl,priceLevel,plusCode,location,websiteType. - Contacts:
email,emails,emailsMxValid,emailProvenance,websitePhones,contactPageUrl,websitePagesCrawled,facebook,instagram,linkedin,twitter,youtube,tiktok,pinterest,threads,whatsapp,telegram. - Context:
recordType,sourceUrl,scrapedAt.
emailProvenance names the signal and the page that supplied each address. websiteType marks social-profile and directory links so a platform page is never treated as the business's own site.
How many emails should I expect?
In a 128-business sample across Austin, London, Berlin and Paris, 74% published an email within the homepage plus two contact pages; reading deeper pages lifted the measured rate to 77% of businesses with a website. About 76% of the businesses with a website had at least one MX-valid address (98% of the email-bearing sites in the sample). European businesses often publish a legally required Impressum page, which helps those markets; sites that only offer a contact form, hide their address in JavaScript, or block automated visits cannot yield one. Treat 66–77% as a realistic range, not a promise for every market.
Limitations
- A single Maps phrase exposes a ranked window of roughly 150–220 businesses. Run several related phrases, or split by area, to widen coverage; duplicates are removed by Place ID.
- Some websites publish no email, use a contact form only, or block automated access. Those rows keep their Maps details and simply omit website contacts.
priceLevelis rarely exposed by Google's public listing data and is omitted rather than invented.plusCodeis the code computed from the coordinates; Google's optional locality label is not appended.emailsMxValidconfirms that the address domain publishes an MX record. It cannot prove that a person reads the inbox or detect a catch-all mailbox.- Closed-place checks use Google's public status. A place whose status cannot be read is kept.
FAQ
Do I need an API key, cookies or a proxy? No. Searches and business websites are read from public pages. You do not configure a connection.
Why is a row missing an email?
Not every business has a website, and not every website publishes an address. Some use a contact form or a booking widget. The row is still a valid lead unless you choose onlySaveResults: "onlyWithEmails"; that filter keeps the matching rows among the places fetched up to your lead cap.
What does emailsMxValid mean?
It is the part of emails whose domain had an MX record when the run executed. An address is kept in emails even when DNS has no answer; it is simply not listed as MX-valid.
What is emailProvenance?
A small list that pairs each email with its signal (mailto, jsonLd, cloudflare, text, obfuscated or raw) and the page where it was found.
Can I use the actor without Google Maps?
Yes. Choose enrichWebsites and paste the domains. Each row is keyed to the website you supplied.
Does it find owner or decision-maker emails? No. It reports public business contact details; personal or executive addresses are not inferred.
Use public data lawfully and in line with Google's terms. This actor is not affiliated with Google.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build wdMPBcMnl2mFScdCG. Documentation is regenerated from the default published build; private drafts are not included.