# Website Lead Extractor: Emails, Phones & Social Profiles (`arched_friend/website-lead-extractor`) Actor

Turn a list of company websites into contact ready leads. Pulls email addresses, phone numbers and social profiles from any site in one run.

- **URL**: https://apify.com/arched\_friend/website-lead-extractor.md
- **Developed by:** [Ruth Oyengah](https://apify.com/arched_friend) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 website processeds

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?

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 Lead Extractor: Emails, Phones & Social Profiles

**Turn a list of company websites into contact ready leads.**

Give it domains. Get back email addresses, phone numbers and social profiles for each one. It reads the homepage and follows the contact and about pages, where most companies actually publish their details.

Built for B2B lead generation, prospect list building, agency outreach and CRM enrichment.

### How it works

```mermaid
flowchart LR
    A[Your domain list] --> B[Homepage]
    B --> C{Find contact<br/>and about pages}
    C --> D[Read each page]
    B --> D
    D --> E[Emails]
    D --> F[Phones]
    D --> G[Social profiles]
    E & F & G --> H[(One row per company)]
```

### Where the details come from

```mermaid
flowchart TD
    A[Page] --> B[mailto and tel links]
    A --> C[Visible page text]
    A --> D[JSON-LD structured data]
    A --> E[Social links in headers and footers]
    B & C & D & E --> F[Clean, deduplicate, rank]
    F --> G[Best contact email first]
```

Results are filtered rather than dumped. Asset filenames, tracking pixels, share widgets and vendor placeholder addresses are removed, so you get contacts instead of noise.

### Input

```json
{
  "websites": ["acme.com", "https://example-agency.co.uk", "another-company.io"],
  "followContactPages": true,
  "maxPagesPerSite": 5
}
```

| Option | Does |
| --- | --- |
| `websites` | Required. Bare domains or full URLs both work. |
| `followContactPages` | Also read contact and about pages. Keep on for best results. |
| `maxPagesPerSite` | Pages to read per site, homepage included. |
| `maxRequestsPerCrawl` | Hard cap across the run, for cost control. |
| `proxyConfiguration` | Optional proxy for larger runs. |

### Output

One row per website.

```json
{
  "companyName": "Apify: The largest marketplace of trusted tools for AI",
  "domain": "apify.com",
  "primaryEmail": "hello@apify.com",
  "emails": ["hello@apify.com", "support@apify.com"],
  "phones": [],
  "linkedin": "http://linkedin.com/company/apify",
  "twitter": "https://x.com/apify",
  "github": "https://github.com/apify/crawlee",
  "youtube": "https://www.youtube.com/apify",
  "emailCount": 2,
  "hasContactData": true
}
```

`primaryEmail` picks the best single address for outreach, preferring inboxes on the company's own domain such as `info@`, `contact@`, `hello@` or `sales@`.

Export to CSV or Excel and it is ready to import into your CRM or mail tool.

### Run it as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/arched_friend~website-lead-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"websites": ["acme.com", "example.io"]}'
```

### Common questions

**How accurate are the results?**
Every address is checked before it is returned. Image filenames, asset hashes and placeholder addresses from website builders are filtered out. Phone numbers come from `tel:` links, or from page text only when they carry an international prefix, which keeps dates and prices out.

**Why did a site return nothing?**
Some companies publish contact details only inside a form or an image. Sites that block automated visitors may also refuse the request. The `hasContactData` field tells you which rows came back empty so you can filter them out in one step.

**Can I feed it a large list?**
Yes. Add a proxy configuration for bigger runs and use `maxRequestsPerCrawl` to cap spend.

**Does it find personal email addresses?**
It returns whatever a company publishes on its own public website, which is usually a shared inbox such as `info@` or `sales@`. It does not read anything behind a login.

**Is this legal?**
It reads public web pages that companies publish so people can contact them. No logins, no private data.

### Related products

- **Hiring Signals Tracker** to find companies that are actively hiring, then extract contacts for them here
- **Company Enrichment** to add size, funding and tech stack
- **Lead Enrichment Pipeline** to chain the whole sequence into CRM ready rows

# Actor input Schema

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

One entry per company. A bare domain such as acme.com works, so does a full URL.

## `followContactPages` (type: `boolean`):

Most contact details live on a contact or about page rather than the homepage. Keep this on for best results.

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

How many pages to read per site, homepage included.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap across the whole run, for cost control. Leave empty for no cap.

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

Optional. Use a proxy if you are checking many sites at once.

## Actor input object example

```json
{
  "websites": [
    "apify.com"
  ],
  "followContactPages": true,
  "maxPagesPerSite": 5
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per website with emails, phones and social profiles.

## `runSummary` (type: `string`):

Counts of websites processed and contact details found.

# 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",
        "crawlee.dev"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arched_friend/website-lead-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",
        "crawlee.dev",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("arched_friend/website-lead-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",
    "crawlee.dev"
  ]
}' |
apify call arched_friend/website-lead-extractor --silent --output-dataset

```

## MCP server setup

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