# Website Contact Finder – Emails, Phones & Socials (`anatolia-data/website-contact-finder`) Actor

Turn a list of websites into leads: public emails, phone numbers, Instagram, LinkedIn, Facebook, TikTok and more, plus address, company name and the platform the site runs on. Pay only for sites where contacts are found.

- **URL**: https://apify.com/anatolia-data/website-contact-finder.md
- **Developed by:** [Oğulcan Katmer](https://apify.com/anatolia-data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 website with contacts

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 – Emails, Phones & Socials

Paste a list of websites, get one clean lead row per site: the public email addresses, phone numbers and social profiles the business publishes about itself.

No login, no API key, no browser. It reads the homepage and the few pages that usually carry contact details — contact, imprint, about, support, team — and merges everything into one row.

### What you get per website

| Field | Description |
|---|---|
| `primaryEmail`, `emails` | Every public email, best first: the site's own domain and general inboxes (info@, hello@, support@) rank above everything else |
| `emailsOnOwnDomain` | Only the addresses on the company's own domain — the ones that are safest to use for outreach |
| `primaryPhone`, `phones` | Phone numbers, de-duplicated across formats (`+1 518 400 1050` and `(518) 400-1050` count once) |
| `instagram`, `facebook`, `linkedin`, `twitter`, `tiktok`, `youtube`, `pinterest`, `threads`, `snapchat`, `whatsapp`, `telegram` | The company's own profile on each network. Share buttons, single posts and embedded videos are ignored |
| `address` | Postal address from the site's structured data |
| `name`, `pageTitle` | Company name, read from the site itself |
| `platform` | What the site runs on: Shopify, WordPress, WooCommerce, Wix, Squarespace, Webflow, HubSpot, Framer and more |
| `contactPageUrl`, `pagesScanned` | Where the details were found |
| `contactChannels`, `hasContactInfo`, `status` | How reachable the business is at a glance |

### Why the results are clean

- **Placeholders are dropped.** `your@email.com`, `name@example.com`, `logo@2x.png`, tracking hashes and `noreply@` never reach your list.
- **Scripts are ignored.** Analytics and app configs are full of addresses that are not the company's. Only what a visitor can actually see is read — plus the site's own structured data.
- **Hidden emails are decoded.** Cloudflare's email protection is reversed automatically.
- **The most-linked profile wins.** When a footer links to the brand and a blog post links to a collaborator, you get the brand.

### Input

```json
{
  "websites": ["deathwishcoffee.com", "basecamp.com", "https://www.example-agency.co.uk/about"],
  "maxPagesPerSite": 5,
  "onlyWithContacts": false
}
```

A bare domain is enough. Any page of the site works, and so does an email address — its domain is used.

### Common uses

- **Lead lists** — enrich a list of company domains from a CRM export, a directory or another scraper
- **Agency prospecting** — find the contact route for every business in a niche, plus the platform they are built on
- **Partnership and PR outreach** — reach the press@ or partners@ inbox instead of a generic form
- **Data cleaning** — confirm which domains in a list are live and reachable

### Pairs well with

- **[Shopify Store Contact Finder](https://apify.com/anatolia-data/shopify-store-contacts)** — the same idea tuned for Shopify stores, with store country, currency and product count
- **[Shopify Store Analyzer](https://apify.com/anatolia-data/shopify-store-analyzer)** — the theme and apps a Shopify store runs

### Notes and limits

- Only information the website publishes publicly is collected. The Actor respects each site's `robots.txt`.
- Contact forms are not submitted and personal inboxes are not guessed — if a site does not publish an address, none is invented.
- Sites that render everything with JavaScript and publish no contact details in the HTML may come back as `no-contacts-found`.

### Pricing

Pay per website where at least one email, phone or social profile is found. Sites with nothing found, and unreachable sites, are free. You can cap spend per run with **Max cost per run** in the Apify Console.

### Support

Something missing or wrong? Open an issue on the **Issues** tab with the website and the run ID.

# Actor input Schema

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

One website per line. A bare domain is enough — stripe.com. Any page of the site works too, and so does an email address (its domain is used).

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

Same as above, for long lists loaded from a file or another Actor.

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

The homepage plus the most promising pages linked from it: contact, imprint, about, support, team. 5 finds contacts on most sites.

## `onlyWithContacts` (type: `boolean`):

Leave out sites where nothing was found. You are never charged for those either way.

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

Apify Proxy is recommended for long lists.

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

How many pages are loaded at once.

## Actor input object example

```json
{
  "websites": [
    "deathwishcoffee.com",
    "basecamp.com"
  ],
  "startUrls": [],
  "maxPagesPerSite": 5,
  "onlyWithContacts": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 10
}
```

# Actor output Schema

## `results` (type: `string`):

One row per website.

## `overview` (type: `string`):

Open the dataset in a table view.

# 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": [
        "deathwishcoffee.com",
        "basecamp.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("anatolia-data/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": [
        "deathwishcoffee.com",
        "basecamp.com",
    ] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anatolia-data/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/lnrjLDI5DO0UFzD9L/builds/I8liP0FdDflTKobyb/openapi.json
