# Website Contact & Socials Extractor

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.

## Actor Statistics

- Total users: 303
- Monthly users: 94
- Runs succeeded: 98.47%
- Categories: Lead generation, Automation, Social media

## Pricing

$10.00/month + usage

## 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.

## API example

## Website Contact & Socials Extractor

- **OpenAPI Version:** `3.1.1`
- **API Version:** `0.1`

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.

### Servers

- **URL:** `https://api.apify.com/v2`

### Operations

#### Executes an Actor, waits for its completion, and returns Actor's dataset items in response.

- **Method:** `POST`
- **Path:** `/acts/embion~website-contact-socials-extractor/run-sync-get-dataset-items`
- **Tags:** Run Actor

##### Request Body

###### Content-Type: application/json

- **`start_urls` (required)**

  `array` — Websites from which to extract contact details.

  **Items:**

  - **`url` (required)**

    `string`, format: `uri`

- **`concurrency_limit`**

  `integer`, default: `10` — Prevents making new requests until the domain responds to the old ones. Useful to avoid overwhelming the target website

- **`max_connect_timeout`**

  `integer`, default: `30` — Time in seconds before actor considers connection timed out.

- **`max_crawl_depth`**

  `integer`, default: `10` — The depth limit for crawling within a website. Helps prevent excessive crawling on sites with dynamically generated pages.

- **`max_fetch_timeout`**

  `integer`, default: `50` — Time in seconds before an HTML page load is considered failed. Prevents resource exhaustion on large responses.

- **`max_pages_per_domain`**

  `integer`, default: `100` — 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_redirects`**

  `integer`, default: `10` — Maximum redirects followed per URL. Prevents resource waste from faulty redirects.

- **`max_request_retries`**

  `integer`, default: `3` — The number of retry attempts per page before giving up.

- **`proxy_settings`**

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

- **`request_rate`**

  `integer`, default: `120` — Prevents crawler from going too fast and getting blocked by a target website.

- **`user_agent`**

  `string`, default: `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"` — The user agent string used by the crawler when making requests.

**Example:**

```
{
  "start_urls": [
    {
      "url": ""
    }
  ],
  "proxy_settings": {},
  "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"
}
```

##### Responses

###### Status: 200 OK

#### Executes an Actor and returns information about the initiated run in response.

- **Method:** `POST`
- **Path:** `/acts/embion~website-contact-socials-extractor/runs`
- **Tags:** Run Actor

##### Request Body

###### Content-Type: application/json

- **`start_urls` (required)**

  `array` — Websites from which to extract contact details.

  **Items:**

  - **`url` (required)**

    `string`, format: `uri`

- **`concurrency_limit`**

  `integer`, default: `10` — Prevents making new requests until the domain responds to the old ones. Useful to avoid overwhelming the target website

- **`max_connect_timeout`**

  `integer`, default: `30` — Time in seconds before actor considers connection timed out.

- **`max_crawl_depth`**

  `integer`, default: `10` — The depth limit for crawling within a website. Helps prevent excessive crawling on sites with dynamically generated pages.

- **`max_fetch_timeout`**

  `integer`, default: `50` — Time in seconds before an HTML page load is considered failed. Prevents resource exhaustion on large responses.

- **`max_pages_per_domain`**

  `integer`, default: `100` — 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_redirects`**

  `integer`, default: `10` — Maximum redirects followed per URL. Prevents resource waste from faulty redirects.

- **`max_request_retries`**

  `integer`, default: `3` — The number of retry attempts per page before giving up.

- **`proxy_settings`**

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

- **`request_rate`**

  `integer`, default: `120` — Prevents crawler from going too fast and getting blocked by a target website.

- **`user_agent`**

  `string`, default: `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"` — The user agent string used by the crawler when making requests.

**Example:**

```
{
  "start_urls": [
    {
      "url": ""
    }
  ],
  "proxy_settings": {},
  "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"
}
```

##### Responses

###### Status: 200 OK

\####### Content-Type: application/json

- **`data`**

  `object`

  - **`actId`**

    `string`

  - **`buildId`**

    `string`

  - **`buildNumber`**

    `string`

  - **`containerUrl`**

    `string`

  - **`defaultDatasetId`**

    `string`

  - **`defaultKeyValueStoreId`**

    `string`

  - **`defaultRequestQueueId`**

    `string`

  - **`finishedAt`**

    `string`, format: `date-time`

  - **`id`**

    `string`

  - **`meta`**

    `object`

    - **`origin`**

      `string`

    - **`userAgent`**

      `string`

  - **`options`**

    `object`

    - **`build`**

      `string`

    - **`diskMbytes`**

      `integer`

    - **`memoryMbytes`**

      `integer`

    - **`timeoutSecs`**

      `integer`

  - **`startedAt`**

    `string`, format: `date-time`

  - **`stats`**

    `object`

    - **`computeUnits`**

      `integer`

    - **`inputBodyLen`**

      `integer`

    - **`rebootCount`**

      `integer`

    - **`restartCount`**

      `integer`

    - **`resurrectCount`**

      `integer`

  - **`status`**

    `string`

  - **`usage`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `integer`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`usageTotalUsd`**

    `number`

  - **`usageUsd`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `number`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`userId`**

    `string`

**Example:**

```
{
  "data": {
    "id": "",
    "actId": "",
    "userId": "",
    "startedAt": "2025-01-08T00:00:00.000Z",
    "finishedAt": "2025-01-08T00:00:00.000Z",
    "status": "READY",
    "meta": {
      "origin": "API",
      "userAgent": ""
    },
    "stats": {
      "inputBodyLen": 2000,
      "rebootCount": 0,
      "restartCount": 0,
      "resurrectCount": 0,
      "computeUnits": 0
    },
    "options": {
      "build": "latest",
      "timeoutSecs": 300,
      "memoryMbytes": 1024,
      "diskMbytes": 2048
    },
    "buildId": "",
    "defaultKeyValueStoreId": "",
    "defaultDatasetId": "",
    "defaultRequestQueueId": "",
    "buildNumber": "1.0.0",
    "containerUrl": "",
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 1,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    },
    "usageTotalUsd": 0.00005,
    "usageUsd": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 0.00005,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    }
  }
}
```

#### Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.

- **Method:** `POST`
- **Path:** `/acts/embion~website-contact-socials-extractor/run-sync`
- **Tags:** Run Actor

##### Request Body

###### Content-Type: application/json

- **`start_urls` (required)**

  `array` — Websites from which to extract contact details.

  **Items:**

  - **`url` (required)**

    `string`, format: `uri`

- **`concurrency_limit`**

  `integer`, default: `10` — Prevents making new requests until the domain responds to the old ones. Useful to avoid overwhelming the target website

- **`max_connect_timeout`**

  `integer`, default: `30` — Time in seconds before actor considers connection timed out.

- **`max_crawl_depth`**

  `integer`, default: `10` — The depth limit for crawling within a website. Helps prevent excessive crawling on sites with dynamically generated pages.

- **`max_fetch_timeout`**

  `integer`, default: `50` — Time in seconds before an HTML page load is considered failed. Prevents resource exhaustion on large responses.

- **`max_pages_per_domain`**

  `integer`, default: `100` — 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_redirects`**

  `integer`, default: `10` — Maximum redirects followed per URL. Prevents resource waste from faulty redirects.

- **`max_request_retries`**

  `integer`, default: `3` — The number of retry attempts per page before giving up.

- **`proxy_settings`**

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

- **`request_rate`**

  `integer`, default: `120` — Prevents crawler from going too fast and getting blocked by a target website.

- **`user_agent`**

  `string`, default: `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"` — The user agent string used by the crawler when making requests.

**Example:**

```
{
  "start_urls": [
    {
      "url": ""
    }
  ],
  "proxy_settings": {},
  "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"
}
```

##### Responses

###### Status: 200 OK

### Schemas

#### inputSchema

- **Type:**`object`

* **`start_urls` (required)**

  `array` — Websites from which to extract contact details.

  **Items:**

  - **`url` (required)**

    `string`, format: `uri`

* **`concurrency_limit`**

  `integer`, default: `10` — Prevents making new requests until the domain responds to the old ones. Useful to avoid overwhelming the target website

* **`max_connect_timeout`**

  `integer`, default: `30` — Time in seconds before actor considers connection timed out.

* **`max_crawl_depth`**

  `integer`, default: `10` — The depth limit for crawling within a website. Helps prevent excessive crawling on sites with dynamically generated pages.

* **`max_fetch_timeout`**

  `integer`, default: `50` — Time in seconds before an HTML page load is considered failed. Prevents resource exhaustion on large responses.

* **`max_pages_per_domain`**

  `integer`, default: `100` — 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_redirects`**

  `integer`, default: `10` — Maximum redirects followed per URL. Prevents resource waste from faulty redirects.

* **`max_request_retries`**

  `integer`, default: `3` — The number of retry attempts per page before giving up.

* **`proxy_settings`**

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

* **`request_rate`**

  `integer`, default: `120` — Prevents crawler from going too fast and getting blocked by a target website.

* **`user_agent`**

  `string`, default: `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"` — The user agent string used by the crawler when making requests.

**Example:**

```
{
  "start_urls": [
    {
      "url": ""
    }
  ],
  "proxy_settings": {},
  "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"
}
```

#### runsResponseSchema

- **Type:**`object`

* **`data`**

  `object`

  - **`actId`**

    `string`

  - **`buildId`**

    `string`

  - **`buildNumber`**

    `string`

  - **`containerUrl`**

    `string`

  - **`defaultDatasetId`**

    `string`

  - **`defaultKeyValueStoreId`**

    `string`

  - **`defaultRequestQueueId`**

    `string`

  - **`finishedAt`**

    `string`, format: `date-time`

  - **`id`**

    `string`

  - **`meta`**

    `object`

    - **`origin`**

      `string`

    - **`userAgent`**

      `string`

  - **`options`**

    `object`

    - **`build`**

      `string`

    - **`diskMbytes`**

      `integer`

    - **`memoryMbytes`**

      `integer`

    - **`timeoutSecs`**

      `integer`

  - **`startedAt`**

    `string`, format: `date-time`

  - **`stats`**

    `object`

    - **`computeUnits`**

      `integer`

    - **`inputBodyLen`**

      `integer`

    - **`rebootCount`**

      `integer`

    - **`restartCount`**

      `integer`

    - **`resurrectCount`**

      `integer`

  - **`status`**

    `string`

  - **`usage`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `integer`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`usageTotalUsd`**

    `number`

  - **`usageUsd`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `number`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`userId`**

    `string`

**Example:**

```
{
  "data": {
    "id": "",
    "actId": "",
    "userId": "",
    "startedAt": "2025-01-08T00:00:00.000Z",
    "finishedAt": "2025-01-08T00:00:00.000Z",
    "status": "READY",
    "meta": {
      "origin": "API",
      "userAgent": ""
    },
    "stats": {
      "inputBodyLen": 2000,
      "rebootCount": 0,
      "restartCount": 0,
      "resurrectCount": 0,
      "computeUnits": 0
    },
    "options": {
      "build": "latest",
      "timeoutSecs": 300,
      "memoryMbytes": 1024,
      "diskMbytes": 2048
    },
    "buildId": "",
    "defaultKeyValueStoreId": "",
    "defaultDatasetId": "",
    "defaultRequestQueueId": "",
    "buildNumber": "1.0.0",
    "containerUrl": "",
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 1,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    },
    "usageTotalUsd": 0.00005,
    "usageUsd": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 0.00005,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    }
  }
}
```

## 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?actors=embion/website-contact-socials-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## 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.

### 🚀 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.

### 🛠 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 — 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 case? 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.
