Detect malformed addresses, disposable domains, and common typos. $3 per 1,000 checks ($0.003 a call), paid through x402 in USDC on Base or Solana. No account, no API key: your client pays the 402 and gets the answer.
Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.
info@, sales@ …), free provider, and a typo suggestion (gmial.com → gmail.com).The verdict is one of domain_accepts_mail, risky, disposable, undeliverable or unknown, with every reason listed. A working mail exchanger means the domain accepts mail; it never means the mailbox exists. Role and free-provider flags are signals for your own routing rules, not rejections.
GET /v1/email/verify $0.003 per callUse when an agent has an email address from a form, a scrape or a CRM and must decide whether it is worth sending to. Screens the address: syntax, DNS mail exchanger, disposable domain, role account, free provider and common typos. It does not verify that the mailbox exists. A DNS failure answers 503 and is not charged.
curl -i "https://api.paywallwatch.com/v1/email/verify?email=jane%40iana.org" # unpaid: answers 402 with the payment terms
{
"email": "jane@iana.org",
"valid_syntax": true,
"dns_status": "ok",
"has_mx": true,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": null,
"verdict": "domain_accepts_mail",
"reasons": [],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-20T09:12:00Z"
}// One paid attempt, at most $0.003. The complete, runnable version is on the quickstart page.
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
const client = new x402Client();
client.register("eip155:*", new ExactEvmScheme(account)); // a viem account holding USDC on Base
const paid = wrapFetchWithPayment(fetch, client);
const res = await paid("https://api.paywallwatch.com/v1/email/verify?email=jane%40iana.org"); // pays the 402 once, returns the JSON above
| Response | Charge |
|---|---|
| 402 with the payment terms, because no payment was sent | not charged |
400 because the payment carried no usable email | not charged: refused before the facilitator is asked |
| 402 because the payment was rejected (signature, balance, network) | not charged |
| 503 when the DNS lookup fails (Retry-After is set): not charged, try again later | not charged |
| 200 with the screening result | charged $0.003, settled on the network you paid on |
| 5xx from the service itself | not charged: settlement is cancelled when the check fails |
The result is computed first and returned only once settlement succeeds; if settlement fails you get a 402 with the reason instead of the result.
Prove that your client pays a 402 and retries before you spend on real checks.
GET /v1/ping $0.01 per callUse when testing an x402 client end to end. Returns ok and the server time; costs one cent.
curl -i "https://api.paywallwatch.com/v1/ping" # unpaid: answers 402 with the payment terms
{
"ok": true,
"at": "2026-10-20T09:12:00Z"
}cloudflare-dns.com) for the MX and A lookups. Nothing else is sent anywhere.Questions, integration help or a problem with a charge: contact@zahidayub.com. A person reads it.