Write a rule, point your bot at the gate, approve what needs you. The fastest way to feel it is the demo — no setup.
One sentence. The compiler turns it into allow / ask / deny.
under $50 auto; over $50 ask me; daily budget $200; never pay blacklisted-merchant
Wherever your bot is about to pay, it POSTs the request first and reads the verdict.
curl -X POST https://<your-deploy>/api/approvals \
-H "Content-Type: application/json" \
-d '{ "summary":"Pay OpenAI invoice", "amountUsd":80,
"requester":"atlas", "target":"openai",
"policyText":"under $50 auto; over $50 ask me", "logResolved":true }'
# → { "verdict": { "verdict": "ask" },
# "approval": { "id": "appr_9c1f…", "status": "pending" } }allow → spend now. ask → wait for you. deny → don’t. On Grok, the grokbotwallet skill makes this call for you — no code.
Every ask lands in your console — one tap. Every action (allowed, approved, or denied) leaves a signed receipt: which bot, what, which rule, who approved.
Open the console →Steps 1–3 are opt-in — a well-behaved bot asks first. To make overspend impossible, the funds live in the vault and each bot is a member with a hard cap — it never holds the key:
setMemberPolicy(bot, perTxUsd6, dailyBudgetUsd6).setAllowedAsset / setAllowedProtocol.executeTransfer(...) — which reverts if it’s over the per-tx cap, over the daily budget, or off the allowlist. That’s the block, enforced at sign-time.contracts/). And it enforces the declared USD amount + allowlists on-chain; a plain credit card the bot holds still can’t be blocked. On-chain is the only rail we truly gate.