Practitioner guide · 2026

A Domain Is Not a Contact: Turning a Website List into Reachable Leads

Where emails actually hide on a site, why info@ and jane.doe@ are different leads, what verification really proves, and the legal line you cannot ignore.

Open the Website Contact Finder →
Short version: you have a column of domains and you need people you can email. The gap is bigger than it looks. Emails live on deep pages, not the homepage; a generic info@ is a weaker lead than a named address; verification removes bounces but does not promise a reply; and whether you can legally send depends on where the recipient is. Here is how each piece actually works.

The problem nobody states out loud

Scraping a list of company websites is the easy 20%. You ran a Google Maps or directory scrape, you have 2,000 domains, and now you are stuck. A domain is a building, not a person. To act on it you need an address that (a) exists, (b) belongs to someone relevant, and (c) you are allowed to write to. Visiting 2,000 sites by hand to hunt for a contact link is exactly the kind of work that never gets done. This guide is about closing that gap honestly — including the parts the slick "find anyone's email" tools gloss over.

Where emails actually live on a site

The single biggest reason naive scrapers come back empty is that they read only the page you gave them. Business emails are almost never on the homepage. They cluster on a handful of deep pages, and a finder is only as good as how it follows internal links to reach them:

The takeaway: depth and link-following beat breadth. A crawler that visits the contact, about, team and imprint pages of one domain finds far more than one that scrapes a thousand homepages.

Role addresses vs personal addresses

Not all emails are the same kind of lead, and treating them identically is why a lot of campaigns underperform.

TypeExamplesWhat it is good for
Role / genericinfo@, sales@, hello@, support@Always-on, low-risk under most laws, but routed to a shared inbox and easy to ignore. Good for a first-touch or for tiny businesses with no other address.
Personal / namedjane.doe@, j.smith@Reaches an actual human, far higher reply rate — but it is "personal data" under GDPR, so it carries more compliance weight and goes stale when people leave.
Pattern-guessedderived first.last@domainCheap to generate, but unverified guesses bounce and bounces wreck sender reputation. Never send to a guess you have not verified.

A good enrichment keeps the type alongside the address so you can route them differently: personal addresses into a careful, GDPR-aware sequence; role addresses into a lighter first-touch.

Verification: what it can and cannot tell you

"Verified email" gets sold as a guarantee. It is not one. Verification typically means: the domain has valid MX records (it can receive mail), and an SMTP probe suggested the specific mailbox exists without a hard reject. That is genuinely useful — it strips out the obvious bounces that otherwise tank your sender score. But be honest about its ceiling:

Read verification as "unlikely to bounce", not "will be read and answered". That framing keeps your expectations and your bounce rate honest.

The worked pipeline: domains in, leads out

Here is the actual flow that turns a raw domain column into a list you can hand to a sales sequence.

  1. Feed the domains. Pass your list of websites to a contact-finder Actor. One run, no per-site clicking.
  2. Crawl deep. The Actor walks contact/about/team/imprint/footer pages and de-obfuscates mailto tricks, returning every address plus where it found it.
  3. Classify. Tag each address as role vs personal, and keep the source page — an email from /team is a stronger signal than one from a blog comment.
  4. Verify. Run MX + SMTP checks, drop hard-invalids, flag catch-all/risky separately rather than trusting them.
  5. Dedupe and route. One contact per company (or per named person), de-duplicated, ready to drop into your CRM or outreach tool.

The crawl-and-extract step is the one you should never build yourself. As an API call it looks like this:

curl -X POST "https://api.apify.com/v2/acts/renzomacar~website-contact-finder/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "websites": ["acme.io", "example-clinic.com", "studio-nord.de"],
    "maxDepth": 2,
    "includePhones": true,
    "includeSocials": true
  }'

maxDepth: 2 is the sweet spot — it reaches the contact and team pages one or two clicks in without crawling the entire blog. Push depth higher only for sprawling sites where the imprint is buried.

The "one good contact beats ten guesses" rule. It is tempting to maximise addresses per domain. Resist it. Ten pattern-guessed, unverified addresses per company will bounce and burn your sending domain's reputation, which then sinks deliverability for the good addresses too. One verified, well-classified contact per company is worth more than a fat list of maybes. Optimise for low bounce rate, not for row count.

Turn your domain list into contacts

Our Website Contact Finder crawls each site's contact, about, team and imprint pages, de-obfuscates hidden addresses, and returns emails, phones and socials with the source page attached — ready to verify and route. Free Apify credits to start.

Run the Website Contact Finder → Or get done-for-you leads

Troubleshooting an empty or thin result

When a finder comes back with fewer contacts than you expected, it is almost always one of these:

Disclosure: links to Apify on this page are affiliate links, marked rel="sponsored". If you create a paid account through them we may earn a commission at no extra cost to you. We recommend Apify because we build and ship Actors on it ourselves, including the Website Contact Finder linked above. Nothing here is legal advice; check the rules that apply to your recipients before sending.