Migrate from MillionVerifier

This guide shows how to replace MillionVerifier with Mailbeam. The migration typically takes under 30 minutes.

Why developers switch

  • Official SDKs: MillionVerifier has no official SDKs; Mailbeam ships Node.js, Python, PHP, Ruby, and Go libraries
  • AI catch-all scoring: MillionVerifier returns a binary catch-all flag; Mailbeam's AI model scores catch-all addresses with an explainable reason field
  • Real-time performance: MillionVerifier is designed for CSV bulk uploads; Mailbeam's p99 response time is under 100ms for inline signup validation
  • Free tier: Mailbeam includes 1,000 verifications/month free — no purchase required to start

Endpoint mapping

MillionVerifierMailbeamNotes
GET /api/v3/?api=KEY&email=EMAILPOST /v1/verifySingle email check
CSV upload (dashboard)POST /v1/verify/batchBulk verification

Authentication

MillionVerifier passes the API key as a URL query parameter. Mailbeam uses Bearer tokens in the Authorization header — the key is never exposed in the URL.

MillionVerifier (old):

curl "https://api.millionverifier.com/api/v3/?api=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

MillionVerifier resultMailbeam equivalent
"ok"valid: true
"error"valid: false
"unknown"status: "unknown", use score
"disposable"disposable: true
"catchall"catchAll: true, use score

Code migration

MillionVerifier (old):

const res = await fetch(
  `https://api.millionverifier.com/api/v3/?api=${apiKey}&email=${email}`
);
const { result } = await res.json();
if (result !== "ok") return 422;

Mailbeam (new):

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

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

if (!valid || disposable) return 422;
if (score < 30) return 422; // catch low-confidence addresses MillionVerifier passes

Using the quality score

MillionVerifier's binary result misses the nuance that Mailbeam's 0–100 score provides. For catch-all domains especially, the score makes a significant difference:

const result = await mb.verify(email);

// MillionVerifier would accept or reject uniformly
// Mailbeam lets you apply thresholds
const threshold = isColdOutreach ? 70 : 40;
if (result.score < threshold) {
  return res.status(422).json({ error: "Email address could not be verified." });
}

Next steps