# Website Email & Social Media Scraper (`saregaa/website-contacts-scraper`) Actor

Extract emails and social media links (Facebook, Instagram, LinkedIn, TikTok, YouTube and more) from any list of websites. Perfect for enriching Google Maps leads, CRM exports, or business directories. Pay only for results actually found - no subscription, no wasted spend.

- **URL**: https://apify.com/saregaa/website-contacts-scraper.md
- **Developed by:** [Saregaa](https://apify.com/saregaa) (community)
- **Categories:**
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 email founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Email & Social Media Scraper | Extract Contact Info from Any Website

### Short Description

This Actor visits any list of websites and pulls out **email addresses** and **social media profile links** (Facebook, Instagram, LinkedIn, X/Twitter, TikTok, YouTube, Telegram, WhatsApp) automatically — no manual browsing required. It's built for people who have a list of business websites (from Google Maps, a CRM export, a directory, or a spreadsheet) and need working contact points to reach out to them.

It's used by sales teams, marketers, recruiters, and data teams who need clean, structured contact data instead of a list of URLs.

✅ Extracts emails from homepage + Contact/About/Team subpages automatically
✅ Detects 9 social platforms, not just Facebook/Instagram
✅ Works on any industry or country — including French/German business sites
✅ Export to JSON, CSV, Excel, XML
✅ Full REST API and scheduling support

***

### What Data Can Be Extracted?

| Field                | Description                                                  |
| -------------------- | ------------------------------------------------------------ |
| `start_url`        | The website URL that was scraped                             |
| `emails`           | Array of unique, validated email addresses found on the site |
| `emailsCount`      | Number of unique emails found                                |
| `facebookUrl`      | Facebook page/profile URL, empty if not found                |
| `instagramUrl`     | Instagram profile URL, empty if not found                    |
| `linkedinUrl`      | LinkedIn company or personal profile URL, empty if not found |
| `twitterUrl`       | Twitter / X profile URL, empty if not found                  |
| `tiktokUrl`        | TikTok profile URL, empty if not found                       |
| `youtubeUrl`       | YouTube channel URL, empty if not found                      |
| `telegramUrl`      | Telegram channel/profile URL, empty if not found             |
| `whatsappUrl`      | WhatsApp click-to-chat link, empty if not found              |
| `aggregatorUrl`    | TripAdvisor/Yelp profile URL, empty if not found             |
| `socialLinksCount` | Number of distinct social/review profiles found              |

***

### Features

- Crawl thousands of websites in a single run with adjustable concurrency (up to 50 sites in parallel)
- Automatically follows Contact, About, Team, and Impressum-style subpages to find hidden emails
- Filters out junk emails (image files, tracking pixels, hashed/obfuscated addresses, placeholder domains like `example.com`)
- Detects direct social/aggregator links even when the "website" itself is just a Facebook or TripAdvisor page
- Uses browser-grade TLS fingerprinting to reduce blocks compared to plain HTTP scrapers
- DNS-over-HTTPS fallback for sites with flaky DNS resolution
- Export results to JSON, CSV, Excel, or XML directly from Apify Console
- Full Apify API and scheduling — automate recurring enrichment runs
- Integrate with Zapier, Make, n8n, or any tool that can call the Apify API

***

### How to Scrape Emails and Social Links from a List of Websites

1. Open the Actor in Apify Console and click **Try for free**
2. Paste your list of website URLs into **Start URLs** (or import a CSV/Google Sheet)
3. Set **Max Concurrency** based on how fast you need results (default: 10)
4. Optionally enable **Apify Proxy** if you're scraping a large or geo-restricted list
5. Click **Start** and download results as JSON, CSV, or Excel once the run finishes

***

### Input Example

The easiest way — just paste a list of website URLs, one per line:

```json
{
  "startUrlsText": "pinehillsveterinary.com\nwww.bcrha.org\noakislandanimalhosp.com/?utm_source=gmb&utm_medium=organic\ncaresouth-carolina.com",
  "maxConcurrency": 10
}
```

For programmatic use or chaining from another Actor's output (e.g. a Google Maps scraper), use the `startUrls` array instead:

```json
{
  "startUrls": [
    { "url": "https://www.hope-health.org/" },
    { "url": "https://www.example-restaurant.com/" }
  ],
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

***

### Output Example

```json
{
  "start_url": "https://www.hope-health.org/",
  "emails": ["info@hope-health.org"],
  "emailsCount": 1,
  "facebookUrl": "https://www.facebook.com/hopehealthinc",
  "instagramUrl": "https://www.instagram.com/hopehealthinc",
  "linkedinUrl": "https://www.linkedin.com/company/1868297",
  "twitterUrl": "",
  "tiktokUrl": "",
  "youtubeUrl": "https://www.youtube.com/channel/UCh1c1YImP2X3DlZGyz2PRwg",
  "telegramUrl": "",
  "whatsappUrl": "",
  "aggregatorUrl": "",
  "socialLinksCount": 3
}
```

***

### Use Cases

#### Google Maps Data Enrichment

Scraped a list of businesses from Google Maps but only got a website URL, no email or socials? Feed those URLs straight into this Actor and get back the missing contact fields in the same dataset shape you can merge back into your Maps results.

#### Lead Generation

Turn a list of company websites into a list of real, reachable email addresses and social profiles for cold outreach and prospecting campaigns.

#### Market Research

Quickly find how a set of competitors or an entire local industry (clinics, restaurants, agencies) presents itself online — which platforms they use, whether they publish public contact info at all.

#### Competitor Monitoring

Track which social platforms competitors are actively using and how their online contact presence changes over time by re-running on a schedule.

#### CRM & Sales Data Enrichment

Fill missing `email` and `social_profile` columns in an existing CRM export by running this Actor against the `website` column and merging results back by URL.

***

### API Access

This Actor can be triggered and its results retrieved entirely through the **Apify API** — no manual clicking required. You can:

- Start runs programmatically and poll for completion
- Pull results directly from the run's dataset in JSON, CSV, or Excel format
- Schedule recurring runs (e.g. daily/weekly re-enrichment of a lead list) directly in Apify Console
- Wire the Actor into **Zapier**, **Make**, **n8n**, or any custom pipeline that can call a REST API

See the **API** tab on this Actor's page for your account-specific endpoint and authentication details.

***

### Pricing

This Actor uses **Pay Per Event** pricing — you only pay when something is actually found on a website:

- **Email found** — charged once per website, only if at least one valid email is found
- **Social profile found** — charged once per website, only if at least one social/aggregator link is found
- Websites where nothing is found cost nothing beyond the Actor start

Since success rates vary by industry, here's what that looks like in practice:

| Sites scraped | Industry example     | Typical email hit rate | Typical social hit rate | Estimated emails billed | Estimated socials billed |
| ------------- | -------------------- | ---------------------- | ----------------------- | ----------------------- | ------------------------ |
| 100           | Healthcare           | ~30%                   | higher than email       | ~30                     | ~50–70                  |
| 1,000         | Restaurants          | ~35–40%               | higher than email       | ~350–400               | ~600–800                |
| 10,000        | Real estate agencies | ~40–60%               | higher than email       | ~4,000–6,000           | ~7,000–9,000            |

Social profiles are generally found more often than emails across every industry, since most businesses list at least one social page even when they hide their email behind a contact form.

Check the **Pricing** tab on this Actor's page for the exact current per-event rates.

***

### Why Use This Instead of Manual Research or a Paid Contact Database?

| Feature                             | This Actor            | Manual research       | Paid contact database (e.g. ZoomInfo, Hunter.io) |
| ----------------------------------- | --------------------- | --------------------- | ------------------------------------------------ |
| Speed for 1,000+ sites              | Minutes, automated    | Days of manual work   | Fast, but requires existing coverage             |
| Pay only for found results          | ✅ Yes                | N/A                   | ❌ Usually flat subscription                     |
| Works on any website, any country   | ✅ Yes                | ✅ Yes, but slow      | ❌ Limited to indexed companies                  |
| No monthly subscription required    | ✅ Yes                | ✅ Yes                | ❌ Typically required                            |
| Structured, exportable output       | ✅ JSON/CSV/Excel/XML | ❌ Manual spreadsheet | ✅ Usually yes                                   |
| Integrates into automated pipelines | ✅ Full API           | ❌ No                 | ✅ Usually yes, at higher cost                   |

***

### FAQ

**Is it legal to scrape emails and social links from public websites?**
Scraping publicly available business contact information is generally legal in most jurisdictions, but you're responsible for complying with applicable laws (such as GDPR/CAN-SPAM) in how you use the data you collect, especially for outreach.

**Do I need proxies to run this Actor?**
Not for most runs. Proxy support is built in and optional — enable it in the input if you're scraping a very large list or sites that are geo-restricted.

**Can I schedule this Actor to run automatically?**
Yes. Use Apify's built-in Scheduler to run it daily, weekly, or on any custom interval.

**Can I export results to CSV or Excel?**
Yes, directly from the Apify Console dataset view, or via the API with `format=csv` or `format=xlsx`.

**How much does it cost?**
You only pay for websites where an email or social profile was actually found — see the Pricing section above and the Pricing tab for exact current rates.

**How many websites can I scrape in one run?**
There's no hard limit — concurrency is configurable up to 50 parallel sites, so runs scale to tens of thousands of URLs.

**Does it work worldwide, or only for English-language sites?**
It works on sites in any language. Subpage detection also recognizes French and German patterns (`kontakt`, `impressum`, `l-equipe`, `a-propos`) in addition to English ones.

**Can I use it through the API without opening Apify Console?**
Yes, the Actor is fully controllable via the Apify API — start runs, check status, and pull results programmatically.

**What happens if a website blocks the scraper or times out?**
That site is skipped and returned with empty fields rather than failing the whole run — you're not charged for sites where nothing was found.

**How often is the Actor updated?**
The Actor is actively maintained, with updates to subpage detection patterns and social platform coverage as sites evolve.

**Can I feed it URLs from a Google Maps scraper?**
Yes — this is one of its primary use cases. Take the `website` field from any Google Maps scraper's output and use it as `startUrls` here to fill in missing emails and social links.

**Does it extract phone numbers too?**
Not currently — this Actor is focused specifically on emails and social/aggregator profile links.

***

### How to Scrape Website Emails at Scale

Manually opening every website's Contact page to copy an email address doesn't scale past a handful of leads. This Actor automates that exact workflow: it fetches each site, checks the homepage and the most likely subpages (Contact, About, Team), and extracts every valid email it finds — deduplicated and filtered for junk automatically.

### Website Email Scraper API Alternative

If you're currently paying for a fixed-subscription contact database and only using a fraction of its coverage, a pay-per-event scraper like this one can be cheaper for targeted lists, since you only pay for websites where a result was actually found, with no monthly minimum.

### How Much Does It Cost to Scrape Emails from a Website?

Cost depends entirely on how often emails are actually published — see the Pricing section above for real industry benchmarks (roughly 30% for healthcare, 35–40% for restaurants, 40–60% for real estate). Since you only pay for hits, low-hit-rate industries simply cost less overall, not more per unit.

### Export Website Contact Data to CSV

Every run's results can be downloaded as CSV directly from the Output tab in Apify Console, or pulled via the API with `format=csv` — ready to import into a CRM or spreadsheet tool.

### Automate Website Contact Data Collection

Combine the Apify Scheduler with this Actor to re-run enrichment on a list periodically, or trigger it from Zapier/Make/n8n whenever new leads are added to your CRM.

***

### Support

Found a bug or have a feature request? Open an issue on this Actor's Issues tab in Apify Console, or reach out through Apify's support channels. Feedback on data accuracy for specific industries or regions is especially welcome — it directly improves subpage detection patterns.

# Actor input Schema

## `startUrlsText` (type: `string`):

The easiest way to add many websites at once: paste one URL per line (or separate them with commas). No need to format anything as JSON - plain domains like 'example.com' work too, 'https://' is added automatically. If you also fill in 'Start URLs' below, both lists are combined.

## `startUrls` (type: `array`):

For programmatic use or chaining from another Actor's output (e.g. a Google Maps scraper's 'website' field). Most users should use 'Website URLs (paste list)' above instead.

## `maxConcurrency` (type: `integer`):

Number of concurrent websites to process simultaneously (max 50).

## `proxyConfiguration` (type: `object`):

Select Apify Proxy to bypass geo-blocks and IP limits.

## Actor input object example

```json
{
  "startUrlsText": "https://pinehillsveterinary.com/\nwww.bcrha.org\noakislandanimalhosp.com",
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ],
  "maxConcurrency": 10
}
```

# Actor output Schema

## `results` (type: `string`):

All websites processed during this run, one item per website.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrlsText": `https://pinehillsveterinary.com/
www.bcrha.org
oakislandanimalhosp.com`,
    "startUrls": [
        {
            "url": "https://example.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("saregaa/website-contacts-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrlsText": """https://pinehillsveterinary.com/
www.bcrha.org
oakislandanimalhosp.com""",
    "startUrls": [{ "url": "https://example.com" }],
}

# Run the Actor and wait for it to finish
run = client.actor("saregaa/website-contacts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrlsText": "https://pinehillsveterinary.com/\\nwww.bcrha.org\\noakislandanimalhosp.com",
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ]
}' |
apify call saregaa/website-contacts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,saregaa/website-contacts-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GUirKgrtBo30J4PaQ/builds/6X27qFuwhqc3x67yS/openapi.json
