Your AI agent pays.You keep signed proof.
Behest checks each purchase against a mandate you signed, pays through PayPal only inside it, and signs a receipt any seller can verify.
Spice gift box
Held because $40.00 is over your $25.00 approval limit. You approved it at PayPal, and it was paid.
- Confirmed by your signed-in session
The intent check compares the cart with the request and can only tighten the gate's verdict. Here it left the verdict as the gate set it: ask you.
- You, at PayPal
Signed receipt compact JWS
Headerdecoded {"alg": "EdDSA","kid": "0f8b1e11fba284ed","typ": "behest-receipt+jws"}Payloaddecoded {"cart": {"currency": "USD","hash": "3e1f36b25205762ebfbf6cd97cec52948297a3d65e4e9df56edaa1c2054b8e4c","itemCount": 1,"totalCents": 4000},"decision": {"approver": "human","outcomes": [{ "result": "pass", "rule": "mandate_active" },{ "result": "pass", "rule": "cart_valid" },{ "result": "pass", "rule": "category_allowed" },{ "result": "pass", "rule": "seller_allowed" },{ "result": "pass", "rule": "listing_clean" },{ "result": "pass", "rule": "per_purchase_max" },{ "result": "pass", "rule": "budget_remaining" },{ "result": "pass", "rule": "velocity" },{ "result": "ask", "rule": "ask_threshold" },{ "result": "skip", "rule": "price_benchmark" },{ "result": "pass", "rule": "quantity" },{ "result": "pass", "rule": "wallet_linked" }],"purchaseId": "b7d2f0c4-1e2a-4c55-8d0e-6a9f3b1c2d4e","rulesetVersion": "gate-v1","verdict": "ASK"},"iat": 1794060131,"id": "0f8e6a1c-52d4-4f27-9a3b-7c1de0b4e21b","iss": "behest","mandate": {"id": "5c1e9a7d-3b2f-4e61-9d08-2a7f4c6b1e30","jwsHash": "89caaae3db8501043b5668ccd6ee0f720a1921a2bb1a1bfaa8fae68e4cac1472","policyHash": "d04343f7f764dcf16ac1f2fb0d7310e7ba950f3fdcebaa1dcf9083b16cdcbc10"},"payment": {"amountCents": 4000,"captureId": "3GG27975UR7654321","capturedAt": "2026-11-07T14:02:11.000Z","orderId": "8MC58745YK1234567","processor": "paypal"},"seller": { "slug": "ravi-spices" },"v": 1}SignatureEdDSA
01
Every purchase takes five steps.Each one leaves proof.
- 01
Mandate
“$60 a month on groceries and spices, ask me above $25, never electronics”
You say what your agent may buy in plain words. Code reads the policy back to you, and Behest signs it when you confirm.
- 02
Gate
Twelve deterministic rules check every cart against the signed policy. No model takes part.
- 03
Intent check
- becomeswhen the check finds consistent
- becomeswhen the check finds needs_human
- becomeswhen the check finds inconsistent
Claude compares the cart with what you asked for. It can move a verdict toward you, never away.
- 04
PayPal
Charged to your saved PayPal wallet
Spice gift box$40.00An allowed purchase is charged to your saved PayPal wallet. One that needs you waits until you approve it at PayPal.
- 05
Receipt
Behest signs an Ed25519 receipt binding the mandate, the cart, every rule result and the capture. The seller verifies it.
02
We attacked it the wayagents get attacked.
- Attacks replayed against every layer
- 8
- Stopped in the live run, out of 8
- 7
- Model calls in the live run
- 38
- What the live run cost, estimated
- $0.31
In January 2026, researchers showed that a few sentences in a product listing steer shopping agents built on Google's Agent Payments Protocol, even with a signed mandate. Behest replays that attack against each of its layers and publishes what each one did, including what got through.
See every attack, layer by layerThe gate decides.
Allow, ask or block comes from plain TypeScript rules. No model can approve a purchase.
Models only tighten.
The intent check can turn allow into ask or block, never the reverse. A check that cannot run sends the purchase to you.
Outside text is quoted data.
Listings, search results and market prices reach a model only inside quoted blocks, and a listing that addresses AI agents is hidden from them.
Retries never double charge.
Every PayPal call that moves money carries a request id made from the purchase, so PayPal answers a repeat with the first result.
03
Every step that moves moneyruns through PayPal.
Behest is the merchant of record: a saved wallet can only pay the business that saved it, so Behest takes the payment and pays the seller out.
Vault v3 saved wallets
- Mandate signedsetup token created
- Approved at PayPalby the buyer, once
- Wallet savedpayment token
- Charged, no clickvault_id
The buyer saves their PayPal wallet once, with no purchase, while signing the mandate. Allowed purchases charge it with no click.
Orders v2
Creates and captures every order: charged to the saved wallet when allowed, approved by the buyer at PayPal when held.
Payouts
Pays the seller once it has verified the receipt and accepted the order, and polls the payout until PayPal settles it.
Refunds
refund $40.00capture 3GG2...4321
request id b7d2f0c4...:refund
Refunds the buyer from Behest’s capture when a seller rejects the order, once, under the purchase’s own request id.
Disputes with evidence
- mandate
- readback
- receipt
- cart
- decision
- purchase_log
- approval
- tracking
Matches each dispute to its purchase and answers it with the operator’s reviewed narrative, citing these evidence items.
Webhooks
- CHECKOUT.ORDER.APPROVED
- PAYMENT.CAPTURE.COMPLETED
- PAYMENT.CAPTURE.DENIED
- PAYMENT.CAPTURE.REFUNDED
- PAYMENT.CAPTURE.REVERSED
- CUSTOMER.DISPUTE.CREATED
- CUSTOMER.DISPUTE.UPDATED
- CUSTOMER.DISPUTE.RESOLVED
- PAYMENT.PAYOUTS-ITEM.SUCCEEDED
- PAYMENT.PAYOUTS-ITEM.FAILED
Acts on an order, capture, refund, payout or dispute event only after PayPal confirms its signature.
Agent Toolkit, read only
- list_disputes
- get_dispute
- get_order
- get_shipment_tracking
Gives the dispute evidence agent these four tools and no other.
04
Every paid purchasegets a signed receipt.
This is the sample purchase's receipt, decoded. A seller checks it before accepting the order; so can anyone else.
How a seller verifies it
- 1Fetch Behest's public keys from
/.well-known/jwks.json. - 2Check the Ed25519 signature with the key the header names, and that the type is
behest-receipt+jws. - 3Compare the cart hash and the amount with the order received, and the seller with yourself.
- 4Or post the receipt, the cart and your seller slug to
/api/receipts/verify. It answers with the payload, or with the check that failed.
Signed receipt compact JWS
- $40.00
- The buyer, at PayPal
human ravi-spices
{"alg": "EdDSA","kid": "0f8b1e11fba284ed","typ": "behest-receipt+jws"}{"cart": {"currency": "USD","hash": "3e1f36b25205762ebfbf6cd97cec52948297a3d65e4e9df56edaa1c2054b8e4c","itemCount": 1,"totalCents": 4000},"decision": {"approver": "human","outcomes": [{ "result": "pass", "rule": "mandate_active" },{ "result": "pass", "rule": "cart_valid" },{ "result": "pass", "rule": "category_allowed" },{ "result": "pass", "rule": "seller_allowed" },{ "result": "pass", "rule": "listing_clean" },{ "result": "pass", "rule": "per_purchase_max" },{ "result": "pass", "rule": "budget_remaining" },{ "result": "pass", "rule": "velocity" },{ "result": "ask", "rule": "ask_threshold" },{ "result": "skip", "rule": "price_benchmark" },{ "result": "pass", "rule": "quantity" },{ "result": "pass", "rule": "wallet_linked" }],"purchaseId": "b7d2f0c4-1e2a-4c55-8d0e-6a9f3b1c2d4e","rulesetVersion": "gate-v1","verdict": "ASK"},"iat": 1794060131,"id": "0f8e6a1c-52d4-4f27-9a3b-7c1de0b4e21b","iss": "behest","mandate": {"id": "5c1e9a7d-3b2f-4e61-9d08-2a7f4c6b1e30","jwsHash": "89caaae3db8501043b5668ccd6ee0f720a1921a2bb1a1bfaa8fae68e4cac1472","policyHash": "d04343f7f764dcf16ac1f2fb0d7310e7ba950f3fdcebaa1dcf9083b16cdcbc10"},"payment": {"amountCents": 4000,"captureId": "3GG27975UR7654321","capturedAt": "2026-11-07T14:02:11.000Z","orderId": "8MC58745YK1234567","processor": "paypal"},"seller": { "slug": "ravi-spices" },"v": 1}05
Fair questions.Straight answers.
- Only in passing. A saved PayPal wallet can only pay the business that saved it, so Behest is the merchant of record: each purchase is paid into Behest’s PayPal account, and Behest pays the seller through Payouts once the seller verifies the receipt and accepts the order, or refunds you if they reject it. This demo runs on the PayPal sandbox, so no real money moves.
- Without one, your signed-in session confirms the mandate. With one, your passkey signs the mandate’s policy and readback hashes with you present, and the signed mandate names that passkey and its public key, so anyone can check the signature from the mandate alone, without trusting Behest.
- Nothing is bought that you did not allow. The gate is plain code and needs no model. If the intent check cannot run, or hits its spending cap, the purchase comes to you for approval. If the shopping agent cannot run, it stops and buys nothing, and if the mandate compiler fails, nothing is signed.
- No. Receipts are signed with Behest’s Ed25519 key, which no seller has, and the signature covers the cart hash, the amount, the seller and every rule result. Change any of it and the signature no longer verifies against the public keys at /.well-known/jwks.json. Each receipt is also accepted once, so a replay is refused.
- Google’s AP2 standard, which PayPal supports, also signs mandates. A signature records what you allowed; it does not stop an agent being talked into something inside it. Behest adds a deterministic gate that checks every purchase against the mandate, keeps listing text away from the model as quoted data, and turns the same signed records into dispute evidence.
- A listing that tells agents to choose it, at a price the mandate allows, is only partly covered. A listing's category is written by a model from seller text, so a dishonest seller can list earbuds as spices. Spend caps are checked, not reserved. There is one signing key, not yet rotated. The README lists every known limitation.
06
Pick a role.Run the demo.
No sign-up. Each role opens its own pages, and everything runs against the PayPal sandbox.