Works with AI

Email verification your AI agents can actually call.

AI SDRs burn sender reputation on bad addresses. Give your agents a native MCP tool, a REST API, and bulk CSV cleaning — so every recipient is verified before every send.

No credit card required — start with 100 free verifications every month.

Three ways to connect

Pick the path that fits how your agent works.

A

MCP tool for AI assistants

Connect verify_email as a native tool in Claude Code, Cursor, or any MCP client. No code — paste a config, and your assistant verifies addresses mid-conversation.

Set up the MCP tool →

B

REST API for custom agents

Building your own agent loop? POST /api/verify, poll the job, act on the verdict. Copy-paste Python and JavaScript examples below.

See the code →

C

Bulk CSV for AI lead lists

Your prospector generated 5,000 leads. Upload the CSV, download it clean — verdict and reasons per row. No code required.

Clean a list →

Why agents need verification

Autonomy multiplies mistakes. A bad address list becomes a burned domain overnight.

Agents guess addresses

Enrichment and pattern-guessing produce plausible-looking emails that don't exist. Each hard bounce tells inbox providers your mail can't be trusted.

Speed amplifies damage

A human spots a bounce spike after dozens of sends. An agent fires hundreds before breakfast — reputation damage happens while you sleep.

Verification is a one-line guardrail

Make verify_email a mandatory step before any draft or send. Bad addresses never leave the building; your domain stays warm.

Guide 1 — Connect the MCP tool

Our MCP server runs at https://email-verify.simplebusinesssuite.com/mcp over Streamable HTTP. Auth is your API key as a Bearer token. Tool name: verify_email.

1

Get an API key

Sign in, open API keys, and create a key. It's shown once — copy it somewhere safe, like a password. Every verify_email call costs 1 credit from your balance.

2

Add the server to your AI client

Claude Code — add to .mcp.json in your project root (or run claude mcp add --transport http email-verify https://email-verify.simplebusinesssuite.com/mcp --header "Authorization: Bearer evk_YOUR_KEY"):

{
  "mcpServers": {
    "email-verify": {
      "type": "http",
      "url": "https://email-verify.simplebusinesssuite.com/mcp",
      "headers": {
        "Authorization": "Bearer evk_YOUR_KEY"
      }
    }
  }
}

Cursor — add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "email-verify": {
      "url": "https://email-verify.simplebusinesssuite.com/mcp",
      "headers": {
        "Authorization": "Bearer evk_YOUR_KEY"
      }
    }
  }
}

Replace evk_YOUR_KEY with the key from step 1. Any other MCP client with Streamable HTTP + custom header support works the same way: URL above, Authorization: Bearer header.

3

Restart your client

Reload MCP servers (Claude Code picks up .mcp.json on restart; Cursor via Settings → MCP → refresh).

4

Confirm the tool appears

Look for verify_email in your client's tool list — description: “Verify a single email address…”. If it's missing, double-check the URL and that your key starts with evk_.

5

Put it in the workflow

Example prompt for an outreach agent:

Before drafting any outreach, call verify_email for every
recipient. Skip invalid addresses entirely, and flag risky
ones for my review before drafting. Tell me which
addresses you skipped and why.

The tool returns verdict, reasons, per-layer checks, and credits_remaining. Note: MCP verdicts top out at “unknown”/“risky” — the mailbox handshake runs via the REST API (Guide 2).

Guide 2 — REST API for custom agents

Full pipeline including the live SMTP handshake. 1 credit per email.

1

Get an API key

Same as Guide 1, step 1 — dashboard → API keys. Pass it as Authorization: Bearer evk_….

2

Verify an address

Python (requests):

import time, requests

API = "https://email-verify.simplebusinesssuite.com"
KEY = "evk_YOUR_KEY"  # from your dashboard
H = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}

def verify(email):
    r = requests.post(f"{API}/api/verify", headers=H, json={"email": email})
    if r.status_code == 402:
        raise SystemExit("Out of credits - top up at /pricing")
    if r.status_code == 429:
        raise SystemExit("Rate limited - back off and retry")
    r.raise_for_status()
    job_id = r.json()["job_id"]
    for _ in range(40):  # poll up to ~2 minutes
        job = requests.get(f"{API}/api/jobs/{job_id}", headers=H).json()
        if job["status"] == "done":
            return job["checks"][0]
        time.sleep(3)
    raise TimeoutError("verification timed out")

check = verify("lead@company.com")
print(check["verdict"], check["reasons"])
if check["verdict"] != "valid":
    print("Skipping - not safe to send")

JavaScript (fetch):

const API = "https://email-verify.simplebusinesssuite.com";
const KEY = "evk_YOUR_KEY"; // from your dashboard

async function verify(email) {
  const res = await fetch(API + "/api/verify", {
    method: "POST",
    headers: { "Authorization": "Bearer " + KEY, "Content-Type": "application/json" },
    body: JSON.stringify({ email }),
  });
  if (res.status === 402) throw new Error("Out of credits - top up at /pricing");
  if (res.status === 429) throw new Error("Rate limited - back off and retry");
  if (!res.ok) throw new Error("Verify failed: " + res.status);
  const { job_id } = await res.json();
  for (let i = 0; i < 40; i++) {
    const job = await (await fetch(API + "/api/jobs/" + job_id, {
      headers: { Authorization: "Bearer " + KEY },
    })).json();
    if (job.status === "done") return job.checks[0];
    await new Promise(r => setTimeout(r, 3000));
  }
  throw new Error("Verification timed out");
}

const check = await verify("lead@company.com");
console.log(check.verdict, check.reasons);
if (check.verdict !== "valid") console.log("Skipping - not safe to send");
3

Poll the job

Local checks (syntax, disposable, MX, role) complete immediately; the live SMTP handshake runs in the background. Poll GET /api/jobs/:id until status is "done" — usually seconds.

4

Interpret the verdict

VerdictMeaningAgent action
validMailbox confirmed by the receiving server.Safe to send.
invalidMalformed, no MX records, or mailbox rejected.Do not send; drop the lead.
riskyDisposable, role account, or inconclusive handshake.Review or suppress from cold sends.
unknownLocal checks passed; mailbox unconfirmed.Treat like risky — verify again or deprioritize.

Every verdict ships with reasons — log them so you can audit why an address was skipped.

5

Handle billing & limits

402 means out of credits — top up with a pack or upgrade at /pricing. 429 means slow down and retry with backoff. 401 means your key is missing or revoked. No key at all? You get the anonymous tier: 10 checks/day/IP.

Guide 3 — Bulk-clean AI-generated lead lists

Your prospector made 5,000 leads. Don't let your agent send to all of them.

1

Export your list as CSV

Export from Clay, Apollo, Smartlead, or your prospector of choice. Put the email addresses in the first column (a header row is skipped automatically). Up to 10,000 rows per upload.

2

Upload

No code: open your dashboard and use the bulk upload — or programmatically:

curl -X POST https://email-verify.simplebusinesssuite.com/api/verify/bulk \
  -H "Authorization: Bearer evk_YOUR_KEY" \
  -F file=@leads.csv
# => {"job_id":"...","count":5000}
3

Download the cleaned list

When the job finishes, download the results CSV — one row per address with email,verdict,reasons,smtp_status,smtp_code:

curl https://email-verify.simplebusinesssuite.com/api/jobs/JOB_ID/download \
  -H "Authorization: Bearer evk_YOUR_KEY" -o leads-clean.csv
4

Filter and send

Keep valid, review risky/unknown, drop invalid — then import the clean list into your sequencer. A 5,000-lead clean costs a $30 one-time pack, and leftover credits never expire.

Frequently asked questions

Everything else, ask us.

Which AI tools does this work with?

Any MCP client that supports Streamable HTTP with custom headers — setup configs for Claude Code and Cursor are below. The REST API works from any language or agent framework, and bulk CSV cleaning needs no code at all.

Do I need to write code?

Not for the basics. Connecting the MCP tool is paste-a-config-JSON, and bulk list cleaning is a dashboard upload. Code is only needed if you're building a custom agent loop — the Python and JavaScript examples below are copy-paste ready.

How are MCP tool calls billed?

Each verify_email call costs exactly 1 credit from the same balance as the API and dashboard. The free plan's 100 monthly verifications cover prototyping.

Can my agent clean a whole list, not just one address?

Yes. For lists, have the agent POST the CSV to /api/verify/bulk (up to 10,000 rows) and download the results — 1 credit per address, same as single checks. Reserve per-address verify_email calls for real-time decisions.

Is the MCP check as thorough as the REST API?

Almost. The MCP tool runs syntax, disposable-domain, MX, and role-account checks, so its verdicts top out at “unknown” or “risky” — the mailbox is unconfirmed. For the definitive live SMTP mailbox handshake on high-value sends, escalate to POST /api/verify.

Give your agents the guardrail.

Connect verify_email in minutes. 100 free verifications every month — no credit card required.

Start free — 100/mo View pricing

No credit card required — upgrade only when you need more.