# Contact Details Scraper - Emails, Phones & Socials (`kamerozkan/contact-details-scraper`) Actor

Extract emails, phone numbers and social profiles (LinkedIn, Facebook, Instagram, X, YouTube) from company websites. One row per website, contact and imprint pages crawled automatically. Pay per website, not per page.

- **URL**: https://apify.com/kamerozkan/contact-details-scraper.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 6 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 websites

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

## Contact Details Scraper - Emails, Phones & Socials

**Extract emails, phone numbers and social media profiles from any list of company websites.** Paste domains or URLs and get **one clean row per website**: published email addresses, phone numbers, LinkedIn company page, Facebook, Instagram, X (Twitter), YouTube, TikTok, Pinterest, GitHub and XING, plus the company name. The Actor finds and opens the site's **contact, imprint (Impressum) and about pages** for you.

You pay **per website, not per page**, and websites that cannot be opened are never charged. No API key, account or proxy setup needed.

### What does Contact Details Scraper do?

For every website you give it, it loads the homepage, picks the pages on the same domain that usually hold contact data (Contact, Kontakt, Impressum, Imprint, Legal notice, About us, Support) and collects:

- email addresses from `mailto:` links, page text and structured data (schema.org),
- phone numbers from `tel:` links, structured data and labelled text such as "Tel.:" or "Phone:",
- the company's own social profiles,
- the company name from structured data or the site title.

All results for one website are merged, de-duplicated and sorted (addresses on the site's own domain first), so you get a lead-ready row instead of hundreds of page rows to clean up.

### Who is it for?

- **Sales and lead generation teams**: enrich a list of target companies with emails, phones and LinkedIn pages before outreach.
- **Agencies**: turn a Google Maps or directory export of business websites into a contact list.
- **Marketers**: find the Instagram, TikTok, YouTube and Facebook accounts of brands, shops or partners.
- **CRM and data teams**: fill missing contact fields for existing accounts on a schedule.

### What data can you extract?

| Field | Example |
|---|---|
| `domain` | `moz.com` |
| `companyName` | `Moz` |
| `emails` | `["help@moz.com"]` |
| `phones` | `["+49 30 577 00 820"]` (format as published) |
| `linkedin` | `https://www.linkedin.com/company/moz` (company pages only) |
| `facebook`, `instagram`, `twitter`, `youtube`, `tiktok`, `pinterest`, `github`, `xing` | profile links, or `null` |
| `website` | final homepage URL after redirects |
| `contactPages` | the contact, imprint and about pages that were crawled |
| `pagesCrawled` | pages opened for this website |
| `input` | the website exactly as you entered it |
| `scrapedAt` | `2026-10-09T19:36:21Z` |

### How much does it cost to scrape contact details?

You pay only for websites saved to your dataset: **$1.50 per 1,000 websites** on the Free plan ($0.0015 per website), with lower prices on paid Apify plans (up to 20% off). Platform usage is included. The price is the same whether the Actor opens 1 or 10 pages of a website.

Worked example: enriching 500 company websites costs 500 x $0.0015 = $0.75. A list of 30 websites costs $0.045.

Websites that are offline, return an error or show a bot check page are **not saved and not charged**; they are listed in the `FAILED_WEBSITES` record of the run's key-value store. Turn on **Only websites with contacts** to also skip (and not pay for) websites where nothing was found. Set **Max websites** or a maximum cost per run to cap spending.

### How to scrape emails and phone numbers from websites

1. Click **Try for free**.
2. Paste your **websites**, one per line (`apify.com`, `https://www.haribo.com`, ...). From another Actor or integration, pass them as **Start URLs** in the `{"url": "..."}` format.
3. Optionally change **Max pages per website** (default 4) and turn on **Only websites with contacts**.
4. Click **Start**. 100 websites usually take one to two minutes; up to 10 websites are crawled in parallel.
5. Download the results as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "websites": ["apify.com", "https://www.python.org", "haribo.com", "moz.com", "ritter-sport.de"],
  "maxPagesPerSite": 4,
  "onlyWebsitesWithContacts": false,
  "maxItems": 100
}
```

| Parameter | Type | Default | Description |
|---|---|---|---|
| `websites` | array of strings | 5 sample sites | Domains or URLs, one per website. Duplicate domains are removed. |
| `startUrls` | array of `{"url"}` | empty | Same as `websites`, for integrations and other Actors' output. |
| `maxPagesPerSite` | integer 1 to 10 | 4 | Homepage plus contact, imprint and about pages on the same domain. |
| `onlyWebsitesWithContacts` | boolean | false | Save and charge only websites with at least one email, phone or social profile. |
| `maxItems` | integer | 100 | Maximum websites in the dataset; caps the cost of the run. |

### Output example

A real row from a test run on 2026-10-09:

```json
{
  "input": "moz.com",
  "website": "https://moz.com/",
  "domain": "moz.com",
  "companyName": "Moz",
  "emails": ["help@moz.com"],
  "phones": [],
  "linkedin": "https://www.linkedin.com/company/moz",
  "facebook": "https://www.facebook.com/moz",
  "instagram": "https://www.instagram.com/moz_hq",
  "twitter": "https://twitter.com/Moz",
  "youtube": "https://www.youtube.com/channel/UCs26XZBwrSZLiTEH8wcoVXw",
  "tiktok": null,
  "pinterest": null,
  "github": null,
  "xing": null,
  "contactPages": ["https://moz.com/about/contact", "https://moz.com/help"],
  "pagesCrawled": 3,
  "scrapedAt": "2026-10-09T19:36:21Z"
}
```

The dataset has two views: **Overview** (domain, company, emails, phones, main social profiles) and **All social profiles**.

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, chain it after a Google Maps or directory scraper, schedule it, or connect it to Make, n8n, Zapier, Google Sheets or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/contact-details-scraper").call(run_input={
    "websites": ["apify.com", "moz.com", "haribo.com"],
    "onlyWebsitesWithContacts": True,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["domain"], row["emails"], row["phones"], row["linkedin"])
```

```bash
curl -X POST "https://api.apify.com/v2/acts/kamerozkan~contact-details-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"websites": ["apify.com", "moz.com"]}'
```

### FAQ

**Which pages does it open?** The homepage, then up to `maxPagesPerSite - 1` pages on the same domain whose link or address mentions contact, Kontakt, Impressum, imprint, legal notice, about or support. Contact and imprint pages come first. It never leaves the website's domain.

**Why was a website not found or not charged?** Some sites are offline, block automated visitors or show a bot check. The Actor does not try to get around such checks; the website is skipped, not charged and listed in `FAILED_WEBSITES`.

**Does it find hidden or obfuscated emails?** No. It returns addresses the company publishes in links, page text or structured data. Addresses hidden behind email protection scripts are not decoded.

**Does it return personal profiles?** No. LinkedIn results are company, school or showcase pages; personal `/in/` profiles are skipped. Use the data for business contacts only.

**Is it legal to collect this data?** It collects contact details that companies publish on their own websites so that people can reach them. You are responsible for how you use the data, including GDPR, anti-spam rules such as CAN-SPAM, and the websites' terms.

**Something is not working?** Open an issue on the Issues tab with your run link and it will be fixed quickly.

### Support and feedback

- Found a bug or missing a field? Open an issue on the **Issues** tab of this Actor. We reply within
  48 hours and ship most fixes within a few days.
- Have an idea for a feature? Issues are the fastest way to get it built.
- If the Actor saves you time, a short review on this page helps other users find it.

# Actor input Schema

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

Company websites or domains, one per line, for example "apify.com" or "https://www.haribo.com". The Actor opens the homepage and the site's own contact, imprint and about pages. Duplicate domains are removed.

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

Same as Websites, in the {"url": "..."} format other Actors and integrations produce, for example the website field of a Google Maps export. Both lists are combined.

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

Homepage plus contact, imprint (Impressum) and about pages found on the same domain. More pages find more contacts but take longer. The price per website is the same.

## `onlyWebsitesWithContacts` (type: `boolean`):

Save and charge only websites where at least one email, phone number or social profile was found. Websites that cannot be opened are never charged.

## `maxItems` (type: `integer`):

Stop after this many websites in the dataset. You are charged per website, so this also caps the cost of the run.

## Actor input object example

```json
{
  "websites": [
    "apify.com",
    "https://www.python.org",
    "haribo.com",
    "moz.com",
    "ritter-sport.de"
  ],
  "maxPagesPerSite": 4,
  "onlyWebsitesWithContacts": false,
  "maxItems": 100
}
```

# Actor output Schema

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

One row per result in the default dataset.

# 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": [
        "apify.com",
        "https://www.python.org",
        "haribo.com",
        "moz.com",
        "ritter-sport.de"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/contact-details-scraper").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": [
        "apify.com",
        "https://www.python.org",
        "haribo.com",
        "moz.com",
        "ritter-sport.de",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/contact-details-scraper").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": [
    "apify.com",
    "https://www.python.org",
    "haribo.com",
    "moz.com",
    "ritter-sport.de"
  ],
  "maxItems": 100
}' |
apify call kamerozkan/contact-details-scraper --silent --output-dataset

```

## MCP server setup

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

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/RuhCTiLp3YLPcbZe9/builds/Ff5BbS3a4M3ZGnvMc/openapi.json
