start
Fund a wallet, pick an on-ramp, call an endpoint. That's the whole setup for 688 live endpoints across 14 product clusters. No signup, no dashboard, no API key.
You need one thing: an EVM private key holding USDC on Base (chain 8453, token 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913). That's it. No ETH for gas. x402 payments settle through EIP-3009 transferWithAuthorization, which is gasless for the buyer. You sign a message, the facilitator submits the transaction and pays the gas itself. No RPC key either; every snippet on this page defaults to the public https://mainnet.base.org endpoint.
A dollar of USDC covers hundreds of calls. Prices across the 688-endpoint catalog run $0.001 – $5 per call, so even the pricier composites leave room for a long test session.
mkdir -p ~/.claude/skills/agentutility && curl -fsSL https://agentutility.ai/skill.md -o ~/.claude/skills/agentutility/SKILL.md
The skill teaches Claude how to discover endpoints, check a price before calling one, and run the payment pattern against any of the 688 endpoints in the catalog.
curl https://agentutility.ai/prompt.txt
Paste the output into the agent's system prompt. It works for any harness that can run shell or Node.
claude mcp add prooflayer -e X402_PRIVATE_KEY=0x... -- npx -y @agentutility/mcp-prooflayer
There are 14 live clusters, each shipping as its own package. Cursor and Claude Desktop configs live at /mcp/.
npm i @x402/fetch @x402/evm viem
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme, toClientEvmSigner } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
import { createPublicClient, http } from "viem";
import { base } from "viem/chains";
const account = privateKeyToAccount(process.env.X402_PRIVATE_KEY);
const signer = toClientEvmSigner(
account,
createPublicClient({ chain: base, transport: http("https://mainnet.base.org") }),
);
const client = new x402Client().register("eip155:8453", new ExactEvmScheme(signer));
const paidFetch = wrapFetchWithPayment(fetch, client);
const res = await paidFetch("https://x402.agentutility.ai/cve", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ "cve_id": "CVE-2021-44228" }),
});
console.log(await res.json());That's the whole flow. The first request gets a 402, wrapFetchWithPayment signs a USDC transferWithAuthorization for the amount the server asked for, and retries automatically. The paid response comes back in the same await paidFetch(...) call. Nothing else to wire up.
Want to see the 402 handshake byte by byte before you trust a library with it? /docs walks the raw HTTP exchange. Schemas and prices for every endpoint live at /registry.json.