Maps Lead Enricher: Domains to Emails & Phones (CSV) avatar

Maps Lead Enricher: Domains to Emails & Phones (CSV)

Pricing

$5.00 / 1,000 domain with contacts

Go to Apify Store
Maps Lead Enricher: Domains to Emails & Phones (CSV)

Maps Lead Enricher: Domains to Emails & Phones (CSV)

Already have a Maps export or lead CSV with websites? Get one CRM-ready row per domain: scored email, E.164 phones, socials, contact forms; your columns pass through. Bring your own domains - this Actor does not scrape Google Maps. Pay only when contacts are found.

Pricing

$5.00 / 1,000 domain with contacts

Rating

0.0

(0)

Developer

Joel Sumner

Joel Sumner

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Security

Limited permissions

Share

Google Maps Leads Enricher — Domains/Websites to Emails & Phones (CSV)

Already exported leads from a Google Maps scraper? Feed the website/domain column here and get one deduped, CRM-ready contact row per domain. Scored best email, E.164 phones, social links and contact-form URLs, with all your original Maps/CSV columns passed straight through.

This Actor does not scrape Google Maps. It enriches websites/domains you already have (from any Maps scraper, directory export or CRM).

How to feed domains from a Google Maps scrape export

  1. Run whichever Google Maps scraper you already use (any Apify Store Maps Actor or other tool).
  2. Export the results as CSV (or a dataset JSON) and keep the column that holds the business website or domain.
  3. Give it to this Actor in one of three ways:
    • CSV URL: put a public link to the CSV in csvUrls. It should have a url, website or domain column.
    • Rows: paste rows into rows (e.g. {"place_id":"...","name":"...","website":"acme.com"}). Every column comes back as original_*.
    • Plain list: paste the websites into startUrls.
  4. Run it. You get one row per registrable domain with bestEmail, emailConfidence, phones (E.164), socials, contactFormUrls and your passthrough columns, ready for your CRM.

When to use this vs. a bundled Maps + contacts tool: if you want one tool that both scrapes Maps and grabs contacts, a bundled Maps scraper with contact enrichment may suit you better. Use this Actor when you already have domains (from Maps or anywhere else) and want scored emails, normalized E.164 phones, per-domain dedupe and your original columns kept, paying only for domains where contacts were found.

GDPR / CAN-SPAM: your responsibility

  • You are the data controller for any personal data you collect and use. Make sure you have a lawful basis (e.g. legitimate interest under GDPR) and honor opt-outs.
  • The Actor only reads publicly visible contact details on the business websites you supply. It does not log in, bypass paywalls, or access private data.
  • Any outreach must follow CAN-SPAM, GDPR/ePrivacy, CASL and local laws (accurate sender info, physical address, working unsubscribe). Results come with no guarantee of deliverability, replies, or that any email is OK to cold-email.

Give it a list of websites (startUrls, or a CSV/rows of leads). For each registrable domain it returns one CRM-ready row. Each row has:

  • the best email,
  • a confidence score,
  • same-domain emails,
  • E.164 phones,
  • verified social profiles,
  • contact-form URLs,
  • and all of your original CSV columns (original_*).

Why use this rather than the per-page leader (vdrmota Contact Details Scraper)

vdrmotaThis Actor
Output unitone row per page; you dedupe yourselfone row per registrable domain (www/subdomains/redirects merged)
Email qualityraw listemailConfidence 0–1, emailsSameDomain, bestEmail, placeholder/asset/fake-TLD filtering, optional MX check
Sites with no public emailnothingcontactFormUrls (forms with an email/tel input + textarea, or a contact/mail action)
Lead list in → enriched list outURLs onlyCSV/rows passthrough: your columns (crm_id, company, owner…) come back on the same row
You pay forevery page, even empty onesonly domains where something was delivered (row pushed first, then charged)
Phonestel: + texttel: + plain text via libphonenumber-js (default region input), deduped E.164
Networksmore (Threads/Snapchat/Telegram)fewer: x, linkedin, facebook, instagram, youtube, github, tiktok (host-anchored, no share/intent/watch/issue links)
Honest gap: vdrmota is stronger on brand, reviews (4.69★), network coverage, and DIAMOND-tier price.

Example inputs

List of websites:

{"startUrls":[{"url":"https://apify.com"},{"url":"https://stripe.com"}]}

Lead list enrichment (CSV passthrough — your columns come back as original_*):

{"rows":[{"crm_id":"A1","company":"Acme","website":"acme.com"},{"crm_id":"A2","company":"Globex","website":"globex.com"}]}

Or point csvUrls at a public CSV with a url/website/domain column.

Output sample

{"domain":"acme-plumbing.com","original_crm_id":"A1","original_company":"Acme","bestEmail":"office@acme-plumbing.com","emailConfidence":0.9,
"emailsSameDomain":["office@acme-plumbing.com"],"phones":["+15125557788"],"socials":{"facebook":["https://www.facebook.com/acmeplumbing"]},
"contactFormUrls":["https://acme-plumbing.com/contact"],"status":"complete"}

(Illustrative values.)

All input options

startUrls | csvUrls (+csvUrlColumn) | rows, maxPagesPerDomain (5), maxRequestsPerCrawl (1000), maxConcurrency (10), requestTimeoutSecs (20), maxRequestRetries (1), defaultRegion (US), checkMx (false; DNS resolveMx, cached per domain, mxTimeoutMs default 3000 ms; a timeout counts as unknown, not bad), maxTotalChargeUsd (0 = platform limit only), proxyConfiguration (off).

Output

See .actor/dataset_schema.json, which has two views: overview and full. Every input domain gets a row, including status: failed with errors. Rows are pushed as soon as each domain finishes. On abort or migration, rows that were not yet flushed are pushed with aborted-partial / migrated-partial.

Pricing (pay per event)

EventPrice
domain-with-contacts — a domain row with ≥1 email, phone or contact form$0.005
No per-page fee. Failed or empty domains are free. Set maxTotalChargeUsd or the run's max-charge limit to cap spend. Example: 1,000 domains with a 30% hit rate ≈ $1.50.

Limits / ToS-safe use

Cheerio only: no JS rendering, no logins, no LinkedIn/IG profile scraping. Contact pages are found by URL keyword. Proxy is off by default. Public contact details are still personal data. Under GDPR you are the controller and must have a legitimate interest; follow CAN-SPAM and local law. The tool doesn't scrape anything behind a login, and you must only submit sites you are permitted to process.

FAQ

  • GDPR / CAN-SPAM? Public contact details are still personal data; you are the controller. Only process sites you are permitted to, and follow local law.
  • MX check? checkMx: true runs a DNS MX lookup per domain (cached, 3 s timeout; timeout = unknown, not bad).
  • JavaScript-heavy sites? Cheerio only — no JS rendering, no logins.

Local dev

npm i && npm test && npm start (input goes in storage/key_value_stores/default/INPUT.json).

More Actors by willed_nursery