Website Email Scraper — Verified Emails From Any Site avatar

Website Email Scraper — Verified Emails From Any Site

Pricing

from $8.00 / 1,000 contact records

Go to Apify Store
Website Email Scraper — Verified Emails From Any Site

Website Email Scraper — Verified Emails From Any Site

Hand it a list of websites and get back the business email addresses each one publishes, checked for deliverability and deduplicated to one row per company. Phone numbers and social profiles are included in the same row at no extra cost.

Pricing

from $8.00 / 1,000 contact records

Rating

0.0

(0)

Developer

Blackcube

Blackcube

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

38 minutes ago

Last modified

Share

Website Contact & Email Suite  •  9 Actors, one codebase, one contact record billed once
Website Contact & Email Extractor
Verified Emails + Socials
B2B Leads Finder
Verified Emails, Phones & Socials
Company Contact Scraper
Emails, Phones & Socials
Phone Number Scraper
Business Numbers From Any Website
MX Verified Email Finder
Deliverable Business Emails
Website Email Scraper
➤ You are here
Decision Maker Email Finder
Skip the info@ Inbox
Contact Page Scraper
Emails, Phones & Socials by Site
Email Finder
Business Emails From a List of Domains

More from this account: YouTube Transcript Suite · Career Site & ATS Jobs Suite · Google News Suite · Keyword Research Suite · Shopify Store Intelligence Suite · eBay Data Suite · Amazon Reviews Suite · Reddit · Meta Ad Library · Vinted · Trustpilot Review Intelligence Suite · App Store & Google Play Reviews Suite · Etsy Research Suite · YouTube Comments Intelligence Suite · Telegram Channel Intelligence Suite · Business Reviews Suite · Google Trends Suite · Amazon Product Data Suite · Polymarket Order Book · Nordic Marketplaces Suite · Google Sheets Suite · TikTok Suite · Snapchat Suite · LinkedIn Public Data Suite · Instagram Suite · Contact Validation Suite · Google Maps Suite · X / Twitter

Hand it a list of websites and get back the business email addresses each one publishes, checked for deliverability and deduplicated to one row per company. Phone numbers and social profiles are included in the same row at no extra cost.

You pay per company we find an email address for. Companies with only a phone number or social links, websites with no contacts, and failed sites are delivered free, with the reason in errorReason.

What it does

Addresses that survive contact with a mail server. Obfuscated and encoded addresses that most tools walk straight past are recovered, junk and image-filename lookalikes are discarded, and what is left is checked for deliverability before it reaches your dataset. One row per company, with the phone number and social profiles in the same row, so nothing needs a second run.

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

FieldWhat it is
emails[]{ address, role, foundOn, verification } — every address says what it is, where it came from, and how it verified
primaryEmailthe single best address, already picked for you
phones[]normalised to E.164
socialsLinkedIn, X, Facebook, Instagram, YouTube and more, keyed by network
companyName, address, descriptioncompany identity, taken from the site's own markup
domain, emailCount, phoneCount, pagesCrawledthe 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 address, by your Apify plan:

Plan tierPer 1,000 companies
Free$20.00
Bronze$12.00
Silver$10.00
Gold$8.00
Platinum$8.00
Diamond$8.00

Free: companies with no email address (their phone numbers and social links are still delivered), and failed and unreachable sites. Each free row says why in errorReason. 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

curl -X POST "https://api.apify.com/v2/acts/vonsensey~website-email-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"domains":["stripe.com","apify.com"]}'
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("vonsensey/website-email-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.

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

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/website-email-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/website-email-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)

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

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

REST API (one call, rows in the response)

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

Python

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

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/website-email-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/website-email-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 emails from any website, 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.