{"demo":true,"note":"Free fixed fixtures — no live probe. Paid: POST /x402/check","disclaimer":"SpendGuard is a fast, cheap pre-payment honesty check for x402 resources. It is not a substitute for post-payment verification or ongoing monitoring.","good":{"score":80,"verdict":"allow","signals":[{"id":"http_402_present","value":true,"weight":0,"gate":true,"detail":"Resource returned HTTP 402 Payment Required","hard_fail":false},{"id":"payment_requirements_valid","value":true,"weight":0,"gate":true,"detail":"Valid requirements: network=base payTo=0x7e05d79f914fdac136812af82d304e8272b3dc20 amount_usd=0.005","hard_fail":false},{"id":"payto_matches_input","value":true,"weight":0,"gate":true,"detail":"payTo matches 0x7e05d79f914fdac136812af82d304e8272b3dc20","hard_fail":false},{"id":"amount_vs_budget","value":{"amount_usd":0.005,"expected_max_usd":0.01},"weight":0,"gate":true,"detail":"amount $0.005 ≤ budget $0.01","hard_fail":false},{"id":"https_used","value":true,"weight":10,"soft":true,"detail":"Resource URL uses https","hard_fail":false},{"id":"latency_ok","value":120,"weight":10,"soft":true,"detail":"Probe latency 120ms < 2000ms","hard_fail":false},{"id":"amount_sanity","value":null,"weight":0,"soft":true,"detail":"Omitted — caller supplied expectedMaxUsd (amount_vs_budget gate applies)","hard_fail":false},{"id":"expiry_present","value":60,"weight":10,"soft":true,"detail":"Challenge carries timeout/expiry (60s)","hard_fail":false}],"summary":"ALLOW (score 80). Resource presents a valid x402 challenge (payTo 0x7e05d79f914fdac136812af82d304e8272b3dc20). Pre-filter only — not a substitute for post-payment verification.","resource":"https://example-good.invalid/x402/demo","payTo":"0x7e05d79f914fdac136812af82d304e8272b3dc20","network":"base","checked_at":"2026-08-09T19:08:28.653Z","cache":"miss","latency_ms":120,"demo":true,"fixture":"good"},"bad":{"score":70,"verdict":"block","signals":[{"id":"http_402_present","value":false,"weight":0,"gate":true,"detail":"HTTP 200 without valid x402 challenge","hard_fail":true},{"id":"payment_requirements_valid","value":false,"weight":0,"gate":true,"detail":"Skipped — no 402 body to parse","hard_fail":false},{"id":"payto_matches_input","value":false,"weight":0,"gate":true,"detail":"mismatch: input 0x7e05d79f914fdac136812af82d304e8272b3dc20 vs challenge (none)","hard_fail":true},{"id":"amount_vs_budget","value":{"amount_usd":null,"expected_max_usd":0.01},"weight":0,"gate":true,"detail":"Skipped — no challenge amount to compare","hard_fail":false},{"id":"https_used","value":true,"weight":10,"soft":true,"detail":"Resource URL uses https","hard_fail":false},{"id":"latency_ok","value":40,"weight":10,"soft":true,"detail":"Probe latency 40ms < 2000ms","hard_fail":false},{"id":"amount_sanity","value":null,"weight":0,"soft":true,"detail":"Omitted — caller supplied expectedMaxUsd (amount_vs_budget gate applies)","hard_fail":false},{"id":"expiry_present","value":null,"weight":0,"soft":true,"detail":"Skipped — no accept object","hard_fail":false}],"summary":"BLOCK (score 70). Gate fail: http_402_present, payto_matches_input. SpendGuard is a cheap pre-payment honesty check — not post-payment verification.","resource":"https://example-bad.invalid/no-paywall","payTo":null,"network":"base","checked_at":"2026-08-09T19:08:28.653Z","cache":"miss","latency_ms":40,"demo":true,"fixture":"bad"}}