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
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.
GET /score $0.02Trust 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 param | Description |
|---|---|
resource | Full URL of the x402 service (as listed in the Bazaar) |
window | On-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.01Raw 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 param | Description |
|---|---|
address | EVM address that receives the payments (0x...) |
window | Window in hours. Default 24, max 720 |
GET /ping freeIntegration check: service metadata, current paid routes and prices.
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.
complete flag.