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.
Pick the path that fits how your agent works.
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.
Building your own agent loop? POST /api/verify, poll the job, act on the verdict. Copy-paste Python and JavaScript examples below.
Your prospector generated 5,000 leads. Upload the CSV, download it clean — verdict and reasons per row. No code required.
Autonomy multiplies mistakes. A bad address list becomes a burned domain overnight.
Enrichment and pattern-guessing produce plausible-looking emails that don't exist. Each hard bounce tells inbox providers your mail can't be trusted.
A human spots a bounce spike after dozens of sends. An agent fires hundreds before breakfast — reputation damage happens while you sleep.
Make verify_email a mandatory step before any draft or send. Bad addresses never leave the building; your domain stays warm.
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.
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.
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.
Reload MCP servers (Claude Code picks up .mcp.json on restart; Cursor via Settings → MCP → refresh).
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_.
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).
Full pipeline including the live SMTP handshake. 1 credit per email.
Same as Guide 1, step 1 — dashboard → API keys. Pass it as Authorization: Bearer evk_….
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");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.
| Verdict | Meaning | Agent action |
|---|---|---|
valid | Mailbox confirmed by the receiving server. | Safe to send. |
invalid | Malformed, no MX records, or mailbox rejected. | Do not send; drop the lead. |
risky | Disposable, role account, or inconclusive handshake. | Review or suppress from cold sends. |
unknown | Local 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.
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.
Your prospector made 5,000 leads. Don't let your agent send to all of them.
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.
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}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
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.
Everything else, ask us.
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.
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.
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.
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.
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.
Connect verify_email in minutes. 100 free verifications every month — no credit card required.
No credit card required — upgrade only when you need more.