Verification API
Verify email addresses using SMTP checks and optional API fallback.
The Verification API allows you to validate email addresses in your lead lists. Choose between fast free SMTP verification or hybrid verification with paid API fallback for higher accuracy.
Verification Methods
| Method | Description | Cost |
|---|---|---|
| smtp_only | Direct SMTP verification (~85% accuracy) | Free |
| smtp_api_fallback | SMTP first, then choose to fill gaps with API | Free + Optional |
| api_only | MillionVerifier API for all emails (~99% accuracy) | $0.0005/email |
POST
/api/verification/jobsSessionCreate a new email verification job
Parameters
listIdstringrequiredID of the list containing leads to verifyverificationMethodstringrequiredOne of: smtp_only, smtp_api_fallback, api_onlyRequest
{
"listId": "list_abc123",
"verificationMethod": "smtp_api_fallback"
}Response
{
"id": "job_xyz789",
"listId": "list_abc123",
"listName": "Q1 Prospects",
"verificationStage": "smtp_verifying",
"verificationMethod": "smtp_api_fallback",
"totalEmails": 150,
"processedEmails": 0,
"smtpValidCount": 0,
"smtpInvalidCount": 0,
"smtpCatchAllCount": 0,
"smtpUnknownCount": 0,
"coveragePercentage": 0,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}GET
/api/verification/jobs/:jobIdSessionGet verification job details
Parameters
jobIdstringrequiredThe verification job ID (URL parameter)Response
{
"id": "job_xyz789",
"listId": "list_abc123",
"listName": "Q1 Prospects",
"verificationStage": "awaiting_decision",
"verificationMethod": "smtp_api_fallback",
"totalEmails": 150,
"processedEmails": 150,
"smtpValidCount": 98,
"smtpInvalidCount": 12,
"smtpCatchAllCount": 25,
"smtpUnknownCount": 15,
"smtpCompletedAt": "2024-01-15T10:35:00Z",
"coveragePercentage": 73.3,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:35:00Z"
}GET
/api/verification/jobs/:jobId/progressSessionGet detailed verification progress with domain statistics
Parameters
jobIdstringrequiredThe verification job ID (URL parameter)Response
{
"job": {
"id": "job_xyz789",
"verificationStage": "smtp_verifying",
"processedEmails": 75,
"totalEmails": 150,
"coveragePercentage": 50.0
},
"domainStats": [
{
"domain": "acme.com",
"totalEmails": 12,
"validCount": 8,
"invalidCount": 2,
"catchAllCount": 2,
"unknownCount": 0,
"isCatchAll": null
}
]
}GET
/api/verification/jobs/:jobId/estimateSessionGet cost estimate for filling verification gaps with API
Parameters
jobIdstringrequiredThe verification job ID (URL parameter)Response
{
"jobId": "job_xyz789",
"unknownCount": 15,
"catchAllCount": 25,
"totalGapCount": 40,
"costPerEmail": 0.0005,
"fillUnknownsCost": 0.01,
"fillCatchAllCost": 0.01,
"fillAllGapsCost": 0.02,
"currentCoveragePercentage": 73.3,
"projectedCoveragePercentage": 100.0
}POST
/api/verification/jobs/:jobId/decisionSessionSubmit user decision for handling verification gaps
Parameters
jobIdstringrequiredThe verification job ID (URL parameter)decisionstringrequiredOne of: accept_current, fill_unknowns_only, fill_catchall_only, fill_all_gapsRequest
{
"decision": "fill_unknowns_only"
}Response
{
"id": "job_xyz789",
"verificationStage": "api_verifying",
"userDecision": "fill_unknowns_only",
"decisionMadeAt": "2024-01-15T10:40:00Z"
}Verification Stages
| Stage | Description |
|---|---|
| pending | Job created, waiting to start |
| smtp_verifying | SMTP verification in progress |
| awaiting_decision | SMTP complete, waiting for user decision on gaps |
| api_verifying | API verification in progress for gaps |
| completed | All verification complete |
User Decision Options
| Decision | Description |
|---|---|
| accept_current | Keep SMTP results as-is (free) |
| fill_unknowns_only | Use API for emails SMTP couldn't verify |
| fill_catchall_only | Use API for catch-all domain emails |
| fill_all_gaps | Use API for all unknowns and catch-alls |
Verification Result Types
- Valid - Email is deliverable and exists
- Invalid - Email will bounce (mailbox doesn't exist)
- Catch-All - Domain accepts all emails (can't confirm mailbox)
- Unknown - Verification couldn't be completed (timeout, blocked, etc.)