ReasoningReceipt ·oracle

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. Here's the exact HTTP dance the consumer goes through. No wallet required to read along — everything you need to verify a receipt is on this page.

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":     "2234620",
  "probability":   0.236000,
  "confidence":    0.650000,
  "claim":         "Will Sahith Theegala win the 2026 PGA Championship?…",
  "trace_hash":    "0x0b9cef06882260fe7594ec1b13f47250ea261059913759c4e2974885e0cc2a55",
  "trace_cid":     "ar://A87igp13bM6Eoam91kfK2thqkmXQX6hcqUb2jGYhuz72",
  "merkle_root":   "0xc6c5ce65de2c0b0e1109f96562a3b1c28673bbd2392958fe4921294abedcb1d3",
  "arc_tx_hash":   "0xce8a24340a27b6825e726280887ffb16a4dcefd68faddf07871c27e995e2e817",
  "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 2482
  verdict           : VERIFIED [OK]
  stored hash       : 0x0b9cef06882260fe7594ec1b13f47250ea261059913759c4e2974885e0cc2a55
  recomputed hash   : <same>
  irys gateway      : https://gateway.irys.xyz/A87igp13bM6Eoam91kfK2thqkmXQX6hcqUb2jGYhuz72
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" }
    }
  }
}