# Website Contact & Leads Scraper (`parseforge/website-contact-leads-scraper`) Actor

Read company websites for the contacts they publish today: emails, phones, address, socials. Charges only reachable leads. Export CSV, Excel, JSON, XML.

- **URL**: https://apify.com/parseforge/website-contact-leads-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.72 / 1,000 results

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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📬 Website Contact & Leads Scraper

> 🚀 **Export any list of company websites into a mailable contact list in seconds.** Paste domains, or describe the companies you want, and each one comes back as a flat 29-field row: email, phone, contact form, postal address, six social profiles and the company's own name and description, read from the live site at the moment you run it. Measured on 46 live sites: 72% published an email, 78% an email or a phone.

Most lead tools on this marketplace are not scrapers. They are search boxes on top of a contact database somebody bought, which is why their reviews say the same three things: the emails bounce, the data is two to three years old, and you get charged when nothing comes back.

This Actor does not have a database. It reads the company's own website, which is the one place where a contact is current by definition: if the site says `info@acme.com` today, that address is live today. And it only bills you for a company that actually published a way to reach it.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Sales and outbound teams | Turn a target-account list into a reachable contact list |
| Agencies and consultancies | Build a local prospect list for a service area |
| Recruiters | Reach employers directly instead of through job boards |
| Data teams | Enrich an existing CRM with contacts that are live today |

### 📋 What the Website Contact & Leads Scraper does

> 💡 **Why it matters:** in a measured comparison on 2026-09-11, a leading paid leads Actor filled the `email` column on 3 of the 25 rows it charged for. Reading the companies' own websites filled it on 33 of 46. The difference is not a better database. It is not using a database at all.

- 🌐 **Works from a domain list.** Paste `acme.com` or `https://www.acme.com`. Both are accepted, deduplicated, and normalised.
- 🔎 **Or finds the websites for you.** Describe the companies ("commercial roofing contractors phoenix az") and the Actor locates candidate company sites first. Directories, review sites and news outlets are filtered out.
- 📧 **Finds the email even when it is hidden.** Reads `mailto:` links, plain text, `name [at] domain [dot] com` obfuscation, and Cloudflare's encoded email protection, which returns nothing at all to a scraper that only reads visible text.
- 📞 **Phones normalised.** `tel:` links first, then the page text. `+31 (0)73 631 5101` and `+31 73 631 5101` are stored as one number, not two.
- 📨 **Contact form detected** when a company publishes a form instead of an address.
- 📍 **Postal address, city, region, postcode and country** from the site's own schema.org data.
- 🔗 **Six social profiles:** LinkedIn, Facebook, Instagram, X, YouTube and TikTok.
- 💸 **You are only charged for a reachable company.** A site that publishes no email and no phone is skipped and never billed. There is no start fee, so a run that finds nothing costs nothing.
- 🔁 **Clean data:** one row per company, the same 29 columns every time, `N/A` instead of blank cells and `error` reserved for failures.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | The company's own share image or logo |
| 🔗 `website` | string | The URL that answered, after redirects |
| 🌐 `domain` | string | Normalised domain, without `www.` |
| 🏢 `companyName` | string | From schema.org, `og:site_name`, or the page title |
| 📝 `description` | string | The company's own description of itself |
| 📧 `primaryEmail` | string | The best address to write to |
| 🔢 `emailCount` | integer | How many distinct addresses were found |
| 📞 `primaryPhone` | string | The first number published |
| 🔢 `phoneCount` | integer | How many distinct numbers were found |
| 📨 `contactFormUrl` | string | Page carrying a contact form, when there is one |
| 📍 `address` | string | Street, town, region and postcode as one line |
| 🏙 `city` | string | Town or city |
| 🗺 `region` | string | State, province or region |
| 📮 `postalCode` | string | Postal or ZIP code |
| 🌍 `country` | string | Country |
| 💼 `linkedinUrl` | string | Company or personal LinkedIn page |
| 📘 `facebookUrl` | string | Facebook page |
| 📸 `instagramUrl` | string | Instagram profile |
| 🐦 `twitterUrl` | string | X / Twitter profile |
| ▶️ `youtubeUrl` | string | YouTube channel |
| 🎵 `tiktokUrl` | string | TikTok profile |
| 🔢 `socialProfileCount` | integer | How many of the six were found |
| 📬 `hasContactChannel` | string | Yes when an email or a phone was found |
| 🔎 `sourceQuery` | string | Which search term produced this company, if any |
| 📄 `pagesCrawled` | integer | How many pages were read for this row |
| 📧 `emails` | array | Every address found |
| 📞 `phones` | array | Every number found |
| 🕒 `scrapedAt` | string | ISO timestamp of the read |
| ❌ `error` | string | Only on failure rows |

#### Example rows

```json
[
  {
    "imageUrl": "N/A",
    "website": "https://comfortmonster.com/",
    "domain": "comfortmonster.com",
    "companyName": "Comfort Monster Heating & Air",
    "description": "Comfort Monster Heating & Air is the leading HVAC service company in the Raleigh-Durham area. Experience our great service & affordable pricing!",
    "primaryEmail": "info@comfortmonster.com",
    "emailCount": 1,
    "primaryPhone": "9196667837",
    "phoneCount": 2,
    "contactFormUrl": "N/A",
    "address": "N/A",
    "city": "N/A",
    "region": "N/A",
    "postalCode": "N/A",
    "country": "N/A",
    "linkedinUrl": "N/A",
    "facebookUrl": "https://www.facebook.com/comfortmonster",
    "instagramUrl": "N/A",
    "twitterUrl": "https://twitter.com/comfortmonster",
    "youtubeUrl": "N/A",
    "tiktokUrl": "N/A",
    "socialProfileCount": 2,
    "hasContactChannel": "Yes",
    "sourceQuery": "N/A",
    "pagesCrawled": 1,
    "emails": [
      "info@comfortmonster.com"
    ],
    "phones": [
      "9196667837",
      "7049997467"
    ],
    "scrapedAt": "2026-09-16T19:19:03.207Z",
    "error": null
  },
  {
    "imageUrl": "https://brookstonelandscapes.com/wp-content/uploads/cropped-brookstone-leaf-icon-32x32.png",
    "website": "https://brookstonelandscapes.com/",
    "domain": "brookstonelandscapes.com",
    "companyName": "Brookstone Landscape & Design",
    "description": "Brookstone Landscape & Design is a leader in commercial landscaping services in the greater Seattle metroplex and King County, Washington.",
    "primaryEmail": "sales@brookstonelandscapes.com",
    "emailCount": 1,
    "primaryPhone": "8447181260",
    "phoneCount": 1,
    "contactFormUrl": "https://brookstonelandscapes.com/",
    "address": "N/A",
    "city": "N/A",
    "region": "N/A",
    "postalCode": "N/A",
    "country": "N/A",
    "linkedinUrl": "https://www.linkedin.com/company/brookstone-landscape-design",
    "facebookUrl": "https://www.facebook.com/brookstonelandscapedesign",
    "instagramUrl": "N/A",
    "twitterUrl": "N/A",
    "youtubeUrl": "N/A",
    "tiktokUrl": "N/A",
    "socialProfileCount": 2,
    "hasContactChannel": "Yes",
    "sourceQuery": "N/A",
    "pagesCrawled": 1,
    "emails": [
      "sales@brookstonelandscapes.com"
    ],
    "phones": [
      "8447181260"
    ],
    "scrapedAt": "2026-09-16T19:19:02.003Z",
    "error": null
  },
  {
    "imageUrl": "https://thebarn.de/cdn/shop/files/barn_logo_large_house_copy.png?crop=center&height=32&v=1718815603&width=32",
    "website": "https://thebarn.de/",
    "domain": "thebarn.de",
    "companyName": "THE BARN Coffee Roasters",
    "description": "THE BARN Coffee Roasters are one of the leading Specialty Coffee Roasters in Europe. We roast the best coffees available on this planet.",
    "primaryEmail": "webshop@thebarn.de",
    "emailCount": 1,
    "primaryPhone": "N/A",
    "phoneCount": 0,
    "contactFormUrl": "N/A",
    "address": "Wattstraße 10-13, Berlin, 13355",
    "city": "Berlin",
    "region": "N/A",
    "postalCode": "13355",
    "country": "Germany",
    "linkedinUrl": "N/A",
    "facebookUrl": "https://www.facebook.com/THEBARNBERLIN/",
    "instagramUrl": "https://www.instagram.com/thebarnberlin",
    "twitterUrl": "https://twitter.com/THEBARNBERLIN",
    "youtubeUrl": "https://www.youtube.com/@thebarncoffeeroastersberlin",
    "tiktokUrl": "N/A",
    "socialProfileCount": 4,
    "hasContactChannel": "Yes",
    "sourceQuery": "N/A",
    "pagesCrawled": 1,
    "emails": [
      "webshop@thebarn.de"
    ],
    "phones": [],
    "scrapedAt": "2026-09-16T19:19:01.916Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

- **The contact is live, not remembered.** Every field is read from the company's site during your run. There is no dump to go stale.
- **You are not charged for empty rows.** No start fee, and a company with no published contact is skipped rather than billed.
- **Hidden addresses are found.** Cloudflare-protected and `[at]`-obfuscated emails are decoded, which is most of the gap between a 40% and a 70% hit rate.
- **Nothing is invented.** An address is only reported if the site published it. An earlier version guessed addresses from running text and produced `landscaping@lees.g.landscaping`, a valid-looking address that does not exist. That behaviour was removed, because a fabricated contact is worse than a missing one.
- **Honest ceilings.** Measured on 46 live company sites: 87% answered, 72% published an email, 61% a phone, 78% at least one of the two. The README tells you that instead of promising 100%.

### 📈 How it compares to alternatives

| | This Actor | Database-backed leads Actors |
|---|---|---|
| Where the contact comes from | The company's website, during your run | A contact dump bought from a wholesaler |
| Age of the data | Today | "at least 2 to 3 years old", their reviews |
| Email column filled | 72% measured on 46 sites | 12% measured on a 25-row run |
| Charged when the run returns nothing | ❌ never | ✅ start fee still applies |
| Account permissions required | None | One leading Actor demands full read/write on your Apify account |
| Coverage outside the US | Same as anywhere: any site in any country | Reviews report France, Germany, Brazil and Spain as empty |

### 🚀 How to use

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Website Contact & Leads Scraper](https://apify.com/parseforge/website-contact-leads-scraper?fpr=vmoqkp).
3. Paste your domains into **Company websites**, or type what you are looking for into **Or find websites by search**.
4. Set **Maximum leads**. Leave **Only return companies with a contact** on unless you want a row for every site.
5. Click **Start** and download the dataset as CSV, Excel, JSON or XML.

Free-plan runs return up to 10 leads as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 leads per run.

### 💼 Business use cases

- **Target-account outreach.** You know the 400 companies you want; this turns them into 400 reachable contacts.
- **Local service prospecting.** Search a trade and a city, get the businesses in it with their emails.
- **CRM hygiene.** Re-read the websites of accounts you already have and replace the addresses that have moved on.
- **Partner and supplier discovery.** Find who to write to at companies in an adjacent market.
- **Event and list building.** Assemble a contactable list for a launch, a survey or an invitation.

### 🔌 Automating Website Contact & Leads Scraper

Schedule the Actor from the Apify Console and it reruns on its own. Point a webhook at your CRM and each finished run lands there. Company sites change addresses quietly, so a monthly re-read of your account list is a cheap way to keep it warm.

### 🌟 Beyond business use cases

- Find the right address to complain to, instead of a support ticket form.
- Collect the contact details of every club or charity in your town.
- Check what your own website exposes to anyone who looks.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant with web access:

> I want to build a contact list from a set of company websites. Look at https://apify.com/parseforge/website-contact-leads-scraper and tell me how to configure a run over 300 domains, what each of the 29 output fields means, and when a row is charged.

### ❓ Frequently Asked Questions

#### 🌐 What do I put in Company websites?

Domains or full URLs, one per line. `acme.com`, `www.acme.com` and `https://acme.com/` are all read as the same company and returned once.

#### 🔎 Do I need a domain list?

No, but it gives cleaner results. Search discovery finds candidate company sites from a description, and filters out directories, review sites and news outlets, but a search engine will always return some of them, while a domain list returns exactly what you asked for.

#### 📧 How often is an email actually found?

Measured on 46 live company sites across six countries: 72% published an email, 61% a phone, 78% at least one. Small businesses are the strongest case; large corporations often publish only a form.

#### 🔐 Does it find emails hidden behind Cloudflare?

Yes. Cloudflare replaces the address with an encoded blob that plain-text scrapers read as nothing. This Actor decodes it, along with the `name [at] domain [dot] com` style of obfuscation.

#### 💸 When am I charged?

Only for a delivered row that carries an email or a phone. There is no start fee, and skipped or failed sites are never billed.

#### 📄 How many pages does it read per company?

One, when the home page already carries an email, which is the common case, because most small businesses put the address in the header or footer. Otherwise it follows the site's own contact, about or imprint links, up to the limit you set.

#### 🛡️ Do I need a proxy?

The default datacenter proxy is already correct: company websites serve it normally, and its transfer is not billed, which is what keeps the price per lead down. Switch to residential only if a specific target refuses datacenter.

#### 🧑‍💼 Does it return named people, like a CEO?

No. It returns the company's published contact channels. A name scraped off an About page is a guess about who holds which role, and this Actor does not guess.

#### ✅ Are the emails verified as deliverable?

No, and be careful with any tool that claims otherwise. Mail servers do not reliably answer that question: a major provider returns the same "accepted" response for a real address and an invented one at the same domain. What is reported here is that the company published the address, which is a fact, not a prediction.

#### ⚠️ What do `N/A` values mean?

The company does not publish that value on its site. Blank cells never appear.

#### ⏰ Can I run this on a schedule?

Yes. Schedule it in the Apify Console. Monthly is a sensible cadence for refreshing an account list.

#### 📄 What output formats are supported?

CSV, Excel, JSON, XML, JSONL and RSS, from the dataset tab or the API.

#### ❌ What happens when a site fails?

It is retried on a fresh proxy exit, and if it still fails it is counted as unreachable and not charged. A genuine error writes a row carrying only `error`, which is also never charged.

### 🔌 Integrate with any app

The dataset is available through the Apify API the moment the run finishes. Use the `run-sync-get-dataset-items` endpoint for one-shot calls, webhooks to trigger downstream jobs, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

### 🔗 Recommended Actors

- [LinkedIn Company Profiles Scraper](https://apify.com/parseforge/linkedin-company-profiles-scraper?fpr=vmoqkp)
- [Crunchbase Scraper](https://apify.com/parseforge/crunchbase-scraper?fpr=vmoqkp)
- [Sunbiz Florida Business Scraper](https://apify.com/parseforge/sunbiz-florida-business-scraper?fpr=vmoqkp)
- [Delaware Business Search Scraper](https://apify.com/parseforge/delaware-business-search-scraper?fpr=vmoqkp)
- [Contact Info Scraper](https://apify.com/parseforge/contact-info-scraper?fpr=vmoqkp)

***

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA) with your run ID, your input and what you expected.

> **⚠️ Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by any of the companies whose websites it reads. It collects only publicly available data. You are responsible for using the collected contact data in compliance with applicable law, including GDPR and other privacy and anti-spam rules in your jurisdiction.

# Actor input Schema

## `websiteUrls` (type: `array`):

The company websites to read. Paste domains (acme.com) or full URLs, both work. This is the main input: point it at a list you already have and every row comes back with the contact details that site publishes today.

## `searchTerms` (type: `array`):

Describe the companies you want and the Actor finds candidate websites first, then reads them. Directories, review sites and news outlets are filtered out. Use this when you do not have a domain list yet; a domain list always gives cleaner results.

## `maxItems` (type: `integer`):

Stop after this many leads. Free users get up to 10 results per run; paid users get up to 1,000,000.

## `requireContact` (type: `boolean`):

On by default. A company whose site publishes no email and no phone is skipped and never charged. Turn it off to get a row for every website, including the ones with nothing to show.

## `resultsPerSearch` (type: `integer`):

How many company websites to take from each search term. Directories and review sites do not count toward this number.

## `maxPagesPerSite` (type: `integer`):

The home page is read first. If it already carries an email, no further page is requested. Otherwise the Actor follows the site's own contact, about or imprint links, up to this many pages.

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

How many company sites to read at once. Each site only ever gets one request at a time from this run; the parallelism is spread across different companies. Lower it if your list holds many sites hosted together and you want to be gentle with that host.

## `directSiteRequests` (type: `boolean`):

On by default: company websites are read straight from the run, which is faster, and a site that fails is tried once more through the proxy. Search always uses the proxy. Turn it off to send every request through the proxy below.

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

Datacenter proxy by default: company websites serve it normally, and its transfer is not billed, which is what keeps the price per lead down. Switch to residential only if a specific target refuses datacenter.

## Actor input object example

```json
{
  "websiteUrls": [
    "https://www.hollandpackaging.nl",
    "https://www.comfortmonster.com",
    "https://www.gilbertsondavis.com"
  ],
  "searchTerms": [],
  "maxItems": 10,
  "requireContact": true,
  "resultsPerSearch": 10,
  "maxPagesPerSite": 3,
  "concurrency": 40,
  "directSiteRequests": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "BUYPROXIES94952"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields

## `fullData` (type: `string`):

Complete dataset with all 29 fields

# 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 = {
    "websiteUrls": [
        "https://www.hollandpackaging.nl",
        "https://www.comfortmonster.com",
        "https://www.gilbertsondavis.com"
    ],
    "searchTerms": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/website-contact-leads-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 = {
    "websiteUrls": [
        "https://www.hollandpackaging.nl",
        "https://www.comfortmonster.com",
        "https://www.gilbertsondavis.com",
    ],
    "searchTerms": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/website-contact-leads-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 '{
  "websiteUrls": [
    "https://www.hollandpackaging.nl",
    "https://www.comfortmonster.com",
    "https://www.gilbertsondavis.com"
  ],
  "searchTerms": [],
  "maxItems": 10
}' |
apify call parseforge/website-contact-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/website-contact-leads-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/datb8GAE4CxALVOen/builds/BodveUsMtJabt6cHF/openapi.json
