Bulk Email Verification API
Submit up to 500,000 addresses in a single API call. Get back per-address scores, status classifications and delivery flags — without a connection timeout.
What Mailbeam checks
Every verification runs 7 checks in parallel and returns a structured result in under 100ms.
500K addresses per batch job
A single POST to /v1/verify/batch accepts up to 500,000 email addresses. Jobs are queued and processed asynchronously — no HTTP timeout, no partial results.
Signed webhook on completion
Register an endpoint once in the dashboard. When a job finishes, Mailbeam POSTs a batch.completed event carrying the totals and a download URL, signed with HMAC-SHA256 so you can verify it came from us.
Per-address scoring
Every address in the batch receives the same treatment as the single verify endpoint: syntax, MX, SMTP, disposable, role, catch-all detection and the quality score.
Deliverable / Risky / Undeliverable segmentation
Results include a status field for each address. Filter the JSON output by status to create send-ready, review, and suppression segments.
Progress polling
Poll /v1/jobs/{jobId} at any time for the number of addresses processed so far. Or just wait for the webhook — whichever fits your workflow.
One connection per destination domain
Addresses are grouped by domain and each domain is probed one at a time, while different domains run in parallel. It is slower than hammering a mail server, and it is what keeps our IPs — and therefore your results — off blocklists.
How it works
POST the email array
Send a JSON body with an `emails` array — up to 500,000 strings — to /v1/verify/batch. The response returns a `job_id` immediately, with a 202.
Async processing begins
Mailbeam processes each address independently: syntax check, DNS/MX lookup, SMTP probe, disposable database check, role detection, and catch-all scoring.
Webhook fires (or poll)
When every address has been processed, your endpoint receives a signed `batch.completed` event. Alternatively, poll /v1/jobs/{jobId} for progress.
Retrieve and segment results
Download /v1/jobs/{jobId}/results as CSV, or add ?format=json for rows carrying `index`, `email`, `status`, `score` and `reason`. Filter by status to build your segments. Results are kept for 72 hours, then deleted.
Integrate in minutes
const auth = { Authorization: `Bearer ${process.env.MAILBEAM_KEY}` };
// Submit a batch job — returns 202 immediately
const job = await fetch("https://api.mailbeam.dev/v1/verify/batch", {
method: "POST",
headers: { ...auth, "Content-Type": "application/json" },
body: JSON.stringify({
emails: ["alice@example.com", "bob@company.io" /* up to 500,000 */],
}),
}).then((r) => r.json());
console.log(`Job ${job.job_id} queued — ${job.total} addresses`);
// Wait for the batch.completed webhook, or poll:
const status = await fetch(
`https://api.mailbeam.dev/v1/jobs/${job.job_id}`,
{ headers: auth }
).then((r) => r.json());
// Then download the cleaned list (CSV by default)
const csv = await fetch(status.download_url, { headers: auth }).then((r) =>
r.text()
);When to use it
Pre-campaign list cleaning
Run every email list through the batch API before sending a campaign. Suppress Undeliverable addresses to keep bounce rates below the 2% ISP threshold.
CRM import validation
Verify contacts before importing them from trade show exports, spreadsheets, or third-party lead sources. Clean data enters your CRM; invalid data never does.
Quarterly database re-verification
B2B email addresses decay at ~25% annually. Schedule a quarterly batch job against your full user or contact database to identify addresses that have lapsed.
Re-engagement campaign prep
Inactive segments have the highest decay rate. Verify before any win-back send to suppress invalid addresses and avoid the bounce-triggered deliverability damage.
Frequently asked questions
How long does a batch job take?
It depends heavily on how many distinct domains your list contains, because we probe one address at a time per destination domain to protect our sending reputation. A list spread across many domains finishes far faster than the same number of addresses at a handful of hosts. Poll the job for real progress rather than working from an estimate.
What is the maximum batch size?
The batch endpoint accepts up to 500,000 addresses per job. For larger lists, submit multiple jobs. Every address counts as one verification against your monthly quota.
Can I import a CSV file directly?
Yes — the dashboard takes a CSV, TSV or plain text file, finds the column holding the addresses, removes duplicates and gives you the cleaned list back. The API itself accepts a JSON array of strings.
How should I handle 'Risky' results?
Risky includes role-based addresses, catch-all domains, and free-provider addresses. For cold outreach: suppress role-based. For marketing: include free providers (Gmail, Yahoo). For catch-all, use the quality score threshold — score ≥ 60 is generally safe.
Ready to integrate?
Free tier includes 1,000 verifications/month. No credit card required.