Google Maps Email & Contact Details Scraper
Pricing
from $12.00 / 1,000 contact profiles
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
Maintained by CommunityActor 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
- Run a Google Maps scraper in your own Apify account.
- Pick that run's dataset in
datasetId, or on the Maps scraper open Integrations → Add integration, choose this Actor and use{"datasetId": "{{resource.defaultDatasetId}}"}. - 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
- Add websites in
urls(1–500) or pick a dataset. - Choose the purpose and scope:
contactPurpose,emailScope,channelScope. - Click Start.
Input
{ "urls": ["https://www.example.be"], "contactPurpose": "sales", "channelScope": "all", "emailScope": "all" }
| Option | Default | What it does |
|---|---|---|
contactPurpose | any | sales, general, support; sales never picks a support address |
emailScope | role_person | all adds freemail and department addresses |
channelScope | core (email, phone, form) | all adds social profiles, WhatsApp and the online booking link |
conversionRoutes | off | Adds proven booking and quote routes with evidence |
maxPages | 5 | Pages per website (contact and legal pages first) |
maxRunSeconds | 600 | Unprocessed websites are listed and picked up on resume |
maxConcurrency | 5 | 1–10 |
expectedEntities | — | Name, city, postal code per site; output says whether the site agrees |
previousSnapshot | — | SNAPSHOT from an earlier run, to detect changes |
countryHint | from the domain | Flags 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?
| Event | Price |
|---|---|
| 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 ApifyClientclient = 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.