Pro Feature : Async bulk validation uses validation credits. Free plan includes 1,000 credits. Pro plan includes 100,000 credits for $29.
Overview
For large email lists (1,000+ emails), use the async bulk validation API. This starts a background job that validates emails using SMTP verification and returns results when complete.
Processing Speed
Emails Estimated Time 1,000 ~2 minutes 10,000 ~17 minutes 100,000 ~2.8 hours 500,000 ~14 hours
Validation Checks
Syntax Check - RFC-compliant email format
Disposable Domain - Blocks tempmail, guerrillamail, etc.
Typo Detection - Catches gmial.com, hotmal.com
Role-Based - Flags info@, support@, noreply@
MX Record Lookup - Verifies domain has mail servers
SMTP Mailbox Check - Verifies mailbox exists
Start Validation Job
Array of email addresses to validate (up to 500,000). Provide this OR audience_id.
Validate all subscribed contacts in an audience. Provide this OR emails.
cURL
Validate Audience
Node.js
Python
curl -X POST https://www.unosend.co/api/v1/validate/bulk \
-H "Authorization: Bearer un_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"emails": ["[email protected] ", "[email protected] "]
}'
200 OK
402 Insufficient Credits
{
"data" : {
"job_id" : "val_abc123xyz" ,
"status" : "pending" ,
"total" : 10000 ,
"credits_used" : 10000 ,
"credits_remaining" : 90000 ,
"estimated_time_minutes" : 17 ,
"message" : "Validation job started for 10,000 emails."
}
}
Check Progress
GET /v1/validate/bulk/:job_id
Poll this endpoint to check job progress.
curl https://www.unosend.co/api/v1/validate/bulk/val_abc123xyz \
-H "Authorization: Bearer un_your_api_key"
{
"data" : {
"job_id" : "val_abc123xyz" ,
"status" : "processing" ,
"total_emails" : 10000 ,
"valid_count" : 4500 ,
"invalid_count" : 500 ,
"progress_percent" : 50
}
}
Status Values
Status Description pendingJob is queued, waiting to start processingValidation in progress completedAll emails validated failedJob failed (check error message) cancelledJob was cancelled
Get Results
GET /v1/validate/bulk/:job_id/results
Retrieve results once job status is completed.
curl https://www.unosend.co/api/v1/validate/bulk/val_abc123xyz/results \
-H "Authorization: Bearer un_your_api_key"
{
"data" : {
"job_id" : "val_abc123xyz" ,
"valid_count" : 9200 ,
"invalid_count" : 800 ,
"invalid_emails" : [
{ "email" : "[email protected] " , "reason" : "disposable" },
{ "email" : "[email protected] " , "reason" : "typo" },
{ "email" : "[email protected] " , "reason" : "no_mx" },
{ "email" : "[email protected] " , "reason" : "invalid_mailbox" },
{ "email" : "[email protected] " , "reason" : "role_based" }
]
}
}
Reason Codes
Reason Description syntaxInvalid email format disposableTemporary/throwaway email domain typoCommon domain typo detected no_mxDomain has no mail servers invalid_mailboxMailbox doesn’t exist (SMTP check failed) role_basedGeneric address (info@, support@, etc.)
Cancel Job
DELETE /v1/validate/bulk/:job_id
Cancel a running validation job.
curl -X DELETE https://www.unosend.co/api/v1/validate/bulk/val_abc123xyz \
-H "Authorization: Bearer un_your_api_key"
{
"message" : "Validation job cancelled" ,
"job_id" : "val_abc123xyz" ,
"status" : "cancelled"
}
Best Practices
Poll progress every 2-5 seconds
Don’t poll too frequently. The validation runs at ~10 emails/second, so progress updates every few seconds are sufficient.
Validate before campaigns
Run bulk validation on your audience list before sending a broadcast to reduce bounces.
Use the results to unsubscribe or remove invalid emails from your audience to protect sender reputation.
Credits are deducted upfront
Credits are deducted when the job starts. If a job fails, contact support for a refund.