Waterfall Contact Enrichment avatar

Waterfall Contact Enrichment

Pricing

Pay per usage

Go to Apify Store
Waterfall Contact Enrichment

Waterfall Contact Enrichment

Find business emails, phones, and social profiles from a name + company domain. Cascades through MX validation, website scraping, pattern detection, and SMTP verification. Free Clay alternative.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

ryan clinton

ryan clinton

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

4

Monthly active users

2 days ago

Last modified

Categories

Share

Clay alternative — find anyone's business email, phone number, and social profiles from their name + company domain. Zero external API costs.

Cascades through 4 data sources until contact info is found:

  1. Email pattern generation — 15+ common B2B email patterns (first.last, flast, etc.)
  2. Website scraping — finds emails, phones, and social links on the company website
  3. Email pattern detection — identifies the company's actual email format
  4. Social profile discovery — generates likely LinkedIn, GitHub, and Twitter URLs

Each result includes a confidence score (0-100) and status: found, likely, or not_found.

Key features

  • Zero external API costs — no Hunter, Clearbit, or ZoomInfo subscription needed
  • Waterfall enrichment — cascades through multiple free sources for maximum coverage
  • Email + phone + socials — full contact enrichment, not just email
  • 15+ email patterns — covers first.last, firstlast, flast, f.last, last.first, and more
  • SMTP verification (deep mode) — confirms the exact mailbox exists on the mail server
  • Website scraping — leverages our Contact Scraper to find real data on company sites
  • Pattern detection — detects the company's email format, then applies it to the person
  • Per-domain caching — efficient for bulk lists (multiple people at the same company)
  • Batch processing — configurable concurrency for speed

How the waterfall works

Input: {name, domain} → Source 1 → Source 2 → Source 3 → Source 4 → Best match
Source 1: Generate 15+ email candidates from person's name
Source 2: Scrape company website for real emails, phones, socials
Source 3: Detect company's email pattern, apply to person
Source 4: Generate likely social profile URLs
Cross-reference all sources → Score by confidence → Return best email

Why waterfall? Single sources miss 40-50% of emails. By combining multiple approaches, we boost match rates to 70-90%.

Example output

{
"firstName": "Jan",
"lastName": "Curn",
"domain": "apify.com",
"company": null,
"email": "jan.curn@apify.com",
"emailConfidence": 85,
"emailSource": "pattern_detection",
"phone": "+420 234 567 890",
"phoneSource": "website",
"socialProfiles": {
"linkedin": "https://www.linkedin.com/in/jan-curn/",
"github": "https://github.com/jancurn",
"twitter": "https://twitter.com/jancurn"
},
"status": "found",
"sources": {
"patternGeneration": {
"candidates": ["jan.curn@apify.com", "jan@apify.com", "jcurn@apify.com"],
"topPattern": "first.last"
},
"websiteScraping": {
"emailsFound": ["hello@apify.com"],
"phonesFound": ["+420 234 567 890"],
"socialsFound": ["linkedin.com/in/jancurn"]
},
"patternDetection": {
"detectedPattern": "first.last",
"patternConfidence": 85,
"generatedEmail": "jan.curn@apify.com"
}
},
"allCandidates": [
{"email": "jan.curn@apify.com", "pattern": "first.last", "confidence": 85, "sources": ["pattern_generation", "pattern_detection"]},
{"email": "jan@apify.com", "pattern": "first", "confidence": 65, "sources": ["pattern_generation"]}
],
"domainValid": true,
"mxHost": "aspmx.l.google.com",
"verifiedAt": "2026-02-07T12:00:00.000Z"
}

Input

FieldTypeDefaultDescription
peoplearray of objectsrequiredEach: {firstName, lastName, domain} or {fullName, domain}. Optional: company
enrichFromWebsitebooleantrueScrape company website for real contact data (calls Contact Scraper)
detectPatternbooleantrueDetect company's email pattern (calls Email Pattern Finder)
verificationLevelenum"standard"standard (MX only) or deep (MX + SMTP)
smtpTimeoutinteger (3-30)10SMTP timeout in seconds (deep mode)
maxConcurrencyinteger (1-5)3Parallel person lookups

Person object format

Each person in the people array needs:

{"firstName": "Jan", "lastName": "Curn", "domain": "apify.com"}

Or with full name:

{"fullName": "Jan Curn", "domain": "apify.com"}

Optional fields: company (string) for display purposes.

Verification levels

LevelWhat it checksSpeedAccuracy
StandardMX records + pattern generation + website~5-15s/person~80%
Deep+ SMTP verification + catch-all detection~15-30s/person~95%

Standard mode is recommended for most use cases. Deep mode connects to the mail server to verify each candidate individually.

Confidence scoring

ScenarioScore
Direct match on company website + SMTP confirmed98
SMTP confirmed + not catch-all domain95
Direct match found on company website90
Pattern matches detected company email format75-80
Most common pattern (first.last) + MX valid70
Common pattern (first, flast) + MX valid65
Less common pattern + MX valid60
Catch-all domain (accepts all addresses)50
Domain has no MX records0

Status values

StatusMeaningConfidence
foundHigh confidence email discovered70-98
likelyBest guess, moderate confidence40-69
not_foundDomain invalid or no viable candidates0-39

Email patterns generated

The actor tries 15+ common B2B email patterns for each person:

PatternExample (Jan Curn)
first.lastjan.curn@domain.com
firstlastjancurn@domain.com
firstjan@domain.com
flastjcurn@domain.com
f.lastj.curn@domain.com
first_lastjan_curn@domain.com
first-lastjan-curn@domain.com
firstljanc@domain.com
first.ljan.c@domain.com
last.firstcurn.jan@domain.com
lastfirstcurnjan@domain.com
lastcurn@domain.com
last.fcurn.j@domain.com
lastfcurnj@domain.com
f_lastj_curn@domain.com

International names are transliterated automatically (e.g., Rene -> rene, Munoz -> munoz).

Use cases

  • Sales prospecting — find decision-maker emails from a list of names + companies
  • Lead enrichment — add contact details to CRM records with only name + domain
  • Outreach campaigns — build verified email lists for cold outreach
  • Recruiting — find candidate contact info from LinkedIn profiles (name + company)
  • Market research — enrich company databases with key contact information
  • PR & media — find journalist and editor emails at publications

Pipeline integration

Combine with our other B2B actors for a complete lead generation pipeline:

  1. Google Maps Lead Enricher or B2B Lead Gen Suite — find businesses and basic contacts
  2. Waterfall Contact Enrichment — find specific decision-maker emails
  3. Bulk Email Verifier — verify deliverability before sending
  4. HubSpot Lead Pusher — push enriched contacts to your CRM

Cost structure

The actor itself has minimal compute cost. When enrichFromWebsite and detectPattern are enabled, it calls two sub-actors:

  • Website Contact Scraper — ~$0.001 per domain (one call per unique domain)
  • Email Pattern Finder — ~$0.001 per domain (one call per unique domain)

Sub-actor results are cached per domain, so 50 people at the same company only trigger one sub-actor call.

Deep mode adds SMTP connections which take 2-10 seconds per candidate (rate-limited to protect mail servers).

API usage

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/waterfall-contact-enrichment").call(
run_input={
"people": [
{"firstName": "Jan", "lastName": "Curn", "domain": "apify.com"},
{"firstName": "Elon", "lastName": "Musk", "domain": "tesla.com"},
],
"enrichFromWebsite": True,
"detectPattern": True,
"verificationLevel": "standard",
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['firstName']} {item['lastName']}: {item['email']} ({item['emailConfidence']}%)")

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('ryanclinton/waterfall-contact-enrichment').call({
people: [
{ firstName: 'Jan', lastName: 'Curn', domain: 'apify.com' },
{ firstName: 'Elon', lastName: 'Musk', domain: 'tesla.com' },
],
enrichFromWebsite: true,
detectPattern: true,
verificationLevel: 'standard',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
console.log(`${item.firstName} ${item.lastName}: ${item.email} (${item.emailConfidence}%)`);
});

How it works

  1. Domain validation — DNS MX lookup confirms the domain can receive email
  2. Pattern generation — creates 15+ email candidates from the person's name
  3. Website scraping — calls our Contact Scraper to find real emails, phones, and social links on the company website
  4. Pattern detection — calls our Email Pattern Finder to identify the company's email format (e.g., first.last@domain.com)
  5. Cross-referencing — matches website-found emails against the person's name patterns
  6. SMTP verification (deep mode) — connects to the mail server to verify the top candidates
  7. Confidence scoring — scores each candidate based on all signals
  8. Result ranking — returns the best email with confidence score, plus phone and social profiles

Limitations

  • Website scraping requires the company to have publicly listed contact information
  • SMTP verification (deep mode) may be blocked by some corporate mail servers
  • Catch-all domains cannot be reliably verified (flagged as "unknown" with lower confidence)
  • Social profile URLs are generated guesses unless found on the company website
  • Phone numbers can only be found via website scraping (no phone pattern generation)
  • Free-tier Apify accounts may hit memory limits when running sub-actors concurrently