# Email Extractor (`gordian/email-extractor`) Actor

Find and extract email addresses from any website in seconds. This actor will crawl entire websites and return all emails after validation. Easy to use and extremely fast.

- **URL**: https://apify.com/gordian/email-extractor.md
- **Developed by:** [Gordian](https://apify.com/gordian) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 1,057 total users, 33 monthly users, 99.1% runs succeeded, 8 bookmarks
- **User rating**: 1.12 out of 5 stars

## Pricing

from $1.00 / 1,000 page crawleds

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?

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

Email Extractor is an Apify Actor that finds and collects email addresses from web pages you provide, with an option to follow links and discover more emails.

> **💰 You pay per page crawled, not per email found.** Every page the Actor opens is charged as one "Page crawled" event, including pages without emails. By default only the URLs you list are checked (one charged page per URL). If you turn on **Crawl linked pages**, up to **Max pages per start URL** (default 10) pages per URL are crawled and charged.

### 🎯 Why extract emails?

Use cases include:

- Lead generation and outreach lists
- Finding contact emails for support, press, or careers pages
- Verifying public contact details across a site
- Compliance and due‑diligence checks

### ✨ What can Email Extractor do?

This Actor:

- Checks the URLs you provide and, optionally, follows links on the same website (capped per start URL)
- Extracts emails from full page HTML (not just visible text)
- Validates the email domain TLD against the official IANA list for better accuracy
- Deduplicates results across the whole run
- Records both the page where an email was found and the original source URL you submitted

### 🚀 How to run

Run on Apify Console:

1. Create a free Apify account: https://console.apify.com/sign-up
2. Click “Try for free” on this actor
3. Fill the input (see example below)
4. Click Start and wait for the run to finish
5. Download results (JSON, CSV, Excel) from the Dataset tab

### 💡 Output data

Each dataset item contains:

| Field | Description |
|-------|-------------|
| email | The extracted email address |
| url | Page URL where the email was found |
| sourceUrl | One of your input URLs from which this crawl originated |

#### Output example

```json
{
    "email": "hello@apify.com",
    "url": "https://apify.com/resources/nonprofits",
    "sourceUrl": "https://apify.com"
}
```

### 📥 Input

The Actor accepts these input parameters:

- `urls` (array, required): One or more page URLs to scan
- `crawl` (boolean, optional, default: `false`): Also follow links on the same website to find more emails. **Every crawled page is charged.**
- `maxPagesPerStartUrl` (integer, optional, default: `10`): Only used when `crawl` is on. Maximum number of pages crawled and charged per start URL, including the start URL itself.

#### Input example

```json
{
    "urls": [
        "https://apify.com"
    ],
    "crawl": true,
    "maxPagesPerStartUrl": 10
}
```

### 💰 How much does it cost to extract emails?

This Actor charges per **page crawled** (see the "Pricing" tab for your plan's price per 1,000 pages). The number of emails found doesn't change the price.

- **Crawl off (default):** one charged page per URL you provide. 500 URLs = 500 charged pages.
- **Crawl on:** up to `maxPagesPerStartUrl` charged pages per URL. 500 URLs with the default cap of 10 = up to 5,000 charged pages.

To keep costs predictable, test on a few URLs first and set a **Max cost per run** in the run options. The run stops when that limit is reached.

With Apify's free tier, you get $5 of platform credits monthly for free, which you can use to test this actor for free.

Do you need to scrape more? [Upgrade to a paid plan](https://apify.com/pricing?fpr=7p4wu) which includes more platform credits and discounted pricing.

Tip 1: Provide multiple URLs in your input, that way you only pay the actor start cost once.

Tip 2: If you are doing a large run, consider increasing the RAM used per run to scrape faster. When doing a small run decrease the RAM used to reduce the actor start costs.

Tip 3: Upgrade to a higher plan to get discounted pricing. Link: [https://apify.com/pricing](https://apify.com/pricing?fpr=7p4wu)

### 🔗 Integrations

This Actor integrates seamlessly with:

- **Automation platforms** - Build no code workflows with [Make.com](https://www.make.com/en/register?pc=louisdeconinck), n8n, and Zapier
- **Webhooks** - Trigger actions when scraping completes through [webhooks](https://docs.apify.com/platform/integrations/webhooks?fpr=7p4wu)
- **Schedulers** - Run daily/weekly to track group growth with Apify's [Scheduler](https://docs.apify.com/schedules?fpr=7p4wu)
- **API** - Start runs and access data programmatically with the [Apify API](https://docs.apify.com/api/v2#/reference/actors/run-collection/run-actor?fpr=7p4wu)
- **Google Sheets** - Export directly to spreadsheets

### 👥 Who made this Actor?

Gordian is a specialised Apify web scraping agency founded by Louis Deconinck.

Louis is a top 1% Apify developer, Oxford University IT graduate, and creator of 70+ scrapers used by 1,000+ data professionals every month. He has scraped 10,000,000+ pages bypassing the most advanced anti-scraping protections.

- Apify AI Agent Hackathon Winner
- 300+ contributions in Apify Discord
- Former senior data engineer in EU banking

Looking for a custom data solution? Get in touch.

### ❓ FAQ

#### Do you validate emails?

We validate the top‑level domain against the official IANA list, deduplicate results and verify correct syntax.

#### Is it legal to scrape emails?

Yes, web scraping publicly available data is legal. This scraper only extracts information that is publicly visible.

For more information on web scraping legality, read this blog post: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal?fpr=7p4wu)

#### Can I export data to CSV or Excel?

Yes, Apify supports exporting dataset results in multiple formats: JSON, CSV, Excel (XLSX), HTML, XML and RSS.

#### How do I get started?

[Make a free Apify account](https://console.apify.com/sign-up?fpr=7p4wu) to claim your free $5 usage and start scraping today by clicking "Try for free".

# Actor input Schema

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

List of page URLs to check for emails. Each URL checked is one charged 'Page crawled' event (the price is per page, not per email found).

## `crawl` (type: `boolean`):

Off by default: only the URLs you list are checked, so you pay for exactly one page per URL. If on, the Actor also follows links on the same website (up to <b>Max pages per start URL</b>) to find more emails. <b>Every crawled page is charged as a 'Page crawled' event, whether or not it contains an email</b>, so a run with crawl on can cost up to Max pages per start URL times more.

## `maxPagesPerStartUrl` (type: `integer`):

Only used when Crawl is on. The maximum number of pages crawled (and charged) per start URL, including the start URL itself. Example: 100 start URLs with a cap of 10 is at most 1,000 charged pages.

## `email` (type: `string`):

Your email address

## Actor input object example

```json
{
  "urls": [
    "https://apify.com"
  ],
  "crawl": false,
  "maxPagesPerStartUrl": 10
}
```

# 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://apify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gordian/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://apify.com"] }

# Run the Actor and wait for it to finish
run = client.actor("gordian/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": [
    "https://apify.com"
  ]
}' |
apify call gordian/email-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gordian/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/LOnZuDhS6d1WRM5ov/builds/Q70EhrHEpcyrgqd9m/openapi.json
