home / see it gate a refund
Live · real Ed25519 receipts

Watch an agent try to move money it isn't authorized to move.

This is the real control path, not a video. Every button below makes a live call to the AgentGuard gate at /api/gate/authorize, and every receipt it returns is checked by the independent verifier at /api/verify. Open your network tab and watch. Try a refund or a payout before the agent is authorized.

agent actionsno authorization
the agent attempts
the human / policy gate
the diligence question
agentguard · refund_customerseq 0
› waiting for the agent. press an action on the left.
last signed receipt
no receipt yet
independent verification
awaiting a decision to verify
What just happened

The tool can't run without a valid authorization.

AgentGuard wraps the one function that moves money. The model can ask all day. The money only moves when a signed authorization clears policy, server-side, before dispatch.

01 · wrapped

The side-effecting call is the gate

The refund function is wrapped, so there is no path to move money that skips the check. Fail-closed by default.

02 · checked

Policy decides before dispatch

Scope, expiry, and replay are checked server-side. Unsigned, expired, or unauthorized means the provider is never called.

03 · proven

Every decision signs a receipt

Allow and block both produce an Ed25519 receipt with no customer data in it. Anyone can verify it without trusting your database.

Content-free by design

What's in the receipt, and what never is.

The authorization carries the policy. The receipt carries the proof. Neither carries your customer, their card, or the model's output. That is what keeps AgentGuard under your stack with zero data plane.

signed authorization
toolrefund_customer
actionmoney:refund
agentsupport-agent-v20
order#4471
scoperefund order #4471
matched_patternrefund.*
policyrefunds-tier-1
expires+15 min
idempotency_keynonce·once
content-free receipt
idag_8af4d2c1
decisionALLOWED
amount$142.50
signered25519:a3f2··c1
prev_hashsha256:9e4d··e0
seq#0042
Not present, by construction: customer name, card or bank detail, prompt, model output, or any free text. The receipt proves the decision, never the content.
Low lift

Wire one tool in about 30 minutes.

No data plane, no model replacement, no workflow rebuild. You wrap the refund function you already have. Bring your own provider key.

Node
Python
// wrap the one function that moves money
import { SpendGuard } from "@agentguard-run/spend";

const guard = new SpendGuard({ policy, signingKeys });

// the agent calls refund() instead of the raw Stripe call.
// dispatchToolCall fails closed: it throws AgentGuardBlockedError
// unless a signed authorization clears policy, so money only moves on approval.
const refund = (orderId, amount) =>
  guard.dispatchToolCall(
    { scope: "money:refund", toolName: "refund_customer", toolArgs: { orderId, amount } },
    (args) => stripe.refunds.create(args)
  );
# wrap the one function that moves money
from agentguard_spend import SpendGuard

guard = SpendGuard(config)

# dispatch_tool_call fails closed: raises AgentGuardBlockedError
# unless a signed authorization clears policy, so money only moves on approval.
async def refund_customer(order_id, amount):
    return await guard.dispatch_tool_call(
        {"scope": "money:refund", "toolName": "refund_customer",
         "toolArgs": {"order_id": order_id, "amount": amount}},
        lambda args: stripe.Refund.create(**args),
    )
The question every buyer asks

So what stops the agent from calling Stripe directly?

"If it's just an SDK, can't the agent route around it?"

Fair question, and the honest answer matters. In your integration, the wrapped function is the agent's only path to the refund. The raw provider call is not exposed to the agent, so there is nothing to route around, and AgentGuard fails closed when the authorization is missing or invalid. Beyond the wiring, partners keep money-movement inside the gate because externally governed, verifiable refunds are a feature they sell to their own customers, not a checkbox they want to skip. AgentGuard is the audit and authorization layer that sits under your stack. It proves who authorized what. It never holds your keys, your data, or your money.

Put a gate in front of your money-moving agent.

Install the SDK, wrap one tool, and ship your first signed refund receipt today. Free under 10K enforcement calls a month.