Evaluate list quality
Score a list’s hygiene instantly — free, no probes, no credits.
Runs an instant, free hygiene scan over a list without any DNS or SMTP probing: duplicates, syntax errors, disposable domains, role accounts, free-provider share and typo-suspects, plus a 0–100 quality_score. Use it to decide whether a list is worth a full (credit-consuming) bulk verification.
POST /v3/validate/evaluate
Body parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
emails | array of strings | Required | 1 to 500,000 addresses (each max 320 chars). Normalised and deduplicated before scoring. |
file | multipart CSV | Optional | Alternative to the JSON body: upload a CSV (first column = email, up to 100 MB) as a file field. |
Responses
| Status | Description |
|---|---|
200 | OK. { total_count, unique_count, duplicate_count, syntax_errors, disposable, role_based, free_provider, typo_detected, quality_score, estimated_deliverable_pct, recommendation } — each issue bucket carries { count, percentage }, and recommendation is good (score ≥ 80), needs_cleaning (≥ 50) or poor. |
400 | Empty list or more than 500,000 addresses. |
401 | Missing or invalid API key. |
Code examples
cURL
curl -X POST https://api.wemail.io/v3/validate/evaluate \
-H "Authorization: Bearer afn_live_…" \
-H "Content-Type: application/json" \
-d '{ "emails": [ "a@example.com", "b@example.com" ] }'Node.js
const res = await fetch("https://api.wemail.io/v3/validate/evaluate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WEMAIL_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ "emails": [ "a@example.com", "b@example.com" ] }),
});
const data = await res.json();Python
import os, requests
r = requests.post(
"https://api.wemail.io/v3/validate/evaluate",
headers={"Authorization": f"Bearer {os.environ['WEMAIL_API_KEY']}"},
json={ "emails": [ "a@example.com", "b@example.com" ] },
)
data = r.json()