Email list (batch)

Check up to 100 email addresses in one request. Same result per address as the single email check.

POST /v1/email/batch · 1 credit per address (+5 each with verify_mailbox)

Use it to clean an existing list or to check a CSV import. Each address gets exactly the same result as /v1/email/check, in the order you sent them.

Request

Field Type Required Description
emails array of strings yes 1 to 100 addresses.
verify_mailbox boolean no Verify each mailbox over SMTP. Default false.
curl https://veqen-app.com/v1/email/batch \
  -H "Authorization: Bearer $VEQEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"emails": ["ana@gmail.com", "bot@mailinator.com", "sales@acme.com"]}'
import requests


def clean(addresses, key):
    keep = []
    for start in range(0, len(addresses), 100):
        chunk = addresses[start : start + 100]
        r = requests.post(
            "https://veqen-app.com/v1/email/batch",
            headers={"Authorization": f"Bearer {key}"},
            json={"emails": chunk},
            timeout=60,
        )
        r.raise_for_status()
        for item in r.json()["results"]:
            if item["risk"]["verdict"] != "refuse":
                keep.append(item.get("normalized") or item["email"])
    return keep
const res = await fetch("https://veqen-app.com/v1/email/batch", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.VEQEN_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ emails: ["ana@gmail.com", "bot@mailinator.com"] }),
});
const { results } = await res.json();
const keep = results.filter((r) => r.risk.verdict !== "refuse");

Response

{
  "count": 3,
  "results": [
    { "email": "ana@gmail.com", "disposable": false, "risk": { "score": 0, "verdict": "admit", "...": "..." } },
    { "email": "bot@mailinator.com", "disposable": true, "risk": { "score": 90, "verdict": "refuse", "...": "..." } },
    { "email": "sales@acme.com", "role_account": true, "risk": { "score": 15, "verdict": "admit", "...": "..." } }
  ]
}

Your balance must cover the whole batch before it runs (the number of addresses × the cost per address). Otherwise you get insufficient_credits and nothing is charged.