Mercury

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:

  1. Format — RFC 5322, label length, IDN. Catches typos.
  2. Disposable — 70k+ throwaway domains, updated daily.
  3. Role — Detects abuse@, info@, no-reply@.
  4. MX — DNS over HTTPS against multiple resolvers.
  5. SMTP (Pro+) — RCPT TO probe through our separate SMTP prober.
  6. 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.

Start free Read the quickstart