Website Contact Extractor - Emails, Phones & Socials avatar

Website Contact Extractor - Emails, Phones & Socials

Pricing

$20.00 / 1,000 website processeds

Go to Apify Store
Website Contact Extractor - Emails, Phones & Socials

Website Contact Extractor - Emails, Phones & Socials

Give it a list of websites, get back the emails, phone numbers and social profiles published on each one. Built to run straight after a Google Maps or directory scrape.

Pricing

$20.00 / 1,000 website processeds

Rating

0.0

(0)

Developer

Project Desk

Project Desk

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Share

Website Contact Extractor — emails, phone numbers and social profiles

Give it a list of websites. Get back the email addresses, phone numbers and social profiles each one publishes — as a clean table you can export to CSV, Excel, JSON, or push straight into your CRM.

It is built to run immediately after a Google Maps, directory or search scrape. Those give you a company name and a website. They do not give you a way to reach anyone. This closes that gap.


What it does

For every website you give it, this Actor:

  1. Fetches the homepage.
  2. Finds the pages most likely to carry contact details — contact, about, impressum, team, support — and fetches those too.
  3. Pulls out every email address, phone number and social profile it can find.
  4. Cleans the result: no image filenames mistaken for emails, no Sentry or Wix tracker addresses, no noreply@, no share-button links pretending to be the company's Facebook page.

Things most extractors miss, and this one handles

  • Cloudflare-obfuscated emails (data-cfemail) — decoded, not skipped. These are addresses a human sees in the browser and a naive scraper never returns.
  • Written-out addressessid [at] example [dot] com, sid(at)example(dot)com.
  • Phone numbers in E.164+442079460958, not 020 7946 0958 (opt 2). Validated with Google's libphonenumber, so years, VAT numbers and prices do not come back as phones.
  • Role vs personal emailsinfo@ and sales@ are separated from firstname.lastname@, in their own output columns, so you can route them differently.
  • Expired SSL certificates — small-business sites are full of them. Handled by default instead of failing the row.

Input

FieldTypeDefaultWhat it does
startUrlsarrayThe websites. Paste them, upload a CSV, or link the dataset from another Actor. Bare domains (example.com) are fine.
followContactPagesbooleantrueAlso check the contact/about pages. Leaving this on roughly triples the hit rate.
maxPagesPerSiteinteger3Homepage plus this many contact-ish pages.
defaultPhoneRegionstringTwo-letter code (US, GB, IN, DE) for reading local numbers written without a country code.
maxConcurrencyinteger10Websites handled at once.
respectRobotsTxtbooleantrueSkip pages the site asks crawlers not to fetch.
ignoreSslErrorsbooleantrueKeep going on expired or mismatched certificates.
proxyConfigurationobjectoffOptional. Most sites do not need one; switch it on if you hit blocks at volume.

Minimal input:

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

Output

One row per website.

{
"website": "https://decathlon.in/",
"domain": "decathlon.in",
"status": "ok",
"totalContacts": 5,
"title": "Buy Sporting Goods, Sportswear and Equipments | Download App",
"emails": [
"care.india@decathlon.com"
],
"emailsRole": [
"care.india@decathlon.com"
],
"emailsPersonal": [],
"phones": [],
"socials": {
"twitter": [
"https://x.com/Decathlon_ind"
],
"facebook": [
"https://www.facebook.com/decathlonindia"
],
"instagram": [
"https://www.instagram.com/decathlonsportsindia"
],
"youtube": [
"https://www.youtube.com/@decathlon_india"
]
},
"pagesCrawled": [
"https://decathlon.in/",
"https://decathlon.in/support/hc"
],
"error": null
}

status is one of:

StatusMeaning
okAt least one contact was found.
no-contacts-foundThe site was read fine and publishes nothing reachable.
failedThe site could not be read — see error (http-403, timeout, ...).
skipped-by-robotsThe site's robots.txt asks crawlers not to fetch that page.

Pricing

Pay per website processed. One charge per website you hand in, whatever comes back — the fetching happens either way, and a site that publishes nothing costs the same work as one that publishes ten addresses. No subscription, no minimum, no charge for a run you cancel.

If a website you care about returns failed, re-run just that one with the proxy switched on.


Honest limits

  • Only what is published. This reads the public website. It does not guess addresses, buy them from a database, or verify that an inbox accepts mail.
  • No JavaScript rendering. Contact details behind a JS-only widget or a "reveal email" button will not be found. The vast majority of business sites put them in the HTML.
  • Hard-blocked sites. A few sites return 403 to anything that is not a browser. Turn the proxy on for those.
  • Social links are read off the site's own pages. No request is ever made to LinkedIn, Instagram or any other platform, and nothing behind a login is touched.

Common pairings

  • Google Maps Scraper → this — turn a list of local businesses into a contactable list.
  • Any directory or search scrape → this — the same last mile.
  • Your own customer list → this — refresh contact details that have gone stale.

Compliance note

Scraping publicly published business contact details is legal in most jurisdictions, but what you do next is regulated — GDPR, CAN-SPAM, CASL and India's DPDP all govern unsolicited outreach. Personal addresses (firstname.lastname@) carry more obligations than role addresses (info@), which is exactly why this Actor separates them for you. Check your own obligations before you send.