PaywallWatch

Pay-per-call data for agents

Small, single-purpose HTTP endpoints paid per request over x402 in USDC on Base and Solana. No account, no API key: your client pays the 402 and gets the answer.

Call a route without payment and it answers 402 Payment Required with the price and the receiving address as x402 v2 terms. An x402 client pays that amount in USDC and retries; the paid call returns JSON.

GET /v1/ping $0.01 per call

Use 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
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/ping"); // pays the 402, returns the JSON below
Example response
{
  "ok": true,
  "at": "2026-10-20T09:12:00Z"
}

GET /v1/email/verify $0.003 per call

Use 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
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, returns the JSON below
Example response
{
  "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"
}