Email verification
for developers
The best way to check an email address before you send to it. Catch typos, disposable inboxes and dead mailboxes with a single API call.
1,000 free checks every month. No card required.
const res = await fetch("https://api.bouncerly.com/v1/verify", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOUNCERLY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email: "jane@acme.com" }),
});
const { status, reason, did_you_mean } = await res.json();{
"email": "jane@acme.com",
"status": "deliverable",
"reason": "accepted",
"domain": "acme.com",
"disposable": false,
"role_account": false,
"free_provider": false,
"accept_all": false,
"mx_found": true,
"mx_host": "acme-com.mail.protection.outlook.com",
"smtp": { "code": 250, "enhanced": "2.1.5", "message": "Recipient OK" },
"smtp_checked": true,
"checked_at": "2026-10-28T10:03:42Z",
"duration_ms": 1840,
"cached": false
}Four clear answers
Know exactly what to do with every address.
Every result comes back as deliverable, undeliverable, risky or unknown, with a machine-readable reason and the mail server's own reply. No scores to interpret.
jane@acme.com
Mailbox exists
john@gmial.com
Did you mean gmail.com?
temp8812@mailinator.com
Disposable inbox
sales@bigcorp.io
Accept-all domain · role address
old.account@company.co
Mailbox not found
Features
Everything you need, nothing you don't.
One endpoint for single checks, one for lists. Sensible defaults, honest results and a dashboard that stays out of your way.
Real-time API
Verify at signup in one or two seconds, or instantly from our shared cache. Fail open on timeouts so real users never get stuck.
Typo suggestions
jane@gmial.com comes back with did_you_mean: jane@gmail.com, ready to show as a one-click fix.
Disposable detection
Around 10,000 throwaway domains blocked out of the box, plus role addresses like info@ and sales@ flagged.
Bulk list cleaning
Drop in a CSV of any shape. We find the email column, verify every row, and hand back a clean CSV in the same order.
Signed webhooks
Get a POST when a bulk job finishes, signed with HMAC-SHA256 so you know it came from us.
Scoped API keys
Create as many keys as you need. Restrict a key to single checks so it's safe to use in a signup backend.
We never send email
We talk to the recipient's mail server and stop before any message is sent. Your contacts never hear from us.
Polite by design
Per-provider throttling, greylisting retries and accept-all detection keep results accurate and our IPs trusted.
Logs for every call
See every request, its result and its latency in the dashboard. Filter by status to find the problems fast.
How it works
Five checks, one request.
Each address runs through the same pipeline, stopping as soon as the answer is certain. Definite results are cached for 30 days, so repeat checks come back instantly.
- 01
Syntax
RFC-aware parsing and normalisation.
- 02
Domain
DNS and MX lookups, typo suggestions.
- 03
Lists
Disposable, role and free-provider flags.
- 04
Mailbox
SMTP handshake with the real mail server.
- 05
Accept-all
A random-address probe catches catch-alls.
Drop-in
Stop bad signups in ten lines.
Call the API from your signup handler, reject what will bounce, suggest fixes for typos, and let everything else through. Fewer fake accounts, fewer bounces, better sender reputation.
- Works from any language: it's one HTTPS POST
- Restricted keys can only verify, nothing else
- Typical uncached check: 1 to 3 seconds
"use server";
export async function signUp(formData: FormData) {
const email = String(formData.get("email"));
const check = await fetch("https://api.bouncerly.com/v1/verify", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BOUNCERLY_API_KEY}` },
body: JSON.stringify({ email }),
signal: AbortSignal.timeout(4000), // fail open if slow
}).then((r) => r.json()).catch(() => null);
if (check?.status === "undeliverable") {
return { error: check.did_you_mean
? `Did you mean ${check.did_you_mean}?`
: "That email address can't receive mail." };
}
if (check?.disposable) {
return { error: "Please use a permanent email address." };
}
// ...create the account
}Pricing
Simple, monthly, predictable.
Start free. Upgrade when you need more checks. Cancel any time.
Free
$0/mo
1,000 checks per month
Starter
$15/mo
10,000 checks per month
Growth
$49/mo
50,000 checks per month
Scale
$149/mo
250,000 checks per month
Clean lists start with Bouncerly.
Create an account, grab an API key and verify your first address in under a minute.