# Website Contact Finder - Emails, Phones, Socials (`plotpointtech/website-contact-finder`) Actor

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

## Pricing

from $1.50 / 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?

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 Finder

Give it a list of company websites and get back each company's published business contact details: email addresses, phone numbers, social media profile links and street address. One row per website, with a list of the pages where each detail was found, so you can check any value in seconds.

### Who uses it

- **Sales and business development teams** enriching a list of target companies with general contact emails and phone numbers.
- **Agencies and freelancers** building prospect lists from domains they already have.
- **Marketplaces and directories** keeping supplier or member records up to date.
- **Researchers** collecting the official contact channels of organizations.

### How it works

For each website the tool loads the homepage, then picks the pages most likely to hold contact details: contact, about, team, locations, imprint (Impressum), legal notice and privacy pages, in many languages. If the homepage has no obvious contact link it also tries `/contact`, `/contact-us` and `/about`. By default it checks up to 8 pages per website, all on the same website.

On every page it reads:

- **Emails** from `mailto:` links, visible text, structured data (schema.org), Cloudflare-protected addresses, and simple obfuscated forms such as `name [at] company [dot] com` or `name(at)company.com`.
- **Phone numbers** from `tel:` links, WhatsApp links, structured data and visible text. Numbers are validated and normalized to international format, with the country they belong to. Fax numbers are labelled as fax.
- **Social profile links** that the website itself links to: LinkedIn company pages, Facebook, X (Twitter), Instagram, YouTube and TikTok. Share buttons and other non-profile links are ignored. Nothing is fetched from the social networks.
- **Address** only when it is clearly marked up: schema.org PostalAddress (JSON-LD or microdata) or an HTML `<address>` block.

Placeholder and junk emails are removed: image file names (`logo@2x.png`), `example.com`, `yourname@domain.com`, Sentry and Wix tracking addresses, and similar.

### Input

| Field | What it does |
|---|---|
| Websites | Company websites or bare domains, e.g. `acme.com`. Duplicates are removed. |
| Pages per website | 1 to 20 (default 8): the homepage plus the most likely contact pages. |
| Leave out personal-looking emails | Drop addresses shaped like a person's name (`jane.smith@`, `j.smith@`) and keep role and other company addresses (default off). |
| Skip websites with no contact details | Do not save or charge for websites where nothing was found (default off). |
| Websites at once | Parallel websites, 1 to 10 (default 5). |

### Output

| Field | Description |
|---|---|
| `input`, `url`, `domain` | What you entered, the homepage actually loaded, and its domain |
| `companyName` | From structured data, `og:site_name` or the page title |
| `emails` | Unique emails; addresses on the company's own domain first, then role addresses such as info@ or sales@ |
| `phones` | Phone numbers in international format (fax numbers excluded here) |
| `linkedIn`, `facebook`, `x`, `instagram`, `youtube`, `tiktok` | Profile links found on the website |
| `address` | Street, locality, region, postal code, country, full text, and the page it came from |
| `emailDetails`, `phoneDetails`, `socialDetails` | Each value with the pages it was found on and how it was found (link, text, structured data, obfuscated). Emails also get a `type`: `role` (info@, sales@...), `personal` (looks like a person's name) or `other` |
| `pagesVisited` | Every page that was checked |
| `phoneRegionAssumed` | The country used to read local-format phone numbers (from the domain, page language or numbers on the site) |

### Pricing

You pay a flat price per website saved, no matter how many pages were checked, so you know the cost of a list before you run it. Websites that cannot be loaded, are blocked by robots.txt or time out are not saved and not charged; they are listed in the `FAILED_WEBSITES` record of the run's key-value store.

### Notes and limits

- **robots.txt is always respected**, and requests to each website are spaced out. The tool identifies itself as `PlotPointBot`.
- Only public pages are read: no logins, no CAPTCHA solving, no proxies, and no data is fetched from LinkedIn, Facebook or other social networks.
- Pages are downloaded without a browser. Contact details that only appear after JavaScript runs, or inside images, are not found.
- Emails are not verified for deliverability.
- Contact details belong to the website owner. You are responsible for using them lawfully, including data protection and anti-spam rules such as GDPR, CAN-SPAM and PECR, especially for emails that name an individual.

Plot Point Technologies is not affiliated with any website you process with this tool, with the social networks named above, or with Apify.

# Actor input Schema

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

Company websites or bare domains, one per line, e.g. acme.com or https://www.acme.com.

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

The homepage plus the most likely contact, about, team, locations and imprint pages, up to this many pages per website.

## `excludePersonalEmails` (type: `boolean`):

Drop addresses that look like an individual's name, such as jane.smith@ or j.smith@, and keep role addresses (info@, sales@, support@) and other company addresses.

## `skipSitesWithoutContacts` (type: `boolean`):

Do not save (or charge for) websites where no email, phone, social link or address was found.

## `maxConcurrency` (type: `integer`):

How many websites to process in parallel.

## Actor input object example

```json
{
  "websites": [
    "https://www.bakerbotts.com/"
  ],
  "maxPagesPerSite": 8,
  "excludePersonalEmails": false,
  "skipSitesWithoutContacts": false,
  "maxConcurrency": 5
}
```

# 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 = {
    "websites": [
        "https://www.bakerbotts.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("plotpointtech/website-contact-finder").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": ["https://www.bakerbotts.com/"] }

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

```

## MCP server setup

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

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/q52OfxfEnQTm3VhPE/builds/G4YFG4c3VcbU67lbX/openapi.json
