# B2B Leads & Contact Info Enricher (`nunu27/b2b-lead-enricher`) Actor

Extract verified business emails, phones, LinkedIn profiles, addresses, and tech stack from any list of company domains.

- **URL**: https://apify.com/nunu27/b2b-lead-enricher.md
- **Developed by:** [Wisnu Agung Pambudi](https://apify.com/nunu27) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 enriched leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does B2B Company Leads & Contact Info Enricher do?

The **B2B Company Leads & Contact Info Enricher** automatically crawls company websites, startup homepages, and agency directories to discover verified **public business emails, direct phone numbers, LinkedIn profiles, physical office locations, and tech stack components**.

Instead of manually clicking through hundreds of websites, copy-pasting info from contact pages, and guessing email formats, you simply paste a list of company domains (e.g., `stripe.com`, `linear.app`) or target URLs. The Actor crawls the homepage and automatically navigates high-value subpages (`/contact`, `/about`, `/team`, `/imprint`) using lightweight HTTP parsing to produce a clean, structured lead dataset in seconds.

Because it runs on the **Apify platform**, you get built-in proxy rotation, automated scheduling, webhook triggers, API integrations, and direct export to CSV, JSON, or Excel.

***

### Why use B2B Company Leads & Contact Info Enricher?

- **Cold Outreach & Sales Prospecting:** Turn a bare list of company domains into a fully enriched lead list ready for cold email or cold calling campaigns.
- **CRM Data Hygiene & Enrichment:** Fill in missing corporate phone numbers, verified LinkedIn company handles, and headquarters addresses in HubSpot, Salesforce, or Pipedrive.
- **Market & Competitor Intelligence:** Identify what technologies prospective clients are running (e.g., Shopify, WordPress, Next.js, HubSpot, Stripe) to pitch targeted developer or marketing services.
- **Agency & Freelancer Prospecting:** Quickly discover decision-maker contact points from digital agencies, SaaS businesses, and local service companies.
- **10x Cheaper than Traditional B2B Databases:** Avoid expensive `\$100`–`\$300`/month subscriptions to legacy databases with outdated data. Scrape fresh, real-time data straight from live websites.

***

### How to use B2B Company Leads & Contact Info Enricher

1. **Create a free Apify account** if you do not have one already.
2. In the **Input** tab of this Actor:
   - Enter target company domains or URLs in the **Target Domains** field (e.g. `shopify.com`, `acme.io`).
   - (Optional) Adjust **Max Pages per Domain** (default is 3, which checks Homepage, Contact, and About pages).
   - (Optional) Enable or disable specific extractors (Emails, Phones, Socials, Tech Stack).
3. Click the **Start** button at the bottom right.
4. Once the run completes, navigate to the **Output / Storage** tab to view your enriched leads.
5. Export your results directly as **CSV**, **Excel**, **JSON**, or connect via **Zapier/Make** to sync directly with your CRM.

***

### Input Configuration

The Actor accepts a straightforward JSON configuration or form input:

```json
{
  "domains": [
    "apify.com",
    "thoughtbot.com",
    "browserless.io"
  ],
  "maxCompanies": 50,
  "maxPagesPerDomain": 3,
  "extractEmails": true,
  "extractPhones": true,
  "extractSocials": true,
  "extractTechStack": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `domains` | Array of Strings | `["crawlee.dev", "apify.com"]` | Target domains or full website URLs to crawl and enrich. |
| `startUrls` | Array of URLs | `[]` | Optional directory or category pages to discover outbound company links from. |
| `maxCompanies` | Integer | `50` | Maximum number of distinct companies to process in a single run. |
| `maxPagesPerDomain` | Integer | `3` | Number of subpages to crawl per domain (Homepage + Contact/About pages). |
| `extractEmails` | Boolean | `true` | Extract public business contact emails. |
| `extractPhones` | Boolean | `true` | Extract phone numbers from headers, footers, and contact sections. |
| `extractSocials` | Boolean | `true` | Discover LinkedIn, Twitter/X, Facebook, Instagram, GitHub, and YouTube URLs. |
| `extractTechStack` | Boolean | `true` | Detect CMS (WordPress, Shopify, Webflow), frameworks (React, Next.js), and analytics. |
| `proxyConfiguration` | Object | `{ "useApifyProxy": false }` | Apify Proxy configuration for high-volume scrapes. |

***

### Output Data & Sample Record

Each crawled company produces a standardized record pushed to the default Apify Dataset:

```json
{
  "companyName": "thoughtbot",
  "domain": "thoughtbot.com",
  "websiteUrl": "https://thoughtbot.com",
  "description": "Design and development agency that provides design and development services for mobile and web applications.",
  "primaryEmail": "hello@thoughtbot.com",
  "primaryPhone": "+18779762687",
  "linkedinUrl": "https://www.linkedin.com/company/thoughtbot-inc-",
  "twitterUrl": "https://x.com/thoughtbot",
  "facebookUrl": null,
  "instagramUrl": null,
  "githubUrl": "https://github.com/thoughtbot",
  "youtubeUrl": "https://www.youtube.com/@thoughtbot",
  "address": "Boston, MA, United States",
  "city": "Boston",
  "country": "US",
  "techStack": [
    "Next.js",
    "Tailwind CSS"
  ],
  "emails": [
    "hello@thoughtbot.com"
  ],
  "phones": [
    "+18779762687",
    "+442038070560"
  ],
  "pagesCrawled": 3,
  "crawledAt": "2026-09-12T05:02:46.478Z"
}
```

You can download the dataset in various formats such as **JSON**, **CSV**, **Excel**, or **XML** from the Apify Console.

***

### Output Fields Table

| Output Field | Format | Description |
| :--- | :--- | :--- |
| `companyName` | String | Clean legal or brand name extracted from JSON-LD / OpenGraph metadata. |
| `domain` | String | Normalized root domain (e.g., `company.com`). |
| `websiteUrl` | Link | Canonical URL used for the crawl. |
| `description` | String | Company summary, tagline, or meta description. |
| `primaryEmail` | String | Best contact email found (prioritizing company domain and contact/info prefixes). |
| `primaryPhone` | String | Primary telephone number formatted with international calling code. |
| `linkedinUrl` | Link | Verified LinkedIn company or showcase page URL. |
| `twitterUrl` | Link | Official Twitter / X profile handle. |
| `githubUrl` | Link | Organization GitHub profile (crucial for tech/software intelligence). |
| `address` | String | Physical office or headquarters street address if published. |
| `city` / `country` | String | Geographic location derived from Schema.org microdata. |
| `techStack` | Array | Detected CMS, frameworks, and analytics software. |
| `emails` | Array | All distinct valid public emails detected across the site. |
| `phones` | Array | All telephone and support numbers detected. |
| `pagesCrawled` | Number | Total internal pages inspected for this company. |
| `crawledAt` | Timestamp | ISO 8601 timestamp of extraction. |

***

### Pricing & Cost Estimation

How much does it cost to enrich company leads with this Actor?

- **Pay-Per-Result (PPR):** This Actor is billed on a pure Pay-Per-Result model at **`\$0.01` per enriched lead** (`\$10` per 1,000 leads). You only pay when data is successfully extracted and pushed.
- **Compute Units (CU):** Because the Actor uses high-speed HTTP streams (`@crawlee/cheerio`) rather than heavyweight headless Chrome instances, compute consumption is negligible:
  - **1,000 company websites** consume approximately **0.1 to 0.2 Apify Compute Units**.
  - On Apify's **`\$5` free monthly tier**, you can enrich hundreds of domains every month at zero cost.

***

### Tips for High-Volume Scrapes

1. **Proxy Settings:** For lists under 100 domains, direct connection (`useApifyProxy: false`) is fast and free. For large batches (5,000+ domains), enable Apify Proxy (`useApifyProxy: true`) to distribute requests across rotating residential and datacenter IPs.
2. **Page Depth Optimization:** Setting `maxPagesPerDomain: 2` or `3` strikes the ideal balance between speed and contact discovery. Most corporate sites place contact details on the homepage footer or `/contact`.
3. **Automate via API:** You can trigger this Actor programmatically from Python, Node.js, or curl using Apify's REST API:
   ```bash
   curl -X POST "https://api.apify.com/v2/acts/<YOUR-USERNAME>~b2b-company-lead-enricher/runs?token=<YOUR-APIFY-TOKEN>" \
        -H "Content-Type: application/json" \
        -d '{"domains": ["acme.com", "startup.io"]}'
   ```

***

### FAQ, Legality & Support

#### Is scraping public business websites legal?

Yes. Extracting publicly accessible business contact information (corporate emails, company telephone numbers, public addresses, and social links) posted openly on commercial websites complies with international data collection regulations. This Actor only accesses public HTML pages intended for human viewing.

#### How are duplicate or junk emails filtered?

The extraction pipeline filters out image artifacts (e.g., `icon@2x.png`), dummy templates (`example.com`, `user@domain.com`), and error monitoring logs (`sentry.io`). It prioritizes domain-matching addresses (`@targetdomain.com`) over generic third-party providers.

#### Need custom features or have an issue?

If you encounter a bug, need an additional data field extracted, or require custom scraping features, submit a ticket in the **Issues** tab or contact developer support via the Apify Console.

# Actor input Schema

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

List of domains (e.g. stripe.com, linear.app) or full website URLs to crawl and enrich.

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

Optional directory or category pages to discover outbound company links from.

## `maxCompanies` (type: `integer`):

Maximum number of distinct company websites to enrich.

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

Maximum number of subpages to crawl per domain (e.g. homepage, contact, about, team).

## `extractEmails` (type: `boolean`):

Search for public business and contact emails across pages.

## `extractPhones` (type: `boolean`):

Extract phone numbers from tel: links, contact headers, and footers.

## `extractSocials` (type: `boolean`):

Discover LinkedIn, Twitter/X, Facebook, Instagram, YouTube, and GitHub links.

## `extractTechStack` (type: `boolean`):

Identify website CMS, frameworks, and analytics tools (WordPress, Shopify, Webflow, React, HubSpot, etc.).

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

Select proxy settings. Using Apify Proxy is recommended for high-volume jobs to bypass rate limits.

## Actor input object example

```json
{
  "domains": [
    "crawlee.dev",
    "apify.com"
  ],
  "maxCompanies": 50,
  "maxPagesPerDomain": 3,
  "extractEmails": true,
  "extractPhones": true,
  "extractSocials": true,
  "extractTechStack": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "domains": [
        "crawlee.dev",
        "apify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nunu27/b2b-lead-enricher").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 = { "domains": [
        "crawlee.dev",
        "apify.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("nunu27/b2b-lead-enricher").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 '{
  "domains": [
    "crawlee.dev",
    "apify.com"
  ]
}' |
apify call nunu27/b2b-lead-enricher --silent --output-dataset

```

## MCP server setup

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

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/itiEtNgiDhapyVC76/builds/GWreAVTdqs6rNrJUL/openapi.json
