Email Verification Guide

Learn how to verify email addresses efficiently and cost-effectively.

Email verification helps you maintain list hygiene and improve deliverability. Enrich Engine offers a hybrid verification system that balances speed, accuracy, and cost.

Understanding Verification Methods

SMTP Verification (Free)

Direct communication with email servers to check if an address exists.

Pros:
  • Completely free
  • Fast (1000+ emails in minutes)
  • No external dependencies
Cons:
  • ~85% accuracy
  • Can't verify catch-all domains
  • Some servers block checks

API Verification (MillionVerifier)

Third-party service with advanced verification techniques.

Pros:
  • ~99% accuracy
  • Handles catch-all domains
  • Bypasses server blocks
Cons:
  • $0.0005 per email
  • Slower processing
  • External API dependency

Recommended Workflow

For most use cases, we recommend the SMTP + API Fallback method:

1

Start SMTP Verification

Create a verification job with smtp_api_fallback method. This runs free SMTP checks on all emails.

2

Review Results

When SMTP completes, check your coverage percentage. Typically you'll see 60-85% definitive results (valid or invalid), with the rest as catch-all or unknown.

3

Decide on Gaps

Choose whether to accept current results (free) or fill gaps using the paid API. The cost estimate endpoint shows exactly what each option will cost.

4

Export Clean List

Download your list with verification status for each email. Filter by valid emails only for outreach campaigns.

Cost Optimization Tips

  • Start with SMTP - Always run free SMTP first to identify obvious invalids
  • Fill unknowns only - Usually the best value; catch-alls often work fine
  • Batch your lists - Verify in batches to control costs
  • Check coverage first - If SMTP gives 80%+ coverage, you may not need API

Understanding Results

StatusMeaningRecommendation
ValidMailbox exists and accepts mailSafe to email
InvalidMailbox doesn't exist or domain invalidRemove from list
Catch-AllDomain accepts all emailsLikely valid, but verify with API if important
UnknownVerification failed (timeout, blocked)Verify with API for certainty

Example Integration

// 1. Create verification job
const job = await fetch('/api/verification/jobs', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  credentials: 'include',
  body: JSON.stringify({
    listId: 'list_abc123',
    verificationMethod: 'smtp_api_fallback'
  })
}).then(r => r.json());

// 2. Poll for progress
const pollProgress = async () => {
  const progress = await fetch(`/api/verification/jobs/${job.id}/progress`, {
    credentials: 'include'
  }).then(r => r.json());

  if (progress.job.verificationStage === 'awaiting_decision') {
    // SMTP complete, show decision UI
    return progress;
  }

  // Still processing, poll again
  setTimeout(pollProgress, 2000);
};

// 3. Get cost estimate
const estimate = await fetch(`/api/verification/jobs/${job.id}/estimate`, {
  credentials: 'include'
}).then(r => r.json());

console.log(`Fill all gaps: $${estimate.fillAllGapsCost}`);

// 4. Submit decision
await fetch(`/api/verification/jobs/${job.id}/decision`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  credentials: 'include',
  body: JSON.stringify({
    decision: 'fill_unknowns_only'
  })
});

Next Steps