{"x402Version":1,"services":[{"$comment":"x402 service listing for Hunch partner trade. Submit to Bankr's x402 registry (Sprint B7). Values marked <…> are filled at go-live from prod env.","name":"hunch-partner-trade","title":"Hunch — place a prediction-market bet","description":"Discover and bet YES/NO on Hunch crypto prediction markets. Settles in USDC on Base.","version":"hunch-partner-api-v1","provider":{"name":"Hunch","url":"https://www.playhunch.xyz","contact":"https://www.playhunch.xyz"},"endpoint":{"method":"POST","url":"https://www.playhunch.xyz/api/partner/trade","discover":"https://www.playhunch.xyz/api/partner/discover","quote":"https://www.playhunch.xyz/api/partner/quote","catalogue":"https://www.playhunch.xyz/api/partner/catalogue","trending":"https://www.playhunch.xyz/api/partner/trending","positions":"https://www.playhunch.xyz/api/partner/positions?wallet={wallet}","result":"https://www.playhunch.xyz/api/partner/result?marketId={marketId}","proof":"https://www.playhunch.xyz/api/partner/proof/{tradeId}"},"payment":{"scheme":"exact","network":"base","asset":"USDC","assetAddress":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","payTo":"0x4F0d7622984b38DfB2D1F86F10eEE564566C09F2","minAmountUsd":1,"maxAmountUsd":9,"extra":{"name":"USD Coin","version":"2"}},"allowedOrigins":["https://www.playhunch.xyz"],"signingPolicy":{"$comment":"Pin-check EVERY x402 challenge against these values BEFORE signing. On any mismatch or missing field, ABORT — do not sign. A spoofed/compromised upstream must never redirect funds, swap the asset, or inflate the amount. Pin from here, not from the challenge.","requireScheme":"exact","requireAuthorization":"eip3009-transferWithAuthorization","pinned":{"network":"base","asset":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","payTo":"0x4F0d7622984b38DfB2D1F86F10eEE564566C09F2","resource":"https://www.playhunch.xyz/api/partner/trade","assetName":"USD Coin","assetVersion":"2"},"limits":{"maxAmountAtomic":"9000000","maxValiditySeconds":120},"preSignChecks":["accepts[0].scheme === requireScheme ('exact') — else abort.","accepts[0].network === pinned.network ('base') — else abort.","accepts[0].asset === pinned.asset (Base USDC) — else abort; never sign for any other token.","accepts[0].payTo === pinned.payTo — else abort; never sign a transfer to any other recipient.","accepts[0].resource === pinned.resource — else abort.","accepts[0].maxAmountRequired <= limits.maxAmountAtomic AND === the user-approved sizeUsd in atomic units — else abort; never sign a larger amount.","authorization is transferWithAuthorization ONLY — never approve(), permit(), permit2, increaseAllowance, or any unlimited/blanket allowance.","bound validBefore to <= now + limits.maxValiditySeconds; one authorization per idemKey.","if accepts[] is empty/ambiguous or any field is absent — abort."]},"request":{"contentType":"application/json","body":{"marketId":"string (from discover)","side":"yes | no","sizeUsd":"number 1..9","idemKey":"string (uuid; reuse on retry)","ref":"bankr","walletAddress":"0x… (paying wallet)","mentionId":"string (optional, attribution)"},"headers":{"X-PAYMENT":"base64 EIP-3009 transferWithAuthorization"}},"response":{"200":"{ receipt, txHash, explorerUrl, position, proofUrl }","402":"x402 payment requirements challenge","409":"idemKey reused for a different market/side (idempotency_conflict), or a same-key bet is mid-settlement (trade_in_progress)","422":"invalid size or missing field"},"attribution":{"refParam":"ref=bankr","positionKey":"bankr:<wallet>"}},{"name":"hunch-agent-trade","title":"Hunch — agent prediction-market betting (no size cap)","description":"Keyless prediction-market betting for autonomous agents. Discover, research, quote, simulate for $0, then settle real USDC bets on Base via x402 — $1 floor, no maximum. Winners are paid automatically on resolution.","version":"hunch-agent-api-v1","provider":{"name":"Hunch","url":"https://www.playhunch.xyz","contact":"https://www.playhunch.xyz"},"endpoint":{"method":"POST","url":"https://www.playhunch.xyz/api/agent/v1/trade","discover":"https://www.playhunch.xyz/api/agent/v1/discover","quote":"https://www.playhunch.xyz/api/agent/v1/quote","markets":"https://www.playhunch.xyz/api/agent/v1/markets","positions":"https://www.playhunch.xyz/api/agent/v1/positions?wallet={wallet}","result":"https://www.playhunch.xyz/api/agent/v1/result?marketId={marketId}","proof":"https://www.playhunch.xyz/api/agent/v1/proof/{tradeId}","readiness":"https://www.playhunch.xyz/api/agent/v1/wallet/{wallet}/readiness"},"payment":{"scheme":"exact","network":"base","asset":"USDC","assetAddress":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","payTo":"0x4F0d7622984b38DfB2D1F86F10eEE564566C09F2","minAmountUsd":1,"maxAmountUsd":null,"$comment":"maxAmountUsd null = NO product cap. The challenge maxAmountRequired equals the user-approved sizeUsd in atomic 6-decimal units — unbounded above the $1 floor.","extra":{"name":"USD Coin","version":"2"}},"allowedOrigins":["https://www.playhunch.xyz"],"signingPolicy":{"$comment":"Pin-check EVERY x402 challenge against these values BEFORE signing. On any mismatch or missing field, ABORT — do not sign. A spoofed/compromised upstream must never redirect funds, swap the asset, or inflate the amount. Pin from here, not from the challenge.","requireScheme":"exact","requireAuthorization":"eip3009-transferWithAuthorization","pinned":{"network":"base","asset":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","payTo":"0x4F0d7622984b38DfB2D1F86F10eEE564566C09F2","resource":"https://www.playhunch.xyz/api/agent/v1/trade#<intentHash>","assetName":"USD Coin","assetVersion":"2"},"limits":{"maxValiditySeconds":120},"preSignChecks":["accepts[0].scheme === requireScheme ('exact') — else abort.","accepts[0].network === pinned.network ('base') — else abort.","accepts[0].asset === pinned.asset (Base USDC) — else abort; never sign for any other token.","accepts[0].payTo === pinned.payTo — else abort; never sign a transfer to any other recipient.","accepts[0].resource must prefix-match 'https://www.playhunch.xyz/api/agent/v1/trade#' — the URL part is pinned; the fragment is the canonical trade-intent hash, which you MAY verify by recomputing it from your request body. Honest scope: EIP-3009 binds payer/amount/recipient plus a one-use nonce; marketId/side bind via the request body that travels with the payment, and the intentHash in the resource and receipt is an audit contract, NOT a cryptographic bind.","accepts[0].maxAmountRequired === the user-approved sizeUsd in atomic 6-decimal units — else abort; never sign a larger amount. There is NO upper cap on this rail; the floor is $1.","authorization is transferWithAuthorization ONLY — never approve(), permit(), permit2, increaseAllowance, or any unlimited/blanket allowance.","bound validBefore to <= now + limits.maxValiditySeconds; one authorization per idemKey.","if accepts[] is empty/ambiguous or any field is absent — abort."]}}]}