Skip to content

Batch Validation

Batch validation lets you validate multiple emails in a single request, reducing overhead and improving throughput for list cleaning and bulk operations.

POST /validate/batch
HeaderRequiredDescription
X-API-KeyYesYour API key
Content-TypeYesapplication/json
{
"emails": [
"user1@example.com",
"user2@company.org",
"test@mailinator.com"
],
"options": {
"quickMode": false
}
}
FieldTypeRequiredDescription
emailsstring[]YesArray of email addresses (1-100)
options.quickModebooleanNoSkip expensive checks for faster results

{
"total": 3,
"valid": 2,
"invalid": 1,
"warning": 0,
"results": [
{
"email": "user1@example.com",
"severity": "valid",
"isValid": true,
"score": 95,
"checks": { ... },
"recommendations": []
},
{
"email": "user2@company.org",
"severity": "valid",
"isValid": true,
"score": 88,
"checks": { ... },
"recommendations": []
},
{
"email": "test@mailinator.com",
"severity": "invalid",
"isValid": false,
"score": 25,
"checks": { ... },
"recommendations": ["Disposable email detected"]
}
],
"processingTime": 342,
"timestamp": "2024-01-15T10:30:00.000Z"
}
FieldTypeDescription
totalnumberTotal emails processed
validnumberCount of valid emails (score >= 70)
invalidnumberCount of invalid emails (score < 40)
warningnumberCount of warning emails (score 40-69)
resultsarrayIndividual validation results
processingTimenumberTotal processing time in milliseconds
timestampstringISO 8601 timestamp

Each item in results follows the standard Response Schema.


Terminal window
curl -X POST https://api.spamidate.com/validate/batch \
-H "X-API-Key: spm_live_..." \
-H "Content-Type: application/json" \
-d '{
"emails": [
"user1@example.com",
"user2@company.org",
"test@mailinator.com"
]
}'

Each email in a batch counts toward your monthly quota:

Batch SizeQuota UsedRate Limit Impact
1 email11 request
50 emails501 request
100 emails1001 request

For lists larger than 100 emails, process in batches:

async function validateLargeList(emails: string[]) {
const results = [];
const batchSize = 100;
for (let i = 0; i < emails.length; i += batchSize) {
const batch = emails.slice(i, i + batchSize);
const response = await client.validateBatch(batch);
results.push(...response.results);
// Optional: Progress logging
console.log(`Processed ${Math.min(i + batchSize, emails.length)}/${emails.length}`);
}
return {
total: results.length,
valid: results.filter(r => r.isValid).length,
invalid: results.filter(r => !r.isValid).length,
results,
};
}
async function validateWithRateLimit(emails: string[], client: Spamidate) {
const results = [];
const batchSize = 100;
for (let i = 0; i < emails.length; i += batchSize) {
const batch = emails.slice(i, i + batchSize);
try {
const response = await client.validateBatch(batch);
results.push(...response.results);
} catch (error) {
if (error instanceof RateLimitError) {
// Wait and retry
await new Promise(r => setTimeout(r, error.retryAfter * 1000));
i -= batchSize; // Retry this batch
continue;
}
throw error;
}
}
return results;
}

Remove duplicates before batch validation to save quota:

function deduplicateEmails(emails: string[]): string[] {
const seen = new Set<string>();
return emails.filter(email => {
const normalized = email.toLowerCase().trim();
if (seen.has(normalized)) return false;
seen.add(normalized);
return true;
});
}
// Usage
const unique = deduplicateEmails(rawEmails);
const results = await client.validateBatch(unique);

const validEmails = results.results
.filter(r => r.severity === 'valid')
.map(r => r.email);
const grouped = {
valid: results.results.filter(r => r.severity === 'valid'),
warning: results.results.filter(r => r.severity === 'warning'),
invalid: results.results.filter(r => r.severity === 'invalid'),
};
// Get non-disposable emails
const realEmails = results.results.filter(
r => r.checks.disposable?.passed !== false
);
// Get corporate emails only
const corporateEmails = results.results.filter(
r => r.checks.corporateEmail?.metadata?.isCorporate === true
);

ErrorDescription
BATCH_TOO_LARGEMore than 100 emails submitted
BATCH_EMPTYEmpty emails array
{
"error": {
"code": "BATCH_TOO_LARGE",
"message": "Batch size exceeds maximum of 100 emails",
"details": {
"submitted": 150,
"maximum": 100
}
}
}

If individual emails fail validation, they’re included in results with error status:

{
"email": "invalid-format",
"severity": "invalid",
"isValid": false,
"score": 0,
"checks": {
"syntax": {
"passed": false,
"status": "fail",
"reason": "Invalid email format"
}
}
}

  1. Use Quick Mode for Speed

    await client.validateBatch(emails, { quickMode: true });
  2. Deduplicate First - Don’t pay for the same email twice

  3. Process in Parallel (with rate limit awareness)

    // Process multiple batches concurrently (if your tier allows)
    const batches = chunk(emails, 100);
    const results = await Promise.all(
    batches.map(batch => client.validateBatch(batch))
    );
  4. Cache Results - Validation results are stable for 24+ hours