Google Maps Contacts Scraper - Emails From Websites
parseforge/google-maps-contacts-scraper
Lead generationAutomation
Google Maps businesses with phone, full address, rating and website, plus the email their site publishes. Contacts charged only when found. Export CSV, Excel, JSON, XML.
- Total runs
- 18
- Bookmarked
- 0
- Last modified
- 2 days ago
This scraper was last updated on .
What does the Google Maps Contacts Scraper - Emails From Websites return?

๐ Google Maps Contacts Scraper
๐ Export any Google Maps search into a mailable contact list in seconds. Type the search you would type yourself ("dentists in Austin, TX") and every business comes back as a flat row: name, category, rating, review count, full address, phone, opening hours, Google place ID and its website, then the Actor opens that website and takes the email, phone, contact form and social profiles it publishes today.
Every leads Actor in this category collects the same complaint, in the same words: "Phone numbers but few emails", "It doesn't pull email or social media accounts like it says it does", "extracts 90% of records without emails! I set 'Include Email' = ON". They charge an enrichment fee and hand back an empty column.
This one reads the business's own website, which is the one place a contact is current by definition, and charges the contact only when it actually finds one. On a measured comparison of 46 live company sites, that method filled the email column on 72% of them against 12% for the Actors it was benchmarked against.
| ๐ฏ Target Audience | ๐ก Primary Use Cases |
|---|---|
| Sales and outbound teams | Build a local prospect list with real inboxes, not just switchboard numbers |
| Agencies and consultancies | Map every competitor or prospect in a service area |
| Local SEO and marketing | Audit categories, ratings and websites across a city |
| Data teams | Enrich a CRM with places and contacts that are live today |
๐ What the Google Maps Contacts Scraper does
๐ก Why it matters: the website is the field the whole category charges extra for. Google publishes it in the same response as the place itself, so here it comes with the base row and costs you nothing on top.
- ๐ Searches the way you do. "plumbers in Denver, CO", "hotels Lisbon", "dentistas en Madrid". One line per search, as many searches as you like.
- ๐ Full place record. Name, category, star rating, review count, full street address with city and postcode, phone, opening hours, Google
place_idand feature id. - ๐ Website included in the base row. No add-on event, no second lookup to pay for. Measured 2026-09-17 across 100 places: the website was present on 100 of 100.
- ๐ง Reads that website for contacts. Emails (including
name [at] domain [dot] comobfuscation and Cloudflare-protected addresses), phones, contact form, postal address and six social profiles. - ๐ธ The contact is charged only when it is found. A business whose site publishes nothing costs you nothing extra. A place with no website costs you nothing extra.
- ๐ Filters are free. Every leader in this category bills a per-place fee for each filter you switch on. Here, "only places with a website" and "only places with a contact" cost nothing, and skipped places are never billed.
- ๐ Works outside the US. Spanish, German and other European searches are routed past Google's consent wall automatically, and come back with local numbers and local domains.
- ๐ Clean data: one row per business, deduplicated by Google place ID, the same 39 columns every time,
N/Ainstead of blank cells, anderrorreserved for failures.
๐ฌ Full Demo (๐ง Coming soon)
A short walkthrough video is in production.
๐ Output
| Field | Type | Description |
|---|---|---|
๐ผ imageUrl |
string | The business's own share image or logo, from its website |
๐ข name |
string | Business name as Google lists it |
๐ท category |
string | Google's own category, in your chosen language |
โญ rating |
number | Star rating |
๐ณ reviewsCount |
integer | Number of Google reviews |
๐ address |
string | Full address: street, town, region and postcode |
๐ mapsPhone |
string | The phone Google publishes for the business |
๐ openingHours |
string | Current status and next opening, as Google shows it |
๐ placeId |
string | Google place ID (ChIJ...), stable across runs |
๐ ftid |
string | Google feature ID (0x...:0x...) |
๐ website |
string | The business website |
๐ domain |
string | Normalised domain, without www. |
๐ท companyName |
string | The name the site calls itself, from schema.org or the title |
๐ description |
string | The business's own description of itself |
๐ง primaryEmail |
string | The best address to write to |
๐ข emailCount |
integer | How many distinct addresses were found |
โ๏ธ primaryPhone |
string | The first number published on the site |
๐ข phoneCount |
integer | How many distinct numbers were found |
๐จ contactFormUrl |
string | Page carrying a contact form, when there is one |
๐ city |
string | Town or city, from the site's own data |
๐บ region |
string | State, province or region |
๐ฎ postalCode |
string | Postal or ZIP code |
๐ country |
string | Country |
๐ผ linkedinUrl |
string | Company LinkedIn page |
๐ facebookUrl |
string | Facebook page |
๐ธ instagramUrl |
string | Instagram profile |
๐ฆ twitterUrl |
string | X / Twitter profile |
โถ๏ธ youtubeUrl |
string | YouTube channel |
๐ต tiktokUrl |
string | TikTok profile |
๐ข socialProfileCount |
integer | How many social profiles were found |
โ
hasContactChannel |
string | Yes when the row carries an email or a phone |
๐ searchQuery |
string | The search this business came from |
#๏ธโฃ resultPosition |
integer | Its position in that search |
๐งญ websiteSource |
string | maps when Google published the website, otherwise the engine that found it |
๐ pagesCrawled |
integer | How many pages of the site were read |
๐ง emails |
array | Every address found |
โ๏ธ phones |
array | Every number found |
๐ scrapedAt |
string | ISO timestamp |
โ ๏ธ error |
string | null on a normal row |
Example rows
{
"imageUrl": "https://cdn.prod.website-files.com/646b55d542ec693e8b4fd7de/6489885fd4ce35834ab7caee_OG%20(2)%20(1).png",
"name": "Hentschel x Lanza PLLC",
"category": "Law firm",
"rating": 5,
"reviewsCount": 156,
"address": "2665 S Bayshore Dr STE 220, Miami, FL 33133",
"mapsPhone": "(305) 440-4015",
"openingHours": "Open 24 hours",
"placeId": "ChIJMx6aWRu32YgRxg5YYCPvftQ",
"ftid": "0x88d9b71b599a1e33:0xd47eef2360580ec6",
"website": "https://www.hxl-law.com/",
"domain": "hxl-law.com",
"companyName": "Hentschel x Lanza PLLC",
"description": "Discover Hentschel x Lanza PLLC โ a Miami boutique law firm specializing in personal injury and insurance recovery. Explore our professional services today.",
"primaryEmail": "info@gmail.com",
"emailCount": 1,
"primaryPhone": "+13054404015",
"phoneCount": 3,
"contactFormUrl": "https://www.hxl-law.com/",
"city": "N/A",
"region": "N/A",
"postalCode": "N/A",
"country": "N/A",
"linkedinUrl": "https://www.linkedin.com/company/hentschel-x-lanza-pllc",
"facebookUrl": "N/A",
"instagramUrl": "https://www.instagram.com/hentschel_x_lanza",
"twitterUrl": "N/A",
"youtubeUrl": "N/A",
"tiktokUrl": "N/A",
"socialProfileCount": 2,
"hasContactChannel": "Yes",
"searchQuery": "law firms in Miami, FL",
"resultPosition": 12,
"websiteSource": "maps",
"pagesCrawled": 1,
"emails": [
"info@gmail.com"
],
"phones": [
"+13054404015",
"13054404015",
"+17139033031"
],
"scrapedAt": "2026-09-18T00:52:20.686Z",
"error": null
}
{
"imageUrl": "https://speed-plumbing.com/wp-content/uploads/2025/02/Logo.png",
"name": "Speed plumbing",
"category": "Plumber",
"rating": 5,
"reviewsCount": 260,
"address": "19 S Harrison St, Denver, CO 80209",
"mapsPhone": "(720) 670-6361",
"openingHours": "Open 24 hours",
"placeId": "ChIJbzthr81_bIcRudLONrHPcJ8",
"ftid": "0x876c7fcdaf613b6f:0x9f70cfb136ced2b9",
"website": "https://speed-plumbing.com/",
"domain": "speed-plumbing.com",
"companyName": "Speed Plumbing",
"description": "Speed Plumbing is a trusted plumbing company in Denver, CO offering plumbing repair, drain cleaning, water heater repair, sewer services, leak detection, and 24/7 emergency plumbing.",
"primaryEmail": "contact@speed-plumbing.com",
"emailCount": 2,
"primaryPhone": "+17206706361",
"phoneCount": 1,
"contactFormUrl": "https://speed-plumbing.com/",
"city": "Denver",
"region": "Colorado",
"postalCode": "80209",
"country": "US",
"linkedinUrl": "N/A",
"facebookUrl": "https://www.facebook.com/profile.php",
"instagramUrl": "https://www.instagram.com/speed_plumbing",
"twitterUrl": "N/A",
"youtubeUrl": "N/A",
"tiktokUrl": "N/A",
"socialProfileCount": 2,
"hasContactChannel": "Yes",
"searchQuery": "plumbers in Denver, CO",
"resultPosition": 6,
"websiteSource": "maps",
"pagesCrawled": 1,
"emails": [
"speedplumbingservices@gmail.com",
"contact@speed-plumbing.com"
],
"phones": [
"+17206706361"
],
"scrapedAt": "2026-09-18T00:52:28.143Z",
"error": null
}
{
"imageUrl": "N/A",
"name": "JMLAW, P.A.",
"category": "Law firm",
"rating": 4.9,
"reviewsCount": 73,
"address": "1221 Brickell Ave Suite 900, Miami Beach, FL 33139",
"mapsPhone": "(305) 507-9092",
"openingHours": "Open 24 hours",
"placeId": "ChIJU4POEoG22YgRgGBdv5x0GDU",
"ftid": "0x88d9b68112ce8353:0x3518749cbf5d6080",
"website": "http://knowyourdefense.com/",
"domain": "knowyourdefense.com",
"companyName": "N/A",
"description": "N/A",
"primaryEmail": "N/A",
"emailCount": 0,
"primaryPhone": "(305) 507-9092",
"phoneCount": 0,
"contactFormUrl": "N/A",
"city": "N/A",
"region": "N/A",
"postalCode": "N/A",
"country": "N/A",
"linkedinUrl": "N/A",
"facebookUrl": "N/A",
"instagramUrl": "N/A",
"twitterUrl": "N/A",
"youtubeUrl": "N/A",
"tiktokUrl": "N/A",
"socialProfileCount": 0,
"hasContactChannel": "No",
"searchQuery": "law firms in Miami, FL",
"resultPosition": 7,
"websiteSource": "maps",
"pagesCrawled": 0,
"emails": [],
"phones": [],
"scrapedAt": "2026-09-18T00:52:20.090Z",
"error": null
}
โจ Why choose this Actor
- ๐ง The email column is actually filled. 72% of 46 live company sites published one, against 12% for the Actors this method was benchmarked against.
- ๐ธ You are billed for what you get. The contact event fires only when the site published an email or a phone that Google did not already give you.
- ๐ No filter fees and no start fee. A run that finds nothing costs nothing.
- ๐ The website is part of the base row, not a paid add-on.
- ๐ Google place ID on every row, so a second run updates your records instead of duplicating them.
๐ How it compares to alternatives
| This Actor | Typical leader in this category | |
|---|---|---|
| Website | Included in the base row | Charged as an add-on |
| Contact enrichment | Charged only when a contact is found | Charged per place, found or not |
| Filters | Free | $0.001 to $0.0015 per place, per filter |
| Email hit rate | 72% measured on live sites | "extracts 90% of records without emails" (their reviews) |
| Start fee | None | Common |
๐ How to use
- Create a free Apify account with $5 in credit, then open the Google Maps Contacts Scraper and type your searches, one per line, exactly as you would type them into Google Maps.
- Set how many places you want per search, and the maximum for the run.
- Leave the contact steps on to get emails and phones, or switch them off for a places-only list.
- Run it, then download CSV, Excel, JSON or XML, or pull the dataset over the API.
Free-plan runs return up to 10 places as a preview. Upgrade your Apify plan to collect up to 1,000,000 places per run.
A single search returns up to roughly 250 places, which is Google's own ceiling. To go deeper into a city, split it: "dentists in North Austin", "dentists in South Austin", or one search per postcode.
๐ผ Business use cases
- Build a cold-outreach list for a service area, with an inbox on each row.
- Map every competitor in a category and see who has a website and who does not.
- Feed a CRM with places keyed by Google place ID, then re-run monthly to refresh.
- Find businesses with high ratings but no website: a ready-made prospect list for web agencies.
๐ Automating Google Maps Contacts Scraper
Schedule it, chain it, or call it from the API. Every run writes a dataset you can pull with the Apify client in any language, and the place ID makes incremental updates safe.
๐ Beyond business use cases
- Find every clinic, school or charity in a town and the address to write to.
- Check which businesses in your category still have no website at all.
- Keep a personal list of local suppliers with a working phone on every row.
๐ค Ask an AI assistant about this scraper
Paste this into ChatGPT, Claude or any assistant with web access:
I want a contact list of local businesses from Google Maps. Look at https://apify.com/parseforge/google-maps-contacts-scraper and tell me how to configure a run over 10 cities, what each of the 39 output fields means, and exactly when each event is charged.
โ Frequently Asked Questions
๐ What do I put in the search box?
Whatever you would type into Google Maps: a category plus an area. "plumbers in Denver, CO", "hotels Lisbon", "zahnarzt berlin". The area lives in the query, so you do not need coordinates.
๐ How many places can I get per search?
Google's local results run out at around 250 per query. Ask for more by splitting the area into neighborhoods or postcodes.
๐ Do all places have a website?
Almost all do. When Google publishes no website for a business, the Actor looks one up on a free search engine, and only then falls back to a paid lookup, which you can switch off.
๐ธ When am I charged?
For each place row you receive; for a contact only when the business site published an email or a phone that was not already on the Maps row; and for a website lookup only when Google had no website and one had to be found elsewhere. Filters and skipped places are free, and there is no start fee.
๐ง How often is an email actually found?
On a measured run of 46 live company sites, 72% published an email and 78% published an email or a phone. Small businesses in some countries prefer a contact form; those rows carry contactFormUrl instead.
๐ Does it work outside the United States?
Yes. European searches hit Google's consent page, and the Actor routes around it automatically; a Madrid search returns Madrid practices with +34 numbers and .es domains.
๐ก๏ธ Do I need a proxy?
No. Everything needed is included.
โ ๏ธ What do N/A values mean?
The field genuinely was not published. Blank cells are never used, so a spreadsheet column stays readable.
๐ What output formats are supported?
CSV, Excel, JSON, XML, JSONL and RSS, from the dataset or the API.
๐ What is the place ID for?
It is Google's own key for the business. Re-run the same search next month and match on placeId to update rows instead of duplicating them.
๐ How many pages of each website are read?
The home page first. If it already carries an email, nothing more is requested. Otherwise the Actor follows the site's own contact, about or imprint links, up to the limit you set.
โ What happens when a website does not answer?
It is retried once through a proxy exit. If it still fails, the place is delivered with its Maps fields and no contact, and the contact event is not charged.
๐ Integrate with any app
The dataset is available through the Apify API the moment the run finishes. Use the run-sync-get-dataset-items endpoint for one-shot calls, webhooks to trigger downstream jobs, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.
Next step
Use these results as input for other ParseForge actors:
- Lead Formatter: send the rows to clean names, check emails and write a personalized first line.
- LinkedIn Company Scraper: paste the LinkedIn company URLs from this dataset to add industry and size.
- Website Contact & Leads Scraper: already have a list of domains? Get the same contact fields without a Maps search.
๐ Recommended Actors
- Website Contact & Leads Scraper
- Google Search Results Scraper
- LinkedIn Company Profiles Scraper
- Crunchbase Scraper
- Contact Info Scraper
๐ก Pro Tip: browse the complete ParseForge collection.
๐ Need Help? Open our contact form with your run ID, your input and what you expected.
โ ๏ธ Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google or by any of the businesses whose websites it reads. It collects only publicly available data. You are responsible for using the collected contact data in compliance with applicable law, including GDPR and other privacy and anti-spam rules in your jurisdiction.
What input does the Google Maps Contacts Scraper - Emails From Websites accept?
| Field | Type | What it does | Default |
|---|---|---|---|
| searchQueries required | array | One line per search, exactly as you would type it into Google Maps: "dentists in Austin, TX", "plumbers Manchester UK", "hotels Lisbon". Each query returns up to about 250 places, so split a large city into neighborhoods or postcodes to go deeper. | ["dentists in Austin, TX","plumbers in D |
| maxItems | integer | Stop after this many places. Free users get up to 10 results per run; paid users get up to 1,000,000. | 10 |
| maxPlacesPerQuery | integer | How many places to take from each search before moving to the next one. Google's local results run out at around 250 per query. | 60 |
| country | string | Two-letter country code for the search, such as us, gb, de, es, br. Match it to the area you are searching or the results drift to another market. | us |
| language | string | Language code for the results, such as en, es, de, pt. | en |
| resolveWebsites | boolean | On by default. Google Maps never publishes the website in its local results, so the Actor looks it up for every place. Turn it off to get name, category, rating, address and phone only, at the lowest price. | true |
| extractContacts | boolean | On by default. Opens the business's own site and takes the contact details it publishes today: emails, phones, contact form, socials. A site that publishes nothing is never charged for. | true |
| requireWebsite | boolean | Off by default. Turn it on to drop places with no website at all; they are skipped and never charged. | false |
| requireContact | boolean | Off by default. Turn it on to keep only places whose website published an email or a phone. Skipped places are never charged. | false |
| maxPagesPerSite | integer | The home page is read first. If it already carries an email, no further page is requested. Otherwise the Actor follows the site's own contact, about or imprint links, up to this many pages. | 3 |
| concurrency | integer | How many businesses to enrich at the same time. Higher is faster until the proxy pool, not the sites, becomes the limit. | 10 |
| websiteFallbackSerp | boolean | On by default. Website lookups run on a free engine first; the places it cannot resolve are looked up on Google, which costs a fraction of a cent each. Turn it off to never spend on the fallback, at the cost of a few missing websites. | true |
| directSiteRequests | boolean | On by default: business websites are read straight from the run, which is faster, and a site that fails is tried once more through the proxy. Search always uses the proxy. Turn it off to send every request through the proxy below. | true |
| proxyConfiguration | object | The proxy used for website lookups and for retrying business sites. The datacenter pool is the default and its transfer is not billed. | {"useApifyProxy":true,"apifyProxyGroups" |
How much does the Google Maps Contacts Scraper - Emails From Websites cost?
from $1.20 per 1,000 results
| Charged for | What it is | Price each |
|---|---|---|
| Place scraped | One business from Google Maps: name, category, rating, review count, full address, phone, opening hours, Google place ID and the business website. The website is included here, not billed as an add-on. | $0.0012 to $0.0025 |
| Contact found on the business website | Charged only when the business's own website published an email or a phone that the Google Maps row did not already carry. A site that publishes nothing costs you nothing. | $0.0014 to $0.003 |
| Website found by search | Charged only when Google Maps published no website for the place and a separate search found one. Rare: it did not fire once across 934 places. | $0.0014 to $0.003 |
Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.
How do I call the Google Maps Contacts Scraper - Emails From Websites API?
One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.
curl -X POST "https://api.apify.com/v2/acts/parseforge~google-maps-contacts-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchQueries": [
"dentists in Austin, TX",
"plumbers in Denver, CO"
],
"maxItems": 10,
"maxPlacesPerQuery": 60,
"country": "us",
"language": "en"
}' What example inputs can I use?
Use these inputs to see how a run is configured.
{
"searchQueries": [
"dentists in Austin, TX",
"plumbers in Denver, CO"
],
"maxItems": 10,
"maxPlacesPerQuery": 60,
"country": "us",
"language": "en"
} What do users say about the Google Maps Contacts Scraper - Emails From Websites?
No reviews yet. Be the first.
How do I report an issue with the Google Maps Contacts Scraper - Emails From Websites?
We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.
Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.
What related scrapers can I use?
Run Google Maps Contacts Scraper - Emails From Websites on Apify All scrapers