Skip to main content
POST
/
v1
/
validate
/
emails
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": [
      "[email protected]",
      "[email protected]",
      "[email protected]",
      "[email protected]"
    ]
  }'
{
  "total": 4,
  "valid": 2,
  "invalid": 2,
  "risky": 2,
  "summary": {
    "deliverable": 2,
    "undeliverable": 2,
    "risky": 2,
    "unknown": 0
  },
  "results": [
    {
      "email": "[email protected]",
      "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": "[email protected]",
      "valid": true,
      "score": 75,
      "reason": "Role-based email address",
      "checks": {
        "syntax": true,
        "mx_records": true,
        "disposable": false,
        "role_based": true,
        "free_provider": false,
        "catch_all": null,
        "smtp_valid": null
      },
      "details": {
        "local_part": "info",
        "domain": "business.com"
      }
    },
    {
      "email": "[email protected]",
      "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"
      }
    },
    {
      "email": "[email protected]",
      "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"
      }
    }
  ]
}
Pro Feature: Bulk email validation is available on Pro, Scale, and Enterprise plans only. Free plan users should use the single email validation endpoint.

Request Body

emails
array
required
Array of email addresses to validate. Maximum 1,000,000 emails per request on Pro/Scale/Enterprise plans. Duplicates are automatically removed.
check_smtp
boolean
default:"false"
Perform SMTP mailbox verification for each email. Significantly slower but more accurate.
check_catch_all
boolean
default:"false"
Check if domains are catch-all (accept any address).

Response

total
number
Total number of emails validated
valid
number
Count of valid emails
invalid
number
Count of invalid emails
risky
number
Count of risky emails (disposable, role-based, catch-all)
summary
object
results
array
Array of validation results for each email (same format as single validation)
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": [
      "[email protected]",
      "[email protected]",
      "[email protected]",
      "[email protected]"
    ]
  }'
{
  "total": 4,
  "valid": 2,
  "invalid": 2,
  "risky": 2,
  "summary": {
    "deliverable": 2,
    "undeliverable": 2,
    "risky": 2,
    "unknown": 0
  },
  "results": [
    {
      "email": "[email protected]",
      "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": "[email protected]",
      "valid": true,
      "score": 75,
      "reason": "Role-based email address",
      "checks": {
        "syntax": true,
        "mx_records": true,
        "disposable": false,
        "role_based": true,
        "free_provider": false,
        "catch_all": null,
        "smtp_valid": null
      },
      "details": {
        "local_part": "info",
        "domain": "business.com"
      }
    },
    {
      "email": "[email protected]",
      "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"
      }
    },
    {
      "email": "[email protected]",
      "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"
      }
    }
  ]
}

Processing Large Lists

For lists larger than 1000 emails, split them into batches:
async function validateLargeList(emails, apiKey) {
  const batchSize = 1000;
  const results = [];
  
  for (let i = 0; i < emails.length; i += batchSize) {
    const batch = emails.slice(i, i + batchSize);
    const response = await fetch('https://www.unosend.co/api/v1/validate/emails', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ emails: batch })
    });
    const data = await response.json();
    results.push(...data.results);
  }
  
  return results;
}
Bulk validation processes emails in parallel (10 concurrent). SMTP checks will significantly increase processing time.