# B2B Website Contact, Email & Social Links Extractor (`whispery_transformer/my-actor`) Actor

Extract verified B2B emails, direct phone numbers, LinkedIn & social profiles, and addresses from any company website list. High-speed asynchronous crawler with Pay-Per-Event pricing. Perfect for sales, cold outreach, and CRM enrichment.

- **URL**: https://apify.com/whispery_transformer/my-actor.md
- **Developed by:** [SOHAM 45](https://apify.com/whispery_transformer) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## B2B Website Contact, Email & Social Links Extractor (Pay Per Result)

Extract verified **business emails**, **phone numbers**, **LinkedIn & social media profiles**, **physical addresses**, and **company metadata** from any list of company websites in seconds. Built on a lightweight HTTP/2 asynchronous architecture (`httpx` + `BeautifulSoup`/`lxml`) that requires zero headless browser overhead and charges **only per enriched domain result**.

***

### What Does B2B Website Contact, Email & Social Links Extractor Do?

Given a list of target company URLs or domains, this Actor:

1. **Crawls the Company Homepage**: Extracts company name, meta description, structured `Schema.org` `PostalAddress` records, `mailto:` and `tel:` links, and social media URLs.
2. **Automatically Discovers High-Value Internal Pages**: Finds and visits internal pages matching `/contact`, `/about`, `/team`, `/impressum`, `/legal`, and `/support` (up to `maxPagesPerDomain`).
3. **Cleans & Deduplicates Business Emails**: Uses RFC-compliant regex + DOM `mailto:` parsing while automatically stripping false positives (`.png`, `.jpg`, `.webp`, `.svg`, `sentry.io`, `wixpress.com`, `example.com`, and `noreply@` addresses) and sorting domain-matching business emails first.
4. **Extracts Decision-Maker Social Links**: Captures clean company and profile URLs for **LinkedIn**, **X (Twitter)**, **Facebook**, **Instagram**, **YouTube**, and **GitHub** (excluding share buttons and intent links).

***

### Why Use This Scraper for B2B Lead Generation?

- **Enrich CRM & Cold Outreach Lists**: Turn raw domain lists from Google Maps, Apollo, Clay, Crunchbase, or directories into actionable contact records with direct emails, phone numbers, and LinkedIn company URLs.
- **GDPR / DACH Impressum Ready**: Specifically tuned to discover `/impressum` and `/legal` pages on European websites where direct company emails, phone numbers, and registered addresses are legally required.
- **Ultra-Fast, Low-Compute Architecture**: Runs on `httpx.AsyncClient` with HTTP/2 and `lxml` instead of heavy Chromium browsers—processing hundreds of domains in minutes on just 256MB–512MB RAM.

***

### Cost of Usage & Pay-Per-Event (PPE) Pricing

This Actor uses Apify's transparent **Pay-Per-Event (PPE)** pricing model so you only pay for results delivered:

| Event Name | Price per Event | Cost per 1,000 Enriched Domains | When It Is Charged |
| :--- | :--- | :--- | :--- |
| **`scraped-result`** | **$0.002 USD** | **$2.00 USD** | Charged once per successfully scraped domain record pushed to your dataset. |

- **Zero Charge for Dead Websites**: Unreachable domains, DNS failures, or SSL-broken sites are skipped and **never charged**.
- **Zero Charge for Empty Email Domains (Optional)**: Enable `onlyWithEmails: true` to only push and pay for domains where at least one verified business email was extracted.
- **Spend Limit Protection**: Set your maximum spend per run directly in the Apify Console. The Actor checks `charge_result.event_charge_limit_reached` after every domain and exits cleanly the moment your budget cap is reached.

***

### Input Parameters

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | `array` (stringList) | `["https://apify.com", "https://news.ycombinator.com", "https://python.org"]` | List of company URLs or domains to crawl and enrich. |
| `maxPagesPerDomain` | `integer` | `5` | Maximum number of pages to visit per domain (`1` = homepage only; `2`–`20` = homepage + discovered `/contact`, `/about`, `/team`, `/impressum`, `/legal`, `/support` pages). |
| `onlyWithEmails` | `boolean` | `false` | When `true`, domains without any extracted business emails are skipped (not saved to the dataset and not charged). |
| `proxyConfiguration` | `object` | `{"useApifyProxy": false}` | Optional Apify Proxy or custom proxy configuration for protected targets. |

***

### Sample JSON Output

Each enriched domain pushed to the default Dataset follows this structured schema:

```json
{
  "domain": "apify.com",
  "companyName": "Apify",
  "emails": [
    "hello@apify.com",
    "support@apify.com"
  ],
  "phones": [
    "+1 (415) 890-6193"
  ],
  "socialLinks": {
    "linkedin": "https://www.linkedin.com/company/apify",
    "twitter": "https://x.com/apify",
    "facebook": "https://www.facebook.com/apifytech",
    "instagram": null,
    "youtube": "https://www.youtube.com/@apify",
    "github": "https://github.com/apify"
  },
  "addresses": [
    "Vodickova 704/36, 110 00 Prague 1, Czech Republic"
  ],
  "metaDescription": "Cloud platform for web scraping, browser automation, AI agents, and data for AI.",
  "sourceUrl": "https://apify.com",
  "pagesScraped": 5,
  "visitedUrls": [
    "https://apify.com",
    "https://apify.com/contact",
    "https://apify.com/about",
    "https://apify.com/privacy-policy",
    "https://apify.com/terms-of-use"
  ],
  "scrapedAt": "2026-10-26T14:20:00.000000+00:00"
}
```

***

### Frequently Asked Questions (FAQ)

#### 1. How many internal pages should I set in `maxPagesPerDomain`?

Setting `maxPagesPerDomain` to **`5`** (the default) provides the best balance between speed and contact coverage. It crawls the homepage plus the top 4 discovered contact/about/impressum pages.

#### 2. Does this Actor work with Clay, Make, n8n, and Zapier?

Yes. You can trigger `b2b-contact-email-social-scraper` via the Apify API or native integrations in Clay, Make, n8n, and Zapier, passing a single company URL or batches of thousands of URLs and receiving clean JSON output.

#### 3. What happens if a website blocks standard requests or has a broken SSL certificate?

The scraper automatically rotates realistic desktop User-Agents, follows redirects, falls back gracefully on SSL errors, and logs unreachable websites without crashing your batch run. For heavily protected sites, enable Apify Proxy in `proxyConfiguration`.

# Actor input Schema

## `url` (type: `string`):

The URL of website you want to get the data from.

## Actor input object example

```json
{
  "url": "https://www.apify.com/"
}
```

# Actor output Schema

## `results` (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 = {
    "url": "https://www.apify.com/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("whispery_transformer/my-actor").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 = { "url": "https://www.apify.com/" }

# Run the Actor and wait for it to finish
run = client.actor("whispery_transformer/my-actor").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 '{
  "url": "https://www.apify.com/"
}' |
apify call whispery_transformer/my-actor --silent --output-dataset

```

## MCP server setup

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

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/CBSEkMHNn6GyYRexR/builds/VhGt2ka0YU5y6MQkk/openapi.json
