# Website Contact & Socials Extractor (`embion/website-contact-socials-extractor`) Actor

Crawl company websites and extract emails, phone numbers and links to Discord, Facebook, Instagram, LinkedIn, Pinterest, Reddit, Snapchat, Telegram, TikTok, Twitch, Twitter/X and YouTube. 2 hour trial available.

- **URL**: https://apify.com/embion/website-contact-socials-extractor.md
- **Developed by:** [Embion](https://apify.com/embion) (community)
- **Categories:** Lead generation, Automation, Social media
- **Features:** Limited permissions
- **Stats:** 929 total users, 4 monthly users, 100.0% runs succeeded, 32 bookmarks
- **User rating**: 3.80 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 & Socials Extractor

### Get emails, phone numbers, and social media links from the company websites

A crawler designed for lead generation and market research. Built for our own needs while collecting datasets for our directory of corporate service providers, it incorporates years of experience in web scraping. Now, we're making it available to you.

### 🔄 Migrate to our new pay-per-website Actor

Apify is retiring the rental pricing model, so this Actor will eventually be deprecated.

We've launched a replacement under the EntityPlane brand including the same core functionality with additional features and better cost efficiency. It uses pay-per-website pricing, with crawling, proxies and runtime included in the price, so there's no need to configure proxy settings or manage compute costs separately.

We recommend migrating to the new Actor:
[EntityPlane's Website Contact & Socials Extractor](https://apify.com/entityplane/website-contact-socials-extractor)

### 🚀 How to start

1. Log into your Apify account.
2. Enter links to target websites in "Start URLs" input field.
3. Enable proxy settings if needed.
4. Click start button.
5. Wait until the job is complete.
6. Collect results from the Default dataset ("Output" tab)

### 🎯 Features

Actor automatically detects each type of contact       information and deduplicates it in the output, making it easy to process and analyze the collected data. Here's what makes it stand out from the crowd:

- **Domain-based grouping:** actor automatically organizes extracted data by domain.
- **Emails, phones and social media platforms:** actor extracts emails, phone numbers and links to Discord, Facebook, Instagram, LinkedIn, Pinterest, Reddit, Snapchat, Telegram, TikTok, Twitch, Twitter/X, YouTube.
- **Adjustable crawl limits:** actor allows setting the limit on how many pages it will crawl per domain and how deep it will go into the website. Algorithm prioritises "team" and "about us" pages, making useful data available with less pages crawled.
- **Cost-efficiency**: written in Rust with performance in mind. Actor skips full browser rendering, which reduces memory use and speeds up crawling, allowing more work on less hardware.

**Limitation:** actor only validates the format of links found on the target website; it does not verify whether the contact information is active or correct.

### 💫 Leave a review or report an issue

If this actor helps your workflow, you can leave a review on its [Apify page](https://apify.com/embion/website-contact-socials-extractor). A review shows us how you use the actor, which helps us prioritize improvements that support your project. Reviews also show other Apify users what kinds of projects this actor handles well.

If the actor misses data or behaves unexpectedly, open an Issue. Add one or two example URLs so we can check the exact case and respond quickly.

### 🛠 Troubleshooting

#### Why hasn't the actor discovered any emails, even though I can clearly see one on the website?

Some webmasters use services like Cloudflare to protect their websites. These services can hide email addresses from crawlers like ours. That's expected behavior, and we currently can't bypass it. Still, feel free to share your case with us: we're happy to take a look and help if we can.

#### Why hasn't the actor discovered any pages?

There are a few possible reasons:

- **Different subdomain:** the actor treats each subdomain as a separate website. It won't follow links from `domain.com` to `second.domain.com`. If the content you need is on another subdomain, include a direct link to it in the starting URL. The only exception is `www.`: the actor treats `www.example.com` and `example.com` as the same.
- **JavaScript-rendered website:** if the page loads content using JavaScript, the actor won't see it because it doesn't support JavaScript rendering at the moment.
- **Blocked or missing links:** if no internal links are found on the starting URL, the actor can't proceed to other pages.

### ⭐ Premium support

Not sure if our actor fits your ca se? The developer is around to help. You can reach out directly on Telegram: https://t.me/nikmadebeykin

### 📒 Supported Contact Types

The actor detects and extracts the following types of contact information:

#### Basic Contact Information

- Email addresses.
- Phone numbers (outputs E164 standard).

#### Social Media Platforms

- Discord.
- Facebook.
- Instagram.
- LinkedIn.
- Pinterest.
- Reddit.
- Snapchat.
- Telegram.
- TikTok.
- Twitch.
- Twitter/X.
- YouTube.

#### Business Listings and Reviews

- Google Maps.
- TripAdvisor.
- Trustpilot.
- Yelp.

#### Messaging Platforms

- WhatsApp.

### 🏗 Output data format

Default output dataset will include a table with the following rows:

```
{
    "domain": {
        "label": "Domain",
        "format": "text"
    },
    "emails": {
        "label": "Emails",
        "format": "array"
    },
    "phones": {
        "label": "Phone Numbers",
        "format": "array"
    },
    "possible_phones": {
        "label": "Possible Phone Numbers",
        "format": "array"
    },
    "discord_urls": {
        "label": "Discord",
        "format": "array"
    },
    "facebook_urls": {
        "label": "Facebook",
        "format": "array"
    },
    "google_maps_urls": {
        "label": "Google Maps",
        "format": "array"
    },
    "instagram_urls": {
        "label": "Instagram",
        "format": "array"
    },
    "linkedin_urls": {
        "label": "LinkedIn",
        "format": "array"
    },
    "pinterest_urls": {
        "label": "Pinterest",
        "format": "array"
    },
    "reddit_urls": {
        "label": "Reddit",
        "format": "array"
    },
    "snapchat_urls": {
        "label": "Snapchat",
        "format": "array"
    },
    "telegram_urls": {
        "label": "Telegram",
        "format": "array"
    },
    "tiktok_urls": {
        "label": "TikTok",
        "format": "array"
    },
    "tripadvisor_urls": {
        "label": "Tripadvisor",
        "format": "array"
    },
    "trustpilot_urls": {
        "label": "Trustpilot",
        "format": "array"
    },
    "twitch_urls": {
        "label": "Twitch",
        "format": "array"
    },
    "whatsapp_urls": {
        "label": "WhatsApp",
        "format": "array"
    },
    "twitter_urls": {
        "label": "Twitter",
        "format": "array"
    },
    "yelp_urls": {
        "label": "Yelp",
        "format": "array"
    },
    "youtube_urls": {
        "label": "YouTube",
        "format": "array"
    },
    "pages_crawled": {
        "label": "Source pages",
        "format": "number"
    },
    "max_depth_reached": {
        "label": "Depth reached",
        "format": "number"
    },
    "start_urls": {
        "label": "Starting URLs",
        "format": "array"
    }
}
```

### ⚖️ Legal

Consider the legal implications of scraping contact information and verify the legality of scraping each target website. Ensure compliance with applicable laws and website terms of service before using this tool. The authors assume no liability for improper use.

# Actor input Schema

## `start_urls` (type: `array`):

Websites from which to extract contact details.

## `proxy_settings` (type: `object`):

Choose the proxy settings for your crawler. The Apify automatic proxy is recommended for most cases.

## `max_pages_per_domain` (type: `integer`):

The maximum number of pages the crawler can visit per domain. Most contacts are found within the first few pages, so a lower limit is often sufficient.

## `max_crawl_depth` (type: `integer`):

The depth limit for crawling within a website. Helps prevent excessive crawling on sites with dynamically generated pages.

## `max_request_retries` (type: `integer`):

The number of retry attempts per page before giving up.

## `max_connect_timeout` (type: `integer`):

Time in seconds before actor considers connection timed out.

## `max_fetch_timeout` (type: `integer`):

Time in seconds before an HTML page load is considered failed. Prevents resource exhaustion on large responses.

## `max_redirects` (type: `integer`):

Maximum redirects followed per URL. Prevents resource waste from faulty redirects.

## `request_rate` (type: `integer`):

Prevents crawler from going too fast and getting blocked by a target website.

## `concurrency_limit` (type: `integer`):

Prevents making new requests until the domain responds to the old ones. Useful to avoid overwhelming the target website

## `user_agent` (type: `string`):

The user agent string used by the crawler when making requests.

## Actor input object example

```json
{
  "start_urls": [
    {
      "url": "http://example.com"
    }
  ],
  "proxy_settings": {
    "useApifyProxy": true
  },
  "max_pages_per_domain": 100,
  "max_crawl_depth": 10,
  "max_request_retries": 3,
  "max_connect_timeout": 30,
  "max_fetch_timeout": 50,
  "max_redirects": 10,
  "request_rate": 120,
  "concurrency_limit": 10,
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
}
```

# Actor output Schema

## `contacts` (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 = {
    "start_urls": [
        {
            "url": "http://example.com"
        }
    ],
    "proxy_settings": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("embion/website-contact-socials-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 = {
    "start_urls": [{ "url": "http://example.com" }],
    "proxy_settings": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("embion/website-contact-socials-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 '{
  "start_urls": [
    {
      "url": "http://example.com"
    }
  ],
  "proxy_settings": {
    "useApifyProxy": true
  }
}' |
apify call embion/website-contact-socials-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,embion/website-contact-socials-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/K3KVQ5n7S5K5p0KbI/builds/7StpQOjxie8eTLWUl/openapi.json
