# Website Contact & Email Extractor (`code-node-tools/website-contact-extractor`) Actor

Crawl a domain or list of URLs and extract emails, phone numbers, and social media handles. Cheerio-based crawling with configurable depth, proxies, and selectable extraction targets.

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

## Pricing

from $2.00 / 1,000 email founds

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

**Website Contact & Email Extractor** is a fast, no-code **email scraper** and **contact scraper** that crawls any website and pulls out **emails, phone numbers, and social media profiles**. Just paste a domain or a list of URLs, choose how deep to crawl, pick what to collect, and export a clean contact list to CSV, Excel, or JSON. It's the simplest way to **extract emails and contact details from a website** for lead generation, sales prospecting, and CRM enrichment.

Because it uses generic crawling (no website-specific selectors), it works across millions of sites with near-zero maintenance — point it at one site or thousands.

### What can the Website Contact & Email Extractor do?

- 📧 **Scrape email addresses** from `mailto:` links and visible page text
- 📞 **Extract phone numbers** from `tel:` links and page content
- 🔗 **Find social media profiles** — Facebook, Instagram, X/Twitter, LinkedIn, YouTube, TikTok, GitHub, Pinterest, Telegram, WhatsApp
- 🌐 **Crawl multiple websites** in a single run, each with its own page budget
- 🎚️ **Control the crawl** with per-site depth, max pages, and a max-results-per-category limit
- 🧹 **Get clean, deduplicated results** — one tidy record per domain
- 🔁 **Built-in proxy rotation and anti-blocking** via Apify Proxy
- 📤 **Export to CSV, Excel, JSON, or HTML**, or pull results straight from the Apify API

Like every Apify Actor, this tool comes with the full power of the **Apify platform**: scheduling, monitoring, a REST API, webhooks, proxy rotation, and integrations with Make, Zapier, Google Sheets, Slack, and more.

### What data can you extract from a website?

| Field               | Description                                   |
| ------------------- | --------------------------------------------- |
| `domain`            | The website the contacts belong to            |
| `emails`            | List of unique email addresses found          |
| `phones`            | List of unique phone numbers found            |
| `socials`           | Social profiles with `platform` and `url`     |
| `startUrl`          | The URL the crawl started from                |
| `pagesCrawled`      | How many pages were scanned for that domain   |
| `pagesWithContacts` | How many pages contained at least one contact |

### How to scrape emails and contact details from a website

1. Click **Try for free** to open the Actor.
2. Paste one or more **website URLs or domains** into the *Start URLs* field.
3. Set the **crawl depth** (1 is enough for most contact pages) and **max pages per domain**.
4. Tick the contact types you want: **emails**, **phones**, and/or **social profiles**.
5. Click **Start** and watch the results fill in.
6. **Export** your contact list as CSV, Excel, or JSON — or grab it via the API.

That's it. No code, no browser extensions, no selectors to maintain.

### Input

The Actor has a simple, point-and-click input — see the **Input** tab for every option. The main settings are start URLs, crawl depth, max pages per domain, max results per category, the email/phone/social toggles, and proxy configuration.

Example input:

```json
{
  "startUrls": [
    { "url": "https://example.com" },
    { "url": "another-site.com" }
  ],
  "maxCrawlDepth": 1,
  "maxPagesPerDomain": 50,
  "maxResultsPerCategory": 0,
  "extractEmails": true,
  "extractPhones": true,
  "extractSocials": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output example

You can download the dataset produced by the Website Contact & Email Extractor in JSON, CSV, Excel, or HTML. Each domain becomes one row:

```json
{
  "domain": "example.com",
  "startUrl": "https://example.com",
  "emails": ["hello@example.com", "sales@example.com"],
  "phones": ["+1 213 229 7475", "+44 20 7071 4189"],
  "socials": [
    { "platform": "linkedin", "url": "https://linkedin.com/company/example" },
    { "platform": "twitter", "url": "https://x.com/example" }
  ],
  "pagesCrawled": 24,
  "pagesWithContacts": 9
}
```

### How much does it cost to scrape contact details?

This Actor uses a transparent **pay-per-event** pricing model — you pay only for what it does, with no monthly rental fee:

| You pay for               | Price   |
| ------------------------- | ------- |
| Each page processed       | $0.0005 |
| Each email found          | $0.004  |
| Each phone number found   | $0.002  |
| Each social profile found | $0.001  |

As a rough guide, crawling a 30-page site that returns 15 emails, 8 phones, and 4 socials costs about **$0.10**. You only pay for unique, deduplicated results, and you can set a **maximum cost per run** so spending never surprises you. New Apify accounts include **free monthly usage credits**, so you can try it at no cost.

### Why use this email and contact scraper?

- 🚀 **Lead generation at scale** — build targeted B2B prospect lists from any set of websites
- 🧲 **CRM enrichment** — fill in missing emails, phones, and socials for your existing accounts
- 🔍 **Sales prospecting & outreach** — turn a list of company domains into a ready-to-contact list
- 🤖 **Automate it** — schedule recurring runs and push results to Google Sheets, your CRM, or any tool via the Apify API and integrations

### Other Apify Actors you might like

- **Shopify Store Product Scraper** — extract full product catalogs from any Shopify store
- **Sitemap Website Content Crawler** — turn a site's pages into clean markdown for RAG and AI pipelines

### Frequently asked questions

#### Is it legal to scrape contact details from websites?

This Actor collects **publicly available** contact information that website owners have chosen to publish. However, emails and phone numbers can be personal data, which is protected by **GDPR** in the EU, **CCPA** in California, and similar laws elsewhere. You should only collect and use this data when you have a legitimate, lawful basis to do so. If you're unsure, consult a legal professional.

#### Why didn't it find a phone number (or any contacts) on some sites?

The Actor reads a site's raw HTML, which keeps it fast and cheap. Contact details that are rendered only by client-side JavaScript, hidden behind forms, or shown as images won't be captured. Many modern SaaS sites also simply don't publish a phone number. Increasing the crawl depth often surfaces a dedicated contact page.

#### Can I crawl deeper or limit the results?

Yes. Use **Max crawl depth** to follow more link levels, **Max pages per domain** to cap the crawl size, and **Max results per category** to keep, say, only the top 5 emails, phones, and socials per site.

#### Should I use a proxy?

We recommend keeping **Apify Proxy** enabled so requests aren't all sent from a single IP. Datacenter proxies are cheapest and work for most sites; switch to residential for stricter targets.

#### Can I get the data through an API?

Absolutely. Every run stores results in an Apify dataset that you can fetch via the **Apify API**, connect to integrations, or schedule to run automatically.

#### How do I report a bug or request a feature?

Use the **Issues** tab on the Actor page. We welcome feedback and feature requests.

***

<sub>For developers: this Actor is built on Crawlee's `CheerioCrawler` (HTTP + Cheerio, no headless browser) for low memory use and high reliability. Run it locally with the [Apify CLI](https://docs.apify.com/cli/) using `apify run`.</sub>

# Actor input Schema

## `startUrls` (type: `array`):

One or more websites to crawl. Paste full URLs (https://example.com) or bare domains (example.com). Each site is crawled independently up to the configured depth.

## `maxCrawlDepth` (type: `integer`):

How many link levels to follow from each start URL. 0 = only scrape the given URLs, 1 = also follow links found on them, etc. Higher depth finds more contacts but costs more.

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

Hard cap on the number of pages crawled for each domain. Protects you from runaway crawls and keeps cost predictable.

## `maxResultsPerCategory` (type: `integer`):

Maximum number of results to keep for EACH category (emails, phones, socials) per domain. For example, 5 keeps at most 5 emails, 5 phones, and 5 socials per site. Set to 0 for unlimited.

## `extractEmails` (type: `boolean`):

Find email addresses (from mailto: links and page text).

## `extractPhones` (type: `boolean`):

Find phone numbers (from tel: links and page text).

## `extractSocials` (type: `boolean`):

Find links to Facebook, Instagram, X/Twitter, LinkedIn, YouTube, TikTok, GitHub, Pinterest, Telegram, and WhatsApp.

## `sameDomainOnly` (type: `boolean`):

Only follow links that stay within the same domain as the start URL. Strongly recommended to avoid crawling the entire internet.

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

Maximum number of pages fetched in parallel. 10 is a good default for HTTP crawling. Lower it if a target site rate-limits you.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single page before giving up.

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

Proxy settings. Apify Proxy with datacenter IPs is recommended for reliability and to avoid IP blocks. Residential proxies help on stricter sites.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    }
  ],
  "maxCrawlDepth": 1,
  "maxPagesPerDomain": 50,
  "maxResultsPerCategory": 0,
  "extractEmails": true,
  "extractPhones": true,
  "extractSocials": true,
  "sameDomainOnly": true,
  "maxConcurrency": 12,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://apify.com"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("code-node-tools/website-contact-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 = {
    "startUrls": [{ "url": "https://apify.com" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("code-node-tools/website-contact-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 '{
  "startUrls": [
    {
      "url": "https://apify.com"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call code-node-tools/website-contact-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/puYZDD2eheieya0a2/builds/RLwSQeywnUwUP7lhh/openapi.json
