# Website Contact Scraper — Email Phone Social Extractor (`intelscrape/contact-info-scraper`) Actor

Website contact scraper for emails, phones & named contacts. Soft CTA → Maps email / email-finder / Skip Trace.

- **URL**: https://apify.com/intelscrape/contact-info-scraper.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Lead generation, SEO tools, Automation
- **Stats:** 6 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Contact Scraper — Email & Phone Finder

![Actor Banner](https://api.apify.com/v2/key-value-stores/PyvJzfQg02FD3RYhd/records/contact-info-scraper-banner.png)

> 🇨🇳 **中文简介 (Chinese — China & Singapore):**
> 网站联系方式抓取 / 邮箱电话社交链接：输入 URL 列表，深度扫描首页、联系页与关于页，提取邮箱、电话与社交链接，并尽量识别技术栈。按有效联系结果计费，无需 API Key——适合增长团队与跨境销售。本地商家可先用谷歌地图邮箱提取，再对本站深扫；马上在 Apify 试跑，把清洗联系人送进 CRM。

> 🇸🇬 **Ringkasan Melayu (Singapore):**
> Ada senarai laman web tapi susah jumpa kontak? Beri URL — kami imbas halaman kontak/about untuk e-mel, telefon dan pautan sosial, plus isyarat tech stack. Bayar untuk kontak berguna, tiada API key. Sesuai untuk growth, agensi dan jualan merentas sempadan dari Singapura. Cuba di Apify hari ini.

#### 🤖 NEW: Connect This To Your AI!

Want website contact crawls inside Claude, Cursor, or ChatGPT? Use the **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — let your AI deep-scan contact/about pages for emails & phones via MCP, then enrich people with **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)**. Need Maps discovery first? Soft-cross to **[Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor)** / **[No-Website Leads](https://apify.com/intelscrape/website-Leads)**. Prefer name+domain MX? Soft-cross to **[Email Finder & Verifier](https://apify.com/intelscrape/email-finder-verified)**.

#### 🏆 Featured Bots by IntelScrape

1. **[Website Contact Scraper — Email & Phone Finder](https://apify.com/intelscrape/contact-info-scraper)** — Emails, Phones & Named Contacts
2. **[Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor)** — Local Business Email Leads
3. **[Email Finder & Verifier](https://apify.com/intelscrape/email-finder-verified)** — B2B Lookup + MX
4. **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** — Name, Address, Phone & Email People Lookup
5. **[TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)** — Phone & Email Matches
6. **[Shopify Store Leads](https://apify.com/intelscrape/shopify-owner-email)** — Niche Packs & Owner Emails
7. **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)** — Local Businesses Without a Website
8. **[Building Permit Scraper](https://apify.com/intelscrape/building-permit-scraper)** — Roofing, Solar & HVAC Leads
9. **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — Use Skip Trace inside Claude, Cursor, ChatGPT

> **Nice — next step:** Need MX / name+domain candidates? SoftCTA → **[Email Finder & Verifier](https://apify.com/intelscrape/email-finder-verified)**. Maps niche+city? **[Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor)**. People enrich when ready → **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)**. Depth on this Actor: opt-in `verifyEmails` + `phoneLineTypes[]` (honest offline — no fake WhatsApp-live); PPE charges queued when Store unlocks.

***

⚡ **Use this Actor in n8n — no code**

1. Add the official **Apify** node in n8n.
2. Connect your Apify API token.
3. Run Actor ID: `IntelScrape/contact-info-scraper`.

***

![billing](https://img.shields.io/badge/billing-pay_per_site_+_email_/_tech_events-2ea44f)
![API key](https://img.shields.io/badge/API_key-not_required-blue)
![coverage](https://img.shields.io/badge/coverage-Any_website-8a2be2)
![modes](https://img.shields.io/badge/modes-URL_list_·_Maps_discovery-blue)

**Turn website lists (or Maps searches) into contact spreadsheets** — emails, phones, social profiles, optional tech stack & ad pixels.\
**Deep-scans contact/about pages (optional sitemap.xml discovery + MX email checks). No API key.**

**Phones & mobile (honest):** Numbers normalized to E.164 (`defaultPhoneCountry`). `mobilePhones[]` + **`phoneLineTypes[{ e164, lineType }]`** use libphonenumber `getType()` (MOBILE / FIXED\_LINE / FIXED\_LINE\_OR\_MOBILE / VOIP / …) — **not** a live carrier registry, **not** WhatsApp-active, **not** DNC. Public `wa.me` / WhatsApp links are captured in `socialLinks` when the site publishes them. Need people-level phone/email enrichment? Soft CTA → **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)**.

> **Honest coverage & billing (read this):** Charged for **dataset items** (scraped sites, **$0.005**) + actor start (**$0.0005**). Extra PPE when delivered: **email-found ($0.04)**, **tech-stack ($0.02)**, **named-contact ($0.002 per person, queued ~Sep 19)**, plus the depth bundle **email-verified** (when `verifyEmails` finds ≥1 MX-valid) and **phone-line-type** (when `includePhones` delivers ≥1 `phoneLineTypes[]` row). Sites with no crawlable contact data may still create a thin row — check Console events. Discovery via Maps depends on public listing quality.

***

> 🧭 Built for **agencies, SDR teams, and growth operators.** Popular with teams in the **US, China, and Singapore** researching / enriching at scale.

> ⭐ **Store rating is driven by daily power users.** Please [leave a review](https://apify.com/intelscrape/contact-info-scraper) if this saves you time.

> ⚖️ **Lawful business use only.** Scrapes publicly linked contact details on websites you provide or discover. You are liable for outreach compliance (CAN-SPAM/PDPA/etc.).

> 📌 *Examples in this README are **fictional** unless stated otherwise.*

***

### 🕵️‍♂️ Why Choose Us vs. "Cheaper" Competitors?

| Feature | Website Contact Scraper | Cheap URL dumpers |
| :--- | :--- | :--- |
| **Deep pages** | Contact/about crawl | Homepage regex only |
| **Maps discovery** | Built-in | BYO URLs only |
| **Tech signals** | Optional PPE | Rarely included |
| **Named contacts** | `people[]` from team/about + JSON-LD + LinkedIn | Homepage dump only |
| **Billing clarity** | Site + email/tech/named-contact events | Opaque compute |

### Quick start

```json
{
  "urls": ["https://apify.com/"],
  "scrapeContactPages": true,
  "includeSocial": true,
  "includePhones": true,
  "verifyEmails": true,
  "includeNamedContacts": true,
  "includeTechStack": false
}
```

Maps discovery: set `searchQueries` like `["dentists in Austin TX"]` instead of `urls`.

### Rival-parity inputs (webdata\_labs)

- **`websites[]` / `domains[]`** — aliases for `urls` / `startUrls` (normalize + dedupe).
- **`stopWhenEmailFound`** (default false) — stop crawling a site once a same-domain company email is found.
- **`emailScore` 0–100** on each email (+ `bestEmailScore` on the site row): +35 on-domain, +20 mailto, +20 MX valid, +15 not role-junk, +10 contact-page source. MX verify stays free; no SMTP PPE.
- **`filtersApplied`** stamp when aliases/filters matter.
- Soft CTA on `contacts-batch-summary` → Maps Email / Website Leads / Skip Trace / TPS (no self-link).

### Soft CTA — email MX verify + phone lineType depth bundle

Depth layers on this Actor (honest, offline validators):

- **`email-found`** — charged when a harvested email is delivered on the row
- **`email-verified`** — opt-in via `verifyEmails`; `emailMx[]` ships now; PPE charge queued (~2026-10-05) after Store pricing rate-limit from prior named-contact change
- **`phone-line-type`** — `phoneLineTypes[{ e164, lineType }]` from libphonenumber ships now (not live carrier / not WhatsApp-active / not DNC); PPE charge queued (~2026-10-05)
- **`tech-stack`** — charged when CMS/framework signals are detected (`includeTechStack`)
- **`named-contact`** — queued PPE (effective ~2026-09-19) when `people[{name,title,linkedin,email?}]` is delivered (`includeNamedContacts`, default ON)

Base crawl rows bill **`apify-default-dataset-item`**. Need person enrichment beyond public team pages? Soft-cross to **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)**. For Maps niche+city email hunting use **[Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor)**; for name+domain MX patterns use **[Email Finder & Verifier](https://apify.com/intelscrape/email-finder-verified)**; for no-website locals use **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)**.

### What you get

- Emails & phones when published
- Optional MX email verify (`emailMx[]`) + phone lineType depth (`phoneLineTypes[]`)
- Named contacts (`people[]`) from team/about/leadership + JSON-LD Person + LinkedIn profile links
- Social links (Facebook, Instagram, LinkedIn, etc.)
- Optional tech stack / ad pixels
- Source URL + scrape status

### Pricing (PPE)

| Event | Price |
| :--- | ---: |
| Actor start | **$0.0005** |
| Site / dataset item | **$0.005** |
| Email found | **$0.04** |
| Email verified (MX, opt-in, queued ~Oct 5) | **$0.001** |
| Phone line type (queued ~Oct 5) | **$0.001** |
| Tech stack | **$0.02** |
| Named contact (queued ~Sep 19) | **$0.002** / person |

### Legal

Lawful B2B prospecting of publicly published website contacts only. Comply with local outreach and privacy laws.

### Soft CTA mesh (additive)

Each contact lead row and the `contacts-batch-summary` include a `softCta` object with next-step links (Google Maps Email Extractor, Website Leads, Skip Trace PRO, TruePeopleSearch, UCC Lien, Building Permit, Shopify Owner Email). SoftCTA only — no extra PPE events. Skip Trace PRO is link-only (code frozen). No self-link.

# Actor input Schema

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

Paste website URLs to scrape. We'll visit each one and extract every email, phone number, and social media link. You can paste full URLs (https://example.com) or just domains (example.com) — we'll handle both.

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

Compatibility alias for urls — paste bare domains (acme.com) or full URLs. Deduplicated with urls / domains / startUrls.

## `domains` (type: `array`):

Compatibility alias for urls — bare domains or full URLs. Merged and deduped with urls / websites / startUrls.

## `searchQueries` (type: `array`):

Search Google Maps to discover businesses and their websites. Try: 'plumbers in Miami FL', 'dentists in Brooklyn NY', 'restaurants in Austin TX'. We'll find every matching business, grab their website URL, and scrape it for emails.

## `maxResults` (type: `integer`):

Maximum number of websites to process. Start with 10-20 to test, then scale up. Each website costs ~$0.005 base + $0.04 per email found.

## `scrapeContactPages` (type: `boolean`):

Follow links to /contact, /about, /team, and /get-in-touch pages to find hidden email addresses. This finds 30-50% more emails but takes slightly longer. Recommended ON.

## `stopWhenEmailFound` (type: `boolean`):

Speed switch for large lists: stop crawling a site the moment a same-domain company email turns up (webdata\_labs parity). Off by default so full crawl still returns phones, socials, and contact pages.

## `includePhones` (type: `boolean`):

Extract US and international phone numbers from each website. Finds tel: links and phone patterns in the page text.

## `includeSocial` (type: `boolean`):

Find links to Facebook, Instagram, LinkedIn, Twitter/X, YouTube, TikTok, Pinterest, Yelp, WhatsApp, Telegram, GitHub, Threads, and Discord.

## `includeTechStack` (type: `boolean`):

Identify the website's CMS and framework: WordPress, Shopify, Wix, Squarespace, Webflow, Next.js, React, WooCommerce, BigCommerce, HubSpot, and more. Perfect for web design agencies prospecting outdated sites.

## `includePixels` (type: `boolean`):

Find Facebook Pixel (with ID), Google Analytics (with GA/GTM ID), TikTok Pixel, LinkedIn Insight Tag, and Hotjar. Great for ad agencies to identify businesses already running paid ads.

## `maxContactPages` (type: `integer`):

How many internal pages to crawl per website (e.g. /contact, /about, /team), including sitemap hits. Higher = more emails found, but slower. 5 is optimal for most sites.

## `concurrency` (type: `integer`):

How many websites to scrape at the same time. Higher = faster but uses more memory. 10 is a good default.

## `webhookUrl` (type: `string`):

Automatically POST all results as JSON to this URL when the run finishes. Works with Zapier, Make.com, n8n, or your own API endpoint.

## `useSitemapCrawl` (type: `boolean`):

Discover /contact, /about, /team pages from sitemap.xml in addition to homepage link scraping. Finds more emails on large sites. Recommended ON.

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

Check each email domain has MX records (can receive mail). Adds emailMx\[{email,mxStatus}] — valid / no-mx / invalid. No extra PPE charge.

## `excludeRolePrefixes` (type: `array`):

Drop emails whose local-part equals or starts with these prefixes (e.g. info, sales, support, hello, contact, admin). Leave empty to keep all non-spam emails.

## `onlyWithContact` (type: `boolean`):

Skip websites that have neither an email nor a phone after scraping. Saves dataset noise and PPE on empty rows.

## `mergeContacts` (type: `boolean`):

ON (default): one dataset row per website with emails\[] and phones\[] arrays. OFF: one row per email (site fields duplicated) — useful for CRM import.

## `defaultPhoneCountry` (type: `string`):

ISO country used to parse local numbers into E.164 (e.g. US, GB, CA, AU). Invalid / too-short numbers are dropped. Uses libphonenumber-js.

## `includeNamedContacts` (type: `boolean`):

Parse /team, /about, /leadership pages, JSON-LD Person, and linkedin.com/in/ anchors into people\[{name,title,linkedin,email?}]. Charged as named-contact PPE when people are delivered.

## `maxDepth` (type: `integer`):

How many link hops from each start URL (delicious\_zebu Depth parity). 0 = homepage only. 1 = homepage + contact/about/team (default). Higher follows matching links further.

## `sameDomainOnly` (type: `boolean`):

If ON, only crawl URLs on the starting domain (delicious\_zebu Lock\_domain). Recommended ON.

## `urlIncludePatterns` (type: `array`):

Only enqueue URLs whose path/URL contains at least one of these keywords (e.g. /contact, /about, /team). Empty = default contact-ish heuristics at depth 0.

## `urlExcludePatterns` (type: `array`):

Skip URLs containing any of these keywords (e.g. /blog, /news, /cart, /login, /wp-admin).

## `maxUrlsPerDepth` (type: `integer`):

Cap enqueue count at each depth level (delicious\_zebu Max\_urls\_per\_depth). Also capped by Max Sub-Pages Per Website.

## Actor input object example

```json
{
  "urls": [
    "https://www.apify.com/"
  ],
  "websites": [],
  "domains": [],
  "searchQueries": [
    "plumbers in Miami FL"
  ],
  "maxResults": 50,
  "scrapeContactPages": true,
  "stopWhenEmailFound": false,
  "includePhones": true,
  "includeSocial": true,
  "includeTechStack": true,
  "includePixels": true,
  "maxContactPages": 5,
  "concurrency": 10,
  "useSitemapCrawl": true,
  "verifyEmails": true,
  "excludeRolePrefixes": [],
  "onlyWithContact": false,
  "mergeContacts": true,
  "defaultPhoneCountry": "US",
  "includeNamedContacts": true,
  "maxDepth": 1,
  "sameDomainOnly": true,
  "urlIncludePatterns": [],
  "urlExcludePatterns": [],
  "maxUrlsPerDepth": 50
}
```

# Actor output Schema

## `website` (type: `string`):

The scraped website URL

## `domain` (type: `string`):

Domain name

## `businessName` (type: `string`):

Business name from Schema.org or meta tags

## `emails` (type: `string`):

All verified email addresses found

## `phones` (type: `string`):

Phone numbers found on the website

## `socialLinks` (type: `string`):

Social media profile URLs

## `techStack` (type: `string`):

Detected CMS and frameworks

## `trackingPixels` (type: `string`):

Ad tracking pixels detected

## `emailCount` (type: `string`):

Number of emails found

## `phoneCount` (type: `string`):

Number of phones found

## `mobilePhones` (type: `string`):

E.164 numbers classified MOBILE / FIXED\_LINE\_OR\_MOBILE (not WhatsApp-active)

## `mobilePhoneCount` (type: `string`):

Count of mobile-classified phones

# 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://www.apify.com/"
    ],
    "searchQueries": [
        "plumbers in Miami FL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/contact-info-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 = {
    "urls": ["https://www.apify.com/"],
    "searchQueries": ["plumbers in Miami FL"],
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/contact-info-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 '{
  "urls": [
    "https://www.apify.com/"
  ],
  "searchQueries": [
    "plumbers in Miami FL"
  ]
}' |
apify call intelscrape/contact-info-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intelscrape/contact-info-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/vvO0TJ1TLyxvoxyY9/builds/udz04cvgTyjea3Cza/openapi.json
