Paid-success proof

One buyer-safe paid 200 for POST /v1/action/authorize.

This URL is the sendable proof asset for the live x402 action-authorization path. It shows the direct Base recovery sequence and one final paid 200 JSON body with the exact fields a buyer asked to inspect: decision, policy.reasons, operator.step, and billing.

Recovery Path

The bounded x402 flow this proof covers

  1. Send POST /v1/action/authorize without an API key or payment header and receive 402 payment_required.
  2. Decode payment-required and replay the same body with payment-signature.
  3. Receive the final paid 200 response below with decision, policy, operator, routing, and billing state.

Final JSON

One shipped Base paid-success body

Scenario

Deterministic approval request on Base that triggers a hard deny after payment because the approval scope is effectively open-ended and the counterparty lands in the critical risk band. This is buyer-safe proof of the paid-success shape, not a redacted mock.

{
  "mode": "action_authorize",
  "authorizationId": "auth_32e02037073e",
  "decision": "deny",
  "action": {
    "version": "bankr-preflight-v1",
    "kind": "approval",
    "chain": "base",
    "actor": "0x1111111111111111111111111111111111111111",
    "targetAddress": "0x222222222222222222222222222222222222222c",
    "amountUsd": 2500,
    "metadata": {
      "tokenAddress": "0x3333333333333333333333333333333333333333",
      "allowanceUsd": 25000,
      "approvalScope": "unlimited"
    }
  },
  "requestContext": {
    "intentId": "intent_x402_recovery",
    "sessionId": "sess_demo"
  },
  "txriskRequest": {
    "walletAddress": "0x222222222222222222222222222222222222222c",
    "chainId": 8453,
    "exposureUsd": 25000,
    "signalWindowHours": 24
  },
  "txrisk": {
    "walletAddress": "0x222222222222222222222222222222222222222c",
    "chainId": 8453,
    "riskScore": 90,
    "riskBand": "critical",
    "topDrivers": [
      { "code": "volume_spike", "impact": 0.35 },
      { "code": "counterparty_concentration", "impact": 0.31 },
      { "code": "entity_proximity", "impact": 0.19 }
    ],
    "watchFlags": ["sanctions_proximity", "contract_exploit_cluster"],
    "asOf": "2026-03-24T00:00:00.000Z",
    "traceId": "risk_bdf4456554be"
  },
  "policy": {
    "profile": "operator_guard_v1",
    "decisionSource": "txrisk_action_policy",
    "reasons": [
      "counterparty risk band=critical score=90",
      "watch flags: sanctions_proximity, contract_exploit_cluster",
      "approval is effectively open-ended or above prototype allowance threshold"
    ],
    "chargedOnDecision": true
  },
  "operator": {
    "step": "deny_and_rewrite_action",
    "recoveryHint": "Reduce approval scope or counterparty risk before retrying authorization."
  },
  "routing": {
    "chain": "base",
    "chainId": 8453,
    "explorerUrl": "https://basescan.org",
    "recipientWalletAddress": "0x1111111111111111111111111111111111111111"
  },
  "billing": {
    "charged_usdc": "0.0020",
    "remaining_balance_usdc": "0.0000",
    "settlement_mode": "direct_transfer",
    "settlement_reference": {
      "mode": "x402_exact_local",
      "network": "eip155:8453",
      "resource": "/v1/action/authorize"
    }
  }
}

Reading Guide

What to inspect in the paid response

decision

The final policy result. In this proof the paid request lands on deny, which makes the response legible even before a buyer studies the lower-level risk data.

policy.reasons

The concise explanation block. It shows the critical risk band, the watch flags that drove the result, and the approval-scope reason that pushed the request over the threshold.

operator.step

The caller handoff. Here it resolves to deny_and_rewrite_action, which means the action should be changed before retry rather than queued for approval.

billing

The paid-proof block. It shows the admitted charge amount, the remaining balance state, and the settlement reference that ties the response back to the exact x402-protected resource.

Operator Use

How to reuse this proof fast

Sendable buyer path

  • Share this page when someone asks for the final paid 200 shape.
  • Send the field explainer when they want more context on each response block.
  • Send the live evaluator when they want to run the same lane in-browser.

CLI reproduction

  • Start with /docs/ for the copy-paste flow.
  • Run the unpaid call once, decode payment-required, then replay with payment-signature.
  • Confirm the final body includes decision, policy.reasons, operator.step, and billing.