Try it — how the paywall works
ReasoningReceipt is built for agents, not browsers. The intended consumer is another piece of software that pays $0.01 over x402, gets back a probability + a verifiable trace, and uses the answer to size a position. The interactive demo below walks the full x402 v2 protocol with your wallet; the four steps underneath document the HTTP dance for non-browser callers.
Try it for real — sign an EIP-3009 payment authorization
This is the full x402 v2 paywall, end-to-end. Connect a wallet, sign a TransferWithAuthorization authorizing 0.01 USDC to the Arc Testnet Gateway Wallet, server settles via Circle's facilitator (mock in this environment so no testnet USDC is consumed — the signature is real EIP-712 typed-data either way). You get back the latest cached rr-trace/3 trace for the market — no fresh ensemble run, just the paid agent-to-agent revenue path.
For the friction-free version (sign a plaintext authorization, no typed-data signing) see /try-live.
Consumer fetches /price/{market_id} — server returns 402
The first call has no X-Payment header. Server replies 402 with the EIP-3009 challenge.
HTTP/1.1 402 Payment Required
Content-Type: application/json
Accept-Payment: x402-v2
{
"scheme": "x402",
"version": "2.0",
"network": "eip155:5042002",
"asset": "USDC",
"amount": "10000", // 0.01 USDC in micro-USDC
"extra": {
"verifyingContract": "0x0077777d7EBA4688BDeF3E311b846F25870A19B9",
"facilitatorUrl": "https://gateway-api-testnet.circle.com/v1/settle"
}
}Consumer signs EIP-3009 TransferWithAuthorization
A typed-data signature delegates a one-shot USDC transfer to the Circle Gateway. No gas spent by the consumer.
{
"from": "<consumer-address>",
"to": "<oracle-receiver-address>",
"value": "10000",
"validAfter": "0",
"validBefore": "<now + 5 min>",
"nonce": "<random 32 bytes>"
}
// signed with consumer's private key → r, s, vConsumer retries /price with X-Payment — server settles + returns trace
Server posts the signed payload to /v1/settle, settles via Circle Gateway, emits a ReceiptV2 on Arc with the Merkle root of the reasoning DAG, and returns the price.
HTTP/1.1 200 OK
Content-Type: application/json
{
"market_id": "2402643",
"probability": 0.580000,
"confidence": 0.680000,
"claim": "LoL: Dplus KIA vs HANJIN BRION (BO5) - LCK Road to MSI…",
"trace_hash": "0xad75b6733d2e2797b3a5f04a12e8a919a2b5c30f6f5a4da2a4e92a7979a62b82",
"trace_cid": "ar://DNvcsLXJdhBoHgLwsKJS9int5AvAZa9eqtmMmhfisw3B",
"merkle_root": "0x3918e12adc0ba2dc7f09880f0f0723ca919bbffceb05ea8671bdcc265b46c330",
"arc_tx_hash": "0xead3f4e785dca05b68bfc084463496dc10bff1fe9701e67df5130aee91d568bb",
"schema": "rr-trace/3",
"paid_usdc": "0.01",
"gas_usdc": "0.000683"
}Anyone can verify the trace byte-for-byte
Pull the trace JSON from Irys → re-canonicalise (sorted keys, 6-dp floats, UTC) → SHA-256 → compare to the on-chain hash.
uv run python -m scripts.verify-receipt 4683 verdict : VERIFIED [OK] stored hash : 0xad75b6733d2e2797b3a5f04a12e8a919a2b5c30f6f5a4da2a4e92a7979a62b82 recomputed hash : <same> irys gateway : https://gateway.irys.xyz/DNvcsLXJdhBoHgLwsKJS9int5AvAZa9eqtmMmhfisw3BOpen this trace in the dashboard →
Or skip HTTP — call it as an MCP tool
ReasoningReceipt ships as a stdio MCP server. Drop this snippet into your claude_desktop_config.json and Claude calls the oracle directly. Four tools: get_price, verify_receipt, get_stats, get_calibration.
{
"mcpServers": {
"reasoning-receipt": {
"command": "node",
"args": ["<path-to-repo>/services/mcp/server.js"],
"env": { "RR_API_BASE": "https://api.rrtrace.xyz" }
}
}
}Unified Balance — the agent sees its USDC as one pool
The agent operator holds testnet USDC across multiple chains (Sepolia, Arc, Base, etc. — leftovers from the CCTP V2 demo). Rather than juggle per-chain balances, the agent uses Circle's 2026 App Kit Unified Balance SDK (@circle-fin/app-kit) to read all twelve testnet chain balances as one pool, and to spend from that pool in <500 ms via Gateway. Below is the actual response shape our services/app-kit/demo.ts script emits — no mock, no paraphrase.
# services/app-kit/demo.ts (TypeScript, runs under tsx)
import { AppKit } from "@circle-fin/app-kit"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.DEPLOYER_PRIVATE_KEY!).address
const kit = new AppKit()
const balances = await kit.unifiedBalance.getBalances({
token: "USDC",
sources: { address: account },
networkType: "testnet",
includePending: true,
})
# Returns:
{
"token": "USDC",
"totalConfirmedBalance": "0.000000",
"breakdown": [{
"depositor": "0x8939…0a64",
"breakdown": [
{ "chain": "Ethereum_Sepolia", "confirmedBalance": "0.000000" },
{ "chain": "Base_Sepolia", "confirmedBalance": "0.000000" },
{ "chain": "Arc_Testnet", "confirmedBalance": "0.000000" },
{ "chain": "Arbitrum_Sepolia", "confirmedBalance": "0.000000" },
…9 more testnet chains
]
}]
}Zero balances here are the expected first-run state: Unified Balance is gated by a Gateway deposit (kit.unifiedBalance.deposit()) — USDC sitting in a plain ERC-20 wallet doesn't show up until it's parked in Gateway. The SDK is wired in end-to-end; spend uses the same adapter shape we already use for CCTP V2.
Agent-to-agent commerce — paywalled MCP over x402
For agents in production (no local stdio access), the same four MCP tools are exposed as Circle x402 v2 paywalled HTTP endpoints. Pay $0.01 USDC per call, get the cached probability + trace pointer + Merkle root back. Any agent that already speaks x402 to /price speaks this with zero extra code.
# First call — server replies 402
curl -i https://api.rrtrace.xyz/mcp/v1/get_price/<market_id>
HTTP/1.1 402 Payment Required
{
"scheme": "x402",
"version": "2.0",
"network": "eip155:5042002",
"asset": "USDC",
"amount": "10000",
"extra": { "verifyingContract": "0x0077777d7EBA4688BDeF3E311b846F25870A19B9" }
}
# Sign EIP-3009 TransferWithAuthorization, retry
curl -H "X-Payment: <base64-signed-payload>" \
https://api.rrtrace.xyz/mcp/v1/get_price/<market_id>
→ 200 { probability, trace_hash, trace_cid, merkle_root, arc_tx_hash, ... }
# Same envelope for the audit endpoint
curl https://api.rrtrace.xyz/mcp/v1/audit/<receipt_id>