Migrate from Snov.io
Snov.io is an all-in-one sales platform — email finding, verification, drip campaigns, and a CRM. This guide covers moving just the verification step to Mailbeam, which is usually the part developers want as a fast, dedicated API. You can keep using Snov.io for prospecting and outreach if you rely on those.
Why developers switch the verification step
- Synchronous and fast: Snov.io verification runs through an async queue; Mailbeam returns a verdict in a single call, under 100ms (p95)
- Dedicated pricing: Snov.io credits are shared with email finding; Mailbeam charges one unit per verification with a 1,000/month free tier
- AI catch-all scoring: Mailbeam returns a 0–100 score plus an explainable
reasonfor catch-all domains - Developer experience: official SDKs for 6 languages, Bearer-key auth, OpenAPI spec, and a sandbox mode
- EU data residency: all data processed in Frankfurt, with a DPA included on every plan
Authentication
Snov.io uses an OAuth client-credentials flow to obtain an access token, which you then pass to each request. Mailbeam uses a single Bearer API key.
Snov.io (old):
// 1. Exchange client credentials for an access token
const tokenRes = await fetch("https://api.snov.io/v1/oauth/access_token", {
method: "POST",
body: new URLSearchParams({
grant_type: "client_credentials",
client_id: process.env.SNOV_CLIENT_ID,
client_secret: process.env.SNOV_CLIENT_SECRET,
}),
});
const { access_token } = await tokenRes.json();Mailbeam (new):
# No token exchange — just send your API key as a Bearer header
curl -X POST https://api.mailbeam.dev/v1/verify \
-H "Authorization: Bearer $MAILBEAM_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com"}'Endpoint mapping
| Snov.io | Mailbeam | Notes |
|---|---|---|
POST /v1/get-emails-verification-status | POST /v1/verify | Single verification (sync) |
| Add-to-queue + poll for status | Single synchronous response | No polling needed |
POST /v1/oauth/access_token | — | No token exchange in Mailbeam |
Response mapping
| Snov.io result | Mailbeam equivalent |
|---|---|
result: "valid" | valid: true, score >= 60 |
result: "not valid" | valid: false |
result: "unknown" / "greylisted" | status: "unknown" |
result: "catch-all" | catchAll: true + score |
is_disposable: true | disposable: true |
is_role_account: true | role: true |
Code migration
Snov.io's flow is asynchronous: you submit an address, then poll for its status. Mailbeam returns the verdict in one call.
Snov.io (old):
// After obtaining access_token above:
const res = await fetch(
"https://api.snov.io/v1/get-emails-verification-status",
{
method: "POST",
body: new URLSearchParams({ access_token, email }),
}
);
const { data } = await res.json();
// data.result may still be pending — Snov.io often requires polling
if (data?.result !== "valid") return res.status(422).end();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 res.status(422).json({ error: "Invalid email", code: reason });
}Using the score and reason fields
Snov.io returns a status string. Mailbeam adds a numeric score and a machine-readable reason, so you can handle catch-all and low-quality addresses with a threshold instead of an all-or-nothing decision:
const result = await mb.verify(email);
if (result.catchAll && result.score >= 75) {
// High-confidence corporate catch-all — accept
} else if (!result.valid || result.score < 60) {
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 could not be verified." });
}What to keep in Snov.io
Mailbeam only replaces verification. If you use Snov.io's email finder, drip campaigns, or CRM, keep those — point only your verification calls at Mailbeam.