Private betaMailbeam is in private beta — the public API isn't live yet.Join the waitlist

Mailbeam
API · SMTP

SMTP Email Verification API

An MX record confirms the domain can receive email. SMTP verification confirms the specific mailbox exists. Mailbeam does both in a single API call.

What Mailbeam checks

Every verification runs 7 checks in parallel and returns a structured result in under 100ms.

Direct SMTP handshake

Mailbeam connects to the target mail server and executes EHLO + MAIL FROM + RCPT TO to test whether the specific mailbox is accepted — without delivering a message.

Multi-hop MX handling

Domains with multiple MX records are handled in priority order. If the primary server is unresponsive, Mailbeam falls back to secondary MX records automatically.

SMTP check result in response

The `smtp_check` boolean in the response tells you specifically whether the SMTP handshake succeeded, independent of the overall `valid` composite result.

Graceful handling of probe-blocking servers

Google, Microsoft, and some enterprise mail servers block direct SMTP probes. When probing is blocked, Mailbeam uses domain-level signals and historical data to estimate deliverability and returns `status: unknown` instead of a false negative.

Distinct from MX-only check

MX validation confirms the domain has mail infrastructure. SMTP verification confirms the individual mailbox (the username before @) exists. Both checks run in every request.

Parallel execution with other checks

The SMTP probe is the slow part of a verification: syntax, disposable and role checks cost nothing next to it, and the MX lookup is usually cached. It is the probe that decides the response time.

How it works

1

MX records fetched

Mailbeam resolves the domain's MX records to identify the responsible mail server. Records are cached for common domains to reduce DNS lookup latency.

2

SMTP connection opened

A TCP connection is opened to the highest-priority MX server on port 25 (or 587 for submission-only servers). Mailbeam sends EHLO to identify itself.

3

RCPT TO command sent

Mailbeam issues MAIL FROM with a probe address and RCPT TO with the target address. The server's response code (250 = accepted, 550 = rejected) determines mailbox existence.

4

Connection closed, result returned

Mailbeam sends QUIT and closes the connection without delivering any email. The RCPT TO response code is included in the verify result as `smtp_check: true/false`.

Integrate in minutes

PythonPython
import asyncio
import os

import httpx

# No SDK yet — Mailbeam is one POST.
async def verify_email(email: str) -> dict:
    async with httpx.AsyncClient(timeout=3.0) as client:
        response = await client.post(
            "https://api.mailbeam.dev/v1/verify",
            json={"email": email},
            headers={"Authorization": f"Bearer {os.environ['MAILBEAM_KEY']}"},
        )
    response.raise_for_status()
    return response.json()


async def verify_with_smtp_detail(email: str) -> dict:
    result = await verify_email(email)

    print(f"SMTP check:  {result['checks']['smtp']}")
    print(f"MX check:    {result['checks']['mx']}")
    print(f"Status:      {result['status']}")
    print(f"Score:       {result['score']}")

    if result["status"] == "unknown":
        # The probe could not reach a verdict — Google and Microsoft are never
        # probed, and some hosts greylist. Fall back to the score.
        if result["score"] >= 60:
            return {"action": "allow", "reason": "domain_signals_positive"}
        return {"action": "review", "reason": "low_confidence_unknown"}

    if not result["valid"]:
        return {"action": "reject", "reason": result["reason"]}

    return {"action": "allow", "reason": "smtp_verified"}

# Usage
result = asyncio.run(verify_with_smtp_detail("user@company.com"))
print(result)

When to use it

B2B outreach list validation

Before sending a cold outreach sequence, SMTP verification confirms that the specific contacts you've identified at a company domain actually have active mailboxes.

Critical transactional email validation

Before sending invoices, contracts, or onboarding emails to new accounts, SMTP-verify the address to avoid a hard bounce on a high-value communication.

Catch-all domain disambiguation

For domains where MX passes but the catch-all flag is set, SMTP probing is still attempted. The probe result and the capped score together give the most useful verdict for corporate addresses — and the score says how much confidence is left rather than pretending to certainty.

Hard bounce prevention at scale

For email campaigns where sender reputation is a concern, SMTP verification at import time eliminates the class of hard bounces that come from non-existent mailboxes.

Frequently asked questions

Ready to integrate?

Free tier includes 1,000 verifications/month. No credit card required.