Real-time and bulk verification, one API

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();
200 OK · response.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

deliverable

john@gmial.com

Did you mean gmail.com?

undeliverable

temp8812@mailinator.com

Disposable inbox

risky

sales@bigcorp.io

Accept-all domain · role address

risky

old.account@company.co

Mailbox not found

undeliverable

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.

  1. 01

    Syntax

    RFC-aware parsing and normalisation.

  2. 02

    Domain

    DNS and MX lookups, typo suggestions.

  3. 03

    Lists

    Disposable, role and free-provider flags.

  4. 04

    Mailbox

    SMTP handshake with the real mail server.

  5. 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
Next.js server action
"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.

Compare plans

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.