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.
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": "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"
}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/A87igp13bM6Eoam91kfK2thqkmXQX6hcqUb2jGYhuz72Open 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" }
}
}
}