Use case · Sign-up
Stop fake sign-ups before they hit your CRM.
Every sign-up form gets the same five abusers: typos, throwaways, role-based addresses, competitors, and bots. The Mercury API checks all five in <200 ms.
The problem
If your sign-up form accepts every well-formed address, you'll see:
- 5–15% throwaway domains (Mailinator, Yopmail, …) that bounce, killing your sender reputation.
- role-based addresses (
info@,support@) that accept but never convert. - typos (
gmial.com) that route to nothing. - bots that submit the same address 100 times in a minute.
What to call, in what order
On form submit, call GET /v1/verify?email=…. The pipeline is:
- Format — RFC 5322, label length, IDN. Catches typos.
- Disposable — 70k+ throwaway domains, updated daily.
- Role — Detects
abuse@,info@,no-reply@. - MX — DNS over HTTPS against multiple resolvers.
- SMTP (Pro+) — RCPT TO probe through our separate SMTP prober.
- Reputation (Pro+) — Spamhaus DBL signals.
What to do with the verdict
valid— accept the sign-up.risky— accept but flag in the CRM; consider a captcha at high velocity.invalid— reject with a helpful error: "Looks like a typo — did you mean user@gmail.com?"unknown— accept and retry in the background; don't punish the user for our pipeline failing.
Sample integration
async function verify(email: string): Promise<boolean> {
const r = await fetch(
`https://mercury-api.deepeshkalurs.workers.dev/v1/verify?email=${encodeURIComponent(email)}`,
{ headers: { Authorization: `Bearer ${process.env.MR_KEY}` } },
);
const body = await r.json();
if (body.verdict === 'invalid') return false;
return true;
} What it costs
Free tier: 1,000 lookups / day. Pro: 25,000. Team: 250,000. Cached lookups are free. See Pricing for the full table.