Before prepare_x402_payment returns VOUCHER_ISSUED, the backend runs the spend through policy, risk, compliance, and credit. A deny returns POLICY_DECISION_DENIED (or a more specific code) and no voucher. Nothing in this pipeline produces a signature over the agent’s payment. The agent signs the voucher. SohoPay later attests the settlement batch with a hardware-backed key.

What is checked

  • The agent grant is ACTIVE, and the payment fits its merchant, per-payment, daily, and lifetime limits.
  • The borrower has facility headroom. A reservation holds that headroom from voucher issue until capture or expiry, so two prepares cannot spend the same dollar.
  • The draw fits the borrower’s available facility and policy limits.
  • The borrower’s wallet passes sanctions screening.
  • Merchant familiarity. A first payment to a new merchant can deny with RISK_FIRST_TIME_MERCHANT. On an HTTP 402, retry the same order and the same idempotency key. That retry is the acceptance. Other denials are a stop.
  • The merchant is eligible to be paid. The chain still requires ACTIVE in the registry at settleBatch, which the off-chain check does not replace.
get_context reports what is likely allowed. Prepare rechecks. A context payload that says the agent can pay is not a voucher.

Facilitator throttles

These are separate from spend policy. Each merchant is limited to 120 verifies per minute and 30 captures per minute.

Next steps

Errors

How denials are labeled.

Borrower responsibility

Who authorized the limits policy enforces.