{"openapi":"3.1.0","info":{"title":"Patch Guard Utility Portfolio API","version":"1.2.0","description":"Four x402-paid agent utilities: safe JSON Patch evaluation, multi-source crypto price consensus, normalized Polymarket movers, and deterministic JSON repair/canonicalization.","x-guidance":"Use POST /v1/patch-guard before applying an RFC 6902 patch; POST /v1/crypto-price-consensus for a source-transparent BTC, ETH, SOL, or USDC quote; POST /v1/polymarket-odds for normalized active-market odds or movers; and POST /v1/json-repair to clean and canonically hash machine-generated JSON. Send the documented JSON body, read the x402 PAYMENT-REQUIRED challenge, then retry with payment authorization."},"servers":[{"url":"https://patch-guard-api.me-e51.workers.dev"}],"paths":{"/v1/patch-guard":{"post":{"operationId":"guardJsonPatch","summary":"Atomically evaluate a JSON Patch","description":"Costs $0.01 USDC on Base via x402. Invalid request envelopes are not settled.","tags":["json-patch","validation"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["document","patch"],"additionalProperties":false,"properties":{"document":{"description":"The JSON value to patch. Maximum total request size is 64 KiB."},"patch":{"type":"array","maxItems":100,"description":"RFC 6902 operations, applied atomically to an isolated clone.","items":{"type":"object","required":["op","path"],"properties":{"op":{"type":"string","enum":["add","remove","replace","move","copy","test"]},"path":{"type":"string","description":"RFC 6901 JSON Pointer."},"from":{"type":"string","description":"Source pointer for move or copy."},"value":{"description":"Value for add, replace, or test."}}}},"protectedPaths":{"type":"array","maxItems":100,"items":{"type":"string"},"description":"Pointers that the patch may not mutate. Ancestor replacement is blocked too."},"schema":{"description":"Optional bounded JSON Schema subset evaluated against the patched result. References, regex-bearing, combinator, conditional, and unbounded-uniqueness keywords are rejected before billing.","oneOf":[{"type":"object"},{"type":"boolean"}]},"schemaDraft":{"type":"string","enum":["4","7","2019-09","2020-12"],"default":"2020-12"}}},"example":{"document":{"profile":{"name":"Ada","role":"reader"},"revision":7},"patch":[{"op":"test","path":"/revision","value":7},{"op":"replace","path":"/profile/role","value":"writer"},{"op":"replace","path":"/revision","value":8}],"protectedPaths":["/profile/name"],"schema":{"type":"object","required":["profile","revision"],"properties":{"profile":{"type":"object","required":["name","role"],"properties":{"name":{"type":"string"},"role":{"enum":["reader","writer"]}}},"revision":{"type":"integer","minimum":1}}}}}}},"responses":{"200":{"description":"Deterministic allow/deny verdict and reversible artifacts.","content":{"application/json":{"schema":{"type":"object","required":["verdict","atomic","patchValid","schemaValid","originalSha256","resultSha256","result","normalizedDiff","inversePatch","artifactsComplete","violations","limits"],"properties":{"verdict":{"type":"string","enum":["allow","deny"]},"atomic":{"type":"boolean","const":true},"patchValid":{"type":"boolean"},"schemaValid":{"type":["boolean","null"]},"originalSha256":{"type":"string"},"resultSha256":{"type":["string","null"]},"result":{},"normalizedDiff":{"type":["array","null"]},"inversePatch":{"type":["array","null"]},"artifactsComplete":{"type":"boolean"},"violations":{"type":"array"},"limits":{"type":"object"}}},"example":{"verdict":"allow","atomic":true,"patchValid":true,"schemaValid":true,"originalSha256":"sha256:...","resultSha256":"sha256:...","result":{"profile":{"name":"Ada","role":"writer"},"revision":8},"normalizedDiff":[{"op":"test","path":"/revision","value":7},{"op":"replace","path":"/revision","value":8},{"op":"test","path":"/profile/role","value":"reader"},{"op":"replace","path":"/profile/role","value":"writer"}],"inversePatch":[{"op":"test","path":"/revision","value":8},{"op":"replace","path":"/revision","value":7},{"op":"test","path":"/profile/role","value":"writer"},{"op":"replace","path":"/profile/role","value":"reader"}],"artifactsComplete":true,"violations":[],"limits":{"patchOperations":3,"protectedPaths":1,"schemaErrorsReturned":0}}}}},"400":{"description":"Malformed JSON or missing required request fields; payment is canceled."},"402":{"description":"Payment Required. Read PAYMENT-REQUIRED and retry with PAYMENT-SIGNATURE."},"413":{"description":"Input exceeds a documented limit; payment is canceled."},"422":{"description":"Unsupported request envelope or schema; payment is canceled."}}}},"/v1/crypto-price-consensus":{"post":{"operationId":"getCryptoPriceConsensus","summary":"Get multi-source crypto price consensus","description":"Fetches only fixed public CoinGecko, Coinbase, and Kraken routes; returns a median when at least two sources agree on availability. Costs $0.001 USDC on Base via x402.","tags":["agent-utilities"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["assets"],"additionalProperties":false,"properties":{"assets":{"type":"array","minItems":1,"maxItems":4,"uniqueItems":true,"items":{"type":"string","enum":["BTC","ETH","SOL","USDC"]}}}},"example":{"assets":["BTC","ETH","SOL"]}}}},"responses":{"200":{"description":"Successful utility result.","content":{"application/json":{"schema":{"type":"object","required":["asOf","quoteCurrency","methodology","assets","unavailableAssets"],"properties":{"asOf":{"type":"string"},"quoteCurrency":{"type":"string","const":"USD"},"methodology":{"type":"string"},"assets":{"type":"array","items":{"type":"object","required":["asset","consensusUsd","minimumUsd","maximumUsd","spreadBps","sourceCount","quotes"],"properties":{"asset":{"type":"string"},"consensusUsd":{"type":"number"},"minimumUsd":{"type":"number"},"maximumUsd":{"type":"number"},"spreadBps":{"type":"number"},"sourceCount":{"type":"integer"},"quotes":{"type":"array","items":{"type":"object"}}}}},"unavailableAssets":{"type":"array","items":{"type":"string"}}}},"example":{"asOf":"2026-08-08T12:00:00.000Z","quoteCurrency":"USD","methodology":"Median of at least two independently fetched public spot-price sources.","assets":[{"asset":"BTC","consensusUsd":65080.12,"minimumUsd":65074,"maximumUsd":65083.15,"spreadBps":1.41,"sourceCount":3,"quotes":[{"source":"Coinbase","priceUsd":65083.15},{"source":"CoinGecko","priceUsd":65074},{"source":"Kraken","priceUsd":65078.9}]}],"unavailableAssets":[]}}}},"400":{"description":"Malformed JSON request."},"402":{"description":"Payment Required. Read PAYMENT-REQUIRED and retry with PAYMENT-SIGNATURE."},"413":{"description":"Input or output exceeds a documented limit."},"422":{"description":"Unsupported request envelope."},"503":{"description":"A required public upstream is temporarily unavailable."}}}},"/v1/polymarket-odds":{"post":{"operationId":"getPolymarketOdds","summary":"Get normalized Polymarket odds or movers","description":"Fetches fixed public Polymarket Gamma API routes and normalizes outcome token prices to probabilities totaling one. Costs $0.001 USDC on Base via x402.","tags":["agent-utilities"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"sort":{"type":"string","enum":["movers","volume"],"default":"movers"},"limit":{"type":"integer","minimum":1,"maximum":20,"default":10},"minVolume24hUsd":{"type":"number","minimum":0,"maximum":1000000000,"default":0}}},"example":{"sort":"movers","limit":10,"minVolume24hUsd":1000}}}},"responses":{"200":{"description":"Successful utility result.","content":{"application/json":{"schema":{"type":"object","required":["asOf","source","sort","methodology","markets"],"properties":{"asOf":{"type":"string"},"source":{"type":"string","const":"Polymarket Gamma API"},"sort":{"type":"string","enum":["movers","volume"]},"methodology":{"type":"string"},"markets":{"type":"array","items":{"type":"object","required":["id","slug","question","url","outcomes","rawProbabilitySum","change24hPercentagePoints","direction24h","volume24hUsd","liquidityUsd","endDate"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"question":{"type":"string"},"url":{"type":"string"},"outcomes":{"type":"array","items":{"type":"object"}},"rawProbabilitySum":{"type":"number"},"change24hPercentagePoints":{"type":["number","null"]},"direction24h":{"type":"string","enum":["down","flat","up","unknown"]},"volume24hUsd":{"type":["number","null"]},"liquidityUsd":{"type":["number","null"]},"endDate":{"type":["string","null"]}}}}}},"example":{"asOf":"2026-08-08T12:00:00.000Z","source":"Polymarket Gamma API","sort":"movers","methodology":"Outcome token prices are divided by their sum so returned probabilities total 1.","markets":[{"id":"12345","slug":"example-market","question":"Will the example happen?","url":"https://polymarket.com/event/example-market","outcomes":[{"name":"Yes","rawPrice":0.62,"probability":0.62},{"name":"No","rawPrice":0.38,"probability":0.38}],"rawProbabilitySum":1,"change24hPercentagePoints":4.5,"direction24h":"up","volume24hUsd":125000,"liquidityUsd":500000,"endDate":"2026-12-31T00:00:00Z"}]}}}},"400":{"description":"Malformed JSON request."},"402":{"description":"Payment Required. Read PAYMENT-REQUIRED and retry with PAYMENT-SIGNATURE."},"413":{"description":"Input or output exceeds a documented limit."},"422":{"description":"Unsupported request envelope."},"503":{"description":"A required public upstream is temporarily unavailable."}}}},"/v1/json-repair":{"post":{"operationId":"repairAndCanonicalizeJson","summary":"Repair and canonicalize bounded JSON","description":"Repairs common machine-generated JSON defects, emits compact valid JSON plus RFC 8785-style canonical JSON and its SHA-256 hash. Costs $0.001 USDC on Base via x402.","tags":["agent-utilities"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","minLength":1,"maxLength":49152,"description":"Valid or repairable JSON text, up to 48 KiB UTF-8."}}},"example":{"text":"{name: 'Ada', active: True,}"}}}},"responses":{"200":{"description":"Successful utility result.","content":{"application/json":{"schema":{"type":"object","required":["wasValidJson","repairApplied","repairedJson","canonicalJson","canonicalSha256","bytes"],"properties":{"wasValidJson":{"type":"boolean"},"repairApplied":{"type":"boolean"},"repairedJson":{"type":"string"},"canonicalJson":{"type":"string"},"canonicalSha256":{"type":"string"},"bytes":{"type":"object","required":["input","repaired","canonical"],"properties":{"input":{"type":"integer"},"repaired":{"type":"integer"},"canonical":{"type":"integer"}}}}},"example":{"wasValidJson":false,"repairApplied":true,"repairedJson":"{\"name\":\"Ada\",\"active\":true}","canonicalJson":"{\"active\":true,\"name\":\"Ada\"}","canonicalSha256":"sha256:...","bytes":{"input":28,"repaired":28,"canonical":28}}}}},"400":{"description":"Malformed JSON request."},"402":{"description":"Payment Required. Read PAYMENT-REQUIRED and retry with PAYMENT-SIGNATURE."},"413":{"description":"Input or output exceeds a documented limit."},"422":{"description":"Unsupported request envelope."},"503":{"description":"A required public upstream is temporarily unavailable."}}}}},"x-payment":{"protocol":"x402","prices":{"/v1/patch-guard":"$0.01","/v1/crypto-price-consensus":"$0.001","/v1/polymarket-odds":"$0.001","/v1/json-repair":"$0.001"},"network":"eip155:8453","asset":"USDC","payTo":"0x114b509efE2d5F6e438b840043EF1db4FcD36d42"}}