# Website Email & Contact Scraper — Bulk Email Finder (`dev_web_col/email-scraper`) Actor

Extract emails, phone numbers and social profiles from any list of websites. Own-domain emails first, no browser, no API key.

- **URL**: https://apify.com/dev\_web\_col/email-scraper.md
- **Developed by:** [Diseño Web de Colombia](https://apify.com/dev_web_col) (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 site scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Email & Contact Scraper — Bulk Email Finder

**Paste a list of websites. Get the emails, phones and social profiles they publish.**

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

### Call it as an API

One website in, one row out, in a single HTTP call — no polling.

```bash
curl -X POST "https://api.apify.com/v2/acts/dev_web_col~email-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "basecamp.com"}'
```

```python
import requests

r = requests.post(
    "https://api.apify.com/v2/acts/dev_web_col~email-scraper/run-sync-get-dataset-items",
    params={"token": "YOUR_TOKEN"},
    json={"url": "basecamp.com"},
)
site = r.json()[0]
print(site["ownDomainEmails"], site["phones"], site["linkedin"])
```

Pass `urls` instead of `url` to process a whole list in one call.

### What makes this one different

**Own-domain emails are separated out.** A row gives you `emails` (everything
found) and `ownDomainEmails` (only `@thatdomain`). An `info@the-agency-that-built-
their-site.com` is not the same asset as `sales@theircompany.com`, and most
scrapers hand you both in one undifferentiated list.

**Phones come only from `tel:` links.** Measured: a plain regex over page text
returned 10 to 24 "phone numbers" per site — dates, order IDs, random figures.
This Actor reports fewer numbers and every one of them is real.

**No browser.** Runs in seconds and peaks at 165 MB, which matters because Apify
bills memory multiplied by time.

**Placeholder addresses are filtered.** `name@company.com`, `you@example.com` and
platform addresses from Wix, Squarespace, Shopify and Sentry are dropped. Those
are the fake contacts that inflate other tools' hit rates.

### What you can use it for

| What you want | How to ask for it |
|---|---|
| **Email finder** for a prospect list | `urls: [...]` from your CRM export |
| **Lead generation** from a directory you already have | `onlyWithEmail: true` so you only pay for usable rows |
| **Contact scraper** for outbound campaigns | Read `ownDomainEmails` — the ones worth sending to |
| **Social profile discovery** | LinkedIn, Twitter/X, Facebook, Instagram, YouTube per site |
| **CRM enrichment** — fill contact columns | One call per domain from your own code |
| **Agency prospecting** — qualify a list fast | `found: false` tells you which sites publish nothing |
| **Conference or directory lists** | Paste the exhibitor URLs, get contacts |
| **Phone number collection** | `phones`, from `tel:` links only |

### Hit rates, measured — not the best case

This is the number other email scrapers do not publish. Measured on real runs:

| Segment | Sites | With an email | With own-domain | With phone | With socials |
|---|---|---|---|---|---|
| **Small and local business sites** | 19 | **47%** | 37% | 42% | 74% |
| **Large corporate sites** | 6 | **33%** | 33% | 33% | 83% |

**Small businesses publish their email. Large companies hide it behind a contact
form.** If your list is agencies, restaurants, clinics or local services, expect
roughly half. If it is enterprise domains, expect a third, and lean on the social
profiles instead — those come back 74-83% of the time either way.

Run 20 URLs first and check the rate on *your* list before committing to a big job.

### Honest limits

- **It reads what the site publishes.** No pattern guessing, ever. This Actor
  will never invent `firstname.lastname@company.com` — invented addresses bounce,
  burn your sending domain, and are worse than an empty field.
- **Up to 5 pages per site**: `/`, `/contact`, `/contact-us`, `/contacto`,
  `/about`. It stops at the first page with an email. It is not a full crawl,
  which is why it is cheap.
- **Expect generic inboxes.** `info@`, `hello@`, `sales@` — not named individuals.
- **A run stops after about 3.5 minutes** and delivers what it has, so Apify's
  automated checks never time it out. Split large lists across runs.
- **Sites behind Cloudflare or a login return nothing.** Those rows come back
  with `found: false` rather than an error.
- **No personal data beyond what the site publishes itself** on a public page.

### FAQ

#### Do I need an API key or an account anywhere?

No. It reads public web pages, the same ones any visitor sees.

#### Is it legal to scrape emails from websites?

Scraping publicly published information is broadly accepted as legal. What you do
with the addresses afterwards is a separate question — GDPR, CAN-SPAM and CCPA
regulate outreach, and a published email is still personal data in the EU. Take
advice before running a campaign.

#### Why do I get fewer emails than another tool promises?

Because this one does not invent them. Tools that guarantee an address for every
domain are guessing `firstname@company.com` patterns. Those bounce and hurt your
sender reputation. The rates above are what websites actually publish.

#### Why so few phone numbers?

Because they come only from `tel:` links, which are unambiguous. A regex over
page text finds 10-24 "numbers" per site and almost all are junk. Precision beats
volume when the output goes into a dialler.

#### What does `ownDomainEmails` mean?

Addresses ending in the domain you asked about. If you scan `acme.com` and the
site lists `info@acme.com` and `hello@theiragency.com`, only the first is an
own-domain email — and it is the one worth contacting.

#### Can I export to Excel, CSV or Google Sheets?

Yes. Every run's dataset downloads as CSV, Excel, JSON or XML from the **Storage**
tab, and Apify integrates with Google Sheets, Airtable, Zapier, Make and Slack.

#### Can I run it on a schedule?

Yes, from the **Schedules** tab. Useful for re-checking a list whose sites change.

#### A site I know has an email came back empty. Why?

Most likely it is behind a contact form, rendered by JavaScript, or on a page
outside the five this Actor checks. Look at `pagesChecked` in the row to see how
far it got.

### Related Actors

- **Local Business Email & Contact Scraper** — when you do not have the URL list
  yet and want to build it from a city and a business category.
- **Company Data Scraper** — when you also want firmographics, headcount and a
  hiring signal alongside the emails.

### Where the data comes from

The public pages of the websites you provide. No login, no API key, no third-party
database.

# Actor input Schema

## `url` (type: `string`):

One website, for when you call this Actor as an API from your own code — one call in, one row out. For a list, use the field below instead.

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

A list of websites, one per line. Paste them straight from a CRM or a spreadsheet — https://, www. and trailing paths are all stripped for you, and duplicates by domain are removed.

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

Drops rows where no email was found, so you only pay for usable contacts. Leave it off if phone numbers and social profiles are useful to you too.

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

Optional. Most sites answer fine without it. Turn it on if you are scanning hundreds of sites or hitting ones that block datacenter IPs.

## Actor input object example

```json
{
  "url": "basecamp.com",
  "onlyWithEmail": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `contacts` (type: `string`):

One dataset item per website.

# 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 = {
    "url": "basecamp.com",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dev_web_col/email-scraper").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 = {
    "url": "basecamp.com",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dev_web_col/email-scraper").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 '{
  "url": "basecamp.com",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call dev_web_col/email-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/58zeQBe3JhEkte9tQ/builds/P8ihae4B45Qyn43k2/openapi.json
