BounceLayer

An email verification API you can integrate before lunch

One endpoint, one JSON response. No sales call, no annual contract.

You wanted a function, not a vendor relationship

Verifying an email should be one API call, not a project. Sign up, get a key and start calling it. There's no demo to book and no contract to sign.

You wanted a function that takes a string and tells you whether mail will land.

How it works

  1. 1POST /api/v1/verify/single with an email address. Get back a status and the signals behind it.
  2. 2Branch on status. Decide what your app should do with each result, such as valid, invalid or unknown.
  3. 3Batch when you have a list. POST /api/v1/verify/bulk, then poll for the result.
import requests

r = requests.post(
    "https://bouncelayer.com/api/v1/verify/single",
    headers={"X-API-Key": API_KEY},
    json={"email": email},
    timeout=3,
)
result = r.json()

if result["result"]["status"] == "invalid" or result["result"]["is_disposable"]:
    raise ValidationError("Please use a valid work email address.")
const res = await fetch("https://bouncelayer.com/api/v1/verify/single", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.BOUNCELAYER_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ email }),
});
const { result } = await res.json();
const { status, is_disposable } = result;

Integration notes we would want if we were you

  • Always set a timeout and fail open. If verification times out, let the signup through and flag it for an asynchronous re-check. Never let a third-party API block your registration flow.
  • Cache by address. Don't pay twice for the same address in one session.
  • Verify server-side. An API key in client-side JavaScript is a key someone else's script will spend.
  • Handle unknown results on purpose. Some mail servers won't give an answer, so the status comes back unknown. You aren't charged for these. Decide once whether unknown passes or fails in your flow, and write it down.

Common questions

Is there a free tier?

300 credits/month on free accounts, no card required.

What are the rate limits?

Free accounts get 10 requests a minute. Paid plans get 120 to 3,000 requests a minute, depending on the plan.

Do you have SDKs?

Yes. We have official SDKs for TypeScript and Python, plus an OpenAPI spec. It's one HTTP call, so you don't need a dependency if you'd rather not add one.

Can I verify a whole list, not just one email at a time?

Yes. POST /api/v1/verify/bulk accepts a list and returns results by polling or webhook. It uses the same credits, account and API key as single verification.

Does this work with catch-all domains?

Yes. Catch-all domains get their own catch_all status rather than a false valid, because the receiving server won't confirm a specific mailbox exists. You decide how to handle them.

How is an unknown result billed?

Unknown results are free. You pay 1 credit for a definitive result: valid, invalid, catch-all, disposable or do not mail.

Can I verify without sending an email?

Yes. SMTP-level confirmation, and no message is ever delivered.

Is this the same as an email validation API?

Yes — verification and validation are used interchangeably. Same engine, same endpoint, same 1 credit per email.

Do you have an email checker API or just verification?

Same thing. POST /api/v1/verify/single checks syntax, MX, and SMTP in a single response.

Do you support AI agents or MCP tool calls?

Yes — BounceLayer ships a native MCP server, so Claude, Cursor, or any MCP-compatible agent can call verification as a tool mid-task, not just via REST. See the MCP setup guide for details.

Check your email list for free

Get your API key free — 300 credits/month, no card required.

Related

Developer First

Works with your stack

Production SDKs, Model Context Protocol (MCP) server, and drop-in code examples for every major framework.

$npm install @bouncelayer/sdk
Node.js snippet
import { BounceLayer } from "@bouncelayer/sdk";
const client = new BounceLayer({
apiKey: process.env.BOUNCELAYER_API_KEY,
});
// Real-time single email verification (<150ms)
const result = await client.verify.single("alex@stripe.com");
console.log(result.status); // "valid" | "invalid" | "catch_all"
console.log(result.confidence_score); // 98
console.log(result.smtp_checked); // true (RFC 5321 Port 25 Handshake)