# Website Email Contact Scraper (`omkar-cloud/website-email-contact-scraper`) Actor

Website Email & Contact Scraper to extract emails, phone numbers & social profiles from any website. Export contact data as JSON, CSV, or Excel.

- **URL**: https://apify.com/omkar-cloud/website-email-contact-scraper.md
- **Developed by:** [Chetan Jain](https://apify.com/omkar-cloud) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 514 total users, 1 monthly users, 100.0% runs succeeded, 8 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$5.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.

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 — Extract Emails, Phones & Social Profiles

Scrape emails, phone numbers, social media profiles, and the tech stack of any website — no coding required.

Paste website URLs into this contact scraper, click Start, and get **one clean, merged JSON record per website**: every email and phone number with the pages it was found on, social profiles across 17 platforms, and the technologies the site runs on — with the company's real contact flagged `is_likely_official`.

Works on any website — JavaScript-heavy and bot-protected sites included — and exports to JSON, CSV, or Excel in one click.

**Rated Excellent — 4.6 based on 25 reviews** on [Trustpilot](https://www.trustpilot.com/review/omkar.cloud).

### Output example: website contact data in JSON

Each website becomes one dataset item. Here is a trimmed result for `vercel.com`:

```json
{
  "input": "vercel.com",
  "domain": "vercel.com",
  "title": "Agentic Infrastructure - Vercel",
  "description": "The autonomous stack for every app and agent.",
  "emails": [
    {
      "value": "privacy@vercel.com",
      "sources": [
        "https://vercel.com/legal/privacy-notice",
        "https://vercel.com/legal/cookie-policy"
      ],
      "is_likely_official": true
    },
    {
      "value": "security@vercel.com",
      "sources": ["https://vercel.com/legal/terms"],
      "is_likely_official": false
    }
  ],
  "phones": [],
  "phones_uncertain": [
    { "value": "800.352.5267", "sources": ["https://vercel.com/legal/terms"] }
  ],
  "linkedins": [
    {
      "value": "https://www.linkedin.com/company/vercel",
      "sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
      "is_likely_official": true
    }
  ],
  "twitters": [
    {
      "value": "https://x.com/vercel",
      "sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
      "is_likely_official": true
    }
  ],
  "instagrams": [
    {
      "value": "https://www.instagram.com/vercel",
      "sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
      "is_likely_official": true
    }
  ],
  "youtubes": [
    {
      "value": "https://www.youtube.com/@VercelHQ",
      "sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
      "is_likely_official": true
    }
  ],
  "githubs": [
    {
      "value": "https://github.com/vercel",
      "sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
      "is_likely_official": true
    }
  ],
  "blueskys": [
    {
      "value": "https://bsky.app/profile/vercel.com",
      "sources": ["https://vercel.com/docs/accounts"],
      "is_likely_official": true
    }
  ],
  "technologies": [
    { "name": "Next.js", "versions": [], "categories": ["Web frameworks", "Web servers"] },
    { "name": "Node.js", "versions": [], "categories": ["Programming languages"] },
    { "name": "React", "versions": [], "categories": ["JavaScript frameworks"] },
    { "name": "Vercel", "versions": [], "categories": ["Web servers"] }
  ],
  "error": null
}
```

*Trimmed for readability — the full record covers 17 social platforms*

### What data does the Website Email & Contact Scraper extract?

| Data group | Fields |
|------------|--------|
| Emails | Every address the site exposes — including obfuscated ones like `name [at] company [dot] com` — with source pages and the official one flagged |
| Phone numbers | Validated, region-aware numbers in `phones`; loose matches kept separate in `phones_uncertain` so your CRM stays clean |
| Social profiles | LinkedIn, Twitter/X, Instagram, Facebook, YouTube, TikTok, Pinterest, Discord, Snapchat, Threads, Telegram, Reddit, WhatsApp, GitHub, Bluesky, Medium, and Calendly — one list per platform |
| Technologies | Whether the site runs Shopify, WordPress, React, and hundreds of other technologies, with versions and categories |
| Site identity | Resolved domain, homepage title, and meta description |
| Provenance | Every contact carries `sources` — the exact pages it was found on — so you can verify any entry yourself |

### How to scrape emails and contacts from websites

1. Click **Try for free**.
2. Paste one or more **website URLs or bare domains** — `vercel.com` and `https://www.vercel.com/` both work. Add as many as you like; websites are scraped in parallel.
3. Click **Start** and wait for the run to finish.
4. Open the **Dataset** tab to preview your data, then download it as **JSON, CSV, Excel, XML, or an HTML table**.

No proxies, no browser setup, no CAPTCHA solving — the crawler prioritizes contact and about pages, and automatically switches to a real browser for JavaScript-rendered or bot-protected sites.

### Input

```json
{
  "websites": [
    "vercel.com"
  ]
}
```

| Field | Type | Description |
|-------|------|-------------|
| `websites` | array | Website URLs and/or bare domains to scrape. Duplicates are merged automatically, and each website becomes one record in the dataset. |

### How much does it cost to scrape website contacts?

Scraping costs **$5 per 1,000 websites** ($0.005 per website) — one flat price per website, no matter how many pages the crawler visits. Per-page contact scrapers charge for every page they open, so a thorough 20-page crawl of one site can cost 8× more there. Unreachable websites are never charged.

Apify gives you **$5 in free credits** every month, so you can scrape your first 1,000 websites and test the scraper on your real lead lists before paying anything.

### FAQs

#### Why scrape website contacts?

- **Lead generation** — turn a list of company websites into emails, phone numbers, and LinkedIn profiles ready for outreach.
- **Lead enrichment** — fill the contact gaps in your CRM, with source pages so every entry is verifiable.
- **Segmentation** — the detected technologies tell you who runs Shopify, WordPress, or React, so you can target by stack.
- **List cleaning** — dead or parked domains are detected, logged, and never charged, so they simply drop out of your results.

#### How do I scrape emails from a website?

Paste the website's URL or bare domain into the input, click Start, and open the Dataset tab when the run finishes. The crawler checks the site's contact, about, and legal pages first, and every email comes back with the pages it was found on and the company's official address flagged `is_likely_official: true`.

#### How do I know which email is the company's official one?

Every email, phone, and social profile includes `sources` — the pages it was found on — and the highest-scoring entry per list is flagged `is_likely_official: true`. Prominence on the homepage, footer, and contact page plus similarity to the site's domain drive the score.

#### How is this different from per-page contact scrapers?

Three ways. **One merged record per website** — you don't get a separate row for every crawled page, so there's nothing to deduplicate or post-process. **Flat per-website pricing** — a deep 20-page crawl costs the same as a 3-page one, instead of 5–20× more. **Richer data** — per-contact `sources`, the `is_likely_official` flag, 17 social platforms (including GitHub, Bluesky, Medium, and Calendly), and technology detection, which per-page scrapers don't offer.

#### Can I scrape multiple websites in one run?

Yes. The input list accepts any number of websites, and each one becomes its own dataset item. An unreachable site never breaks the run — it's logged, skipped, and not charged, and the rest of your list still completes.

#### Can it scrape JavaScript-heavy or bot-protected websites?

Yes. Sites are first fetched with fast HTTP requests; when a site renders client-side (React/Next.js/Angular shells) or sits behind a bot wall (Cloudflare "Just a moment...", PerimeterX, Incapsula), the scraper automatically escalates to a real browser for that site.

#### How fresh is the contact data?

Every run is a live crawl of the website — you always get what the site exposes right now, not a stale snapshot.

#### Can I use integrations with this scraper?

Yes. You can connect it to almost any cloud service or web app: **Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive**, [and plenty more](https://docs.apify.com/integrations). You can also use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action whenever a run finishes.

#### Can I run it via the Apify API or MCP?

Yes. Use the `apify-client` package ([NPM](https://www.npmjs.com/package/apify-client) for Node.js, [PyPI](https://pypi.org/project/apify-client/) for Python) to start runs and fetch datasets programmatically — see the [Apify API reference](https://docs.apify.com/api/v2). The Actor also works through [Apify's MCP integration](https://blog.apify.com/how-to-use-mcp/), so AI agents can call it directly.

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

Web scraping publicly available data is legal, but your results may contain personal data protected by GDPR and similar laws. Only scrape personal data when you have a legitimate reason to do so; if you're unsure, consult a lawyer. Apify's post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) is a good primer.

### Support

Built by developers, for developers — when you reach out, you talk to the engineers who built the Actor, not a support script. Message us anytime and we'll resolve your query within 1 working day.

[![Contact Us on WhatsApp about Website Email & Contact Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/whatsapp-us.png)](https://api.whatsapp.com/send?phone=918178804274\&text=I%20have%20a%20question%20about%20the%20Website%20Email%20%26%20Contact%20Scraper.)

Email: [happy.to.help@omkar.cloud](mailto:happy.to.help@omkar.cloud?subject=Website%20Email%20Contact%20Scraper%20Question)

[![Email Us about Website Email & Contact Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/ask-on-email.png)](mailto:happy.to.help@omkar.cloud?subject=Website%20Email%20Contact%20Scraper%20Question)

### Love It? Star It! ⭐

From one business owner to another: if this Actor saved you hours of hunting for emails across websites, please [rate the Website Email & Contact Scraper on Apify](https://apify.com/omkar-cloud/website-email-contact-scraper/reviews).

Here's why it matters: most people judge an Actor by its reviews before trying it. Your rating helps the next person — someone deciding whether this Actor really delivers clean contact data — hit "Try for free" with confidence, and it helps the Actor rank higher in the Apify Store.

It takes only 1 second, and means the world to me.

# Actor input Schema

## `websites` (type: `array`):

Website URLs and/or bare domains to scrape — `vercel.com` and `https://www.vercel.com/` both work. Each website is crawled live (contact and about pages first, same registrable domain, subdomains included) and pushed as one row to the dataset.

## Actor input object example

```json
{
  "websites": [
    "vercel.com"
  ]
}
```

# 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 = {
    "websites": [
        "vercel.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("omkar-cloud/website-email-contact-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 = { "websites": ["vercel.com"] }

# Run the Actor and wait for it to finish
run = client.actor("omkar-cloud/website-email-contact-scraper").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 '{
  "websites": [
    "vercel.com"
  ]
}' |
apify call omkar-cloud/website-email-contact-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,omkar-cloud/website-email-contact-scraper"
        }
    }
}

```

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/prMm5nTMlWCW1Hj3C/builds/smN6c9x5UVVhefVeq/openapi.json
