# Email Extractor — Website Email, Phone & Social Scraper (`aitorsm/email-extractor`) Actor

Bulk email & phone extractor for a list of websites. Paste URLs or domains, get back deduped emails, phone numbers, and social links per site — homepage plus contact/about pages, junk filtered. For lead lists, CRM enrichment, and outreach.

- **URL**: https://apify.com/aitorsm/email-extractor.md
- **Developed by:** [Aitor Sanchez-Mansilla](https://apify.com/aitorsm) (community)
- **Categories:** Lead generation, Automation, E-commerce
- **Stats:** 86 total users, 45 monthly users, 99.6% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 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/platform/actors/running/actors-in-store#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

## Email Extractor — Website Email, Phone & Social Scraper

[![Email Extractor status](https://apify.com/actor-badge?actor=aitorsm/email-extractor)](https://apify.com/aitorsm/email-extractor)

**Extract emails from a list of websites** in one run. Give this email extractor a few hundred company or business domains and get back clean, deduped **email addresses, phone numbers, and social-media links** — ready for lead-gen lists, CRM enrichment, or research.

No setup, no per-site configuration. Give it URLs, get contacts.

### Why this email extractor

- **Bulk + parallel** — feed it hundreds of domains; it fetches many in parallel, so a big batch finishes in minutes, not hours.
- **Emails, phones, *and* socials** — not just an address: phone numbers and social links (Instagram, Facebook, LinkedIn, X, YouTube, TikTok) in the same record.
- **Multi-page** — reads each site's homepage plus its `/contact` and `/about` pages, where contact details actually live.
- **Clean output** — deduped and junk-filtered (drops `noreply@`, asset filenames, placeholder domains); one tidy record per site.
- **No per-contact metering, no contract** — pay per site scanned, point it at your own list, and keep everything you find.

### Email extractor

For each URL you provide, this email extractor:

1. Reads the page's published contact details.
2. Optionally also checks the same site's **/contact**, **/contact-us**, **/about**, and **/about-us** pages — where businesses usually publish their email and phone.
3. Returns a single tidy record per input URL with every email, phone, and social link it found, deduped.

It processes **many pages in parallel**, so a big batch of websites finishes in a fraction of the time a one-at-a-time scan would take.

### Website email & contact scraper — use cases

- **Email extraction at scale** — turn a list of website domains into a clean list of email addresses.
- **Lead generation** — turn a list of business domains into a contact list.
- **CRM enrichment** — fill in missing email / phone / social fields for accounts you already have.
- **Market & competitor research** — collect public contact and social presence across a set of sites.
- **Outreach prep** — find the right email and social handles before reaching out.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | array of strings | — (required) | Pages or domains to scan. Bare domains like `example.com` get `https://` added automatically. |
| `maxConcurrency` | integer | `10` | How many pages to fetch in parallel. Raise it for big batches; lower it if you hit rate limits. |
| `crawlContactPages` | boolean | `true` | Also scan each site's `/contact`, `/contact-us`, `/about`, `/about-us`. Best coverage; turn off for a single-page scan. |
| `maxItems` | integer | unlimited | Cap the number of input URLs processed. |
| `maxRequestsPerMinute` | integer | `300` | Overall limit on how many pages are fetched per minute. |

#### Example input

```json
{
  "urls": [
    "https://acme-coffee.com",
    "blue-fox-studio.com",
    "https://example-agency.com/contact"
  ],
  "maxConcurrency": 10,
  "crawlContactPages": true
}
```

### Output

One record per input URL:

```json
{
  "url": "https://acme-coffee.com",
  "finalUrl": "https://acme-coffee.com/",
  "emails": ["hello@acme-coffee.com"],
  "phones": ["+15551234567"],
  "socials": {
    "instagram": ["https://instagram.com/acmecoffee"],
    "facebook": ["https://facebook.com/acmecoffee"],
    "twitter": [],
    "linkedin": ["https://www.linkedin.com/company/acme-coffee"],
    "youtube": [],
    "tiktok": []
  },
  "otherUrls": ["https://acme-coffee.com/menu"],
  "pagesScanned": ["https://acme-coffee.com/", "https://acme-coffee.com/contact", "https://acme-coffee.com/about"],
  "scrapedAt": "2026-06-20T10:00:00.000Z"
}
```

| Field | Description |
|---|---|
| `url` | The URL you supplied. |
| `finalUrl` | Where it landed after redirects. |
| `emails` | Deduped, junk-filtered email addresses (drops `noreply@`, asset filenames, placeholder domains, etc.). |
| `phones` | Deduped, loosely normalized phone numbers. |
| `socials` | Links grouped by platform: `instagram`, `facebook`, `twitter`, `linkedin`, `youtube`, `tiktok`. |
| `otherUrls` | Other outbound links found on the page (non-social, non-asset). |
| `pagesScanned` | Which pages were actually read for this record. |
| `scrapedAt` | ISO timestamp of the scan. |

### Cost

**Pay-per-result: $4 per 1,000 websites scanned** (≈ $0.004 per input URL), with automatic volume discounts down to **$2 per 1,000** at higher usage tiers. Platform usage costs are included — the price you see is all you pay — and you're charged once **per input URL**, regardless of how many contact/about pages it reads for that site.

**For comparison:** per-contact data tools (Apollo, Hunter, Lusha) charge **$0.40–0.80 per verified contact** — roughly **$400–800 to cover 1,000 sites** — and their coverage thins out on smaller, independent domains. This extractor reads what each site already publishes, so 1,000 sites costs a few dollars, not a few hundred. It's a different tool for a different job: bulk public-contact extraction over *your* list, not metered per-contact lookups.

### FAQ

#### How do I extract emails from a list of websites?

Paste your website or domain list into the `urls` field and run the actor. Each URL is read for published email addresses, phone numbers, and social links, and you get one deduped record per input URL. With `crawlContactPages` on (the default), it also checks each site's contact and about pages, where contact details are most often published.

#### Email extractor vs an API?

An email-finder API typically charges per lookup and returns a single guessed address per domain. This email extractor reads what each website actually publishes — every email, phone, and social link present on the page and its contact/about pages — in one bulk run, deduped, with no per-contact metering and no contract. You point it at your own list and get back exactly what's public on those sites.

#### Does it get phone numbers and social links too?

Yes. Alongside emails, every record includes deduped phone numbers and social-media links grouped by platform (`instagram`, `facebook`, `twitter`, `linkedin`, `youtube`, `tiktok`), plus any other outbound links found. It's a full website email and contact extractor, not just emails.

#### What kind of websites work best?

Conventional content and business sites where contact details are published in the page. Pages that only reveal contacts after heavy in-browser loading may show less. All extracted data is public information published on the pages you point it at.

### Related Actors

Pair these with the email extractor to turn event listings into contactable leads — the event actors give you organizer and venue websites, and this actor enriches them with emails, phones, and socials:

- [Eventbrite Scraper](https://apify.com/aitorsm/eventbrite) — event and organizer data, including organizer websites.
- [Luma Events](https://apify.com/aitorsm/luma-events) — event and host data from Luma.
- [Posh Events](https://apify.com/aitorsm/posh-events) — event and host data from Posh.

# Actor input Schema

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

Pages or domains to scan. Each entry is fetched and parsed for contact details. Bare domains (e.g. "example.com") get an https:// prefix automatically.

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

How many pages to fetch in parallel. Higher = faster on big batches; lower if you hit rate limits.

## `crawlContactPages` (type: `boolean`):

When on, the actor also fetches same-domain /contact, /contact-us, and /about pages for each input URL — where businesses usually publish their email and phone. Slightly more requests, much better coverage.

## `maxItems` (type: `integer`):

Maximum number of input URLs to process. 0 or empty = no limit.

## `maxRequestsPerMinute` (type: `integer`):

Global throttle across all concurrent requests. Lower it to be gentler on slow hosts.

## Actor input object example

```json
{
  "urls": [
    "https://www.crawlee.dev",
    "https://apify.com/contact"
  ],
  "maxConcurrency": 10,
  "crawlContactPages": true,
  "maxRequestsPerMinute": 300
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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": [
        "https://www.crawlee.dev",
        "https://apify.com/contact"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aitorsm/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": [
        "https://www.crawlee.dev",
        "https://apify.com/contact",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aitorsm/email-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "https://www.crawlee.dev",
    "https://apify.com/contact"
  ]
}' |
apify call aitorsm/email-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=aitorsm/email-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/imgrIT3U6YRJpLM6W/builds/2ht6DusNQrvucpYP9/openapi.json
