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
Ready to integrate?
Free tier includes 1,000 verifications/month. No credit card required.