# Contact Page Scraper — Emails, Phones & Socials by Site (`vonsensey/contact-page-scraper`) Actor

Goes where companies actually put their details — the contact, imprint, about and team pages — and returns what is published there as one tidy row per business: email, phone and social profiles. A short page budget keeps every run fast and cheap.

- **URL**: https://apify.com/vonsensey/contact-page-scraper.md
- **Developed by:** [Blackcube](https://apify.com/vonsensey) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.00 / 1,000 contact records

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 Page Scraper — Emails, Phones & Socials by Site

<table style="border-collapse:collapse;width:100%;margin:0 0 4px">
<tr><td colspan="3" style="padding:9px 12px;background:#0B6E75;border:1px solid #0B6E75"><span style="color:#FFFFFF;font-weight:700;font-size:13px;letter-spacing:.3px">Website Contact &amp; Email Suite</span><span style="color:#CFF0F2;font-size:12px"> &nbsp;&bull;&nbsp; 9 Actors, one codebase, one contact record billed once</span></td></tr>
<tr><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/website-contact-email-extractor" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Website Contact &amp; Email Extractor</a><br><span style="color:#6B7280;font-size:11px">Verified Emails + Socials</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/b2b-leads-finder" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">B2B Leads Finder</a><br><span style="color:#6B7280;font-size:11px">Verified Emails, Phones &amp; Socials</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/company-contact-scraper" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Company Contact Scraper</a><br><span style="color:#6B7280;font-size:11px">Emails, Phones &amp; Socials</span></td></tr>
<tr><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/website-phone-number-scraper" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Phone Number Scraper</a><br><span style="color:#6B7280;font-size:11px">Business Numbers From Any Website</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/mx-verified-email-finder" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">MX Verified Email Finder</a><br><span style="color:#6B7280;font-size:11px">Deliverable Business Emails</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/website-email-scraper" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Website Email Scraper</a><br><span style="color:#6B7280;font-size:11px">Verified Emails From Any Site</span></td></tr>
<tr><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/decision-maker-email-finder" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Decision Maker Email Finder</a><br><span style="color:#6B7280;font-size:11px">Skip the info@ Inbox</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#ECFDF5;vertical-align:top;width:33%"><span style="color:#0B6E75;font-weight:700;font-size:13px">Contact Page Scraper</span><br><span style="color:#0B6E75;font-size:11px;font-weight:600">&#10148; You are here</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/bulk-domain-email-finder" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Email Finder</a><br><span style="color:#6B7280;font-size:11px">Business Emails From a List of Domains</span></td></tr>
</table>

**More from this account:** [YouTube Transcript Suite](https://apify.com/vonsensey/youtube-transcript-scraper) · [Career Site & ATS Jobs Suite](https://apify.com/vonsensey/career-page-job-postings-scraper-api) · [Google News Suite](https://apify.com/vonsensey/google-news-scraper-api) · [Keyword Research Suite](https://apify.com/vonsensey/google-keyword-ideas-scraper) · [Shopify Store Intelligence Suite](https://apify.com/vonsensey/shopify-store-leads-scraper) · [eBay Data Suite](https://apify.com/vonsensey/ebay-scraper-api) · [Amazon Reviews Suite](https://apify.com/vonsensey/amazon-reviews-scraper-api) · [Reddit](https://apify.com/vonsensey/reddit-scraper-posts-comments-api) · [Meta Ad Library](https://apify.com/vonsensey/facebook-ads-library-scraper-meta-ad-api) · [Vinted](https://apify.com/vonsensey/vinted-scraper-api) · [Trustpilot Review Intelligence Suite](https://apify.com/vonsensey/trustpilot-reviews-scraper) · [App Store & Google Play Reviews Suite](https://apify.com/vonsensey/app-store-google-play-reviews-scraper) · [Etsy Research Suite](https://apify.com/vonsensey/etsy-scraper) · [YouTube Comments Intelligence Suite](https://apify.com/vonsensey/youtube-comments-scraper) · [Telegram Channel Intelligence Suite](https://apify.com/vonsensey/telegram-channel-scraper-api) · [Business Reviews Suite](https://apify.com/vonsensey/business-reviews-aggregator-scraper-api) · [Google Trends Suite](https://apify.com/vonsensey/google-trends-scraper) · [Amazon Product Data Suite](https://apify.com/vonsensey/amazon-product-scraper-api) · [Polymarket Order Book](https://apify.com/vonsensey/polymarket-orderbook-clob-prices-scraper-api) · [Nordic Marketplaces Suite](https://apify.com/vonsensey/blocket-finn-nordic-marketplace-scraper-api) · [Google Sheets Suite](https://apify.com/vonsensey/google-sheets-scraper-api) · [TikTok Suite](https://apify.com/vonsensey/tiktok-scraper-api) · [Snapchat Suite](https://apify.com/vonsensey/snapchat-scraper-api) · [LinkedIn Public Data Suite](https://apify.com/vonsensey/linkedin-scraper-api) · [Instagram Suite](https://apify.com/vonsensey/instagram-posts-scraper-api) · [Contact Validation Suite](https://apify.com/vonsensey/email-verifier-validator-api) · [Google Maps Suite](https://apify.com/vonsensey/google-maps-reviews-scraper-api) · [X / Twitter](https://apify.com/vonsensey/tweet-scraper)

Goes where companies actually put their details — the contact, imprint, about and team pages — and returns what is published there as one tidy row per business: email, phone and social profiles. A short page budget keeps every run fast and cheap.

**You pay per company we find a real contact for.** Websites with no contacts, failed sites,
and records carrying only social links are delivered free.

### What it does

A tight page budget beats a deep crawl. The pages a business keeps its details on are a short, predictable list — contact, imprint, impressum, about, team — and this listing spends five pages per site on exactly those, in whatever language the site is written in. Fast runs, small bills, and the same finished row per company: verified email, international phone number and social profiles.

This listing returns every contact role it finds. Set `roleFilter` to keep only executives, sales, HR and so on.

### Billed per company, not per page

Most contact scrapers bill **per page crawled**, so a headline like "$2 per 1,000" becomes a
much larger invoice the moment one site with deep navigation gets crawled for hundreds of
pages. That mismatch is the single most common complaint in this category, and it is why a
well-known rival sits at 1.89 stars.

Here, one company is one row and one charge, however many pages it took to find the contact.

### What you get per company

| Field | What it is |
|---|---|
| `emails[]` | `{ address, role, foundOn, verification }` — every address says what it is, where it came from, and how it verified |
| `primaryEmail` | the single best address, already picked for you |
| `phones[]` | normalised to E.164 |
| `socials` | LinkedIn, X, Facebook, Instagram, YouTube and more, keyed by network |
| `companyName`, `address`, `description` | company identity, taken from the site's own markup |
| `domain`, `emailCount`, `phoneCount`, `pagesCrawled` | the registrable domain, already deduplicated, plus what the row cost to find |

Paste `acme.io`, `https://www.acme.io/` and `https://acme.io/pricing?utm_source=news` and
you get **one** record, charged **once**. Deduplication happens by registrable domain across
the whole run, on both input and output — no second merge-and-dedupe actor required.

### Honest about verification

Verification is a real MX check, not a guess, and every address says which it is. Addresses
that cannot be verified are still delivered and still labelled, rather than being quietly
dropped or silently presented as confirmed.

Generic addresses (`info@`, `hello@`) are tagged rather than binned, so you decide: keep
them, or set `excludeGenericEmails` and never see them.

### Pricing

Per company with at least one email or phone number, by your Apify plan:

| Plan tier | Per 1,000 companies |
|---|---:|
| Free | $27.50 |
| Bronze | $16.50 |
| Silver | $13.80 |
| **Gold** | **$11.00** |
| Platinum | $11.00 |
| Diamond | $11.00 |

**New price from 19 October 2026** (Apify's 14-day notice): Free $27.50, Bronze $16.50, Silver $13.80, Gold, Platinum and Diamond $11.00 per 1,000 companies.

Free: companies with no reachable contact, failed and unreachable sites, and records holding
only social links. Set `skipDomainsWithoutContacts` to leave out the websites with no contacts
at all (dead, blocked or nothing published) — they cost nothing either way.

### Use it from anywhere

```bash
curl -X POST "https://api.apify.com/v2/acts/vonsensey~contact-page-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"domains":["stripe.com","apify.com"]}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("vonsensey/contact-page-scraper").call(run_input={
    "domains": ["stripe.com", "apify.com"],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row.get("domain"), row.get("primaryEmail"), row.get("phones"))
```

Also available through the Apify integrations for **n8n, Make and Zapier**, and via **MCP** for
AI agents. Feed the output straight into a CRM — one row per company is already the shape a
CRM import expects.

### Legal and responsible use

Reads **public business contact pages only** — the addresses a company publishes so it can be
contacted. No login, no paywall circumvention, and nothing behind authentication. A named address
(jane@company.com) is personal data under the GDPR, so the rules below apply to it.

You are responsible for how you use the output. In the EU/UK that means a lawful basis under
GDPR/PECR for any outreach, an honest sender identity, and honouring opt-outs. This is a tool
for reaching businesses that published a contact address, not for bulk unsolicited mail.

### The rest of the family

- [Website Contact & Email Extractor — Verified Emails + Socials](https://apify.com/vonsensey/website-contact-email-extractor)
- [B2B Leads Finder — Verified Emails, Phones & Socials](https://apify.com/vonsensey/b2b-leads-finder)
- [Company Contact Scraper — Emails, Phones & Socials](https://apify.com/vonsensey/company-contact-scraper)
- [Phone Number Scraper — Business Numbers From Any Website](https://apify.com/vonsensey/website-phone-number-scraper)
- [MX Verified Email Finder — Deliverable Business Emails](https://apify.com/vonsensey/mx-verified-email-finder)
- [Website Email Scraper — Verified Emails From Any Site](https://apify.com/vonsensey/website-email-scraper)
- [Decision Maker Email Finder — Skip the info@ Inbox](https://apify.com/vonsensey/decision-maker-email-finder)
- [Email Finder — Business Emails From a List of Domains](https://apify.com/vonsensey/bulk-domain-email-finder)

Issues and requests go in the **Issues** tab — first response within 24 hours.

### Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is `vonsensey/contact-page-scraper`; every snippet below sends `{}`, which runs the defaults shown on the form — replace it with your own input.

#### n8n

Install the **Apify** community node (`@apify/n8n-nodes-apify` under *Settings → Community Nodes*, or search "Apify" on n8n Cloud). Add **Apify → Run Actor** with Actor `vonsensey/contact-page-scraper` and your input JSON, then **Apify → Get Dataset Items** on the run's `defaultDatasetId` and pipe the rows anywhere. For scheduled runs, the **On new Apify Event** trigger fires when a run of this Actor finishes.

#### MCP (Claude, Cursor, VS Code, any MCP client)

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=vonsensey/contact-page-scraper",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

Your agent then calls `vonsensey/contact-page-scraper` as a tool with the same input the form takes and reads the dataset back.

#### REST API (one call, rows in the response)

```bash
curl -X POST "https://api.apify.com/v2/acts/vonsensey~contact-page-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{}'
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/contact-page-scraper").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

#### JavaScript

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/contact-page-scraper').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Make, Zapier, LangChain, CrewAI

The Apify app in **Make** and **Zapier** has a *Run an Actor* module: pick `vonsensey/contact-page-scraper`. In **LangChain** and **CrewAI** the Apify tool wrappers take the same Actor id. A daily **schedule** needs nothing but the Console: *Schedules → Create → this Actor → cron*, and the dataset fills on its own.

> **Run it without configuring anything** — [Scrape the contact page of a website](https://apify.com/vonsensey/contact-page-scraper/examples/contact-page-details-per-site), a ready-made example you can start as-is or copy.

### Use cases

- **Turn a domain list into CRM rows.** Company URLs in, one de-duplicated row out per company with email, phone and social profiles.
- **Enrich a list you already have.** You have the companies but not the contacts — this fills the gap without a data-vendor subscription.
- **Reach a person, not an inbox.** Prefer a named contact over the generic info@ address where the site publishes one.
- **Re-run weekly.** Sites add and change contacts constantly; a schedule keeps the list current instead of ageing out.

### Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open **Schedules** in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per contact record delivered, and the FAQ below says exactly what a scheduled run that finds nothing new costs.

### FAQ

#### Are the email addresses verified?

Each address's domain is checked for a working mail server (MX records) and tagged role or personal, so typos, dead domains and throwaway providers are caught. An MX check cannot see whether one mailbox exists (Apify closes the SMTP port to every Actor), so a status is valid or risky, never a promise that a message will be delivered.

#### Do I pay for websites that return nothing?

No. Sites that are unreachable, blocked or simply have no published contact details come back as free rows with a reason.

#### Can I pass bare domains instead of full URLs?

Yes. `example.com` and `https://example.com/contact` are both accepted, and both resolve to the same company row.

#### How is this different from a lead database?

Nothing here is a stale purchased list. Every row is read from the live website at the moment you run it.

***

Something wrong, or a field you need that is missing? Open an issue on the **Issues** tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.

# Actor input Schema

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

The company websites to extract contacts from. Paste full URLs or bare domains — both work. Several URLs for the same company collapse into ONE result row, and you are charged once for it.

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

Optional alternative to the field above for pasting a plain list of domains (e.g. acme.io, berg.se). Merged with Websites and de-duplicated by company domain.

## `maxPagesPerDomain` (type: `integer`):

Hard cap on pages crawled per company. The crawler spends this budget on the highest-value pages first (imprint, contact, about, team) rather than crawling blindly, so a low number still finds the good addresses. Total pages for the run can never exceed websites × this number — runaway crawls are impossible.

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

Check every email's domain for a working mail exchanger (MX/DNS) and flag disposable, free-provider, and shared role inboxes. Included in the per-result price — there is no extra charge. Note: this is a domain-level deliverability check, not a per-mailbox SMTP probe.

## `roleFilter` (type: `array`):

Keep only emails classified as these roles. Leave empty to return every address. A company whose contacts are all filtered out becomes a free, unbilled row.

## `excludeGenericEmails` (type: `boolean`):

Shortcut that keeps executive and named-person addresses and drops generic inboxes (info@, support@, noreply@). Roles you pick in the list above are kept as well.

## `skipDomainsWithoutContacts` (type: `boolean`):

By default a website with no contacts still returns a free row explaining why (dead domain, blocked, nothing published), which makes gaps in your list auditable. Turn this on to omit those rows entirely. Either way, they are never charged.

## `respectRobotsTxt` (type: `boolean`):

Skip pages disallowed by each site's robots.txt. Off by default because many sites disallow crawlers wholesale, which would return no contacts for pages that are publicly visible in any browser.

## `maxConcurrency` (type: `integer`):

How many pages to fetch in parallel across all websites. Lower it if you are crawling a small number of sites and want to be gentler on them.

## `proxyConfiguration` (type: `object`):

Apify Proxy on automatic selection is the default: it picks a datacenter IP, which is enough for ordinary company websites and is what keeps the price low. It also works on every Apify plan — pinning a specific proxy group would fail for accounts that do not have it. A residential group is replaced by the normal Apify proxy: its traffic costs more than a contact record is priced at. Optional — proxy is handled for you and its cost is included in the price. Only set this if you have a specific reason.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://www.hetzner.com"
    },
    {
      "url": "https://mailchimp.com"
    }
  ],
  "maxPagesPerDomain": 5,
  "verifyEmails": true,
  "roleFilter": [],
  "excludeGenericEmails": false,
  "skipDomainsWithoutContacts": false,
  "respectRobotsTxt": false,
  "maxConcurrency": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `contacts` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://www.hetzner.com"
        },
        {
            "url": "https://mailchimp.com"
        }
    ],
    "maxPagesPerDomain": 5,
    "verifyEmails": true,
    "skipDomainsWithoutContacts": false,
    "maxConcurrency": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("vonsensey/contact-page-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 = {
    "startUrls": [
        { "url": "https://apify.com" },
        { "url": "https://www.hetzner.com" },
        { "url": "https://mailchimp.com" },
    ],
    "maxPagesPerDomain": 5,
    "verifyEmails": True,
    "skipDomainsWithoutContacts": False,
    "maxConcurrency": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("vonsensey/contact-page-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 '{
  "startUrls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://www.hetzner.com"
    },
    {
      "url": "https://mailchimp.com"
    }
  ],
  "maxPagesPerDomain": 5,
  "verifyEmails": true,
  "skipDomainsWithoutContacts": false,
  "maxConcurrency": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call vonsensey/contact-page-scraper --silent --output-dataset

```

## MCP server setup

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