# Contact Details Scraper (`nogards95/website-contact-scraper`) Actor

Email extractor and lead scraper to extract and download emails, phone numbers, Facebook, Twitter, LinkedIn, Instagram, Threads, Snapchat, and Telegram profiles from any website. Extract contact information at scale from lists of URLs and download the data as Excel, CSV, JSON, HTML, and XML.

- **URL**: https://apify.com/nogards95/website-contact-scraper.md
- **Developed by:** [Nogards](https://apify.com/nogards95) (community)
- **Categories:** Lead generation, Social media, Jobs
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 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 Contact Scraper — Extract Emails, Phone Numbers & Social Profiles from Any Domain

Automatically extract business emails, phone numbers, WhatsApp links and social media profiles from any website. Fast, lightweight, one clean result per domain.

Stop wasting hours manually hunting for contact info. Paste a list of URLs and get back every email, phone number, WhatsApp link, LinkedIn, Instagram, Facebook, and more — structured and ready to use.

***

### What it does

Give this actor a list of websites. It crawls each one intelligently — hitting contact pages, about pages, and legal pages first — and returns a single clean record per domain with all the contacts it found.

No headless browser. No Playwright. No slow JavaScript rendering. Just raw HTTP speed with Cheerio.

***

### Features

- **Emails** — extracted from page text and `mailto:` links, deduplicated, spam-filtered
- **Phone numbers** — from `tel:` links and visible text, no SVG/CSS false positives
- **WhatsApp** — detects `wa.me` and `api.whatsapp.com` links, extracts the number
- **Social profiles** — LinkedIn, Facebook, Instagram, Twitter/X, YouTube, TikTok (share buttons excluded)
- **Smart crawl order** — contact and about pages are visited first, so you get results faster
- **Early stop** — stops crawling a domain the moment contacts are found (saves credits)
- **One result per domain** — clean, structured output, no duplicates
- **Proxy support** — works with Apify residential proxies to avoid blocks

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | — | List of website URLs to scrape (**required**) |
| `maxPagesPerDomain` | integer | `10` | Max pages crawled per domain (1–50) |
| `maxDepth` | integer | `2` | How deep to follow internal links (1–5) |
| `earlyStop` | boolean | `true` | Stop as soon as contacts are found |
| `proxyConfiguration` | object | — | Apify proxy settings (optional) |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://example-agency.com" },
    { "url": "https://another-company.io" }
  ],
  "maxPagesPerDomain": 10,
  "maxDepth": 2,
  "earlyStop": true
}
```

***

### Output

One flat record per domain — ready to export as CSV or filter directly in the Apify dataset viewer.

```json
{
  "domain": "example-agency.com",
  "startUrl": "https://example-agency.com",
  "finalUrl": "https://www.example-agency.com",
  "emails": "info@example-agency.com, sales@example-agency.com",
  "phones": "+39 02 1234567",
  "whatsapps": "+393331234567",
  "linkedin_url": "https://linkedin.com/company/example-agency",
  "facebook_url": "",
  "instagram_url": "https://instagram.com/exampleagency",
  "twitter_url": "",
  "youtube_url": "",
  "tiktok_url": "",
  "pagesVisited": 3,
  "stoppedReason": "early-stop",
  "updatedAt": "2026-05-25T10:30:00.000Z"
}
```

#### Fields

| Field | Description |
|---|---|
| `domain` | Cleaned domain (no www) |
| `startUrl` | The URL you provided as input |
| `finalUrl` | The last URL loaded (after redirects) |
| `emails` | Comma-separated list of found emails |
| `phones` | Comma-separated list of found phone numbers |
| `whatsapps` | Comma-separated list of WhatsApp numbers |
| `linkedin_url` | First LinkedIn company/profile URL found |
| `facebook_url` | First Facebook page URL found |
| `instagram_url` | First Instagram profile URL found |
| `twitter_url` | First Twitter/X profile URL found |
| `youtube_url` | First YouTube channel URL found |
| `tiktok_url` | First TikTok profile URL found |
| `pagesVisited` | Number of pages crawled for this domain |
| `stoppedReason` | Why crawling stopped (see below) |
| `updatedAt` | ISO timestamp of when the record was saved |

#### `stoppedReason` values

| Value | Meaning |
|---|---|
| `early-stop` | Contacts found, crawl stopped early (saves credits) |
| `max-pages` | Reached the `maxPagesPerDomain` limit |
| `no-more-links` | Ran out of internal links to follow |
| `error` | Site was unreachable |

***

### Use cases

- **Lead generation** — build prospect lists with verified contact info at scale
- **Sales outreach** — enrich a list of company domains before cold emailing
- **Marketing agencies** — research competitor contacts and partner directories
- **Recruitment** — find HR and hiring manager contacts on company websites
- **Data enrichment** — add emails and socials to existing domain lists

***

### Tips

- For best results, use **Apify residential proxies** — many sites block datacenter IPs
- Set `earlyStop: true` (default) to minimize credit usage on large lists
- Set `maxDepth: 1` if you only want to check the homepage and direct links
- URLs with or without `https://` are both accepted — the actor normalises them automatically

***

### Technical notes

- Built with [Crawlee](https://crawlee.dev) `CheerioCrawler` on `apify/actor-node:22` — pure HTTP, no browser overhead
- Priority crawl order: contact → about → legal → team → homepage → other
- Phone extraction runs only on visible text nodes — no false positives from SVG or CSS
- Social share buttons (`/sharer`, `/intent/tweet`, etc.) are excluded from social results

# Actor input Schema

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

List of website URLs to scrape contacts from.

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

Maximum number of pages to crawl per domain.

## `maxDepth` (type: `integer`):

How deep to follow links within the same domain.

## `earlyStop` (type: `boolean`):

Stop crawling a domain as soon as contacts are found.

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

Optional Apify proxy settings.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com/contact"
    }
  ],
  "maxPagesPerDomain": 10,
  "maxDepth": 2,
  "earlyStop": true
}
```

# Actor output Schema

## `results` (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/contact"
        }
    ]
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/8Tq3OFiv1Q3Yx3bao/builds/ZQcWjoUoa0IPDyY20/openapi.json
