RReasoningReceiptlive →

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.

1

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"
  }
}
2

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, v
3

Consumer 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"
}
4

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/DNvcsLXJdhBoHgLwsKJS9int5AvAZa9eqtmMmhfisw3B
Open 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>