📇 Google Maps Contact Scraper avatar

📇 Google Maps Contact Scraper

Pricing

from $2.20 / 1,000 business processeds

Go to Apify Store
📇 Google Maps Contact Scraper

📇 Google Maps Contact Scraper

Turn any Google Maps search into a contact list. Emails, phones, websites and social profiles for every business, each with its source and confidence level.

Pricing

from $2.20 / 1,000 business processeds

Rating

0.0

(0)

Developer

Batuhan Bahadır

Batuhan Bahadır

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Find publicly available contact details for businesses listed on Google Maps. Give it a few search terms and a location, and it collects each business's name, Google Maps URL, website, phone, short address, and social profiles, then visits the business website to look for emails 📧, more phone numbers 📞, and social links 🔗 that the business has published online.

🔍 What it does

Unlike a general Maps data scraper, this Actor is focused on one job: contact discovery. It does not collect ratings, reviews, opening hours, popular times, photos, prices, or menus. What makes it different:

  • 🧾 Transparent provenance — every contact value carries its exact source page, extraction method, and a confidence level in contactSources.
  • 🕵️ Third-party detection — heuristics separate a business's own contacts from web-agency credits ("Designed by …"), site-builder platform addresses, and generic mailboxes (noreply@, webmaster@).
  • 🎯 Efficient crawling — stays on the business's own domain, visits only contact-relevant pages (contact, about, imprint, locations…), and skips blogs, shops, carts, and login pages.
  • 🔁 Deduplication — a business matched by several search terms becomes one record with all matched terms listed.
  • Fast Maps stage — the Google Maps step reads Google's own search response over plain HTTP instead of driving a headless browser. On an 8-term / 40-business benchmark this measured about 66% faster and about 57% cheaper per result than the browser-driven approach it replaces, with equal or better contact coverage. A browser is still used, automatically, whenever the fast path cannot answer.

👥 Who is this for

  • Sales & lead generation teams building targeted outreach lists for a niche and region.
  • Marketing agencies enriching local-business lists with emails, phones, and social profiles.
  • Researchers & analysts mapping the online presence of businesses in an area.
  • Business owners auditing what contact details they expose across Maps and their website.

📥 What you give it

Five fields, three of which you will actually touch.

FieldWhat it doesDefault
🔍Search termsThe words you would type into Google Maps — coffee shop, dentist, plumber. Add several to widen the list.
📍LocationOne area per run: a city, district, region or country.
💯Max businesses per search termHow many businesses to collect for each term.50
📄Max pages per websiteHow deep to look inside each business site, homepage included.5
🛡️ProxyAutomatic Apify Proxy is the cheapest and works out of the box.Automatic

🧪 Example input

{
"searchTerms": ["specialty coffee shop", "roastery"],
"location": "Portland, Oregon",
"maxPlacesPerSearch": 50,
"maxPagesPerWebsite": 5,
"proxyConfiguration": { "useApifyProxy": true }
}

📤 What you get back

One row per business, ready for your CRM. Download as JSON, CSV, Excel or HTML.

FieldWhat it holds
🏢businessNameBusiness name from the Google Maps profile
🗺️googleMapsUrlLink to the place page on Google Maps
🏷️matchedSearchTermsEvery search term this business matched
📍addressSingle-line address from Google Maps
🌐websiteWebsite listed on Google Maps
📞phonesPhone numbers, deduplicated, E.164 where possible
📧emailsEmail addresses found on the business website
🔗socialLinksFacebook, Instagram, LinkedIn, X, YouTube, TikTok, WhatsApp, Telegram
🔎contactSourcesWhere each value came from: page URL, extraction method, confidence
contactStatusfound · partial · none · not_attempted
🧭websiteCrawlStatussuccess · partial · failed · skipped_no_website · blocked_or_protected
🕒scrapedAtWhen the record was produced

🎚️ Confidence levels

LevelWhat earns it
🟢highmailto: / tel: links, JSON-LD or schema.org data on the business's own domain
🟡mediumMeta tags, de-obfuscated "at/dot" text, decoded HTML entities, or a provider-domain address
lowPlain-text matches, generic mailboxes, site-builder domains, web-agency credits

The emails, phones and socialLinks columns are built from 🟢 high and 🟡 medium sources. Everything else stays visible in contactSources.

🧾 Example record

{
"businessName": "Roseline Coffee Cafe & Roastery",
"googleMapsUrl": "https://www.google.com/maps/place/Roseline+Coffee...",
"matchedSearchTerms": ["specialty coffee shop"],
"address": "321 NE Davis St, Portland, OR 97232, United States",
"website": "http://roselinecoffee.com/",
"phones": ["+15038092890"],
"emails": [],
"socialLinks": {
"facebook": ["https://facebook.com/roselinecoffee"],
"instagram": ["https://instagram.com/roselinecoffee"],
"linkedin": [],
"twitter": ["https://twitter.com/roselinecoffee"],
"youtube": [], "tiktok": [], "whatsapp": [], "telegram": []
},
"contactSources": [
{
"type": "facebook",
"value": "https://facebook.com/roselinecoffee",
"foundOn": "website",
"sourceUrl": "https://roselinecoffee.com/",
"extractionMethod": "html_anchor_link",
"sourceDomain": "roselinecoffee.com",
"confidence": "high"
}
],
"contactStatus": "found",
"websiteCrawlStatus": "success",
"scrapedAt": "2026-07-31T20:56:17.011Z"
}

⚙️ How it works under the hood

  1. Google Maps stage — searches each term in your location and reads only the in-scope fields (name, Maps URL, website, phone, short address, social buttons) directly from Google's own search response, without driving a browser. Every response is checked for the fields it is supposed to carry; if Google changes its format, the Actor re-learns the request from a real browser session and retries, and falls back to full browser navigation if that does not resolve it.
  2. Website stage — crawls each business website Cheerio-first (fast, cheap), staying strictly on the same domain and visiting only priority pages up to your page budget. A page is re-rendered with a headless browser only when it is client-side rendered, nearly empty, or protected by a bot challenge.
  3. Extraction layers — mailto:/tel: links, JSON-LD, schema.org microdata, meta tags, "at/dot" de-obfuscation, HTML-entity decoding, plain-text regex, and social anchors — each tagged with its own method and confidence.

🚧 Errors

Websites that cannot be crawled (timeouts, 4xx/5xx responses, bot protection, DNS errors) are recorded in a separate, run-scoped errors dataset with businessName, googleMapsUrl, website, errorType, errorMessage, and timestamp. Each run writes to its own isolated errors dataset, so runs never mix results.

💰 Pricing

This Actor uses pay-per-event pricing — you pay for results, not for compute time:

One event, business-processed, charged once per unique business in the results — Maps profile read, deduplicated, and its website crawled when it has one. You pay the same whether or not that business turned out to have published contact details, because the work of checking is the same either way.

Your Apify planPrice per 1,000 businesses
Free / Starter$3.00
Scale$2.60
Business$2.20
Enterprise$1.60 – $1.05

Higher plans get progressively lower prices automatically — there is nothing to apply for.

That is the whole bill. Compute and proxy usage are covered by this Actor, not added to your invoice — the price per business is what you pay. For reference, a 1,000-business run finishes in about 30 minutes on the default settings.

To keep a first run small, start with a low maxPlacesPerSearch, check the output, then scale up. If you switch the proxy to RESIDENTIAL, note that it is only used for the Google Maps step.

💡 Tips to get more (and pay less)

  • The default automatic proxy is the most cost-effective; only switch to RESIDENTIAL if Google blocks the Maps stage (few or no results).
  • Lower maxPagesPerWebsite to reduce compute; the crawler already prioritizes contact-relevant pages.
  • The default memory (4 GB) is the sweet spot. The Actor scales its crawling concurrency to the memory a run is given, and 4 GB is where Apify grants a full CPU core. Lowering it makes large runs disproportionately slower, because the crawler throttles itself once the CPU is saturated.
  • Provide several related search terms to widen coverage; duplicate businesses are merged automatically.

📌 Notes

This Actor collects publicly available business contact details on a best-effort basis — what you get back is what each business has chosen to publish on Google Maps and its own website.

❓ FAQ, disclaimers & support

What does it collect? Only publicly available business contact information from Google Maps profiles and business websites. It does not collect ratings, reviews, opening hours, popular times, photos, prices, or menus.

How complete is the data? You get what each business has published on Google Maps and its own website — see Notes above.

Legal note. This Actor collects publicly available business contact details. You are responsible for using the data in compliance with applicable laws (including data-protection regulations such as the GDPR) and with Google's and the target websites' terms of service. This is not legal advice. Personal data should only be processed where you have a lawful basis to do so.

For questions or problems, use the Issues tab. Custom adjustments are possible on request.