# Website Email Extractor: Emails, Phones & Socials from URLs (`plainrows/website-email-extractor`) Actor

Paste a list of websites, get the e-mails, phone links and social profiles each one publishes (homepage, then its contact or legal pages). A Hunter.io alternative for published e-mails: no browser, robots.txt respected. Pay per website where contacts are found, plus a small start fee per run.

- **URL**: https://apify.com/plainrows/website-email-extractor.md
- **Developed by:** [PlainRows](https://apify.com/plainrows) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 website 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.
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

## Website Email Extractor: Emails, Phones & Socials from URLs

Paste a list of websites and get, for each one, **the e-mails, phone numbers and social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok) it publishes**. The homepage is read first; when it shows no e-mail, up to two contact, imprint or legal pages linked from it are read too. Up to 10,000 websites per run.

**No browser, no proxies**: plain HTTP requests, 10 websites at a time, a few seconds each, **robots.txt respected**. **You pay only per website where contacts were found, plus $0.002 per run start.** Websites with nothing found, unreachable sites and sites that object to solicitation are free.

### Typical uses

- **Lead lists**: turn a list of company domains (from a CRM export, a directory, Google Maps or a tech-stack search) into contact e-mails and LinkedIn pages.
- **Agencies and freelancers**: find how to reach the businesses you want to pitch.
- **CRM enrichment**: fill missing e-mails, phones and social links for the accounts you already have.
- **Automations and AI agents**: feed n8n, Make, Zapier, Google Sheets, HubSpot or an MCP client with structured JSON.

### What you get for each website

| Field | Description |
|---|---|
| `domain` | The website read (your input, normalized to its domain) |
| `email`, `emails` | First e-mail and all e-mails found (up to 10), the site's own domain first |
| `phones` | Phone numbers from `tel:` links and structured data (up to 5) |
| `facebookUrl`, `instagramUrl`, `linkedinUrl`, `xUrl`, `youtubeUrl`, `tiktokUrl` | Social profiles linked from the site |
| `pagesChecked` | Pages read on the site |
| `status`, `message` | `FOUND` (billed), or why not: `NONE_FOUND`, `NO_EMAIL` (with **onlyWithEmail**), `OPTED_OUT`, `DNS_NOT_FOUND`, `TIMEOUT`, `HTTP_ERROR`, `BLOCKED_BY_BOT_PROTECTION`, `ROBOTS_TXT_DISALLOWED`... (free) |
| `found`, `optOut`, `observedAt` | Whether contacts were found, whether the site objects to solicitation, when it was read (UTC) |

Missing values are `null` (lists are empty), never guessed. One row per website, in the dataset view **Contacts** as a ready-to-export table.

### Input

```json
{
  "domains": ["apify.com", "https://stripe.com/contact", "example-bakery.co.uk"],
  "onlyWithEmail": false
}
```

- **domains**: one website per line, as a domain or any URL of the site (it is reduced to its domain). Up to 10,000 per run; duplicates are removed and invalid lines are listed in the run summary.
- **onlyWithEmail** (default off): return and bill only websites where at least one e-mail was found; websites with only phones or social profiles come back as free rows (`NO_EMAIL`).

### Output example

Real row from a run on 2026-10-13 (input `apify.com`):

```json
{
  "domain": "apify.com",
  "found": true,
  "email": "support@apify.com",
  "emails": [
    "support@apify.com"
  ],
  "phones": [],
  "facebookUrl": null,
  "instagramUrl": null,
  "linkedinUrl": "https://www.linkedin.com/company/apify",
  "xUrl": "https://x.com/apify",
  "youtubeUrl": null,
  "tiktokUrl": "https://www.tiktok.com/@apifytech",
  "pagesChecked": [
    "https://apify.com/"
  ],
  "optOut": false,
  "status": "FOUND",
  "message": null,
  "observedAt": "2026-10-13T18:49:42.830Z",
  "schemaVersion": "1.0"
}
```

### How the contacts are found

- **At most 3 pages per website**: the homepage, then, only when it shows no e-mail, up to two pages linked from it whose link or address says contact, imprint or legal (team, people and about pages are skipped). Pages are read without JavaScript, within 45 seconds per site.
- **robots.txt is respected**, private network addresses are refused, pages over 2 MB are cut, bot-protection pages are reported as `BLOCKED_BY_BOT_PROTECTION` (free).
- **A site that objects to solicitation** or to the commercial use of its contact details (English, German, French notices) returns no contact (`OPTED_OUT`) and is not billed.
- Only what the website itself publishes: no guessed e-mail patterns, no personal-data lookups elsewhere, no verification by sending mail.

### Pricing

See the **Pricing** tab for current prices, cheaper on higher Apify plans:

- one event per **website where contacts were found** (all its e-mails, phones and social profiles included); with **onlyWithEmail**, only websites with an e-mail are billed;
- $0.002 per run start.

Websites with nothing found, unreachable or blocked sites, sites that object to solicitation, duplicates and input mistakes cost nothing beyond the start fee. The run never spends more than the maximum cost you set.

**Free Apify plan:** each run reads up to 10 websites, so you can check the output. A paid Apify plan removes this limit.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~website-email-extractor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["apify.com", "stripe.com"]}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/website-email-extractor`, and map the dataset items to Google Sheets, HubSpot, Airtable or your database.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/website-email-extractor` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

### What this is not

- **Not an e-mail finder by person name** and not an e-mail verifier: only addresses the website publishes.
- **Not a crawler**: at most 3 pages per site. E-mails shown only after JavaScript runs, or deep inside a site, are not found.
- You are responsible for how you contact the businesses: follow the anti-spam and privacy rules of your country and theirs (for example CAN-SPAM, GDPR).

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): websites with contacts (billed), websites by status (nothing found, opted out, unreachable...), duplicates and invalid lines, and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I extract e-mails from a list of websites?**
Paste the websites, one per line, and run. Each website comes back with its e-mails, phones and social profiles; download as CSV or Excel from the run page, or send them to Google Sheets or your CRM with n8n, Make or Zapier.

**Why do some websites have no e-mail?**
Many sites publish only a contact form, or load their contact details with JavaScript. Those come back as `NONE_FOUND` and are not billed. A site with only a phone number or social profiles is billed as a site with contacts, unless you turn on **onlyWithEmail**.

**I only have business names or a Google Maps search, not websites.**
Use [Google Maps Email Extractor](https://apify.com/plainrows/google-maps-email-extractor): it finds the businesses on Google Maps and reads their websites in the same run.

**Do I need proxies or a browser?**
No. Pages are read with plain HTTP requests from Apify's servers.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Google Maps Email Extractor](https://apify.com/plainrows/google-maps-email-extractor) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Workday Jobs Scraper](https://apify.com/plainrows/workday-jobs-scraper) · [Greenhouse Jobs Scraper](https://apify.com/plainrows/greenhouse-jobs-scraper) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews) · [Trustpilot Reviews Scraper](https://apify.com/plainrows/trustpilot-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

### Support

Missing a field or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

## `domains` (type: `array`):

One website per line: a domain (acme.com) or any URL of the site (https://www.acme.com/about). The homepage is read, then up to two contact, imprint or legal pages when it shows no e-mail. Up to 10,000 websites per run; duplicates are removed.

## `onlyWithEmail` (type: `boolean`):

Return and bill only websites where at least one e-mail was found. Websites with only phone numbers or social profiles then come back as free rows (status NO_EMAIL).

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "stripe.com"
  ],
  "onlyWithEmail": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "domains": [
        "apify.com",
        "stripe.com"
    ]
};

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

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

```

## MCP server setup

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