# Website Contact Data Extractor (`intrepid_vortex/web-contact-data-extractor`) Actor

Extract emails, phone numbers, social links, and contact pages from public websites into one clean row per domain.

- **URL**: https://apify.com/intrepid\_vortex/web-contact-data-extractor.md
- **Developed by:** [jiang liang](https://apify.com/intrepid_vortex) (community)
- **Categories:** Lead generation, SEO tools, 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 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/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 Data Extractor

Extract business contact details from public websites and return one clean, CSV-ready row per domain.

> **Try the public example:** [Extract Public Website Contact Details](https://apify.com/intrepid_vortex/web-contact-data-extractor/examples/extract-public-website-contact-details)\
> **Pricing:** $2 per 1,000 website results, plus $0.001 per run start. Platform usage is included.

This Actor is built for lead enrichment, prospect research, website audits, agency list building, and sales operations. Give it a list of company homepages or landing pages, and it will inspect each starting URL plus likely contact, about, support, team, location, and request-a-proposal pages.

The result is a structured dataset with primary email, primary phone, best contact page, all discovered emails and phone numbers, social profile links, source pages inspected, and a confidence score.

### What can this Website Contact Data Extractor do?

- Extract contact data from public company websites
- Return one merged result per website instead of one row per page
- Discover likely contact, support, about, team, RFP, and location pages automatically
- Find email addresses from page text and `mailto:` links
- Find phone numbers from page text and `tel:` links
- Normalize phone numbers where possible
- Extract LinkedIn, Facebook, Instagram, TikTok, X/Twitter, YouTube, GitHub, Pinterest, and Threads links
- Choose a `primaryEmail`, `primaryPhone`, and `bestContactPageUrl` for easy CSV workflows
- Include `sourcePages` and `confidence` so you can review where the data came from

### Use cases

- Enrich a list of company websites with emails and phone numbers
- Build prospect lists for sales outreach
- Audit business websites for missing contact information
- Prepare lead data for a CRM, spreadsheet, or enrichment workflow
- Collect social profile links from company websites
- Run lightweight competitor or market research by vertical

### Input

Add one or more public website URLs. Homepages work best, but contact pages, about pages, and landing pages are also supported.

```json
{
    "startUrls": [{ "url": "https://www.example.com" }],
    "maxRequestsPerCrawl": 50,
    "maxPagesPerWebsite": 5,
    "discoverContactPages": true,
    "maxTextChars": 2000,
    "useApifyProxy": false
}
```

#### Input options

- `startUrls`: List of public website URLs to inspect.
- `maxRequestsPerCrawl`: Maximum number of total pages processed in one run.
- `maxPagesPerWebsite`: Maximum pages to inspect per website, including the starting URL.
- `discoverContactPages`: Automatically inspect likely contact, support, about, team, RFP, and location pages.
- `maxTextChars`: Maximum merged plain-text excerpt length saved per website. Set to `0` to skip excerpts.
- `useApifyProxy`: Enable Apify Proxy if target sites block normal cloud traffic.

### Output

Each input website is saved as one dataset item.

```json
{
    "sourceUrl": "https://www.example.com",
    "domain": "example.com",
    "loadedUrl": "https://www.example.com/",
    "canonicalUrl": "https://www.example.com/",
    "title": "Example Company",
    "h1": "Example Company",
    "metaDescription": "Example metadata",
    "primaryEmail": "hello@example.com",
    "primaryPhone": "+14155550123",
    "bestContactPageUrl": "https://www.example.com/contact",
    "emails": ["hello@example.com", "sales@example.com"],
    "phones": ["+1 415 555 0123"],
    "phonesRaw": ["+1 415 555 0123"],
    "phonesNormalized": ["+14155550123"],
    "linkedinUrl": "https://www.linkedin.com/company/example",
    "facebookUrl": "https://www.facebook.com/example",
    "instagramUrl": "",
    "twitterUrl": "",
    "youtubeUrl": "",
    "tiktokUrl": "",
    "githubUrl": "",
    "pinterestUrl": "",
    "threadsUrl": "",
    "socialLinks": ["https://www.linkedin.com/company/example"],
    "contactPageUrls": ["https://www.example.com/contact"],
    "sourcePages": ["https://www.example.com/", "https://www.example.com/contact"],
    "pagesProcessed": 2,
    "confidence": 95,
    "textExcerpt": "Plain text extracted from the website..."
}
```

#### Key output fields

- `primaryEmail`: Best single email address for immediate use.
- `primaryPhone`: Best single normalized phone number for immediate use.
- `bestContactPageUrl`: Best contact page found on the website.
- `emails`: All unique emails found.
- `phonesRaw`: Phone numbers as they appeared on the website.
- `phonesNormalized`: Phone numbers normalized where possible.
- `socialLinks`: All supported social links found.
- `sourcePages`: Pages inspected for this website.
- `confidence`: Simple 0-100 score based on pages processed and data found.

### Example workflow

1. Upload a CSV or paste a list of company website URLs into `startUrls`.
2. Keep `discoverContactPages` enabled.
3. Start with `maxPagesPerWebsite` set to `4` or `5`.
4. Download the dataset as CSV.
5. Use `primaryEmail`, `primaryPhone`, and `bestContactPageUrl` directly in your CRM or spreadsheet.

### Performance notes

This Actor uses fast HTTP/HTML extraction, not a browser. It is designed to be low-cost and suitable for list enrichment jobs. In a 50-site HOA management company test, it produced 50 website rows in about 15 seconds, processed 165 requests, and found either an email or phone for 48 of 50 websites.

For JavaScript-heavy sites or sites with aggressive anti-bot protection, some data may not be available without proxy or browser rendering.

### Limitations

- It only extracts data from public pages it can access.
- It does not log in to websites.
- It does not bypass paywalls, CAPTCHAs, or private areas.
- It cannot guarantee every hidden or JavaScript-rendered contact detail will be found.
- Some websites block cloud datacenter traffic. Enable `useApifyProxy` for those cases.
- Always review extracted contact data before using it for outreach.

### Responsible use

Use this Actor only for legitimate business research, website auditing, enrichment, and compliance-friendly workflows. Follow applicable laws, website terms, and email/phone outreach rules in your jurisdiction.

### Local development

```bash
npm install
apify run
```

Deploy to Apify:

```bash
apify login
apify push
```

# Actor input Schema

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

Public web pages to inspect. Add homepages, contact pages, about pages, or landing pages.

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

Maximum number of pages to process in one run.

## `maxTextChars` (type: `integer`):

Maximum number of merged plain-text characters saved per website. Set to 0 to skip text excerpts.

## `maxPagesPerWebsite` (type: `integer`):

Maximum pages to inspect for each input website, including the starting URL and discovered contact/about/support/team pages.

## `discoverContactPages` (type: `boolean`):

Automatically inspect likely contact, support, about, team, RFP, and location pages found on each starting URL.

## `useApifyProxy` (type: `boolean`):

Enable Apify Proxy for sites that block datacenter traffic. Leave off for cheaper first runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.example.com"
    }
  ],
  "maxRequestsPerCrawl": 50,
  "maxTextChars": 2000,
  "maxPagesPerWebsite": 5,
  "discoverContactPages": true,
  "useApifyProxy": false
}
```

# 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://www.example.com"
        }
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("intrepid_vortex/web-contact-data-extractor").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://www.example.com"
    }
  ]
}' |
apify call intrepid_vortex/web-contact-data-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/qm4FoSghppwf3EL33/builds/sQGt7cnZGvasJVfAq/openapi.json
