# Website Contacts Scraper — Emails, Phones, Social Profiles (`chorelet/website-contacts-scraper`) Actor

Turn a list of domains into contacts: emails, phone numbers and LinkedIn, X, Facebook, Instagram, YouTube, GitHub and Telegram profiles, read from the homepage and the site's own Contact, About and Impressum pages. No login, CSV/JSON export and API.

- **URL**: https://apify.com/chorelet/website-contacts-scraper.md
- **Developed by:** [Chorelet](https://apify.com/chorelet) (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 $1.40 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Contacts Scraper — Emails, Phones, Social Profiles

Turn a list of domains into contactable rows. Paste `stripe.com`, `https://example.com` or a thousand domains from your CRM and get **emails, phone numbers and social profiles** — read from the homepage and from the site's own Contact, About, Team and Impressum pages — as JSON, CSV or Excel, or through the API.

No login, no proxy, no API key: the Actor opens the same public pages a visitor would.

### Why this Actor

- **Contacts, not raw HTML.** Emails, phones and the company's own social profiles, deduplicated across the homepage and the pages where contacts actually live.
- **Noise filtered by design.** `no-reply@`, Sentry and Mailchimp addresses, and documentation placeholders like `info@domain.com` are dropped — a list you can mail merge, not one you have to clean.
- **Share buttons are not profiles.** A Facebook sharer link or a tweet-this URL never ends up in the `facebook` or `twitter` field.
- **Forgiving input.** Domains or URLs, with automatic www/non-www and https→http fallback, so a stale CRM export still returns rows.

### Sample output

One item of the dataset (long values shortened):

```json
{
  "website": "https://shopify.com/",
  "title": "Shopify: The All-in-One Commerce Platform for Businesses - Shopify",
  "emails": [],
  "phones": [],
  "linkedin": "https://www.linkedin.com/company/shopify",
  "twitter": "https://twitter.com/shopify",
  "facebook": "https://www.facebook.com/shopify",
  "status": 200
}
```

### What you get

- Emails from `mailto:` links, page text and bracketed obfuscation like `name (at) domain (dot) com`
- Phone numbers from `tel:` links and international formats
- LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub, Telegram, Discord and Pinterest profiles — the company's own, not share buttons
- Page title and meta description, so a row is usable as a lead record on its own
- Automatic www/non-www and https→http fallback, so a typo or a missing redirect does not lose a site
- Monitored daily

### Input

- **Websites** — domains or URLs, one per line.
- **Contact pages per site** — how many internal Contact/About/Team/Impressum pages to open after the homepage (0 = homepage only).
- **Timeout per page**, **Websites in parallel**.

### Limits and notes

- Noise is filtered out on purpose: `no-reply@`, platform addresses (Sentry, Mailchimp, Shopify…) and documentation placeholders (`info@domain.com`, `youremail@example.com`) never reach the dataset. That is why a site can come back with zero emails while its HTML technically contains an address.
- Contacts hidden behind a form, a JavaScript widget or an image are not extracted — the Actor reads HTML, it does not run a browser or OCR.
- Large enterprise sites often publish no address at all; small and mid-sized businesses are where the hit rate is high.
- Every site is charged once, whether or not something was found. Runs that return no rows at all cost nothing.

### Input example

```json
{
  "websites": [
    "apify.com",
    "stripe.com",
    "chorelet.app"
  ],
  "maxContactPages": 3,
  "requestTimeoutSecs": 20,
  "concurrency": 5
}
```

### How much does it cost?

Pay per website — no subscription, no minimum, no charge for platform usage.

| Volume | Price |
|---|---|
| 1,000 websites | $2.00 |
| 10,000 websites | $20.00 |
| 100,000 websites | $200.00 |

The Apify **free plan includes $5 of usage every month** — about 2,500 websites with this Actor, no card needed. Nothing else is charged: platform usage is included in the price, and Apify Bronze, Silver and Gold subscribers get 10%, 20% and 30% off these prices.

### Use it from code, n8n, Make, Zapier or an AI agent

Run the Actor and download the dataset in one call (JSON by default; add `&format=csv` or `xlsx`):

```bash
curl -X POST "https://api.apify.com/v2/acts/chorelet~website-contacts-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"websites": ["apify.com", "stripe.com", "chorelet.app"], "maxContactPages": 3, "requestTimeoutSecs": 20, "concurrency": 5}'
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("chorelet/website-contacts-scraper").call(run_input={"websites": ["apify.com", "stripe.com", "chorelet.app"], "maxContactPages": 3, "requestTimeoutSecs": 20, "concurrency": 5})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

- **n8n, Make, Zapier** — use the Apify node/module: run the Actor, then "get dataset items".
- **Google Sheets, Slack, webhooks** — add an integration on the run's *Integrations* tab.
- **AI agents** — the Actor is available as a tool through the Apify MCP server; the dataset schema describes every field for the model.
- **Schedules** — run it hourly, daily or weekly from the *Schedules* tab.

### FAQ

**Where does it look for contacts?**

The homepage first, then up to a few internal pages whose link or path looks like Contact, About, Team, Support or Impressum. You choose how many.

**Why did a site return no emails?**

Either it publishes none (a contact form only), or the only addresses on it were noise — `no-reply@`, a platform address or a documentation placeholder — which this Actor deliberately drops.

**Does it verify that the emails work?**

No. It reports what the site publishes. Run the output through an email verifier if you need deliverability.

**Can it read contacts rendered by JavaScript?**

No — it reads HTML rather than running a browser, which is what keeps it fast and cheap. Most contact details are in the HTML; widgets and images are not.

**Is this legal?**

The Actor reads pages that any visitor can open and collects business contact details that companies publish on purpose. How you use them is your responsibility — in the EU and similar jurisdictions, marketing to those addresses is regulated (GDPR, ePrivacy).

### Support

Questions, missing fields or a source that changed? Open an issue on the *Issues* tab or write to support@chorelet.app — problems are usually fixed within a day, and the Actor is checked every morning by an automated test run. If the Actor saved you time, a short review on its Store page helps other people find it.

# Actor input Schema

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

Domains or URLs, one per line: `stripe.com`, `https://example.com/about`. The Actor follows redirects and tries the www/non-www twin if the first address does not answer.

## `maxContactPages` (type: `integer`):

After the homepage, how many internal pages that look like Contact, About, Team or Impressum to open. 0 = homepage only.

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

Slow sites are given up on after this many seconds.

## `concurrency` (type: `integer`):

Higher is faster; lower is gentler on small sites.

## Actor input object example

```json
{
  "websites": [
    "apify.com",
    "stripe.com",
    "chorelet.app"
  ],
  "maxContactPages": 3,
  "requestTimeoutSecs": 20,
  "concurrency": 5
}
```

# Actor output Schema

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

All websites — items of the default dataset. Use ?format=csv or xlsx on this URL for spreadsheets.

## `summary` (type: `string`):

How many sites answered, how many had an email or a phone.

# 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": [
        "apify.com",
        "stripe.com",
        "chorelet.app"
    ],
    "maxContactPages": 3,
    "requestTimeoutSecs": 20,
    "concurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("chorelet/website-contacts-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": [
        "apify.com",
        "stripe.com",
        "chorelet.app",
    ],
    "maxContactPages": 3,
    "requestTimeoutSecs": 20,
    "concurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("chorelet/website-contacts-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": [
    "apify.com",
    "stripe.com",
    "chorelet.app"
  ],
  "maxContactPages": 3,
  "requestTimeoutSecs": 20,
  "concurrency": 5
}' |
apify call chorelet/website-contacts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chorelet/website-contacts-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/Gin8oTTNVScESGagE/builds/8Vpv4yWBQuklNBvG2/openapi.json
