Migrate from Clearout
This guide shows how to replace Clearout's verification calls with Mailbeam. The integration shape does not change: you still send an address and branch on what comes back, so the call site usually stays exactly where it is.
Why developers switch
- EU data residency: Clearout processes outside the EU, which leaves an international-transfer question to answer; Mailbeam processes in Frankfurt with a DPA on every plan
- Built for forms: Clearout's real-time latency is region-dependent and often around 300ms, which is slow for inline signup validation
- Graded catch-all: Clearout flags accept-all domains without a confidence score; Mailbeam returns a 0–100 score plus a
reasonyou can threshold on - Sandbox mode: Clearout has none, so CI has to call the paid production API; Mailbeam ships a deterministic test mode
- Focus: verification is one product line at Clearout alongside an email finder and phone validation
Two things genuinely favour Clearout, and they are worth checking before you move: its pay-as-you-go credits do not expire, which suits spiky or infrequent usage better than a monthly subscription, and it offers email finding and phone validation that Mailbeam does not.
Endpoint mapping
| Clearout | Mailbeam | Notes |
|---|---|---|
POST /v2/email_verify/instant | POST /v1/verify | Single verification |
| Bulk upload via dashboard | POST /v1/verify/batch | Up to 500,000 addresses per job |
Authentication
Clearout sends the token as Bearer:<token> — with a colon and no space.
Mailbeam uses the standard Bearer <token> form, so this is one of the few
places where a copy-paste will fail silently if you are not looking for it.
Clearout (old):
curl -X POST https://api.clearout.io/v2/email_verify/instant \
-H "Authorization: Bearer:$CLEAROUT_TOKEN" \
-H "Content-Type: application/json" \
-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
Clearout nests its result under a data object. Mailbeam returns the result
directly, with no envelope.
| Clearout field | Mailbeam equivalent |
|---|---|
data.status: "valid" | valid: true |
data.status: "invalid" | valid: false |
data.status: "catch_all" | catchAll: true plus a graded score |
data.status: "unknown" | status: "unknown" |
data.sub_status | reason (machine-readable code) |
data.disposable | disposable |
data.role | role |
Migrating the call
Clearout (old):
const res = await fetch("https://api.clearout.io/v2/email_verify/instant", {
method: "POST",
headers: { Authorization: `Bearer:${apiToken}`, "Content-Type": "application/json" },
body: JSON.stringify({ email }),
});
const { data } = await res.json();
if (data.status !== "valid") return 422;Mailbeam (new):
// No SDK to install — see /docs/quickstart for this 12-line wrapper.
import { verifyEmail } from "./lib/mailbeam.js";
const { valid, score, reason } = await verifyEmail(email);
if (!valid || score < 60) return 422;What to check first: catch-all domains
This is where the two products disagree most, and it is the value worth
comparing before you cut over. Clearout returns catch_all as a status and
leaves the interpretation to you, so most integrations end up treating it as a
rejection. Mailbeam reports the accept-all behaviour and a confidence score,
which lets you accept high-quality corporate catch-alls instead of discarding
them:
const { valid, catchAll, score, reason } = await verifyEmail(email);
if (catchAll) {
// A large share of B2B traffic sits behind accept-all domains.
// Threshold instead of rejecting outright.
if (score >= 70) return accept();
return challenge({ reason });
}Run both providers side by side over a sample of real signups before switching this branch — it is the one place where the migration changes behaviour rather than just field names.