Email address verification (syntax, MX, risk flags) API

Checks an email address without sending mail: syntax rules (IDN domains in punycode and Unicode), MX records by preference, null MX (RFC 7505), implicit A/AAAA fallback, NXDOMAIN, SPF and DMARC policy, disposable, role, free-webmail and +tag flags, mail provider from MX hosts, and typo suggestions for popular domains. Returns a verdict and 0-100 score with reasons. Mailbox existence is not confirmed. Sources: Cloudflare DNS over HTTPS, disposable-email-domains (CC0).

$0.003 per call  USDC over x402 v2 on Base, Polygon, Arbitrum, Avalanche or Sei. No signup, no API key. Requests that fail or match nothing are not charged.

Endpoint

GET https://api.kit-rx.com/v1/email/verify

Parameters

NameTypeRequiredDescription
emailstringyesEmail address to check, up to 512 characters (addresses over 254 octets are reported as invalid). A mailto: link (its ?query and #fragment dropped) or a Name <address> header form is unwrapped first. Inputs without an @, quoted local parts, IP-literal domains and mailto links with several addresses are rejected with 400 and not charged. e.g. jane.doe+news@gmail.com

Example request

https://api.kit-rx.com/v1/email/verify?email=jane.doe%2Bnews%40gmail.com

Without payment the server answers 402 Payment Required with the price (3000 atomic USDC) in the PAYMENT-REQUIRED header. Any x402 v2 client pays and retries automatically. A request with no parameters runs this example.

curl -i "https://api.kit-rx.com/v1/email/verify?email=jane.doe%2Bnews%40gmail.com"

Pay from an agent

AgentCash: fetch the URL. OpenDexter MCP: x402_fetch. Kit Rx MCP server: https://api.kit-rx.com/mcp. Code:

import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { wrapFetchWithPayment } from "@x402/fetch";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client();
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.BUYER_KEY) });
const pay = wrapFetchWithPayment(fetch, client);
const res = await pay("https://api.kit-rx.com/v1/email/verify?email=jane.doe%2Bnews%40gmail.com");
console.log(await res.json());

Example response

{
  "query": {
    "email": "jane.doe+news@gmail.com"
  },
  "result": {
    "address": "jane.doe+news@gmail.com",
    "verdict": "deliverable_domain",
    "score": 90,
    "score_reasons": [
      {
        "code": "mailbox_unverified",
        "points": -10,
        "detail": "Mailbox existence was not checked (no SMTP probe)."
      }
    ],
    "did_you_mean": null,
    "mailbox_verified": false,
    "syntax": {
      "valid": true,
      "local_part": "jane.doe+news",
      "domain": "gmail.com",
      "domain_unicode": null,
      "idn": false,
      "length": 23
    },
    "flags": {
      "disposable": false,
      "disposable_match": null,
      "role_account": false,
      "role": null,
      "free_provider": true,
      "subaddress": {
        "base": "jane.doe",
        "tag": "news"
      },
      "typo_suspected": false,
      "non_ascii_local": false
    },
    "mail_provider": {
      "id": "google",
      "name": "Gmail (Google)",
      "category": "mailbox_provider",
      "mx_host": "gmail-smtp-in.l.google.com"
    },
    "dns": {
      "rcode": "NOERROR",
      "accepts_mail": true,
      "mx": [
        {
          "preference": 5,
          "exchange": "gmail-smtp-in.l.google.com",
          "provider": "google"
        },
        {
          "preference": 10,
          "exchange": "alt1.gmail-smtp-in.l.google.com",
          "provider": "google"
        },
        {
          "preference": 20,
          "exchange": "alt2.gmail-smtp-in.l.google.com",
          "provider": "google"
        }
      ],
      "mx_count": 5,
      "null_mx": false,
      "implicit_mx": false,
      "implicit_mx_addresses": null,
      "primary_mx": {
        "host": "gmail-smtp-in.l.google.com",
        "status": "resolves",
        "addresses": [
          "142.250.31.26",
          "2607:f8b0:4004:c08::1a"
        ]
      }
    },
    "email_auth": {
      "spf": {
        "present": true,
        "record": "v=spf1 redirect=_spf.google.com",
        "all": null,
        "multiple_records": false
      },
      "dmarc": {
        "present": true,
        "record_domain": "gmail.com",
        "policy": "none",
        "record": "v=DMARC1; p=none; sp=quarantine; rua=mailto:mailauth-reports@google.com",
        "inherited_from_org_domain": false,
        "multiple_records": false
      }
    }
  },
  "sources": [
    {
      "name": "Cloudflare DNS over HTTPS (JSON API)",
      "url": "https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/"
    },
    {
      "name": "disposable-email-domains blocklist (CC0 1.0, commit ba992a0, 2026-11-08)",
      "url": "https://github.com/disposable-email-domains/disposable-email-domains"
    }
  ],
  "notes": [
    "Mailbox existence is not confirmed: no SMTP connection is made (Cloudflare Workers cannot open outbound connections on port 25), so the result covers address syntax, the domain's mail DNS and list-based flags only. Catch-all and full-mailbox status are unknown."
  ],
  "attribution": [
    "DNS resolved via Cloudflare 1.1.1.1 DNS-over-HTTPS."
  ],
  "generated_at": "2026-11-13T22:10:00.000Z"
}

Kit Rx: Composed public-data reports for AI agents, paid per call in USDC over x402. Machine-readable: OpenAPI, llms.txt, /.well-known/x402, agent skills.