Free · before the signature

The check before the signature.

One call for any x402 payment request or chain transaction. It returns PASS / CAUTION / BLOCK, the reasons, the checks that actually ran, and a short-lived receipt bound to the exact intent — so an executor can refuse to sign without one.

Free · no payment Payments on EVM + Solana Fail-closed

Two intents, one verdict

Payments and transactions are the same question.

“If I sign this, what will the chain do — and is that what I think it is?” The gate answers the part that is measurable at a block, and names the part that is not.

Intent · payment

Validate the 402 before you pay it.

Checks the scheme, CAIP-2 network, canonical USDC asset, raw amount, payTo, resource URL, timeout and authorization window. On EVM it also reads the payer's USDC balance. A swapped payTo or a lookalike asset is exactly the failure this catches.

Intent · transaction

Simulate the call, decode the calldata.

Decodes transfer, approve, transferFrom, permit, and common V2/V3 swap selectors. Checks unlimited approvals, spenders, swap deadlines, zero minimum output and the output recipient. Then simulates the call from your wallet at the current block. EVM only today (Ethereum, Arbitrum, Base).

What it answers

Three verdicts, because two would lie.

VerdictMeaningWhat an agent should do
PASSEvery check in checked passed at this fresh pinned block. On EVM, >30s is CAUTION and >120s is BLOCK.Proceed. Still read notChecked.
CAUTIONA check needs a decision: an unvetted spender, a non-canonical asset, unknown calldata, no from to simulate.Surface the reasons to the operator. Sign only with explicit acknowledgement.
BLOCKA hard check failed: a revert, a wrong asset, an expired authorization, a non-contract target, an allowlist mismatch.Do not sign. Change the transaction, not the gate.

Fail-closed is part of the contract

If the chain cannot be read, the gate returns 503 and issues no receipt. An executor should refuse to sign without a verifiable receipt — a fast wrong answer is worse than a slow honest one.

01 · Payment

Check the 402 challenge.

Pass the challenge as your agent received it. from is optional, but supplying it enables the balance check and makes the verdict stronger.

Request

curl -X POST https://verify402.onrender.com/preflight \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "payment",
    "from": "0xYourWallet",
    "payment": {
      "scheme": "exact",
      "network": "eip155:8453",
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "amount": "10000",
      "payTo": "0xAeEF086DD4e436c69d6d0F684b4c9F43392df9cb",
      "resource": "https://verify402.onrender.com/verify",
      "maxTimeoutSeconds": 60
    },
    "policy": { "maxAmountUsd": 0.25 }
  }'

Response · abbreviated

{
  "verdict": "PASS",
  "sign_allowed": true,
  "requires_ack": false,
  "reasons": [],
  "checked": ["scheme", "network", "asset", "amount", "payee", "resource", "payer_balance", "block_freshness"],
  "notChecked": ["recipient reputation", "sanctions screening", "payment signature / signed payload", "facilitator settlement", "off-chain promises", "counterparty identity / tool metadata", "prompt injection / hidden Unicode in tool output"],
  "receipt": {
    "spec": "verify402/preflight-receipt@1",
    "intentHash": "…",
    "blockNumber": 48277717,
    "expiresAt": "2026-10-19T…Z",
    "signature": "…"
  }
}

02 · Transaction

Check the calldata and the simulation.

EVM only today (Ethereum, Arbitrum, Base). If from is present, the gate simulates the call at the current block. Without it, simulation is skipped and the verdict is at most CAUTION — because a call from the zero address proves nothing.

Request

POST /preflight
{
  "kind": "transaction",
  "chainId": 8453,
  "from": "0xYourWallet",
  "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "data": "0x095ea7b3…",
  "value": "0",
  "policy": {
    "forbidUnlimitedApproval": true,
    "allowedSpenders": ["0x…"]
  }
}

Decoded actions: transfer, approve, transferFrom, permit, Uniswap V2 exact-in and V3 exactInputSingle. Unrecognized selectors are a CAUTION, never a silent pass.

The honesty boundary

Checked, and deliberately not checked.

CheckedNot checked
Network, asset, amount, payee, resource, timeout, authorization window Whether the recipient is a scammer or a sanctioned address
EVM block freshness: >30s CAUTION, >120s BLOCK Gas price/limit chosen by the signer; raw signed-transaction binding
Payment request fields and authorization window Payment signature/signed payload; facilitator settlement
Canonical USDC and a sane raw amount; payer balance on EVM mainnet Contract audits, proxy upgrades, owner privileges
Calldata decode, contract bytecode, and a eth_call simulation Full balance-delta / state-change simulation
Unlimited approvals, spender allowlists, swap deadline, minimum output, output recipient MEV, sandwich protection, route quality beyond the decoded minimum
Receipt integrity: HMAC, intent hash, block, expiry Counterparty identity, tool metadata, hidden Unicode / prompt injection in tool output, or off-chain promises: “the seller will deliver after you pay”

A PASS means the left column passed at that fresh block. A block with no timestamp is a 503, not a pass. It is not a guarantee that the transaction will execute, settle, or be honest, and it is not a counterparty audit or prompt-injection filter. The right column is named on every response so nobody has to infer it.

Receipts

A receipt an executor can actually check.

Every response carries a short-lived HMAC-signed receipt. The intent hash binds the exact normalized request; the fresh block pins the chain state; the expiry bounds reuse.

01

Call the gate

One request, one verdict, reasons and a receipt. Free, rate-limited, and fail-closed.

02

Verify the receipt

POST /preflight/verify recomputes the HMAC and checks the expiry. No chain call.

03

Sign or refuse

An executor should require sign_allowed. A CAUTION is an explicit decision, not a pass. Reference guard. Put the gate in an agent with the MCP server.

Why is the gate free?

Because it has to be in the path before every signature. A toll booth there would be a tax on safety. The deep measurements — /verify, /safety, /route, /quotecheck, /depth — remain paid. The gate is the front door, not a replacement for them.