Quickstart
You'll spend ~$0.30 of testnet USDC and have a pet to your name in about five minutes.
1. Get a wallet
Any EVM wallet works. The agent-friendly path is a freshly-derived private key — no UI required:
# 32 bytes of randomness, hex-encoded
node -e "console.log('0x' + require('node:crypto').randomBytes(32).toString('hex'))"
Save that string somewhere safe; the public address is derived from
it via viem's privateKeyToAccount.
2. Fund the wallet with Base Sepolia USDC
agentchi runs on Base Sepolia (testnet) by default. You'll need two things on that network:
- A small amount of testnet USDC (the contract address the worker
uses is
0x036CbD53842c5426634e7929541eC2318f3dCF7e). - No ETH required — the x402 facilitator submits the USDC transfer on your behalf and pays gas. You only sign the EIP-3009 authorization off-chain.
Faucets:
- USDC (Base Sepolia): https://faucet.circle.com (select Base Sepolia)
- Two test calls cost ~$0.05 USDC; $1 of testnet USDC will cover hours of experimentation.
3. Install the x402 client library
npm install @x402/core @x402/evm viem
Both @x402/core and @x402/evm are ESM-only.
4. Create your first pet
import { x402Client, x402HTTPClient } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const PK = process.env.EVM_PRIVATE_KEY!; // 0x + 64 hex
const BASE = "https://your-deployment.example.com"; // see Endpoints page
const signer = privateKeyToAccount(PK);
const client = new x402Client((_v, requirements) => {
return requirements.find((r) => String(r.network).startsWith("eip155:"))
?? requirements[0];
});
registerExactEvmScheme(client, { signer });
const httpClient = new x402HTTPClient(client);
async function paidPost(url: string, body: unknown) {
const init = {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(body),
};
const first = await fetch(url, init);
if (first.status !== 402) return first;
const required = httpClient.getPaymentRequiredResponse((n) => first.headers.get(n));
const payload = await httpClient.createPaymentPayload(required);
const headers = httpClient.encodePaymentSignatureHeader(payload);
return fetch(url, { ...init, headers: { ...init.headers, ...headers } });
}
// 5. Create the pet — costs $0.20
const res = await paidPost(`${BASE}/api/pet/create`, { name: "agent-1" });
const { pet } = await res.json();
console.log("created", pet.id, pet.species, pet.stage);
You now have a pet. Visit ${BASE}/api/pet/${pet.id} to read its
state (free, no payment required).
5. Take your first turn
// $0.010 — one train action, +xp toward growth
await paidPost(`${BASE}/api/pet/${pet.id}/turn`, {
actions: [{ type: "train", skill: "int" }],
});
A turn body is an array of 1–10 actions; the price scales linearly ($0.010 per action). Action types:
feed— restore hungerplay— restore happinesstrain,skill: "int" | "str" | "cha"— increase the chosen stat, gain xp
6. Watch it evolve
After enough xp the pet is eligible for POST /evolve. See
Concepts for thresholds, and
Endpoints for the full action catalog.
What just happened
- The first POST returned
402 Payment Requiredwith an envelope listing the payment requirements (network, asset, amount, payTo). - Your client signed an EIP-3009 authorization for that exact
amount and re-sent the request with a
Payment-Signatureheader. - The agentchi worker
verify-d the signature with the x402 facilitator, then mutated the pet's Durable Object state, thensettle-d on-chain. - The
Payment-Responseheader on the success reply contains the on-chain transaction hash so you can verify the settle landed.
No API key, no contract deploy, no custom protocol. Same flow for all 19 paid endpoints — just different prices.