Website Email Extractor & Contact Scraper avatar

Website Email Extractor & Contact Scraper

Deprecated

Pricing

from $1.50 / 1,000 site with contact details

Go to Apify Store
Website Email Extractor & Contact Scraper

Website Email Extractor & Contact Scraper

Deprecated

Website email extractor and contact scraper: give a list of websites, get role emails (info@, sales@), phone numbers, social links and the contact page for each. $3 per 1,000 sites with results; sites with nothing found are free. Business contacts only.

Pricing

from $1.50 / 1,000 site with contact details

Rating

0.0

(0)

Developer

Weio, Inc.

Weio, Inc.

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

12 days ago

Last modified

Share

Website Contact Details Extractor (business emails, phones, social links)

Give it a list of websites and get one row per site with the business contact details the site itself publishes: business name, role emails (info@, sales@, office@ ...), phone numbers, social profile links and the contact page. Useful for building B2B outreach lists, enriching a CRM, or checking that your own sites show current contact details.

What it does

For each site the actor fetches the homepage over plain HTTP(S) (no browser), then at most two more pages on the same domain: the contact page and an about page, if the homepage links to them. Results from the pages are merged.

  • emails: role/business addresses only (info@, sales@, contact@, office@, support@ ...), lowercased and deduplicated.
  • phones: from tel: links and phone-number patterns in the page (North American format; numbers can include false positives such as placeholder digits).
  • socials: first link found for facebook, instagram, linkedin, x (x.com / twitter.com), youtube, tiktok.
  • business_name: the site's og:site_name, else the page title.
  • contact_page_url, pages_checked, and error (null, or a short reason such as http 403 or invalid domain).

Sites that render their contact details only with JavaScript, or that block automated requests, will return few or no details.

Input

{
"websites": ["zingermans.com", "https://anchorbrewing.com"],
"onlyWithEmail": false,
"concurrency": 8
}
  • websites (required main input unless you set datasetId): domains or URLs, one per line. Leave it empty if you use a dataset. Up to 5,000 websites per run, list and dataset together; anything beyond that is not read.
  • onlyWithEmail: if true, sites without a business email are left out of the results and not charged.
  • concurrency: websites processed in parallel (1-32, default 8).
  • datasetId (optional): a dataset you already hold, e.g. a places or business-directory scraper's output. Each item's website is read from websiteField (default website; then websiteUrl, webUrl, site, domain, web, homepage). Items without a website and permanently closed places are skipped for free. A listing's own page (the url of a Google Maps or Yelp item) is never used. URL variants of the same domain (for example, www.example.com/contact and example.com) are checked once and count as one site.
  • websiteField (optional): the dataset field that holds each business's website, default website.

A run with no websites and no usable dataset stops at once with a status message and costs nothing.

Run after a Google Maps scrape

Run it automatically after your places scraper. In the task of your Google Maps (or other places or directory) scraper, open Integrations, add this actor and keep the prefilled input {"datasetId": "{{resource.defaultDatasetId}}"}. Each time the scraper finishes, this actor reads that run's dataset and returns the public contact details (business emails, phones, social links) of the businesses that list a website. Businesses without a website, permanently closed places and sites where nothing is found are free. If several locations point at pages on the same domain, that domain is checked once and counts as one site.

Already have a finished scrape? Start this actor with datasetId set to that run's dataset, and leave websites empty (remove the example sites) so only your businesses are checked. If your scraper stores the website under another field name, set websiteField. URL variants on the same domain are deduplicated: if several locations of a chain list different pages on one domain, that domain is checked and charged once.

Use it from automations and the API

Use this actor in an n8n, Make, or Zapier workflow. To run it on a schedule, use an Apify schedule.

Clay HTTP API example. Add an HTTP request that POSTs to https://api.apify.com/v2/acts/weio~website-contact-details-extractor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN with this JSON body:

{"websites":["{{website}}"]}

Replace YOUR_APIFY_TOKEN with your Apify token and map Clay's website column into {{website}}.

FAQ

Can I use a Google Maps scrape? Yes. Pass its datasetId and, if needed, set websiteField to the field that contains each business website.

Why are personal addresses missing? The actor intentionally returns role/business inboxes only, such as info@ or sales@; name-like personal addresses are dropped.

What happens when a site disallows crawlers? The actor checks robots.txt before reading a site. A disallowed site is returned as a free error row and is not charged.

Output example

{
"input": "zingermans.com",
"domain": "zingermans.com",
"final_url": "https://zingermans.com/",
"business_name": "Zingerman's: Online Shopping for Food and Gifts",
"emails": [
"service@zingermans.com"
],
"phones": [
"+17344362006",
"+17344776986",
"+17344776988",
"+18662606169",
"+18886368162"
],
"socials": {
"facebook": "https://www.facebook.com/Zingermans/",
"instagram": "https://www.instagram.com/zingermansmailorder/"
},
"contact_page_url": "https://zingermans.com/CustService.aspx",
"pages_checked": [
"https://zingermans.com/",
"https://zingermans.com/CustService.aspx",
"https://zingermans.com/AboutUs.aspx"
],
"error": null
}

Pricing

$3.00 per 1,000 sites ($0.003 per site), platform usage included. You are charged only for rows with no error and at least one email, phone or social link. Rows with an error or with nothing found are returned free, and with onlyWithEmail sites without a business email are skipped and free too.

Privacy and limits

  • Business/role email addresses only. Addresses that look like a person's name (john.smith@...) are dropped on purpose and never returned.
  • Only publicly reachable pages are read: the homepage and at most two same-domain pages. No logins, no forms, no page text is stored or returned.
  • Requests to private or internal network addresses are refused.
  • The actor identifies itself as WeioBot and reads each site's robots.txt first; a site that disallows it is returned as an error row and not charged. You are responsible for using the results lawfully, including any email-marketing and data-protection rules that apply to you.