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
reasonfield; ZeroBounce uses opaque status strings
Endpoint mapping
| ZeroBounce | Mailbeam | Notes |
|---|---|---|
POST /v1/validate | POST /v1/verify | Core validation |
GET /v1/getapiusage | GET /v1/account/usage | Quota tracking |
POST /v2/validatebatch | POST /v1/verify/batch | Bulk 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 status | Mailbeam 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.
});
}