# Website Email Extractor & Contact Info Scraper — Phones (`intelscrape/contact-info-scraper`) Actor

Website email extractor and contact info scraper: extract emails, phone numbers, social links and named contacts from any website or Google Maps search. MX-checked emails, E.164 phones, tech stack and one merged row per site. Pay per result.

- **URL**: https://apify.com/intelscrape/contact-info-scraper.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Lead generation, Business, Automation
- **Features:** Limited permissions
- **Stats:** 17 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?

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 Info Scraper — Website Emails, Phones & Socials

![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? **[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? Try **[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`.

### Advanced crawl inputs

- **`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.
- Next-step links on `contacts-batch-summary`: Maps Email / Website Leads / Skip Trace / TPS (no self-link).

### Email MX verification and phone line types

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 |

### 💡 Use cases

- **Lead enrichment:** add emails, phones and social profiles to a list of company websites.
- **Sales prospecting:** find named team members from about and leadership pages.
- **Agencies:** check which tech stack and ad pixels a prospect's site uses.
- **Local lead lists:** start from a Google Maps search and get contacts for each business website.

### ❓ FAQ

**How do I scrape contact info from a website?**
Paste website URLs or domains and run. The Actor crawls the homepage plus contact, about and team pages and returns emails, phones, social links and named contacts, merged into one row per site.

**Can I start from a Google Maps search instead of URLs?**
Yes. Add a **Google Maps Search Query** such as `plumbers in Miami FL` and the Actor scrapes each business website it finds.

**Are the emails verified?**
With **Verify emails** on, each email domain gets an MX deliverability check. That confirms the domain accepts mail; it does not prove a specific mailbox exists.

**Can I skip generic inboxes like info@?**
Yes. Add prefixes to **Exclude role-based email prefixes**.

**How is it billed?**
Pay per event per website result, plus optional events listed on the Pricing tab. See the **Pricing** tab on this page for the current per-event prices. You are only charged for the events listed there, and you can cap spend with the run's maximum charge setting.

**How do I export the contacts?**
Download CSV, Excel or JSON from the Output tab, or use the webhook URL, the Apify API, Zapier or Make.

### Legal

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

### Related tools

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). These links add no extra charge.

# 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/hJX4Qk2fcEagm27ze/openapi.json
