{"name":"Penny Engine M2M — Agent Outcome Guard","product":"Deterministic machine result contract verification","audience":"Automated agents with structured JSON results to check before continuing a workflow","problem":"A downstream agent needs a predictable PASS/FAIL result and a content integrity fingerprint for another step's JSON output.","paidUrl":"https://penny-paid-batch-production.up.railway.app/api/proof-gate","method":"POST","priceUsd":0.001,"network":"eip155:8453","currency":"USDC","freeDemo":"https://penny-paid-batch-production.up.railway.app/demo/proof-gate","payments":{"protocol":"x402","walletNeeded":"Buyer-managed x402-compatible wallet with Base USDC","requiredAction":"Inspect payment challenge, authorize a payment within policy, retry the exact same request with PAYMENT-SIGNATURE."},"integration":{"packages":["@coinbase/cdp-sdk","@x402/fetch"],"notes":"Example uses the Coinbase CDP client and explicit buyer spend caps. The caller owns and funds its wallet. Never supply credentials to Penny Engine."},"caveats":["Caller-provided JSON assertions only; not independent attestation of upstream task execution.","SHA-256 fingerprint is not a signed payment receipt.","No successful third-party settlement independently verified yet."],"exampleRequest":{"result":{"status":"completed","processed":5},"expectations":{"requiredPaths":["status"],"equals":{"status":"completed"},"numberRanges":{"processed":{"min":1}}}},"exampleCode":"import \"dotenv/config\";\nimport { CdpX402Client } from \"@coinbase/cdp-sdk/x402\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\n// Requires a buyer-controlled, funded CDP wallet and its credentials in environment variables.\nconst client = new CdpX402Client({\n  environment: \"production\",\n  spendControls: {\n    maxAmountPerPayment: { atomic: 1000n, asset: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" },\n    maxCumulativeSpend: { atomic: 10000n, asset: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" },\n    maxCumulativeSpendWindow: \"24h\",\n    allowedNetworks: [\"eip155:8453\"]\n  }\n});\nconst payFetch = wrapFetchWithPayment(fetch, client);\nconst payload = {\n  result: { status: \"completed\", processed: 5 },\n  expectations: { requiredPaths: [\"status\"], equals: { status: \"completed\" }, numberRanges: { processed: { min: 1 } } }\n};\nconst res = await payFetch(\"https://penny-paid-batch-production.up.railway.app/api/proof-gate\", {\n  method: \"POST\", headers: { \"content-type\": \"application/json\" },\n  body: JSON.stringify(payload)\n});\nif(!res.ok) throw new Error(\"Paid request failed HTTP \"+res.status);\nconsole.log(await res.json());"}