Migrate from ZeroBounce

This guide shows how to switch from ZeroBounce to Mailbeam. Most migrations take under an hour.

Why developers switch

  • EU hosting: ZeroBounce is US-based; Mailbeam processes data in Frankfurt
  • Real-time focus: ZeroBounce is built for bulk list cleaning; Mailbeam is built for signup flows
  • Pricing: Mailbeam charges per verification with no credit multipliers
  • Response schema: Mailbeam provides an explainable reason field; ZeroBounce uses opaque status strings

Endpoint mapping

ZeroBounceMailbeamNotes
POST /v1/validatePOST /v1/verifyCore validation
GET /v1/getapiusageGET /v1/account/usageQuota tracking
POST /v2/validatebatchPOST /v1/verify/batchBulk verification

Authentication

ZeroBounce uses an api_key query parameter. Mailbeam uses Bearer tokens in the header.

ZeroBounce (old):

curl "https://api.zerobounce.net/v2/validate?api_key=YOUR_KEY&email=user@example.com"

Mailbeam (new):

curl -X POST https://api.mailbeam.dev/v1/verify \
  -H "Authorization: Bearer $MAILBEAM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com"}'

Response mapping

ZeroBounce returns a status string. Mailbeam returns a valid boolean + score + reason.

ZeroBounce statusMailbeam equivalent
"Valid"valid: true, score >= 80
"Invalid"valid: false
"Catch-All"catchAll: true (check score)
"Spamtrap"valid: false, reason: "disposable_domain"
"Abuse"Included in AI score signal
"DoNotMail"roleAddress: true or disposable: true
"Unknown"valid: true with lower score

Code migration

ZeroBounce (old):

const response = await fetch(
  `https://api.zerobounce.net/v2/validate?api_key=${apiKey}&email=${email}`
);
const { status, sub_status } = await response.json();

if (status !== "Valid") {
  return res.status(422).json({ error: "Invalid email" });
}

Mailbeam (new):

import Mailbeam from "@mailbeam/sdk";
const mb = new Mailbeam({ apiKey: process.env.MAILBEAM_KEY });

const { valid, score, reason } = await mb.verify(email);

if (!valid || score < 60) {
  return res.status(422).json({
    error: "Invalid email",
    reason, // machine-readable: "disposable_domain", "no_mx_records", etc.
  });
}

Next steps