# Website Email Scraper - Emails & Social Profiles (`datascraperes/website-email-social-scraper`) Actor

Bulk website email extractor for up to 50,000 URLs or domains. Crawl up to 10 pages per site to find public emails and official social profiles, filter noise, deduplicate domains, and export clean lead data via JSON, CSV, Excel, or API.

- **URL**: https://apify.com/datascraperes/website-email-social-scraper.md
- **Developed by:** [DataScraperES](https://apify.com/datascraperes) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.45 / 1,000 website results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper - Emails & Social Profiles extracts public email addresses and official social profiles from up to 50,000 websites. Submit bare domains, full URLs, or both and receive **one auditable Dataset item per unique website**, including contact details, source pages, and crawl status.

### What this Actor does

The Actor visits public HTML pages with direct HTTP requests, follows normal redirects, and discovers internal links until the configured page limit is reached. It extracts public emails plus Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, WhatsApp, and Telegram profiles.

Equivalent inputs are normalized and crawled once. Every unique input receives an outcome: contacts found, no contacts found, crawl failed, or invalid URL. The Actor does not render JavaScript, submit forms, log in, or access private social-network data.

### Use cases

- Enrich company, prospect, supplier, or partner domain lists with public contact channels.
- Add website emails and official social profiles to CRM or lead-research workflows.
- Audit which public contact details are available across a portfolio of websites.
- Prepare structured domain-enrichment exports for spreadsheets, databases, and automation tools.

### How to use

1. Open the Actor in Apify Console.
2. Enter one domain or URL per line under **URLs or domains**.
3. Adjust the page limit, email filters, or proxy settings when needed.
4. Click **Start** and open the Dataset when the run finishes.

For a first run, use one domain and two pages.

### Input

`urls` is required and accepts between 1 and 50,000 strings. Bare domains are normalized to HTTP URLs and normal redirects are followed. Equivalent values such as `example.com`, `www.example.com`, and a path on the same host are processed once; the first occurrence determines the starting URL.

| Field | Default | Description |
| --- | --- | --- |
| `urls` | Required | Domains or URLs, one per line. |
| `maxPagesPerWebsite` | `10` | Maximum HTML pages fetched per unique website, from 1 to 10, including the starting page. |
| `includePrivacyEmails` | `true` | Keep published privacy, DPO, GDPR, and data-protection addresses. |
| `includeEmails` | `[]` | Exact emails that may bypass the built-in balanced filter. |
| `includeDomains` | `[]` | Exact email domains that may bypass the built-in balanced filter. |
| `maxEmailsPerWebsite` | `10` | Maximum accepted emails returned per website, from 1 to 50. |
| `excludeEmails` | `[]` | Exact emails to remove. |
| `excludeDomains` | `[]` | Exact email domains to remove. |
| `excludeEmailPatterns` | `[]` | Case-insensitive shell wildcards such as `*@example.org`. |
| `proxyConfiguration` | Direct | Optional Apify proxy configuration. |

The Actor always applies its built-in balanced noise filter. User exclusions always win. Privacy removal is applied next, and explicit inclusions can restore addresses rejected only by the balanced filter.

This is the exact input used for the real output example below:

```json
{
  "urls": [
    "python.org"
  ],
  "maxPagesPerWebsite": 2
}
```

### Output

The default Dataset stores one item per unique website. Results can be inspected as a table or exported in JSON, JSONL, CSV, Excel, XML, and other formats supported by Apify. A cumulative run summary is available separately through `OUTPUT.summary`.

This is the complete Dataset item from a real successful run:

```json
{
  "input": "python.org",
  "startUrl": "http://python.org/",
  "finalUrl": "https://www.python.org/",
  "domain": "python.org",
  "emails": [],
  "emailDetails": [],
  "socialProfiles": [
    {
      "platform": "linkedin",
      "url": "https://linkedin.com/company/python-software-foundation"
    },
    {
      "platform": "twitter",
      "url": "https://x.com/ThePSF"
    }
  ],
  "facebook": [],
  "instagram": [],
  "linkedin": [
    "https://linkedin.com/company/python-software-foundation"
  ],
  "twitter": [
    "https://x.com/ThePSF"
  ],
  "youtube": [],
  "tiktok": [],
  "pinterest": [],
  "whatsapp": [],
  "telegram": [],
  "crawlStatus": "enriched",
  "statusCode": 200,
  "pagesFetched": 2,
  "crawlDurationMs": 349,
  "error": null
}
```

`emailDetails` records the first source page, whether the email domain matches the website, and confidence. `finalUrl` is the redirect destination of the starting page. Possible `crawlStatus` values are `enriched`, `noContacts`, `failed`, and `invalidUrl`. Failed and invalid inputs remain visible so every unique submitted value has an auditable outcome.

### Pricing

Each successfully processed unique website triggers one `website-result` event.

| Tier | Price per website | Equivalent per 1,000 websites |
|---|---:|---:|
| Free | $0.0006 | $0.60 |
| Bronze | $0.00054 | $0.54 |
| Silver | $0.00048 | $0.48 |
| Gold | $0.00045 | $0.45 |
| Platinum | $0.00045 | $0.45 |
| Diamond | $0.00045 | $0.45 |

Each `enriched` or `noContacts` Dataset item triggers exactly one charge. Duplicate inputs are normalized and processed once, so they are not charged more than once. Failed crawls and invalid inputs remain visible in the Dataset but are not charged.

This is an all-in pay-per-event price. There is no separate Actor-start charge or automatic default-Dataset-item charge, and platform usage is included in the event price.

### Related Actors

| Actor | Best for |
|---|---|
| [Google Maps Business Scraper | $1 per 1,000](https://apify.com/datascraperes/actor-google-maps) | Discovering local businesses and website URLs before extracting their public emails and social profiles. |
| [Website Technology Lookup – CMS, Hosting & Tech Stack Data](https://apify.com/datascraperes/website-technology-lookup) | Adding published CMS, hosting, and technology-stack context to the same domain list. |
| [Similarweb Website Traffic & SEO Analytics Scraper](https://apify.com/datascraperes/similarweb-website-scraper) | Enriching domains with estimated traffic, rankings, geography, and competitor signals. |
| [Favicon Extractor](https://apify.com/datascraperes/favicon-extractor) | Adding website icons and image metadata to directories, CRMs, or domain catalogs. |

### Limits and data quality

- A run accepts at most 50,000 submitted values and fetches at most 10 HTML pages per unique website, including the starting page.
- Only public data present in the downloaded HTML can be extracted. JavaScript-only contacts are not visible.
- Each response body is bounded and every website has a total crawl deadline, so very large or slow pages can produce partial coverage.
- Internal pages are visited in discovery order until the page limit or deadline is reached.
- A social profile is accepted when it appears on the starting page or repeats across at least two crawled pages. Sharing links, posts, videos, login pages, and widgets are excluded.
- Temporary network failures and selected retryable HTTP responses are retried. Persistent failures remain visible as `failed` rows.
- Increasing page count can improve coverage but also increases run time and the number of website requests.

### Frequently asked questions

#### Does the Actor render JavaScript?

No. It uses direct HTTP requests and extracts data from returned HTML. Contacts rendered only after browser-side JavaScript executes may not be available.

#### Why were duplicate URLs processed once?

The Actor deduplicates by normalized website host. Different paths and `www` variants of the same website intentionally produce one crawl and one Dataset item.

#### Why was a social link ignored?

The link may be a share action, post, video, reserved platform page, or a profile seen on only one non-starting page. The confidence rule is designed to favor site-level official profiles.

#### Can I exclude whole email domains or wildcard patterns?

Yes. Use `excludeDomains` for exact domains and `excludeEmailPatterns` for case-insensitive shell wildcards. Exact and wildcard exclusions take priority over all inclusions.

### Responsible use

Use this Actor only for lawful processing of publicly available website data. You are responsible for complying with applicable privacy, marketing, anti-spam, database, and website terms, and for establishing a valid basis for storing or contacting any person represented in the output. Protect exported Datasets and honor applicable deletion or opt-out requests.

### Support

If a run does not behave as expected, open an issue in the Actor's **Issues** tab. Include the run ID, a sanitized reproducible input, the expected result, and the observed result. Do not post API tokens, credentials, or confidential information.

# Actor input Schema

## `urls` (type: `array`):

Enter one domain or URL per line. Bare domains such as example.com are accepted. Duplicate domains are crawled only once.

## `maxPagesPerWebsite` (type: `integer`):

Maximum HTML pages fetched from each website, including the starting page.

## `includePrivacyEmails` (type: `boolean`):

Keep published privacy, DPO, GDPR, and data-protection addresses.

## `includeEmails` (type: `array`):

Optional exact email addresses to keep even when the built-in balanced filter would remove them. User exclusions still take priority.

## `includeDomains` (type: `array`):

Optional exact email domains to keep even when the built-in balanced filter would remove them. User exclusions still take priority.

## `maxEmailsPerWebsite` (type: `integer`):

Maximum accepted email addresses returned for each unique website.

## `excludeEmails` (type: `array`):

Optional exact email addresses to remove from results.

## `excludeDomains` (type: `array`):

Optional exact email domains to remove, for example example.org.

## `excludeEmailPatterns` (type: `array`):

Optional case-insensitive wildcard patterns to remove, for example *@example.org or noreply@*. Use \* for any characters and ? for one character. Exact exclusions also apply.

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

Optional proxy used while visiting websites. Direct connections are used by default.

## Actor input object example

```json
{
  "urls": [
    "apify.com",
    "stripe.com"
  ],
  "maxPagesPerWebsite": 5,
  "includePrivacyEmails": true,
  "includeEmails": [],
  "includeDomains": [],
  "maxEmailsPerWebsite": 10,
  "excludeEmails": [],
  "excludeDomains": [],
  "excludeEmailPatterns": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Unique websites with extracted public contact details and crawl status.

## `summary` (type: `string`):

Input, deduplication, result, error, timing, and page-count metrics.

# 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 = {
    "urls": [
        "apify.com",
        "stripe.com"
    ],
    "maxPagesPerWebsite": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/website-email-social-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 = {
    "urls": [
        "apify.com",
        "stripe.com",
    ],
    "maxPagesPerWebsite": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/website-email-social-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 '{
  "urls": [
    "apify.com",
    "stripe.com"
  ],
  "maxPagesPerWebsite": 5
}' |
apify call datascraperes/website-email-social-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascraperes/website-email-social-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/vzVR6xtHicaTefSbr/builds/NXxUoZBEp0wkP2Hcz/openapi.json
