Single Email Validation
Validate individual email addresses in real-time with syntax, domain, and SMTP checks
Validate an email address in real-time before sending. MailLand runs a 5-layer validation pipeline: syntax check, typo detection, disposable domain detection, role account detection, and SMTP verification.
Authentication
Include your API key in the X-API-Key header:
X-API-Key: ml_pv_Ab3Kx9mN2pQ7rT4wL8yD...The credential must be a Validation product credential with the Api channel enabled.
Validate an Email
POST https://api.mail.land/v1/validation/email{
"email": "[email protected]",
"verify_smtp": true
}| Field | Type | Default | Description |
|---|---|---|---|
email | string | - | Email address to validate (required) |
verify_smtp | bool | true | Perform SMTP mailbox verification |
curl -X POST https://api.mail.land/v1/validation/email \
-H "X-API-Key: ml_pv_Ab3Kx9mN2pQ7rT4wL8yD..." \
-H "Content-Type: application/json" \
-d '{ "email": "[email protected]", "verify_smtp": true }'Response
{
"email": "[email protected]",
"result": "Deliverable",
"score": 95,
"syntax": {
"is_valid": true,
"suggestion": null,
"domain": "example.com",
"local_part": "user",
"has_typo": false,
"typo_type": null,
"typo_confidence": null
},
"disposable": {
"is_disposable": false
},
"role": {
"is_role_account": false
},
"mx": {
"has_mx": true,
"records": ["mx1.example.com", "mx2.example.com"],
"accepts_mail": true
},
"smtp": {
"can_connect": true,
"is_deliverable": true,
"is_catch_all": false,
"has_full_inbox": false,
"is_disabled": false,
"reachability": "safe",
"error_type": null,
"error_message": null
},
"provider": {
"name": "Unknown",
"type": "unknown"
},
"cached": false,
"verified_at": "2026-02-17T12:34:56Z"
}Result Types
| Result | Score Range | Description |
|---|---|---|
Deliverable | 80–95 | Valid address, SMTP confirmed deliverable |
Risky | 45–70 | Might be deliverable but has risk factors (catch-all, role account, full inbox) |
Unknown | 30–50 | Cannot determine (SMTP timeout, connection failure) |
Undeliverable | 0–25 | Not deliverable (disposable, no MX, disabled mailbox, invalid syntax scores 0) |
Invalid | 5 (fixed) | High-confidence domain typo (≥90% confidence), see syntax.suggestion |
Score Adjustments
The base score is adjusted by risk factors:
| Factor | Adjustment |
|---|---|
| Role account (info@, admin@, etc.) | -10 |
| Catch-all server | -5 |
Validation Pipeline
MailLand validates each email through 5 layers:
Syntax validation
Checks RFC 5322 compliance: valid format, local part (max 64 chars), domain (max 255 chars), total length (max 320 chars). Also detects common domain typos.
Disposable domain check
Checks the domain against a database of known temporary/disposable email providers. Disposable addresses are immediately marked Undeliverable.
Role account check
Detects role-based addresses like info@, admin@, support@, postmaster@. Role accounts are not marked as undeliverable but reduce the confidence score.
MX record validation
Looks up MX records for the domain. If no MX records and no A record exist, the email is marked Undeliverable.
SMTP verification
Connects to the mail server and checks if the mailbox exists. This step is skipped if verify_smtp is false.
Typo Detection
MailLand uses 3-layer typo detection for common domain mistakes:
| Layer | Method | Example |
|---|---|---|
| Exact match | Database of known typos | gmial.com → gmail.com |
| TLD correction | Top-level domain variants | gmail.co → gmail.com |
| Levenshtein distance | Fuzzy matching (max distance: 2) | gmal.com → gmail.com |
When a typo is detected, the syntax.suggestion field contains the corrected address:
{
"email": "[email protected]",
"result": "Invalid",
"score": 5,
"syntax": {
"is_valid": true,
"suggestion": "[email protected]",
"domain": "gmial.com",
"local_part": "user",
"has_typo": true,
"typo_type": "levenshtein",
"typo_confidence": 95
}
}High-confidence typos (90%+ confidence) are short-circuited early in the pipeline: no SMTP check is performed and no credit is consumed.
Provider Detection
MailLand identifies the email provider from domain names and MX records:
| Provider | Type | Detection |
|---|---|---|
| Gmail | consumer | Domain match |
| Outlook / Hotmail / Live | consumer | Domain match |
| Yahoo | consumer | Domain match |
| iCloud | consumer | Domain match |
| ProtonMail | consumer | Domain match |
| Google Workspace | business | MX records (aspmx) |
| Microsoft 365 | business | MX records (outlook.com) |
| Zoho | business | MX records |
| Mimecast | business | MX records |
| Proofpoint | business | MX records |
SMTP Check Details
The smtp object contains detailed SMTP verification results:
| Field | Type | Description |
|---|---|---|
can_connect | bool | Successfully connected to the SMTP server |
is_deliverable | bool | Mailbox appears to exist |
is_catch_all | bool | Server accepts all addresses (reduces confidence) |
has_full_inbox | bool | Mailbox is full (result: Risky) |
is_disabled | bool | Mailbox is disabled (result: Undeliverable) |
reachability | string | Verdict: safe, risky, invalid, or unknown |
error_type | string | Error type if SMTP check failed |
error_message | string | Detailed error message |
SMTP Error Types
| Error Type | Description |
|---|---|
Timeout | SMTP connection timed out |
ConnectionFailed | Could not connect to server |
Blacklisted | Verification IP is blocked by the server |
Socks5 | Proxy error |
AsyncSmtpError | SMTP protocol error |
Cancelled | Request was cancelled |
UnexpectedError | Unexpected error |
Credits
Each validation consumes one credit from your monthly quota. Certain validations are free (no credit consumed):
| Condition | Free |
|---|---|
| Disposable email domains | Yes |
| High-confidence domain typos (90%+) | Yes |
| SMTP errors (timeout, connection failure, blacklisted) | Yes |
| SMTP cannot connect with unknown result | Yes |
| Cached results | No (credit was consumed on first check) |
Check your credit balance:
GET https://api.mail.land/v1/validation/credits{
"monthly_quota": 1000,
"used": 450,
"remaining": 550,
"resets_at": "2026-03-01T00:00:00Z"
}Credits reset automatically on the first day of each month (UTC).
Caching
Validation results are cached in Redis to avoid redundant checks:
| Result Type | Cache TTL |
|---|---|
| Deliverable | 48 hours |
| Risky | 24 hours |
| Undeliverable | 24 hours |
| Unknown | 6 hours |
Cached responses have cached: true in the response. The original credit was consumed when the result was first computed.
Error Responses
| Status | Code | Description |
|---|---|---|
400 | INVALID_REQUEST | Missing or invalid request body |
400 | INVALID_EMAIL_FORMAT | Email address is required |
402 | INSUFFICIENT_CREDITS | Monthly validation quota exceeded |
Next Steps
- Batch Validation: validate lists of emails in bulk
- Suppressions: manage suppression lists
- REST API: send email to validated addresses