# Website Email Extractor: Emails, Phones & Socials (`falcon-sol/website-email-extractor`) Actor

Bulk email finder for any list of websites: one row per domain with de-obfuscated, MX-checked emails, phones, a ranked best contact with name & role, and 13 social networks. HTTP-only and fast. Pay $0.0015 only for domains where a contact is found. Misses free.

- **URL**: https://apify.com/falcon-sol/website-email-extractor.md
- **Developed by:** [falcon.sol](https://apify.com/falcon-sol) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.90 / 1,000 domain with contacts

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 📧 Website Email Extractor: Emails, Phones & Socials

**Paste a list of websites, get one clean contact row per domain.** Emails (including obfuscated ones), international phone numbers, the best person to contact with their name and role when the site lists them, and 13 social networks, at **$0.0029 per domain where something is found. Misses are free.**

### 🎯 Who it's for

- **Sales and growth teams** enriching a list of company domains before outreach
- **Agencies** turning prospect websites into contactable leads
- **Recruiters, PR and partnership teams** finding the right inbox at each company
- **Data teams and AI agents** that need a cheap, fast enrichment step via the API, after Google Maps, a CRM export or a list of domains

### 🚀 Why this one

- 💸 **Pay only for hits.** You're charged only for domains where at least one email, phone or social profile was found. Dead sites and empty pages cost nothing.
- 🧹 **One row per domain, not per page.** Results are deduplicated and merged, and every row has the same fields, including misses. They're ready for a spreadsheet or CRM import.
- 🕵️ **Finds hidden emails.** It handles `mailto:` links, JSON-LD, Cloudflare email obfuscation, `name [at] domain (dot) com`, HTML entities, addresses split across tags, script-built strings, fullwidth and reversed text, and embedded page data.
- ✅ **Checked, not just scraped.** Every address is syntax-validated and then checked for an MX record (DNS only, no paid verification API), so addresses on dead domains sink to the bottom.
- 🏆 **A ranked best contact.** Named people at the company's own domain outrank `noreply@` and free-mail addresses. Name and role come from schema.org and from the text around the address, and inboxes like `sales@` are labeled.
- 🌐 **13 social networks:** Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, Discord, Snapchat, Threads, Telegram, Reddit and WhatsApp, canonicalized and deduplicated.
- ⚡ **Lightweight and fast.** It uses plain HTTP with no browser, defaults to 256 MB and checks 20 domains in parallel. It scans the home, contact, about, impressum and footer-linked pages.

### ⚡ Quick start

1. Paste domains or URLs into **Websites or domains**, one per line (`acme.com` or `https://acme.com/about` both work).
2. Click **Start**.
3. Export to CSV, Excel or JSON, or pull the dataset over the API.

```json
{ "urls": ["apify.com", "stripe.com", "basecamp.com"] }
```

### 📊 Sample output (real run, 23 Oct 2026)

This is one row from a local run on the three domains above, with empty social networks and the per-address detail arrays left out of the excerpt. MX checking was turned off for this local run (`validateMx: false`), so `mxValid` shows `null` here. With the default setting on, it is `true` or `false`.

```json
{
  "domain": "apify.com",
  "url": "https://apify.com/",
  "status": "ok",
  "emails": ["support@apify.com", "hello@apify.com"],
  "primaryEmail": "support@apify.com",
  "primaryEmailSyntaxValid": true,
  "primaryEmailMxValid": null,
  "phones": [],
  "primaryPhone": null,
  "socials": {
    "linkedin": ["https://www.linkedin.com/company/apify"],
    "twitter": ["https://x.com/apify"],
    "tiktok": ["https://www.tiktok.com/@apifytech", "https://www.tiktok.com/@apifyoffice"],
    "discord": ["https://discord.gg/jyEM2PRvMU", "https://discord.gg/w3e2v7rWDw"]
  },
  "contactRole": "customer support",
  "bestContact": {
    "email": "support@apify.com",
    "role": "customer support",
    "roleSource": "contactType",
    "reasons": ["same-domain", "role-inbox", "schema", "contact-page", "role"]
  },
  "pagesScanned": 3,
  "pages": ["https://apify.com/", "https://apify.com/contact", "https://apify.com/contact-sales"]
}
```

In the same run, `stripe.com` returned a phone number and five social networks, and `basecamp.com` returned a founder-role email from its About page.

### 💵 Pricing, in plain English

| Event | When it's charged | Price |
|---|---|---|
| `domain-with-contacts` | A domain where at least one email, phone or social profile was found | **$0.0029** |

That's **$2.90 per 1,000 domains with results**, and nothing for the rest. For example, 100 domains with contacts found on 70 cost $0.203. Platform usage is included.

### 💡 Use cases

- Enrich a list of company domains with emails and LinkedIn pages before a cold-email campaign
- Chain after a Google Maps or directory scraper to add contacts to local business leads
- Clean up a CRM: find missing phones, socials and a general inbox for each account
- Find press, partnerships or sales inboxes across a list of brands
- Pull Impressum contacts for German, Austrian and Swiss companies
- Give an AI agent a fast contact lookup tool through the Apify API or MCP server

### ❓ FAQ

**Do I pay for domains where nothing is found?**
No. Domains that return nothing, or that don't load, aren't charged.

**How many pages does it scan per domain?**
The home page plus contact, about and impressum pages, 3 by default and up to 10. Set it with **Max pages per domain**.

**Is the MX check a full email verification?**
No. It confirms the email's domain can receive mail. It doesn't check that the individual mailbox exists, and it never calls a paid verification API.

**Does it work on JavaScript-heavy sites?**
It uses plain HTTP and doesn't render JavaScript, which keeps it fast and cheap. Contact details already in the HTML, including JSON-LD and embedded framework data, are read. Contacts that only appear after scripts run may be missed.

**Can I use it from code, Zapier or an AI agent?**
Yes. Use the Apify API, the JavaScript/Python clients, Zapier, Make or the Apify MCP server.

**Is it legal?**
It reads publicly published contact information. You're responsible for using it lawfully (GDPR, CAN-SPAM and similar laws).

***

*Keywords: email extractor, website email scraper, contact info scraper, email finder by domain, bulk email finder, domain to email, phone number extractor, social media link scraper, LinkedIn company page finder, lead enrichment, contact details scraper, impressum scraper.*

***

**Built by [falcon.sol](https://x.com/ygfalcon)**: anon dev shipping pay-per-call data tools and x402 APIs for builders and agents. [X](https://x.com/ygfalcon) · [GitHub](https://github.com/ygfalcon) · [Apify](https://apify.com/falcon-sol)

# Actor input Schema

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

One per line: bare domains (acme.com) or full URLs. Duplicates are removed automatically. You're only charged for domains where a contact is found.

## `maxPagesPerDomain` (type: `integer`):

Pages scanned per domain: the home page first, then contact, about, impressum and footer-linked pages. 3 covers most sites.

## `concurrency` (type: `integer`):

How many domains to process at the same time. 20 is fast and polite. Lower it if a site rate-limits you.

## `chargeOnlyHits` (type: `boolean`):

Charge only for domains where at least one contact was found.

## `validateMx` (type: `boolean`):

After syntax checks, look up an MX record for each email domain. Lookups time out quickly, are cached for the run, and never call a paid verification API. Turn this off to skip DNS.

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

Off by default because most sites don't need it. Turn on the Apify proxy if many domains block or time out.

## Actor input object example

```json
{
  "urls": [
    "apify.com",
    "stripe.com"
  ],
  "maxPagesPerDomain": 3,
  "concurrency": 20,
  "chargeOnlyHits": true,
  "validateMx": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per domain with emails, phones and social profiles.

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("falcon-sol/website-email-extractor").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",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("falcon-sol/website-email-extractor").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"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call falcon-sol/website-email-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,falcon-sol/website-email-extractor"
        }
    }
}
```

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/SWixSZ71fOhYvoms3/builds/gasZ4qMu0Pm2Rj2gr/openapi.json
