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
reasonfield 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
| Kickbox | Mailbeam | Notes |
|---|---|---|
GET /v2/verify?email=&apikey= | POST /v1/verify | Single verification |
POST /v2/batch | POST /v1/verify/batch | Bulk 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 field | Mailbeam 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: true | disposable: true |
role: true | role: 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,
});
}