# Website Contact Extractor: Emails, Phones, Socials (`juicy_fillet/website-contact-extractor`) Actor

Give it a list of websites or domains and get emails, phone numbers and social media profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok) for each site. Fast, no browser, one row per domain.

- **URL**: https://apify.com/juicy_fillet/website-contact-extractor.md
- **Developed by:** [Xander Yushchak](https://apify.com/juicy_fillet) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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/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 Extractor: Emails, Phones, Socials

Give it a list of **websites or domains** and get back the **email addresses, phone numbers and social media profiles** of each business, one tidy row per domain. It reads the homepage plus the pages where contact details usually live (Contact, Contact us, About, Team, Impressum/Imprint), so you don't have to click through every site yourself.

It works without a browser, so it is **fast and cheap**: hundreds of sites per minute.

### What you get for each website

| Field | What it is |
|-------|------------|
| `emails` | Email addresses from `mailto:` links, page text, `name [at] domain` style obfuscation and Cloudflare-protected emails. Junk is filtered out (image names like `logo@2x.png`, `example.com`, Sentry and Wix tracking addresses). The site's own domain comes first. |
| `phones` | Phone numbers from `tel:` links, plus numbers written on the page in a common phone format |
| `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `pinterest`, `github` | Profile links, cleaned to the account URL (share buttons and post links are skipped). The site's own accounts come first. |
| `contactPageUrl` | The contact page it found, if any |
| `title`, `description` | The homepage title and meta description |
| `pagesCrawled` | Which pages were read |

### What people use it for

- **Lead generation:** turn a list of company domains (from Google Maps, a directory, a CRM export or a trade show list) into emails, phones and LinkedIn pages.
- **CRM enrichment:** fill in missing contact fields for accounts you already have.
- **Agency prospecting:** find who to email at local businesses (restaurants, salons, contractors, clinics).
- **Influencer and partner research:** find a brand's Instagram, TikTok and YouTube from its website.
- **Data cleaning:** check which domains still load and what their title says.

### Input example

```json
{
  "websites": ["apify.com", "https://joesbarbershop.com", "www.python.org"],
  "maxPagesPerSite": 5,
  "maxItems": 1000
}
```

Paste bare domains or full URLs, one per line. Duplicates are removed (`www.example.com` and `example.com/about` count as one site). A `startUrls` list of strings or `{ "url": ... }` objects also works, which is handy from integrations.

### Output example

Real result from a test run:

```json
{
  "input": "apify.com",
  "domain": "apify.com",
  "url": "https://apify.com/",
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "description": "Thousands of tools to automate your business. Get real-time web data, track competitors, generate leads, and integrate your apps and AI agents.",
  "emails": ["hello@apify.com", "james.hill@apify.com", "support@apify.com"],
  "phones": ["(718) 356-5168"],
  "contactPageUrl": "https://apify.com/contact",
  "facebook": [],
  "instagram": [],
  "linkedin": ["https://www.linkedin.com/company/apify"],
  "twitter": ["https://x.com/apify"],
  "youtube": [],
  "tiktok": ["https://www.tiktok.com/@apifytech", "https://www.tiktok.com/@apifyoffice"],
  "pinterest": [],
  "github": ["https://github.com/apify"],
  "pagesCrawled": ["https://apify.com/", "https://apify.com/contact", "https://apify.com/contact-sales", "https://apify.com/compass/crawler-google-places"]
}
```

A small local business looks like this:

```json
{
  "domain": "joesbarbershop.com",
  "title": "Barbershop | San Francisco, CA - Joe’s Barbershop",
  "emails": [],
  "phones": ["+14152559096", "925-300-5688"],
  "facebook": ["https://www.facebook.com/joesbarbershopsf"],
  "twitter": ["https://x.com/joesbarbershop"],
  "youtube": ["https://www.youtube.com/channel/UCq_A6J7HN1u8POWPpoLHWqw"]
}
```

### How to use it

1. Click **Try for free** (new Apify accounts get monthly free credit).
2. Paste your list of websites.
3. Click **Start** and download the results as Excel, CSV, JSON or HTML, or open them in Google Sheets.

### How much does it cost?

You pay per result: **$2.00 per 1,000 websites** (one result = one website, no matter how many pages were read). Sites that don't load (dead domains, timeouts, blocked) are skipped and **not charged**. Set **Max results** to cap your spend.

### Use it with n8n, Make or Zapier

- **n8n:** use the Apify node, choose "Run Actor", pick this actor and pass `{"websites": [...]}`. Then read the dataset items in the next step.
- **Make:** use the Apify app's "Run an Actor" module with "Run synchronously" on, then "Get Dataset Items".
- **Zapier:** use the Apify integration's "Run Actor" action, for example whenever a new row with a domain is added to a Google Sheet or CRM.
- **API:** `POST https://api.apify.com/v2/acts/juicy_fillet~website-contact-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON returns the rows directly.

It also works as a tool for AI agents through Apify's MCP server.

### FAQ

**Does it use a browser?** No. It downloads the HTML directly, which keeps it fast and cheap. Sites that only show their contact details after JavaScript runs (rare for contact pages) may return fewer results.

**Why are some emails missing?** Some sites only offer a contact form or show the email as an image. Those can't be read as text.

**Why are there phone numbers from other countries?** Numbers written on the page are included when they look like a real phone number. `tel:` links are the most reliable and are listed first.

**Does it verify emails?** No, it extracts what's published on the website. Run the results through an email verifier before cold outreach.

**Is this allowed?** It only reads public pages of the websites you give it, a few pages per site, with an identifying user agent. You are responsible for following privacy and anti-spam rules (GDPR, CAN-SPAM) when you contact people.

### More scrapers from this developer

- [App Store Reviews Scraper](https://apify.com/juicy_fillet/app-store-reviews)
- [Bluesky Scraper: Posts, Profiles, Followers](https://apify.com/juicy_fillet/bluesky-scraper)
- [SEC Form D Funding Rounds](https://apify.com/juicy_fillet/sec-form-d-funding)
- [Remote Jobs Aggregator](https://apify.com/juicy_fillet/remote-jobs-aggregator)

# Actor input Schema

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

Website URLs or bare domains, one per line, e.g. 'https://apify.com' or 'stripe.com'. You get one result row per domain.

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

Optional. Same as Websites, for integrations that send a 'startUrls' list. Both lists are combined and duplicates removed.

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

How many pages to load per site: the homepage plus the most likely contact, about, team and imprint pages. More pages find more contacts but take longer.

## `maxItems` (type: `integer`):

Stop after this many websites have been saved. You only pay for websites that load; failed sites are skipped and not charged.

## Actor input object example

```json
{
  "websites": [
    "apify.com",
    "https://www.python.org"
  ],
  "maxPagesPerSite": 5,
  "maxItems": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

All results saved by this run, in the default dataset.

# 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",
        "https://www.python.org"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("juicy_fillet/website-contact-extractor").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",
        "https://www.python.org",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("juicy_fillet/website-contact-extractor").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",
    "https://www.python.org"
  ]
}' |
apify call juicy_fillet/website-contact-extractor --silent --output-dataset

```

## MCP server setup

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

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/WOBImbdSJJiCAKJpK/builds/J03f2cBz6IqNvDxD3/openapi.json
