Email Validation
Validate email addresses for deliverability before sending
Validate one or more email addresses to check syntax, MX records, and SMTP reachability, and to flag disposable, role-account, catch-all, and free-provider addresses before adding contacts or sending campaigns.
Authentication
Email validation requires an API key with the validate or send scope. Base URL: https://api.misar.io/mail.
Endpoints
| Method | Path | Description |
|---|---|---|
POST | /api/v1/validate | Validate one email or a batch |
GET | /api/v1/validate | Get remaining validation credit balance |
Validate emails
/mail/v1/validateValidate a single email or a batch of up to 500 addresses. Provide either email for a single address or emails for a batch — the body is one or the other, not both.
Request body
emailstringbodyA single email address to validate (single-mode body).
emailsstring[]bodyA batch of 1–500 email addresses (batch-mode body).
optionsobjectbodyOptional. { "skip_smtp": boolean } — when true, skips the live SMTP probe (faster, syntax/MX only).
Single response fields
successbooleantrue when the request succeeded.
dataobjectResult for the single email: email, is_valid (boolean), score (0–100), checks (syntax, mx, smtp), flags (disposable, role_account, catch_all, free_provider), domain, provider, mx_records, and verified_at.
creditsobjectused (credits charged) and balance_after (remaining balance).
Batch response fields
summaryobjectCounts and timing: total, valid, invalid, risky, unknown, duration_ms.
resultsArray<object>One entry per address, each with the same shape as the single-mode data.
curl -X POST https://api.misar.io/mail/v1/validate \
-H "Authorization: Bearer msk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "test@example.com" }'{
"success": true,
"data": {
"email": "test@example.com",
"is_valid": true,
"score": 92,
"checks": { "syntax": true, "mx": true, "smtp": true },
"flags": { "disposable": false, "role_account": false, "catch_all": false, "free_provider": true },
"domain": "example.com",
"provider": "google",
"mx_records": ["aspmx.l.google.com"],
"verified_at": "2026-04-01T10:00:00Z"
},
"credits": { "used": 1, "balance_after": 42 }
}curl -X POST https://api.misar.io/mail/v1/validate \
-H "Authorization: Bearer msk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"emails": [
"alice@example.com",
"bob@tempmail.net",
"noreply@company.com"
],
"options": { "skip_smtp": false }
}'{
"success": true,
"summary": {
"total": 3,
"valid": 1,
"invalid": 1,
"risky": 1,
"unknown": 0,
"duration_ms": 812
},
"results": [
{
"email": "alice@example.com",
"is_valid": true,
"score": 95,
"checks": { "syntax": true, "mx": true, "smtp": true },
"flags": { "disposable": false, "role_account": false, "catch_all": false, "free_provider": false },
"domain": "example.com",
"provider": null,
"mx_records": ["mx.example.com"],
"verified_at": "2026-04-01T10:00:00Z"
},
{
"email": "bob@tempmail.net",
"is_valid": false,
"score": 10,
"checks": { "syntax": true, "mx": true, "smtp": false },
"flags": { "disposable": true, "role_account": false, "catch_all": false, "free_provider": false },
"domain": "tempmail.net",
"provider": null,
"mx_records": ["mx.tempmail.net"],
"verified_at": "2026-04-01T10:00:00Z"
},
{
"email": "noreply@company.com",
"is_valid": false,
"score": 40,
"checks": { "syntax": true, "mx": true, "smtp": true },
"flags": { "disposable": false, "role_account": true, "catch_all": false, "free_provider": false },
"domain": "company.com",
"provider": null,
"mx_records": ["mx.company.com"],
"verified_at": "2026-04-01T10:00:00Z"
}
],
"credits": { "used": 1, "balance_after": 41 }
}Get validation credit balance
/mail/v1/validateReturn the account's current wallet credit balance — useful for checking how many validations remain before a batch run.
Response fields
successbooleantrue when the request succeeded.
creditsobject{ "balance": number } — remaining wallet credits.
curl "https://api.misar.io/mail/v1/validate" \
-H "Authorization: Bearer msk_YOUR_API_KEY"{
"success": true,
"credits": { "balance": 42 }
}Checks and flags reference
| Field | Type | Meaning |
|---|---|---|
checks.syntax | boolean | Valid RFC 5322 email format |
checks.mx | boolean | Domain has valid MX DNS records |
checks.smtp | boolean | null | SMTP server accepts the address (null when skipped/inconclusive) |
flags.disposable | boolean | Known disposable/temporary email domain |
flags.role_account | boolean | Generic role address: info@, noreply@, admin@, etc. |
flags.catch_all | boolean | null | Domain accepts all addresses (null when undetermined) |
flags.free_provider | boolean | Gmail, Yahoo, Outlook, etc. |
is_valid is the overall deliverability verdict; score (0–100) reflects confidence.
Status codes
200— Validation completed (single or batch), or balance returned.400— Validation failed (bad email/body) or invalid JSON.402— Insufficient wallet credits; theerrormessage reports therequiredamount and current balance.403— API key lacks thevalidateorsendscope.415—Content-Typeis notapplication/json.
Validation is metered against wallet credits: one credit covers a batch of up to 100 addresses (BILLING_UNITS.email_verification). When the balance is too low the request returns 402 and nothing is validated. Top up at mail.misar.io/pricing.