You wanted a function, not a vendor relationship
Most verification providers sell to marketing teams and treat the API as an upsell. You end up on a demo call just to get a key, and then discover rate limits, a proprietary SDK, and a monthly minimum that assumes you verify a million addresses.
You wanted a function that takes a string and tells you whether mail will land.
How it works
-
1
POST /v1/verifywith an email address. Get back a status and the signals behind it. -
2
Branch on
status. Three values matter in practice: valid, invalid, unknown. -
3
Batch when you have a list.
POST /v1/verify/bulk, then poll for the result.
import requests
r = requests.post(
"https://api.mailvalid.io/v1/verify",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"email": email},
timeout=3,
)
result = r.json()
if result["status"] == "invalid" or result["disposable"]:
raise ValidationError("Please use a valid work email address.")const res = await fetch("https://api.mailvalid.io/v1/verify", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MAILVALID_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email }),
});
const { status, disposable } = await res.json();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. A result holds for around 30 days. Do not 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` deliberately. Catch-all domains return unknown because the receiving server will not tell anyone the truth. Decide once whether unknown passes or fails in your flow, and write it down.
Why teams pick MailValid
| MailValid | Typical alternative | |
|---|---|---|
| Time to first API call | Minutes, self-serve | Demo call to get access |
| Price | $0.00075 per email | Monthly minimum |
| Unused credits | Never expire | Reset monthly |
| Response time | Under 500ms average | 1 to 3 seconds |
| Agent and MCP support | Native MCP server | None |
Is there a free tier?
100 credits on signup, no card required.
What are the rate limits?
Documented in the docs, and generous enough for inline signup verification out of the box.
Do you have SDKs?
Copy-paste examples in Python, Node.js, Ruby, PHP, Go and Java. It is one HTTP call — you do not need a dependency.
What is the accuracy?
95%+ across syntax, MX and SMTP-level checks. No verifier can exceed this on catch-all domains, and any vendor claiming 99% on catch-alls is measuring something else.
Can I verify without sending an email?
Yes. SMTP-level confirmation, and no message is ever delivered.
Get your API key free — 100 credits, no card required.