# Website Contact Extractor - Emails, Phones & Social Links (`veridata/website-contact-extractor`) Actor

Extract emails, phone numbers and social media profiles from company websites. Finds contact, about and imprint pages automatically. Pay only for websites where contacts are found.

- **URL**: https://apify.com/veridata/website-contact-extractor.md
- **Developed by:** [Veridata](https://apify.com/veridata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.60 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Extractor & Email Verifier: Emails, Phone Numbers & Social Links

Get the **emails, phone numbers and social media profiles** listed on any company website. Paste a list of websites or domains; for each one the extractor visits the homepage plus the pages most likely to hold contact details (contact, about, imprint, team, support) and returns one clean row per company.

Built for lead generation, sales prospecting, CRM enrichment and agencies. It works well on the **website column of a Google Maps or lead list export**.

### What you get per website

- **Emails**, with the company's own domain listed first. Includes addresses hidden by Cloudflare email protection and simple obfuscation like `name [at] company [dot] com`.
- **Phone numbers**, validated and formatted in international E.164 format where possible (`+34931234567`).
- **Social profiles**: LinkedIn, Facebook, Instagram, X/Twitter, YouTube, TikTok, Pinterest, GitHub, Threads, WhatsApp and Telegram. Share buttons and tracking links are filtered out.
- **Company name**, the **contact page URL** where emails were found, and the list of pages visited.

### Why this extractor

- **You only pay for websites where contacts were found.** Websites that fail to load or have no contact details are free.
- **Clean results.** Image file names (`logo@2x.png`), placeholder addresses (`name@example.com`), tracking scripts and invalid phone numbers are removed.
- **Multilingual page discovery.** Finds contact pages in English, German, Spanish, French, Italian and Portuguese (`kontakt`, `impressum`, `contacto`, `mentions-legales`, `chi-siamo`...).
- **Fast and lightweight.** Plain HTTP requests, no browser, so large lists run quickly and cheaply.
- **Respects robots.txt** by default.

### Guide

Why naive email scraping returns junk, and how this extractor avoids it: [How to Extract Emails, Phone Numbers and Social Links from a List of Company Websites](https://dev.to/veridata/how-to-extract-emails-phone-numbers-and-social-links-from-a-list-of-company-websites-19eo)

### Email verification (built in)

Turn on **Verify extracted emails** to check every email the extractor finds, or switch **Mode** to **Verify a list of emails** to verify addresses you already have. Each email gets:

- **status**: `valid`, `invalid`, `catch-all`, `risky` or `unknown`
- **reason**, such as `bad_syntax`, `domain_accepts_no_mail`, `disposable_domain`, `mailbox_not_found`
- **domainAcceptsMail**: whether the domain has working mail servers
- flags: **isRoleBased** (info@, sales@...), **isFreeProvider** (Gmail, Outlook...), **isDisposable**, **isCatchAll**
- the domain's **mail server**

Checks run in order: syntax, disposable-domain list, the domain's mail servers (MX records), then an optional mailbox check (SMTP). **No email is ever sent.**

**You're only charged for conclusive results** (`valid`, `invalid` or `catch-all`). `unknown` and `risky` results are free.

Honest limits:

- The mailbox check needs outbound port 25, which the Apify cloud currently blocks. When it's unavailable, addresses on working domains return `unknown` with reason `domain_ok_mailbox_check_unavailable` (free). In practice this is a **domain-level cleaner**: it removes broken syntax, dead domains and disposable addresses, and flags role and free-provider addresses.
- Even where port 25 is open, Google Workspace, Microsoft 365 and other large providers often block mailbox checks, and catch-all domains accept every address.

### How to use

1. Paste your **websites**, one per line. Bare domains like `acme.com` work.
2. Optionally change **max pages per website** (default 5).
3. Run it. Export the results as CSV, Excel or JSON, or send them to Google Sheets, HubSpot, Make, Zapier or n8n through Apify integrations.

### Output example

```json
{
  "inputUrl": "acme-corp.com",
  "domain": "acme-corp.com",
  "website": "https://acme-corp.com/",
  "companyName": "Acme Corp",
  "emails": ["hello@acme-corp.com", "sales@acme-corp.com"],
  "phones": ["+34931234567"],
  "socials": {
    "linkedin": ["https://www.linkedin.com/company/acme-corp"],
    "instagram": ["https://www.instagram.com/acme.corp"]
  },
  "contactPageUrl": "https://acme-corp.com/contact",
  "pagesScraped": ["https://acme-corp.com/", "https://acme-corp.com/contact"],
  "scrapedAt": "2026-11-01T09:00:00+00:00",
  "error": null
}
```

### Pricing

Pay per event: you're charged per **website with contacts found**, and, if you use email verification, per **conclusive email verification**. Websites with no results or that can't be loaded, and inconclusive verifications, are not charged. Set a maximum cost per run in the run options to cap spending.

### Responsible use

This tool collects contact details that companies publish on their own websites. You are responsible for using the data lawfully, including data-protection rules such as the GDPR and anti-spam laws where you operate. Don't use it to send unsolicited messages where that is not allowed.

# Actor input Schema

## `mode` (type: `string`):

Extract contacts from websites, or only verify emails you already have.

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

Company websites or domains, one per line (e.g. apify.com). Paste the website column from a Google Maps or lead list export.

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

Homepage plus the most likely contact, about, imprint and team pages.

## `skipEmptyResults` (type: `boolean`):

Leave websites where nothing was found out of the dataset. They are never charged either way.

## `respectRobotsTxt` (type: `boolean`):

Skip pages the website's robots.txt disallows.

## `verifyEmails` (type: `boolean`):

Check every email found: syntax, domain mail servers, disposable/role/free-provider flags and a mailbox check. Adds a status per email (valid, invalid, catch-all, risky, unknown).

## `emailsToVerify` (type: `array`):

Used when Mode is 'Verify a list of emails'. One email per line.

## `smtpCheck` (type: `boolean`):

Ask the mail server whether the mailbox exists, without sending any email. Turn off for a faster domain-only check.

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

How many websites to process at the same time.

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

Optional. Most company websites work without a proxy.

## Actor input object example

```json
{
  "mode": "extract",
  "websites": [
    "https://apify.com",
    "https://www.crunchbase.com"
  ],
  "maxPagesPerWebsite": 5,
  "skipEmptyResults": false,
  "respectRobotsTxt": true,
  "verifyEmails": false,
  "emailsToVerify": [],
  "smtpCheck": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "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 = {
    "websites": [
        "https://apify.com",
        "https://www.crunchbase.com"
    ],
    "emailsToVerify": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("veridata/website-contact-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 = {
    "websites": [
        "https://apify.com",
        "https://www.crunchbase.com",
    ],
    "emailsToVerify": [],
}

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

```

## MCP server setup

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

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/nn4aTGeqb0V8UqMGY/builds/Rrhn1eYemfOwPMM1V/openapi.json
