Email verification API that doesn't suck.

Syntax, DNS, SMTP handshake, disposable and catch-all detection — in a single fast request, with honest results.

$ curl https://api.checkmail.dev/v1/verify?email=john@example.com \
    -H "Authorization: Bearer cm_live_..."
{
  "email": "john@example.com",
  "status": "valid",
  "checks": {
    "syntax": true,
    "mx_found": true,
    "smtp_valid": true,
    "catch_all": false,
    "disposable": false,
    "role_based": false,
    "free_provider": false
  },
  "suggestion": null,
  "mx_host": "aspmx.l.google.com",
  "cached": false,
  "ms": 1243
}

What we check

  • Syntax — RFC 5322
  • DNS & MX records
  • SMTP handshake — real mailbox existence
  • Disposable domains — 10,000+ known
  • Catch-all detection
  • Typo suggestions — gmial.com → gmail.com
  • Role-based addresses — info@, admin@
  • Free providers — flag, don't reject

Pricing

Pay once, use whenever. Credits never expire, no subscription.

Credits Price Per check
1,000 $2 $0.0020
5,000 $9 $0.0018
10,000 $17 $0.0017
50,000 $75 $0.0015
100,000 $140 $0.0014

Teams can enable auto-topup to refill credits automatically before they hit zero — no latency impact.

Quick start

curl

curl https://api.checkmail.dev/v1/verify \
  -G --data-urlencode "email=john@example.com" \
  -H "Authorization: Bearer $CM_KEY"

Node.js

const r = await fetch(
  "https://api.checkmail.dev/v1/verify?email=john@example.com",
  { headers: { Authorization: `Bearer ${process.env.CM_KEY}` } }
);
const data = await r.json();
console.log(data.status);

Python

import os, requests

r = requests.get(
  "https://api.checkmail.dev/v1/verify",
  params={"email": "john@example.com"},
  headers={"Authorization": f"Bearer {os.environ['CM_KEY']}"},
)
print(r.json()["status"])