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.
- Completely free
- Fast (1000+ emails in minutes)
- No external dependencies
- ~85% accuracy
- Can't verify catch-all domains
- Some servers block checks
API Verification (MillionVerifier)
Third-party service with advanced verification techniques.
- ~99% accuracy
- Handles catch-all domains
- Bypasses server blocks
- $0.0005 per email
- Slower processing
- External API dependency
Recommended Workflow
For most use cases, we recommend the SMTP + API Fallback method:
Start SMTP Verification
Create a verification job with smtp_api_fallback method. This runs free SMTP checks on all emails.
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.
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.
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
| Status | Meaning | Recommendation |
|---|---|---|
| Valid | Mailbox exists and accepts mail | Safe to email |
| Invalid | Mailbox doesn't exist or domain invalid | Remove from list |
| Catch-All | Domain accepts all emails | Likely valid, but verify with API if important |
| Unknown | Verification 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
- API Reference - Full endpoint documentation
- Bulk Enrichment - Enrich emails before verification