# Stripe: human approval gates before live money moves
No skill makes an agent trustworthy with money. What works is making the untrusted action technically impossible without a human. That is what approval gates are.
## What needs a human
- Any charge, capture, or subscription creation in live mode.
- Refunds above a threshold the operator sets (e.g. anything over $50, or any refund at all).
- Creating or rotating API keys.
- Changing webhook endpoints or payout settings.
- Anything the agent has not done before in test mode successfully.
Test-mode work needs no gate. Exploration and building are free; moving live money is not.
## How to enforce it technically
Do not rely on the agent "remembering to ask". Enforce with keys:
1. The agent gets a restricted test key, or a restricted live key with read-only permissions.
2. Live write permissions live only in a key the operator holds, never in the agent's context.
3. The agent's workflow becomes propose-then-approve: it prepares the exact API call (endpoint, parameters, amount, idempotency key), presents it, and the operator executes or approves it.
4. Log every proposal and every approval with timestamps. The audit trail is the product.
## The propose-then-approve shape
When the agent needs a live operation, it outputs:
- The exact operation and parameters.
- The amount, currency, and destination customer.
- The idempotency key it generated.
- What it verified in test mode first.
The operator reviews and runs it, or pastes back an approval token. The agent never holds live write credentials.
## Blast radius limits
Even with gates, set Stripe Dashboard limits: restricted key permissions, webhook signing, and alerts on unusual volume. A gate the operator sleeps through is not a gate; pair approvals with amount caps so a mistaken approval cannot empty an account.