# 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Contact Data Extractor",
        "description": "Extract emails, phone numbers, social links, and contact pages from public websites into one clean row per domain.",
        "version": "0.1",
        "x-build-id": "sQGt7cnZGvasJVfAq"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/intrepid_vortex~web-contact-data-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-intrepid_vortex-web-contact-data-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/intrepid_vortex~web-contact-data-extractor/runs": {
            "post": {
                "operationId": "runs-sync-intrepid_vortex-web-contact-data-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/intrepid_vortex~web-contact-data-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-intrepid_vortex-web-contact-data-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Web page URLs",
                        "type": "array",
                        "description": "Public web pages to inspect. Add homepages, contact pages, about pages, or landing pages.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxRequestsPerCrawl": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of pages to process in one run.",
                        "default": 50
                    },
                    "maxTextChars": {
                        "title": "Max text excerpt length",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of merged plain-text characters saved per website. Set to 0 to skip text excerpts.",
                        "default": 2000
                    },
                    "maxPagesPerWebsite": {
                        "title": "Max pages per website",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum pages to inspect for each input website, including the starting URL and discovered contact/about/support/team pages.",
                        "default": 5
                    },
                    "discoverContactPages": {
                        "title": "Discover contact pages",
                        "type": "boolean",
                        "description": "Automatically inspect likely contact, support, about, team, RFP, and location pages found on each starting URL.",
                        "default": true
                    },
                    "useApifyProxy": {
                        "title": "Use Apify Proxy",
                        "type": "boolean",
                        "description": "Enable Apify Proxy for sites that block datacenter traffic. Leave off for cheaper first runs.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
