Skip to main content
POST
/
v1
/
validate
/
bulk
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]"]
  }'
{
  "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."
  }
}
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

EmailsEstimated Time
1,000~2 minutes
10,000~17 minutes
100,000~2.8 hours
500,000~14 hours

Validation Checks

  1. Syntax Check - RFC-compliant email format
  2. Disposable Domain - Blocks tempmail, guerrillamail, etc.
  3. Typo Detection - Catches gmial.com, hotmal.com
  4. Role-Based - Flags info@, support@, noreply@
  5. MX Record Lookup - Verifies domain has mail servers
  6. SMTP Mailbox Check - Verifies mailbox exists

Start Validation Job

emails
array
Array of email addresses to validate (up to 500,000). Provide this OR audience_id.
audience_id
string
Validate all subscribed contacts in an audience. Provide this OR emails.
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]"]
  }'
{
  "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

StatusDescription
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

ReasonDescription
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

Don’t poll too frequently. The validation runs at ~10 emails/second, so progress updates every few seconds are sufficient.
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 when the job starts. If a job fails, contact support for a refund.