{"ok":true,"tool":"x402-quote-fingerprint-guard","module_version":"0.1.0","result":{"slug":"x402-quote-fingerprint-guard","name":"x402 Quote Fingerprint Guard","version":"0.1.0","category":"coordination","status":"beta","mode":"atomic","summary":"Bind one normalized x402 quote to an opaque retry identity.","description":"Prevents a retry workflow from silently accepting changed payment terms. Bind stores only a normalized quote fingerprint and timestamp; check compares a supplied quote without revealing the original terms.","when_to_use":["A retry identity must stay bound to the first normalized x402 quote.","Agents need a shared, expiring check against silent payment-term drift."],"do_not_use_when":["The quote itself must be retained, signed, paid, or recovered later.","A durable financial ledger or permanent binding is required."],"tested_with":["Valkey 8","x402 v2 requirement snapshots"],"input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"namespace":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[A-Za-z0-9._:-]+$"},"retry_key":{"type":"string","minLength":1,"maxLength":256},"quote":{"type":"object","properties":{"scheme":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9._:/-]+$"},"network":{"type":"string","minLength":3,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"asset":{"type":"string","minLength":1,"maxLength":128},"amount_atomic":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"pay_to":{"type":"string","minLength":1,"maxLength":256},"resource":{"type":"string","maxLength":2048,"format":"uri"},"extensions":{"default":[],"maxItems":32,"type":"array","items":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9._:/-]+$"}}},"required":["scheme","network","asset","amount_atomic","pay_to","resource","extensions"],"additionalProperties":false},"ttl_seconds":{"type":"integer","minimum":60,"maximum":86400},"action":{"type":"string","const":"bind"}},"required":["namespace","retry_key","quote","ttl_seconds","action"],"additionalProperties":false},{"type":"object","properties":{"namespace":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[A-Za-z0-9._:-]+$"},"retry_key":{"type":"string","minLength":1,"maxLength":256},"quote":{"type":"object","properties":{"scheme":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9._:/-]+$"},"network":{"type":"string","minLength":3,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"asset":{"type":"string","minLength":1,"maxLength":128},"amount_atomic":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"pay_to":{"type":"string","minLength":1,"maxLength":256},"resource":{"type":"string","maxLength":2048,"format":"uri"},"extensions":{"default":[],"maxItems":32,"type":"array","items":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9._:/-]+$"}}},"required":["scheme","network","asset","amount_atomic","pay_to","resource","extensions"],"additionalProperties":false},"action":{"type":"string","const":"check"}},"required":["namespace","retry_key","quote","action"],"additionalProperties":false}]},"output_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"guard_hash":{"type":"string"},"bound":{"type":"boolean"},"newly_bound":{"type":"boolean"},"matches":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"supplied_fingerprint":{"type":"string"},"bound_fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}]},"bound_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"ttl_seconds_remaining":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["guard_hash","bound","newly_bound","matches","supplied_fingerprint","bound_fingerprint","bound_at","expires_at","ttl_seconds_remaining"],"additionalProperties":false},"payment":{"kind":"free"},"side_effects":["Bind creates one temporary quote-fingerprint guard when absent."],"retention":"Only derived namespace/retry-key and quote fingerprints plus a timestamp remain in Valkey until expiry. Raw commercial terms are not stored.","limits":{"min_ttl_seconds":60,"max_ttl_seconds":86400,"max_extensions":32,"max_client_requests_per_minute":30,"max_global_requests_per_minute":120},"examples":{"input":{"action":"bind","namespace":"checkout","retry_key":"attempt-42","quote":{"scheme":"exact","network":"eip155:8453","asset":"USDC","amount_atomic":"1000","pay_to":"0x1111111111111111111111111111111111111111","resource":"https://api.example.invalid/job","extensions":["payment-identifier"]},"ttl_seconds":300},"output":{"guard_hash":"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","bound":true,"newly_bound":true,"matches":true,"supplied_fingerprint":"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","bound_fingerprint":"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","bound_at":"2026-07-25T00:00:00.000Z","expires_at":"2026-07-25T00:05:00.000Z","ttl_seconds_remaining":300},"negative":[{"scenario":"The quote itself must be retained, signed, paid, or recovered later.","expected_error":"INVALID_INPUT","charged":false}]},"execution":{"errors":[{"code":"INVALID_INPUT","retryable":false,"charged":false,"recovery":"Correct the request to match input_schema."},{"code":"TOOL_PAUSED","retryable":true,"charged":false,"recovery":"Wait for the operator to resume the tool."},{"code":"RATE_LIMITED","retryable":true,"charged":false,"recovery":"Retry after the response Retry-After interval."},{"code":"DEPENDENCY_UNAVAILABLE","retryable":true,"charged":false,"recovery":"Retry with the same idempotency identity."}],"idempotency":{"required":true,"mock_or_unpaid_header":"Idempotency-Key","x402_extension":null,"replay_retention":"up to 24 hours"}},"endpoints":{"describe":"/v1/tools/x402-quote-fingerprint-guard","execute":"/v1/tools/x402-quote-fingerprint-guard"}},"meta":{"request_id":"req_d76f2cc9748e497c802b951aac113874","observed_at":"2026-07-25T08:24:07.777Z"}}