Website Email Extractor avatar

Website Email Extractor

Pricing

Pay per event

Go to Apify Store
Website Email Extractor

Website Email Extractor

Crawl public websites and export normalized displayed email addresses with exact source-page provenance, discovery context, and timestamps.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Crawl public websites and export displayed email addresses with the exact page where each address was found. This website email extractor turns supplied URLs or domains into structured, deduplicated email records for lead enrichment, contact research, spreadsheet exports, and scheduled data refreshes.

The Actor uses lightweight HTTP requests rather than a browser. It checks each supplied page and follows bounded, same-site contact-related links such as contact, about, team, support, legal, and impressum pages.

What does Website Email Extractor do?

Website Email Extractor:

  • accepts one or many public website URLs or bare domains;
  • finds email addresses in mailto: links and displayed page text;
  • recognizes common [at] and [dot] obfuscation;
  • follows high-signal contact links within configurable depth and page limits;
  • normalizes email addresses and domains;
  • records the exact source page and original start URL;
  • deduplicates repeated email-and-source-page pairs;
  • exports typed JSON, CSV, Excel, XML, RSS, or JSONL through Apify datasets.

It does not guess addresses, generate email patterns, verify mailboxes, or access pages behind logins. Every result is tied to publicly displayed source evidence.

Who is this website email scraper for?

Lead-generation teams

Refresh public business contact lists while preserving source-page provenance for review and CRM updates.

Sales and partnerships teams

Collect displayed sales, support, press, partnership, or general contact addresses from a bounded list of target websites.

Researchers and analysts

Build reproducible datasets of website email addresses with crawl timestamps and discovery context.

Data engineers

Feed normalized website email records into spreadsheets, databases, enrichment pipelines, webhooks, or scheduled Apify workflows.

Agencies

Process client-supplied domain lists without manually opening each contact page.

Why use this online email extractor?

Many email extraction tools return only an address. This Actor also returns:

  • the normalized email domain;
  • the website domain being researched;
  • the exact public source URL;
  • the supplied start URL;
  • whether the address came from visible text, a mail link, or obfuscated text;
  • the source page title;
  • the extraction timestamp.

That provenance makes results easier to audit, deduplicate, refresh, and route to downstream systems.

What data can I extract?

FieldTypeDescription
emailstringNormalized displayed email address.
domainstringDomain portion of the email address.
websiteDomainstringNormalized domain of the supplied website.
sourceUrlURLExact public page where the address appeared.
startUrlURLSupplied website URL that led to the result.
discoveryContextstringmailto-link, visible-text, or obfuscated-text.
pageTitlestring or nullHTML title of the source page when available.
linkTextstring or nullText of the email link when applicable.
foundAtISO timestampTime when the address was extracted.

A repeated email on two different pages creates two records because each source page is independently useful provenance. An email repeated on the same page is saved once.

How to extract email addresses from websites

  1. Open Website Email Extractor in Apify Console.
  2. Add one or more public website URLs to Website URLs.
  3. Choose the maximum pages and contact-link depth for each website.
  4. Keep direct requests enabled, or select an Apify Proxy configuration if your targets require one.
  5. Click Start.
  6. Preview results in the Website emails dataset view.
  7. Export the dataset or connect it to another service.

Start with a small domain batch and maxPagesPerWebsite between 3 and 10. Increase limits only when the target sites need deeper contact-page discovery.

Input parameters

ParameterRequiredDefaultDescription
startUrlsyesW3C and GNU contact pagesPublic URLs or domains to crawl.
maxItemsno20Maximum unique email-and-source-page records, from 1 to 100,000.
maxPagesPerWebsiteno10Maximum pages fetched per supplied website, from 1 to 100.
maxDepthno2Contact-link levels to follow, from 0 to 3.
includeSubdomainsnofalseWhether high-signal links on subdomains may be followed.
proxyConfigurationnodirect requestsOptional Apify Proxy settings.

Example input

{
"startUrls": [
{ "url": "https://www.w3.org/Consortium/contact" },
{ "url": "https://www.gnu.org/contact/" }
],
"maxItems": 50,
"maxPagesPerWebsite": 6,
"maxDepth": 1,
"includeSubdomains": false,
"proxyConfiguration": { "useApifyProxy": false }
}

Bare domains such as gnu.org are normalized to HTTPS URLs. Non-HTTP protocols and local or private-network targets are rejected.

Output example

A real output record has this shape:

{
"email": "team-china-contact@w3.org",
"domain": "w3.org",
"websiteDomain": "w3.org",
"sourceUrl": "https://www.w3.org/contact",
"startUrl": "https://www.w3.org/Consortium/contact",
"discoveryContext": "visible-text",
"pageTitle": "Contact | W3C",
"linkText": null,
"foundAt": "2026-08-13T14:06:51.837Z"
}

The default dataset contains the primary result type, so Apify integrations and dataset export endpoints work without a custom dataset name.

How much does it cost to extract website email addresses?

Website Email Extractor uses pay-per-event pricing:

  • a one-time $0.004 run-start fee;
  • $0.00304 per extracted email record on the BRONZE tier;
  • lower per-record rates on higher Apify tiers.

BRONZE examples use the same simple calculation:

Result countCharge calculation
1one run-start event plus 1 email event
10one run-start event plus 10 email events
100one run-start event plus 100 email events
1,000one run-start event plus 1,000 email events

Only unique records successfully saved to the dataset trigger the email event. Failed pages, duplicate records, and pages with no displayed email do not create per-email charges. Apify applies the tier associated with your account; proxy usage or platform compute can vary separately.

Bounded crawling behavior

The crawler starts from each supplied URL. It follows links only when all of these are true:

  1. the destination is on the same website, unless subdomains are explicitly enabled;
  2. the path, query, or link text looks contact-related;
  3. the configured depth has not been exceeded;
  4. the per-website page limit has not been reached.

This is intentionally not a general whole-site crawler. The bounded strategy controls runtime, transfer, and accidental crawl expansion while prioritizing pages likely to display contact details.

Email normalization and discovery context

Addresses are lowercased and checked for a valid domain structure. Obvious reserved test domains are discarded.

The discoveryContext field explains how each address appeared:

  • mailto-link — extracted from an email link;
  • visible-text — displayed directly in page text;
  • obfuscated-text — displayed with supported [at], (at), [dot], or (dot) notation.

JavaScript-generated addresses that never appear in returned HTML are outside the lightweight HTTP route.

Export to CSV, Excel, or JSON

After a run, open the dataset and choose an export format. You can also use dataset API endpoints, for example:

https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=true

Common formats include JSON, JSONL, CSV, Excel, XML, and RSS. Use clean=true to omit storage metadata where supported.

Lead enrichment workflow

A practical recurring workflow is:

  1. export domains from a CRM or prospecting source;
  2. submit the domain list in startUrls;
  3. run Website Email Extractor on a schedule;
  4. join records by websiteDomain;
  5. preserve sourceUrl and foundAt for auditability;
  6. compare the latest dataset with the previous export before updating the CRM.

The Actor reports what a website displays. It does not determine mailbox ownership, role, deliverability, consent, or whether an address is suitable for outreach.

Scheduling and monitoring

Create an Apify Task with your input, then attach an Apify Schedule for recurring refreshes. Webhooks can notify another system when the run succeeds or fails.

When comparing scheduled outputs, use email, websiteDomain, and sourceUrl as stable business keys. Treat foundAt as observation time rather than a change indicator.

API usage with cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~website-email-extractor/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{"url":"https://www.w3.org/Consortium/contact"}],
"maxItems": 20,
"maxPagesPerWebsite": 5,
"maxDepth": 1
}'

For production integrations, prefer an Authorization: Bearer header instead of putting a token in a logged URL.

API usage with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/website-email-extractor').call({
startUrls: [{ url: 'https://www.w3.org/Consortium/contact' }],
maxItems: 20,
maxPagesPerWebsite: 5,
maxDepth: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

API usage with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/website-email-extractor').call(run_input={
'startUrls': [{'url': 'https://www.gnu.org/contact/'}],
'maxItems': 20,
'maxPagesPerWebsite': 5,
'maxDepth': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use Website Email Extractor with Apify MCP

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/website-email-extractor"

Claude Desktop setup

Use this JSON in Claude Desktop's MCP configuration.

Cursor setup

Add the same server object to Cursor's MCP settings.

VS Code setup

Add the server URL to the MCP server configuration used by your VS Code client.

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/website-email-extractor"
}
}
}

Example prompts:

  • “Run Website Email Extractor on these five public domains and return email, websiteDomain, and sourceUrl.”
  • “Extract displayed contact emails from this organization website with a maximum depth of one.”
  • “Save the resulting website email records for spreadsheet export.”

Proxy configuration

Direct HTTP requests are the default and normally the lowest-cost option. You may enable Apify Proxy through proxyConfiguration for targets that restrict direct cloud traffic.

There is no automatic residential-proxy fallback. The Actor uses only the proxy configuration you provide, so it does not silently switch to a higher-cost network route.

A proxy does not guarantee access to login-only pages, CAPTCHA-protected content, or websites that prohibit automated requests.

Limits and failure behavior

  • Only anonymously reachable public HTTP and HTTPS pages are supported.
  • The Actor does not render client-side JavaScript.
  • It follows high-signal contact links, not every internal link.
  • PDF, image, document, and non-text email extraction is not supported.
  • Login walls, CAPTCHAs, and some anti-bot systems can prevent extraction.
  • Obfuscation outside the documented [at] and [dot] forms may not be recognized.
  • A successful run may return no records when target pages display no email address.
  • Individual page failures are logged and do not prevent other supplied websites from being processed.

Use smaller batches when diagnosing target-specific behavior. Inspect run logs for HTTP status or content-type warnings.

Responsible use and legality

Use this Actor only for public information you are authorized to collect and process. Respect website terms, robots guidance where applicable, applicable privacy and data-protection law, and requests to remove or correct data.

A displayed email address is not automatic consent for marketing. Before outreach, determine a lawful basis, honor suppression lists and opt-outs, identify the sender, and follow rules applicable to your jurisdiction and recipients.

Do not use the Actor to access private systems, evade authentication, collect sensitive personal data, or facilitate spam, harassment, phishing, or discrimination.

Troubleshooting

Why did a website return no emails?

Check whether the address is visible in the raw public HTML. If it appears only after browser interaction, inside an image or PDF, or behind a login, this Actor will not see it. Increase maxPagesPerWebsite or maxDepth only if a relevant contact page was not reached.

Why was a contact page skipped?

The link must be same-site and contain a recognized contact-related hint. Supply that public page directly in startUrls when its path or label is unusual.

Why do I see the same email more than once?

The same address on different source pages is retained as separate provenance. Deduplicate only by email downstream if page-level evidence is not important to your workflow.

Why did the run reject my URL?

Only public HTTP or HTTPS targets are accepted. Localhost and private-network addresses are blocked. Check for a missing or malformed domain.

Should I enable a proxy?

Use direct requests first. Enable a proxy only when you have evidence the public target blocks your current network route and automated access remains permitted.

Choose Website Email Extractor when the desired output unit is each displayed email with exact page provenance.

FAQ

Does the Actor verify whether an email mailbox exists?

No. It extracts and normalizes displayed addresses but does not perform MX, SMTP, deliverability, or identity verification.

Can it crawl multiple domains in one run?

Yes. Add multiple entries to startUrls; page limits apply independently to each supplied website.

Can it follow subdomains?

Yes, when includeSubdomains is enabled. Leave it disabled for tighter scope.

Does it generate guessed employee emails?

No. The Actor emits only addresses found in supported public page content.

Can I schedule it?

Yes. Save the input as an Apify Task and attach an Apify Schedule or webhook.

How do I stop after a fixed number of records?

Set maxItems. The Actor stops saving records after reaching the accepted-result limit.