# Contact Extractor – Emails, Phones & Socials from Any Website (`maged120/extract-contacts`) Actor

Contact extractor: pull every email address, phone number, social media profile (50+ platforms) and contact link from the web pages you list, as structured rows. Ideal for lead generation, outreach lists and CRM enrichment. Export to CSV, JSON, Excel or API.

- **URL**: https://apify.com/maged120/extract-contacts.md
- **Developed by:** [Maged](https://apify.com/maged120) (community)
- **Categories:** Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 46 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.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.
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

### What does Contact Extractor do?

**Contact Extractor** reads the web pages you give it and pulls out the contact details on them: email addresses, phone numbers, social media profiles (50+ platforms, from LinkedIn and Instagram to TikTok, Telegram and WhatsApp) and contact page links. Every contact is one row, with the page it was found on.

It runs on [Apify](https://apify.com), so you can call it from the API, schedule it, or send the results to Google Sheets, Make, Zapier or n8n.

### What people use it for

- **Lead generation:** turn a list of company websites into emails, phones and social profiles.
- **Sales prospecting:** find the LinkedIn, X or Instagram accounts behind a list of sites.
- **PR and outreach:** get the contact addresses of blogs and media sites.
- **Enriching a CRM:** add the socials and phones a company lists on its own site.

### How to use it

1. Click **Try for free**.
2. Paste the page URLs into **URLs to scrape**. Use the pages where contacts usually are: home, contact, about, team.
3. Turn on **Render JavaScript** for sites that load their content with scripts.
4. Click **Start**. Contacts appear in the **Output** tab.
5. Download as JSON, CSV or Excel, or use the API.

### Input

```json
{
  "urls": [
    "https://example.com/contact",
    "https://another-company.com/about"
  ],
  "batch_size": 5,
  "renderJavaScript": false
}
```

| Field | Type | Description | Default |
|---|---|---|---|
| `urls` | array | The pages to read. Each URL is read as given; links on it aren't followed | required |
| `batch_size` | integer | Pages read at the same time (1–50) | `5` |
| `renderJavaScript` | boolean | Load each page in a browser so contacts added by scripts are found. Slower | `false` |

### Output

One row per contact found:

```json
[
  { "type": "email", "value": "hello@example.com", "source": "page_content", "from_url": "https://example.com/contact" },
  { "type": "phone", "value": "+1 415 555 0132", "source": "page_content", "from_url": "https://example.com/contact" },
  { "type": "social", "platform": "linkedin", "value": "example-inc", "url": "https://www.linkedin.com/company/example-inc", "source": "page_content", "from_url": "https://example.com/contact" },
  { "type": "contact_link", "value": "https://example.com/support", "source": "page_content", "from_url": "https://example.com/contact" }
]
```

| Field | Type | Description |
|---|---|---|
| `type` | string | `email`, `phone`, `social` or `contact_link` |
| `value` | string | The email, phone number, social username or link |
| `platform` | string | For `social` rows: the platform, like `linkedin`, `instagram`, `tiktok` |
| `url` | string | For `social` rows: the full profile URL |
| `source` | string | Where on the page it was found |
| `from_url` | string | The page it was found on |

### How many results will I get?

It depends on the page. A contact page often has 3–15 contacts, a page with no contact details gives none. Each contact appears once per page. You pay per contact; your plan's rates are on the **Pricing** tab.

### FAQ

**Does it crawl the whole website?**
No, it reads exactly the pages you list. To cover a site, add its contact, about and team pages, or get the site's URLs first with **URL Extractor & Website Crawler** below.

**Does it find emails hidden behind forms or logins?**
No, only what's written on the public page.

**Is it maintained?**
Yes, I keep it running. If something breaks, open an issue in the **Issues** tab and I'll look at it.

**Need a custom feature?**
Open an issue or message me on Discord: **maged03211**

***

⭐ **Found it useful?** A short review on the Store helps other people find it, and it tells me what to improve next.

### Related tools

- [URL Extractor & Website Crawler – every URL of a site](https://apify.com/maged120/get-urls-pro)
- [Google Maps Leads Scraper – businesses with emails, phones and socials](https://apify.com/maged120/google-maps-leads-scraper)

# Actor input Schema

## `urls` (type: `array`):

List of website URLs to extract contact information (emails, phone numbers, social media profiles, and contact links) from.

## `batch_size` (type: `integer`):

Number of URLs to process concurrently in a batch. Adjust to balance speed and server load.

## `renderJavaScript` (type: `boolean`):

Load each site like a real visitor so contacts added by JavaScript are found. Turn off for faster runs on simple sites.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com/maged120"
  ],
  "batch_size": 5,
  "renderJavaScript": false
}
```

# 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 = {
    "urls": [
        "https://apify.com/maged120"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/extract-contacts").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 = { "urls": ["https://apify.com/maged120"] }

# Run the Actor and wait for it to finish
run = client.actor("maged120/extract-contacts").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 '{
  "urls": [
    "https://apify.com/maged120"
  ]
}' |
apify call maged120/extract-contacts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maged120/extract-contacts"
        }
    }
}
```

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/shrysvMKFe925h6DG/builds/gqkZVg3UYxYbCItub/openapi.json
