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.
Paid-success proof
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 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
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
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.
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.
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.
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