# Website Contact Details Scraper (`piotrv1001/website-contact-details-scraper`) Actor

Email extractor for any list of websites: visits each homepage plus its contact, about and imprint pages and returns emails, phone numbers and Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest links. One row per website, pay only for sites that load. CSV or Excel.

- **URL**: https://apify.com/piotrv1001/website-contact-details-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 websites

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/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 Contact Details Scraper

The **Website Contact Details Scraper** is a bulk email extractor for any list of websites: give it domains or URLs and it returns the emails, phone numbers and social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest) published on each site. It visits the homepage and the pages most likely to hold contacts (contact, about, team, imprint) and gives you one clean row per website. Use it to extract emails from websites for lead generation, to enrich a company list, or to find the social media accounts of a business.

### 🎯 Use Cases

- **Extract emails from a list of websites**: paste hundreds of domains and get every email address they publish, ready for a CSV or Excel file.
- **Lead list enrichment**: add emails, phones and social links to companies you already have from a CRM, a directory or a trade show list.
- **Find the social media accounts of a business**: Instagram, Facebook, TikTok, LinkedIn and YouTube links for influencer, agency or partnership outreach.
- **Phone number extractor**: collect the phone numbers each website links as a call button.
- **Check contact pages at scale**: see which sites in your list have no email, no social presence or do not load any more.

### ✨ Features

- 📧 **Emails**: from email links, page text and the site's structured data, including addresses written as `name [at] domain (dot) com` and the ones hidden from plain view by common website protections. Placeholder and image-file addresses are filtered out.
- ☎️ **Phone Numbers**: every number linked as a call button or listed in the site's structured data, de-duplicated across pages.
- 🔗 **Social Profiles**: Facebook, Instagram, LinkedIn (company and personal), X / Twitter, YouTube, TikTok and Pinterest, cleaned of tracking parameters, share buttons and policy links.
- 🧭 **Smart Page Selection**: the homepage plus the pages most likely to hold contacts, in many languages (contact, kontakt, contacto, about, team, impressum, mentions légales...).
- 🌐 **One Row per Website**: several links to the same domain are merged into one row.
- 💸 **Pay Only for Websites That Load**: dead domains, social profile links and invalid addresses are listed in the run's status and never charged.

### 🛠️ How It Works

1. **Paste your websites**: full URLs or bare domains like `example.com`, one per line.
2. **Choose how many pages to read per website** (default 5: the homepage and 4 contact pages).
3. **Run and download** the rows as CSV, Excel or JSON, or pull them through the API.

### ⚙️ Input

| Field                      | What it does                                                                                                       |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Websites**               | Website addresses or domains, one per line. Each website gives one row.                                            |
| **Max pages per website**  | The homepage plus the most likely contact pages, 1–20. Default 5. The price is per website, not per page.         |

```json
{
    "startUrls": ["https://www.sydneyaccountants.com/", "maidenlanedental.com", "https://www.brazoscommercialroofing.com/"],
    "maxPagesPerSite": 5
}
```

### 💰 Pricing

Pay only for the websites that load. No monthly rental.

| Event           | Price                                | When                                                     |
| --------------- | ------------------------------------ | -------------------------------------------------------- |
| **Website**     | $0.002 per website ($2 per 1,000)    | Every website that loaded, with all the contacts found    |
| **Actor start** | $0.00005 per run                     | Charged once when the run starts                          |

Examples: 1,000 websites = **$2.00** · 10,000 websites = **$20.00** · 500 websites of which 50 are dead = **$0.90**.

### 📊 Sample Output Data

```json
{
    "url": "https://www.sydneyaccountants.com/",
    "domain": "sydneyaccountants.com",
    "finalUrl": "https://www.sydneyaccountants.com/",
    "title": "Sydney Accountants Group",
    "emails": ["admin@sydneyaccountants.com"],
    "phones": ["02 9540 3866"],
    "facebooks": ["https://www.facebook.com/Sydney-Accountants-Group-101742201670072"],
    "instagrams": ["https://www.instagram.com/sydaccgroup"],
    "linkedIns": ["https://www.linkedin.com/in/sydney-accountants-group-770a621b6"],
    "twitters": ["https://x.com/SydneyAccGroup"],
    "youtubes": [],
    "tiktoks": [],
    "pinterests": [],
    "pagesVisited": [
        "https://www.sydneyaccountants.com/",
        "https://www.sydneyaccountants.com/contact-us-page"
    ],
    "scrapedAt": "2026-10-21T14:17:40.284Z"
}
```

`url` is the address you gave, `finalUrl` the homepage after redirects, and `pagesVisited` the pages the contacts come from. Empty arrays mean nothing of that kind was found on the visited pages.

### 📅 Schedule and Integrate

Contact pages change when staff and agencies change, so re-check your lead list monthly. Set it up with Apify **Schedules**, and send the rows to Google Sheets, HubSpot or your outreach tool through the Zapier, Make or n8n integrations, or a webhook when the run finishes.

### 🤖 Use with AI Agents (MCP)

The actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "startUrls": ["example-business.com"], "maxPagesPerSite": 5 }
```

### ❓ FAQ

**How do I find the email address of a website?** Paste the website here. The actor reads its homepage and contact, about and imprint pages and returns every email published there, plus phones and social links.

**Is this an email finder?** It finds the emails a business publishes on its own website (info@, office@, staff addresses on team pages). It does not guess addresses from names or check mailboxes.

**Are the emails verified?** No. Run them through an email validator before a cold email campaign.

**Why is a website missing from the results?** It did not load: the domain no longer exists, the site was down, or it does not open for automated visits. Those sites are listed in the run's status message and are not charged.

**Why are some fields empty?** Many sites only offer a contact form, or keep their contacts on pages beyond the ones visited. Raise "Max pages per website" for big sites.

**Does it work with JavaScript-heavy websites?** It reads the pages as the website sends them. Most business sites (WordPress, Wix, Squarespace, Shopify) include their contacts there; sites that build the whole page in the browser can come back with fewer contacts.

### 🔗 Related Scrapers

- [Google Maps Contact Details Scraper](https://apify.com/piotrv1001/google-maps-contact-details-scraper): find businesses on Google Maps by niche and city and get their emails and social profiles in one run.
- [Google Maps Scraper](https://apify.com/piotrv1001/google-maps-scraper): business listings with websites to feed into this actor.
- [Facebook Pages Scraper](https://apify.com/piotrv1001/facebook-pages-scraper): details and contact info of the Facebook pages in the `facebooks` column.
- [LinkedIn Company Scraper](https://apify.com/piotrv1001/linkedin-company-scraper): company size and industry for the LinkedIn pages in the `linkedIns` column.
- [Yelp Business Scraper](https://apify.com/piotrv1001/yelp-business-scraper): local businesses with websites from Yelp.

# Actor input Schema

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

Website addresses or domains, one per line, e.g. https://www.example.com or example.com. Each website gives one row; several links on the same domain are merged.

## `maxPagesPerSite` (type: `integer`):

The homepage plus the most likely contact pages (contact, about, team, imprint...). More pages find more emails on bigger sites but take longer. The price is per website, not per page.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.sydneyaccountants.com/",
    "https://maidenlanedental.com/"
  ],
  "maxPagesPerSite": 5
}
```

# 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": [
        "https://www.sydneyaccountants.com/",
        "https://www.brazoscommercialroofing.com/",
        "https://maidenlanedental.com/"
    ],
    "maxPagesPerSite": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/website-contact-details-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": [
        "https://www.sydneyaccountants.com/",
        "https://www.brazoscommercialroofing.com/",
        "https://maidenlanedental.com/",
    ],
    "maxPagesPerSite": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/website-contact-details-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 '{
  "startUrls": [
    "https://www.sydneyaccountants.com/",
    "https://www.brazoscommercialroofing.com/",
    "https://maidenlanedental.com/"
  ],
  "maxPagesPerSite": 5
}' |
apify call piotrv1001/website-contact-details-scraper --silent --output-dataset

```

## MCP server setup

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