Migrate from NeverBounce

This guide shows how to replace NeverBounce with Mailbeam. Most migrations take under an hour.

Why developers switch

  • EU hosting: NeverBounce is US-based (ZoomInfo-owned); Mailbeam processes data in Frankfurt, Germany — no GDPR cross-border transfer issues
  • No expiring credits: NeverBounce credits expire after 6 months; Mailbeam uses a monthly subscription with no expiry
  • Self-serve free tier: Mailbeam provides 1,000 verifications/month without a credit card; NeverBounce requires credit purchase to start
  • AI catch-all scoring: NeverBounce returns a binary flag; Mailbeam's AI model scores catch-all addresses 0–100 with an explainable reason field

Endpoint mapping

NeverBounceMailbeamNotes
POST /v4/single/checkPOST /v1/verifySingle email verification
POST /v4/jobs/createPOST /v1/verify/batchBulk list verification
GET /v4/account/infoGET /v1/account/usageQuota / usage info

Authentication

NeverBounce uses HTTP Basic auth with the API key as username and no password. Mailbeam uses Bearer tokens in the Authorization header.

NeverBounce (old):

curl -X POST https://api.neverbounce.com/v4/single/check \
  -H "Authorization: Basic $(echo -n 'YOUR_KEY:' | base64)" \
  -d '{"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

NeverBounce resultMailbeam equivalent
"valid"valid: true, score >= 70
"invalid"valid: false
"catchall"catchAll: true — use score to decide
"disposable"disposable: true
"unknown"status: "unknown", lower score

Code migration

NeverBounce (old):

const res = await fetch("https://api.neverbounce.com/v4/single/check", {
  method: "POST",
  headers: { Authorization: `Basic ${btoa(apiKey + ":")}` },
  body: JSON.stringify({ email }),
});
const { result } = await res.json();
if (result !== "valid") return 422;

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 422;

Handling catch-all addresses

NeverBounce returns result: "catchall" with no further signal. Mailbeam returns catchAll: true alongside a 0–100 score and reason.

const result = await mb.verify(email);

if (result.catchAll) {
  // NeverBounce would reject all catch-all — Mailbeam lets you be selective
  if (result.score >= 70) return 200; // high-confidence corporate address
  if (result.score >= 40) return 200; // accept but flag for review
  return 422; // low-confidence, reject
}

Next steps