Migrate from Kickbox

This guide shows how to replace Kickbox with Mailbeam. Most migrations complete in under an hour.

Why developers switch

  • EU data residency: Kickbox is US-hosted; Mailbeam processes data in Frankfurt, Germany — no GDPR transfer mechanisms needed
  • Explainable scoring: Kickbox's Sendex score has no reason field; Mailbeam's reason field tells you specifically why an address received its score
  • Pricing: Mailbeam is consistently cheaper — €49/month for 50K verifications vs Kickbox's ~$150
  • Annual discount: Mailbeam offers 20% annual discount; Kickbox does not
  • Modern API: Mailbeam's API and SDK design reflect current practices; Kickbox's API dates from 2013

Endpoint mapping

KickboxMailbeamNotes
GET /v2/verify?email=&apikey=POST /v1/verifySingle verification
POST /v2/batchPOST /v1/verify/batchBulk verification
GET /v2/batch/{id}GET /v1/verify/batch/{id}Batch status

Authentication

Kickbox passes the API key as a URL query parameter. Mailbeam uses a Bearer token in the header.

Kickbox (old):

curl "https://api.kickbox.com/v2/verify?email=user@example.com&apikey=YOUR_KEY"

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

Kickbox fieldMailbeam equivalent
result: "deliverable"valid: true, score >= 70
result: "undeliverable"valid: false
result: "risky"valid: true, score 30–69
result: "unknown"status: "unknown"
sendex (0.0–1.0)score (0–100)
reason: "invalid_email"reason: "invalid_syntax"
reason: "rejected_email"reason: "smtp_rejected"
reason: "low_quality"reason field + lower score
disposable: truedisposable: true
role: truerole: true

Replacing the Sendex score

Kickbox's sendex is a 0.0–1.0 float. Mailbeam's score is an integer 0–100. The mapping is straightforward — multiply Kickbox's threshold by 100.

Kickbox (old):

const { result, sendex, reason } = await kickbox.verify(email);
if (result === "undeliverable" || sendex < 0.6) 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;
// `reason` is now machine-readable: "smtp_rejected", "disposable_domain", etc.

Taking advantage of the reason field

Kickbox provides a reason string but without machine-readable codes. Mailbeam's reason field enables programmatic handling:

const result = await mb.verify(email);

if (!result.valid) {
  const messages = {
    invalid_syntax:    "Please check your email format.",
    no_mx_records:     "That email domain does not exist.",
    smtp_rejected:     "This email address does not exist.",
    disposable_domain: "Temporary email addresses are not allowed.",
  };
  return res.status(422).json({
    error: messages[result.reason] ?? "Email address could not be verified.",
    suggestion: result.suggestion ?? null,
  });
}

Next steps