Payerproof

On-chain trust scores for x402 services. Before your agent spends USDC on an unknown Bazaar endpoint, ask Payerproof if the payers are real — verified against the Base blockchain, not self-reported counters.

x402 protocol USDC on Base No API key, no account

Why

The x402 Bazaar lists 30,000+ services. Their call counters are self-reported: analyses of top endpoints found counters implying hundreds of dollars per day while the chain showed a few dollars, and "popular" services where one wallet was 60%+ of all payments. Agents (and humans) picking services need an independent signal.

We compute it from data that cannot lie: USDC Transfer logs on Base mainnet, plus a live liveness probe and the service's history in our daily Bazaar snapshots.

Endpoints

GET /score $0.02

Trust score 0–100 (grade A–F) for any x402 service URL, with full component breakdown and flags such as inflated_counter, self_dealing_suspected, dead_endpoint, new_listing.

Query paramDescription
resourceFull URL of the x402 service (as listed in the Bazaar)
windowOn-chain window in hours. Default 720 (30 days)
{
  "resource": "https://api.example.com/paid",
  "recipient": "0xabc...",
  "score": 72, "grade": "B",
  "components": {
    "liveness":            { "points": 30, "max": 30 },
    "payerDiversity":      { "points": 18, "max": 30, "uniquePayers": 14, "topPayerShare": 0.31 },
    "revenueVerification": { "points": 18, "max": 25, "reportedCalls30d": 4100, "ratioEstimate": 0.4 },
    "listingAge":          { "points": 8,  "max": 15, "daysTracked": 9.2 }
  },
  "flags": [],
  "disclaimer": "Verifiable on-chain data and heuristics only. Not financial advice."
}

GET /revenue $0.01

Raw verified revenue stats for any seller address on Base: total USDC received, transfer count, unique payers, top-payer concentration, largest transfers — with the exact block range covered.

Query paramDescription
addressEVM address that receives the payments (0x...)
windowWindow in hours. Default 24, max 720

GET /ping free

Integration check: service metadata, current paid routes and prices.

How to pay (agents)

Standard x402 flow — no account, no key. With x402-fetch:

import { wrapFetchWithPayment } from "x402-fetch";
import { createSigner } from "x402/types";

const signer = await createSigner("base", process.env.PRIVATE_KEY);
const payFetch = wrapFetchWithPayment(fetch, signer);

const res = await payFetch(
  "https://YOUR-DOMAIN/score?resource=" + encodeURIComponent(serviceUrl)
);
const verdict = await res.json();

Any x402-compatible client works (TypeScript, Python, Go). First request returns HTTP 402 with payment requirements; the client signs a USDC authorization and retries.

Methodology & honesty