Google Maps Email & Contact Details Scraper avatar

Google Maps Email & Contact Details Scraper

Pricing

from $12.00 / 1,000 contact profiles

Go to Apify Store
Google Maps Email & Contact Details Scraper

Google Maps Email & Contact Details Scraper

Best public contact route for each company website or Google Maps lead: email, phone or contact form, each with its source page. Emails labelled role, person or freemail. Optional socials and booking routes. No guessing.

Pricing

from $12.00 / 1,000 contact profiles

Rating

0.0

(0)

Developer

Tom J

Tom J

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Categories

Share

Extract the best public contact details from company websites and Google Maps leads: an email address when a suitable one exists, otherwise a phone number or contact form, each with the page it was found on. Emails are labelled role, person or freemail; no guessing, no mailbox pinging. Use it right after a Google Maps scraper. From $2 per 1,000 websites checked + $12 per 1,000 contact profiles.

What you can do with it

  • Turn Google Maps leads into contactable leads: one contact route per company website, with its source page.
  • Find the right email for the purpose: sales, general or support address, never a support address for sales.
  • Keep GDPR checks easy: personal and freemail addresses and social links are flagged personal_data: true.
  • Spot booking and quote routes (optional): proven booking or quote pages, with evidence.
  • Track changes: pass an earlier snapshot to see whether the chosen email changed.

Use it after Google Maps Scraper

  1. Run a Google Maps scraper in your own Apify account.
  2. Pick that run's dataset in datasetId, or on the Maps scraper open Integrations → Add integration, choose this Actor and use {"datasetId": "{{resource.defaultDatasetId}}"}.
  3. You get one row per unique company website.

Only the website, name, city, postal code and country of each Maps row are read. Rows without an own website (Facebook pages, booking platforms, directories) are skipped and not charged; a website shared by several places is scanned and charged once.

How to extract contact details from websites in 3 steps

  1. Add websites in urls (1–500) or pick a dataset.
  2. Choose the purpose and scope: contactPurpose, emailScope, channelScope.
  3. Click Start.

Input

{ "urls": ["https://www.example.be"], "contactPurpose": "sales", "channelScope": "all", "emailScope": "all" }
OptionDefaultWhat it does
contactPurposeanysales, general, support; sales never picks a support address
emailScoperole_personall adds freemail and department addresses
channelScopecore (email, phone, form)all adds social profiles, WhatsApp and the online booking link
conversionRoutesoffAdds proven booking and quote routes with evidence
maxPages5Pages per website (contact and legal pages first)
maxRunSeconds600Unprocessed websites are listed and picked up on resume
maxConcurrency51–10
expectedEntities—Name, city, postal code per site; output says whether the site agrees
previousSnapshot—SNAPSHOT from an earlier run, to detect changes
countryHintfrom the domainFlags phone numbers with a foreign calling code

Output

{
"input_url": "https://example.be/",
"status": "accepted",
"primary_channel": "email",
"profile": {
"email": "info@example.be",
"role": "general",
"email_category": "role",
"emails_observed": [
{ "value": "info@example.be", "category": "role", "source_url": "https://example.be/contact", "method": "mailto" }
],
"channels": [
{ "type": "email", "value": "info@example.be", "source_url": "https://example.be/contact" },
{ "type": "phone", "value": "+3212345678", "source_url": "https://example.be/contact" },
{ "type": "contact_form", "url": "https://example.be/contact", "submission_tested": false }
],
"evidence": { "method": "mailto", "source_url": "https://example.be/contact", "text": "Contact us" }
},
"mailbox_verified": false,
"scan_completeness": "bounded_scan",
"change": { "state": "first_observed" }
}

Status values: accepted, abstained, failed, invalid_input. Key-value stores: OUTPUT (totals, stop reason), STATUS, ERRORS, SNAPSHOT.

Source-verified, not guessed

Every email, phone and form comes with the page and the evidence it was found on. The Actor never guesses addresses (no firstname@ patterns) and never pings mailboxes: mailbox_verified is always false, by design.

Measured quality

  • Email precision 97.4–97.9% in a preregistered comparison on 300 new SME websites in Belgium, the Netherlands and France (October 2026, AI-reviewed with a human spot check).
  • On 200 local businesses with their own website (four Belgian and Dutch municipalities), 57% got a usable contact route and 43% an email address; most of the rest had websites that were offline, blocked or redirected.
  • Booking and quote routes: 48 of 50 proven routes were correct in a blind test on 660 new SME websites.

These are results on test samples, not a guarantee for your list.

How much does it cost to get contact details?

EventPrice
Website checked$0.002
Contact profile (accepted, source-backed route)$0.012
Booking or quote route (only with conversionRoutes)$0.005
Actor start$0.00005

Example: 1,000 websites, of which 570 give a contact profile = $2 + $6.84 = $8.84. channelScope: all and emailScope: all cost nothing extra.

What you are not charged for

Failures on our side, invalid URLs (free invalid_input rows), Maps rows without an own website, and duplicate websites. Rows are stored before they are charged, a resumed run never charges a website twice, and the run stops cleanly at your spending limit.

Integrate with any app

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("olliolli/website-contact-profile").call(
run_input={"urls": ["https://www.example.be"], "contactPurpose": "sales"}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["input_url"], row["primary_channel"], row.get("profile", {}).get("email"))

Send rows to Google Sheets, HubSpot, Make, Zapier or n8n through Apify's integrations. Through Apify's MCP server, AI assistants can look up a company's contact route.

Privacy

Social links, WhatsApp and personal or freemail addresses are marked personal_data: true, so you can filter them for your GDPR checks. A contact route is not consent to be contacted: check the rules for your outreach (GDPR and national direct-marketing rules).

Good to know

  • Robots.txt is respected; at most 5 pages per site. No forms are sent, no logins, no browser, no paid proxies, no third-party contact database.
  • Pages behind a login, JavaScript-only pages and bot challenges can give no result.

FAQ

Does it find emails for Google Maps leads? Yes: chain it after a Google Maps scraper and it reads each company's own website.

Does it guess email addresses? No. Only addresses published on the site, with the source page.

Are the emails verified? They are source-verified (published on the company's own site), not mailbox-verified.

Is it GDPR-compliant for B2B outreach? It reads public business websites and flags personal data. Whether you may contact someone depends on your outreach and local rules.

What if a company has no website? The row is skipped and not charged.

Need help?

Open an issue on the Issues tab. Please do not send passwords, private records or mailbox contents.