Screen one email address for $0.003 per call ($3 per 1,000). Pay through x402 in USDC on Base or Solana. No account, no API key: your client pays the 402 and gets the answer. Checks syntax, mail-domain DNS, disposable domains and common typos; it does not verify that the mailbox exists or that mail will be delivered. Built for the moment an address arrives from a form, a scrape or a CRM and you must decide whether it is worth sending to.
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 needs email validation, screening only, for an 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"
}An excerpt, not a script to copy: it omits the charge cap and the check of the signing terms. The complete script, capped at $0.003 per run, is on the quickstart.
// Excerpt. Expected price $0.003. Use the capped quickstart for the complete runnable example.
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 before settlement. A confirmed settlement failure returns a 402 instead of the result. If a response is lost or settlement times out, check the transaction before retrying: a new authorization can charge again.
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"
}mailbox_verified always false) and the payment metadata (x-payment-info, x402).cloudflare-dns.com) for the MX and A lookups. Payment authorizations are sent to the facilitator for verification and settlement.Questions, integration help or a problem with a charge: support@auraaia.com. Replies are checked manually; no response time is promised.