Skip to main content

Overview

The Email Validation API helps you verify email addresses before sending, reducing bounces and protecting your sender reputation.
Validate emails at the point of collection (signup forms, checkout) to prevent invalid addresses from entering your database.

Validation Checks

Syntax

RFC 5322 compliant format validation

MX Records

Domain has valid mail servers

Disposable

Temporary/throwaway email detection

Role-based

Generic addresses (info@, support@)

Free Provider

Gmail, Yahoo, Outlook detection

Catch-all

Domain accepts any address

Quality Score

Each email receives a quality score from 0-100:
ScoreRatingDescription
80-100ExcellentSafe to send, high deliverability
60-79GoodLikely valid, minor risks
40-59RiskyMay bounce or be problematic
0-39PoorHigh risk, likely invalid

Single Validation

POST/v1/validate/email
Validate a single email address with comprehensive checks.

Request Body

email
string
required
Email address to validate
check_smtp
boolean
default:"false"
Perform SMTP mailbox verification (slower but more accurate)
check_catch_all
boolean
default:"false"
Check if domain is a catch-all (accepts any address)
cURL
curl -X POST https://www.unosend.co/api/v1/validate/email \
  -H "Authorization: Bearer un_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "john@example.com",
    "check_catch_all": true
  }'

Response

200 OK
{
  "email": "john@example.com",
  "valid": true,
  "score": 85,
  "reason": null,
  "checks": {
    "syntax": true,
    "mx_records": true,
    "disposable": false,
    "role_based": false,
    "free_provider": false,
    "catch_all": false,
    "smtp_valid": null
  },
  "details": {
    "local_part": "john",
    "domain": "example.com",
    "mx_hosts": ["mail.example.com", "mail2.example.com"],
    "suggestion": null
  }
}

Bulk Validation

POST/v1/validate/emailsPRO
Validate multiple email addresses in a single request (up to 1,000 emails synchronously).
For validating more than 1,000 emails, use the Async Bulk Validation endpoint which supports up to 500,000 emails.

Request Body

emails
array
required
Array of email addresses to validate (up to 1,000,000 on Pro/Scale/Enterprise plans)
check_smtp
boolean
default:"false"
Perform SMTP mailbox verification
check_catch_all
boolean
default:"false"
Check for catch-all domains
cURL
curl -X POST https://www.unosend.co/api/v1/validate/emails \
  -H "Authorization: Bearer un_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "emails": [
      "valid@company.com",
      "invalid@nonexistent.xyz",
      "temp@mailinator.com"
    ]
  }'

Response

200 OK
{
  "total": 3,
  "valid": 1,
  "invalid": 1,
  "risky": 1,
  "summary": {
    "deliverable": 1,
    "undeliverable": 1,
    "risky": 1,
    "unknown": 0
  },
  "results": [
    {
      "email": "valid@company.com",
      "valid": true,
      "score": 90,
      "reason": null,
      "checks": {
        "syntax": true,
        "mx_records": true,
        "disposable": false,
        "role_based": false,
        "free_provider": false,
        "catch_all": null,
        "smtp_valid": null
      },
      "details": {
        "local_part": "valid",
        "domain": "company.com"
      }
    },
    {
      "email": "invalid@nonexistent.xyz",
      "valid": false,
      "score": 25,
      "reason": "Domain has no mail server (MX records)",
      "checks": {
        "syntax": true,
        "mx_records": false,
        "disposable": false,
        "role_based": false,
        "free_provider": false,
        "catch_all": null,
        "smtp_valid": null
      },
      "details": {
        "local_part": "invalid",
        "domain": "nonexistent.xyz"
      }
    },
    {
      "email": "temp@mailinator.com",
      "valid": false,
      "score": 40,
      "reason": "Disposable email address",
      "checks": {
        "syntax": true,
        "mx_records": true,
        "disposable": true,
        "role_based": false,
        "free_provider": false,
        "catch_all": null,
        "smtp_valid": null
      },
      "details": {
        "local_part": "temp",
        "domain": "mailinator.com"
      }
    }
  ]
}

Async Bulk Validation

POST/v1/validate/bulkPRO
Validate large email lists asynchronously (up to 500,000 emails). Perfect for cleaning your audience lists before sending campaigns.
This endpoint starts a validation job that runs in the background. Use the job ID to check progress and retrieve results.

Pricing

PlanCreditsPrice
Free1,000$0
Pro100,000$29

Request Body

emails
array
Array of email addresses to validate (up to 500,000)
audience_id
string
Alternatively, validate all contacts in an audience
cURL
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": ["user1@example.com", "user2@test.com", ...]
  }'
Or validate an entire audience:
cURL
curl -X POST https://www.unosend.co/api/v1/validate/bulk \
  -H "Authorization: Bearer un_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "audience_id": "aud_abc123"
  }'

Response

200 OK
{
  "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 Validation Progress

GET/v1/validate/bulk/:job_id
Check the progress of an async validation job.
cURL
curl https://www.unosend.co/api/v1/validate/bulk/val_abc123xyz \
  -H "Authorization: Bearer un_your_api_key"

Response

200 OK
{
  "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 Validation Results

GET/v1/validate/bulk/:job_id/results
Retrieve the results of a completed validation job.
cURL
curl https://www.unosend.co/api/v1/validate/bulk/val_abc123xyz/results \
  -H "Authorization: Bearer un_your_api_key"

Response

200 OK
{
  "data": {
    "job_id": "val_abc123xyz",
    "valid_count": 9200,
    "invalid_count": 800,
    "invalid_emails": [
      { "email": "test@tempmail.com", "reason": "disposable" },
      { "email": "bad@gmial.com", "reason": "typo" },
      { "email": "fake@noexist.xyz", "reason": "no_mx" },
      { "email": "bounce@invalid.com", "reason": "invalid_mailbox" },
      { "email": "info@company.com", "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 Validation Job

DELETE/v1/validate/bulk/:job_id
Cancel a running validation job.
cURL
curl -X DELETE https://www.unosend.co/api/v1/validate/bulk/val_abc123xyz \
  -H "Authorization: Bearer un_your_api_key"

Response

200 OK
{
  "message": "Validation job cancelled",
  "job_id": "val_abc123xyz",
  "status": "cancelled"
}

Processing Time

Async bulk validation processes approximately 10 emails per second:
EmailsEstimated Time
1,000~2 minutes
10,000~17 minutes
100,000~2.8 hours
500,000~14 hours

Check Types Explained

Syntax Check

Validates email format according to RFC 5322:
  • Proper local@domain.tld format
  • No invalid characters
  • Length limits (64 chars local, 254 total)
  • No consecutive dots

MX Records Check

Verifies the domain has configured mail servers:
  • DNS lookup for MX records
  • Returns list of mail hosts
  • No MX = domain can’t receive email

Disposable Detection

Identifies temporary/throwaway email services:
  • 10minutemail, Mailinator, Guerrilla Mail
  • 100+ disposable domains tracked
  • High bounce risk

Role-based Detection

Flags generic/group addresses:
  • info@, support@, sales@, admin@
  • Often shared mailboxes
  • Higher complaint risk

Free Provider Detection

Identifies free email services:
  • Gmail, Yahoo, Hotmail, Outlook
  • Not necessarily bad, just informational

Catch-all Detection

Checks if domain accepts all emails:
  • Tests random address acceptance
  • Catch-all domains can’t verify individual addresses
  • Higher risk of invalid addresses

SMTP Verification

Direct mailbox existence check:
  • Connects to mail server
  • Tests if address is accepted
  • Most accurate but slower

Typo Detection

The API automatically detects common typos and suggests corrections:
{
  "email": "john@gmial.com",
  "valid": false,
  "details": {
    "domain": "gmial.com",
    "suggestion": "john@gmail.com"
  }
}
Common typos detected:
  • gmial.comgmail.com
  • hotmal.comhotmail.com
  • yaho.comyahoo.com
  • outlok.comoutlook.com

Best Practices

Check emails when users sign up or enter their address, not just before sending.
  • Signups: Full validation with catch-all detection
  • Transactional: Quick syntax + MX check
  • Marketing lists: Bulk validation with SMTP
Don’t reject users immediately. Ask them to confirm or re-enter their email.
Bulk validation counts against your API rate limits. Process large lists in batches.