Rightshold™ Sign up

Answers · agent payments

How do I require quote-bound approval before an agent payment settles?

Last updated

TL;DR: Do not let an agent settle from a shared treasury on a vague "buy it" yes. Give it a dedicated wallet or card with narrow instrument limits, require a human approval bound to the exact quote (amount, currency, payee/merchant, quote_id or cart hash), re-verify that hash immediately before capture or broadcast, and write the allow/deny to storage the agent cannot edit. Stripe Issuing for agents supports per-card spend controls and real-time issuing_authorization.request checks (respond within about 2 seconds) so you can confirm amount and merchant against the approved quote before the charge lands. Caps in the prompt are not a settlement gate; set_spend_policy plus request_human_approval plus an outside-agent record are.

What should I check, step by step?

1. Issue a dedicated card or wallet per agent (or per high-risk workflow). Fund only what that workflow may spend; never hand over the company treasury key.

  1. Set instrument-level ceilings first (per-authorization and period caps, allowed merchants/categories). Stripe Issuing spending_controls and wallet signing policies reject over-cap attempts even if the model forgets the prompt.
  2. When a vendor returns a quote or 402/price, freeze quote_id (or cart hash), amount_minor, currency, payee, and expiry into server storage the agent cannot UPDATE.
  3. Call request_human_approval with those exact fields in action. Show the approver the quote fields from the payment request, not the model's paraphrase.
  4. Before settlement: verify_human_approval against the live quote hash; run authorize_spend (or your issuer's real-time auth) against set_spend_policy; refuse if amount, payee, or quote_id drifted.
  5. Settle only after both checks pass. Use an idempotency key so a resumed or retried run cannot pay the same quote twice.
  6. Append every approve, deny, timeout, and settlement receipt outside the agent session (ledger or server DB). Keep only receipt ids in chat memory.
  7. Expire stale quotes and approvals; a yes for quote Q1 is not a warrant for Q2 after a price change.

Dedicated wallet, narrow limits, then a quote-bound yes

A shared corporate card with "ask before big purchases" in the system prompt fails open under prompt injection or a hurried alwaysApprove. Isolate funds and enforce ceilings on the instrument.

Re-check the quote at settlement, not only at ask time

Prices move. Between approval and capture the vendor may return a new total, a different token, or another payTo address. Re-hash the live quote and compare to the approved action; on mismatch, fail closed and open a new request_human_approval.

What can go wrong?

Approval screen shows "about $40 for supplies" while the quote is 42.17 USD to a different merchant legal name.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “Before this agent settles, set a narrow spend policy on its credential and ask me to approve the exact quote (quote id, payee, amount and currency).”

One-click setup

{
  "tool": "set_spend_policy",
  "arguments": {
    "credential_id": "crd_…",
    "currency": "USD",
    "per_tx_max_minor": 5000,
    "daily_max_minor": 15000,
    "allowed_domains": [
      "api.vendor.example"
    ],
    "allowed_categories": [
      "saas"
    ],
    "expires_at": "2026-11-07T00:00:00Z"
  }
}

Rightshold records spending policies, spend authorizations and human approvals for agents that call it. It does not issue cards, hold balances, sign chain transactions, sit in your Stripe webhook, or stop an agent that never asks. Enforce quote checks on the card/wallet and in your settlement path too. Not legal advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'