# Website Email & Phone Finder (`caprolok/website-email-phone-finder`) Actor

Accelerate your outreach by using our Contact Details Scraper to quickly gather emails from any domain, enhancing your marketing strategies and expanding your sales network.

- **URL**: https://apify.com/caprolok/website-email-phone-finder.md
- **Developed by:** [Caprolok](https://apify.com/caprolok) (community)
- **Categories:** Lead generation
- **Features:** Limited permissions
- **Stats:** 2,444 total users, 65 monthly users, 100.0% runs succeeded, 36 bookmarks
- **User rating**: 4.18 out of 5 stars

## Pricing

$20.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 Email & Phone Finder

[![Website Email & Phone Finder Actor](https://apify.com/actor-badge?actor=caprolok/website-email-phone-finder)](https://apify.com/caprolok/website-email-phone-finder)

Find business emails and phone numbers for any list of domains. Built for sales teams, recruiters, and marketers who need to enrich website lists with real contact info at scale.

Submit your domains, get back structured contact data per domain, including the original input URL preserved for easy mapping in your workflow.

***

### Key features

- **Email extraction** from publicly available data (e.g. `c******@company.com`, `s****@business.org`)
- **Phone number extraction** in international E.164 format where possible
- **Source links** included with every result so you can verify where the data came from
- **Original input URL preserved** as `inputUrl` in the output, making 1:1 row matching trivial in Zapier, n8n, Make, or your own scripts
- **Smart filtering** removes duplicates and skips noise like `noreply@` and `no-reply@`
- **Bulk processing** for hundreds or thousands of domains in a single run
- **Flexible input** accepts bare domains, full URLs, or URLs with paths and query strings

***

### Use cases

1. Sales prospecting: turn a target account list into a working contact list
2. Lead generation: enrich domain lists with email and phone data for outreach
3. Recruitment: find HR or careers contacts at sourcing targets
4. Marketing: build niche contact lists for cold email or partnerships
5. CRM enrichment: fill in missing data on existing accounts in HubSpot, Salesforce, Pipedrive
6. Business development: locate decision-maker contacts for partnership outreach
7. Competitive research: map the contact networks of competitors and adjacent companies
8. Event outreach: gather attendee or sponsor contacts for webinars and conferences

***

### Input

| Field   | Type    | Required | Description                                  |
|---------|---------|----------|----------------------------------------------|
| domains | array   | Yes      | List of domains or URLs to extract contacts for |

You can pass any of the following formats. The actor cleans them automatically:

- Bare domain: `example.com`
- With protocol: `https://example.com`
- With subdomain: `https://www.example.com`
- With path or query string: `https://example.com/contact?ref=abc`

#### Example input

```json
{
  "domains": [
    "example.com",
    "https://company.org/contact",
    "https://www.business.net/about"
  ]
}
```

***

### Output

Each result row in the dataset contains the following fields:

| Field          | Type     | Description                                                          |
|----------------|----------|----------------------------------------------------------------------|
| `inputUrl`     | string   | The original input value, exactly as you provided it                 |
| `domain`       | string   | The cleaned base domain used for the search                          |
| `emails`       | string\[] | Email addresses found, deduplicated and filtered                     |
| `phoneNumbers` | string\[] | Phone numbers found, normalized to E.164 format where possible       |
| `links`        | string\[] | URLs of the public pages where the contact info was discovered       |

#### Example output

```json
[
  {
    "inputUrl": "https://example.com/contact",
    "domain": "example.com",
    "emails": [
      "c******@example.com",
      "s******@example.com"
    ],
    "phoneNumbers": [
      "+155*****567"
    ],
    "links": [
      "https://example.com/contact",
      "https://example.com/about"
    ]
  },
  {
    "inputUrl": "company.org",
    "domain": "company.org",
    "emails": [
      "h****@company.org"
    ],
    "phoneNumbers": [],
    "links": [
      "https://company.org/team"
    ]
  }
]
```

#### Tabular view

| inputUrl                       | domain      | emails                                              | phoneNumbers      |
|--------------------------------|-------------|-----------------------------------------------------|-------------------|
| https://example.com/contact    | example.com | `["c******@example.com", "s******@example.com"]`    | `["+155*****567"]` |
| company.org                    | company.org | `["h****@company.org"]`                             | `[]`               |

***

### Pricing

Pay-per-result: $20 per 1,000 results. You only pay for domains where contact info is actually found.

#### Free plan

On the Apify Free plan, the actor processes 1 domain per run and returns partially masked emails and phone numbers (e.g. `c******@example.com`, `+155*****567`) so you can verify the actor works before upgrading.

[Upgrade your plan](https://apify.com/pricing) to unlock all domains and full unmasked results.

***

### How it works

1. Reads your list of input domains and URLs
2. Normalizes each entry to a base domain
3. Looks up publicly available contact information associated with each domain
4. Extracts emails and phone numbers from the collected data
5. Validates and deduplicates contacts, filters out noise
6. Returns results to the Apify dataset with the original input URL preserved

***

### Frequently asked questions

#### Why are some domains returning no contacts?

Not every website has publicly available contact info. Domains with strong privacy controls or minimal web presence may return empty results.

#### Are the phone numbers verified?

Phone numbers are extracted from publicly available data and normalized. They are not actively dialed for verification, so we recommend validating before use in critical workflows.

#### Can I use this with Zapier, Make, or n8n?

Yes. Use the standard Apify integration in any of these platforms. The `inputUrl` field is included in every result specifically to make 1:1 matching with your input rows easy in automated workflows.

#### What about GDPR and data privacy?

This actor only collects contact info that is already publicly available. You are responsible for ensuring your use of this data complies with GDPR, CAN-SPAM, and any other regulations in your jurisdiction.

#### Can I target specific subdomains or paths?

The actor normalizes inputs to the base domain for lookup, but content from subdomains can still appear in results. Pass the full URL if you want to preserve it in the `inputUrl` output field.

***

### Support

If you run into any issues, have suggestions, or need help integrating this actor into your workflow, please open a ticket in the **Issues** tab on the actor page. Our team monitors it actively and responds promptly.

# Actor input Schema

## `domains` (type: `array`):

Enter the domains you want to find contact details for

## Actor input object example

```json
{
  "domains": [
    "centralrestaurante.com",
    "disfrutarbarcelona.com",
    "diverxo.com",
    "asadoretxebarri.com",
    "alchemist.dk"
  ]
}
```

# 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 = {
    "domains": [
        "centralrestaurante.com",
        "disfrutarbarcelona.com",
        "diverxo.com",
        "asadoretxebarri.com",
        "alchemist.dk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("caprolok/website-email-phone-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 = { "domains": [
        "centralrestaurante.com",
        "disfrutarbarcelona.com",
        "diverxo.com",
        "asadoretxebarri.com",
        "alchemist.dk",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("caprolok/website-email-phone-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 '{
  "domains": [
    "centralrestaurante.com",
    "disfrutarbarcelona.com",
    "diverxo.com",
    "asadoretxebarri.com",
    "alchemist.dk"
  ]
}' |
apify call caprolok/website-email-phone-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,caprolok/website-email-phone-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/mD5Xdfj9XeMS5FWPc/builds/4xn7RjpOjnr156163/openapi.json
