Paid-success proof

One buyer-safe paid 200 for the hosted Wallet Action Preflight API.

This URL is the sendable proof asset for the hosted Bankr preflight lane at https://x402.bankr.bot/0xc04d0d464752a58b046105b45089d579eaf54036/bankr-preflight. It shows the live Base 402 to paid retry path and one final paid 200 JSON body with the exact fields buyers asked to inspect: decision, policy.reasons, operator.step, and billing. The direct POST /v1/action/authorize contract remains underneath as the labeled fallback path, but the hosted wrapper is now the primary buyer story.

Recovery Path

The bounded x402 flow this proof covers

  1. Send one transfer or approval action to the hosted Bankr route and receive 402 payment_required on the first unpaid attempt.
  2. Complete the quoted Base settlement and retry through the same hosted wrapper path.
  3. Receive the final paid 200 response below with decision, policy, operator, routing, and billing state.

Fallback reference

The same decision language is backed by the broader TXRISK direct contract on POST /v1/action/authorize. Keep that route for fallback or deeper reference, but lead buyer reviews with the hosted preflight URL above.

Final JSON

One shipped Base paid-success body

Scenario

Deterministic hosted approval preflight 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 the hosted wrapper returns, not a redacted mock.

{
  "mode": "action_authorize",
  "authorizationId": "auth_32e02037073e",
  "decision": "deny",
  "action": {
    "version": "bankr-preflight-v1",
    "kind": "approval",
    "chain": "base",
    "actor": "0x1111111111111111111111111111111111111111",
    "targetAddress": "0x2222222222222222222222222222222222222222",
    "amountUsd": 2500,
    "metadata": {
      "tokenAddress": "0x3333333333333333333333333333333333333333",
      "allowanceUsd": 25000,
      "approvalScope": "unlimited"
    }
  },
  "requestContext": {
    "intentId": "intent_x402_recovery",
    "sessionId": "sess_demo"
  },
  "txriskRequest": {
    "walletAddress": "0x2222222222222222222222222222222222222222",
    "chainId": 8453,
    "exposureUsd": 25000,
    "signalWindowHours": 24
  },
  "txrisk": {
    "walletAddress": "0x2222222222222222222222222222222222222222",
    "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": "verified_settlement_receipt",
      "network": "eip155:8453",
      "resource": "/v1/action/authorize",
      "settlement_id": "set_example_verified"
    }
  }
}

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 from the hosted Wallet Action Preflight API.
  • Send the response guide when they want the hosted field map and fallback explanation.
  • Send the quickstart when they want the exact hosted Bankr URL and retry order.

Fallback and deeper reproduction

  • Start with /docs/ for the hosted copy-paste flow.
  • Open the browser playground when you need to inspect the broader direct TXRISK routes after the hosted proof.
  • Use POST /v1/action/authorize only as the labeled fallback/reference lane, and confirm the final body still includes decision, policy.reasons, operator.step, and billing.