Rightshold™ Sign up

Answers · agent payments

How do I stop an AI agent from signing up for free trials and subscriptions that auto-renew?

Last updated

TL;DR: Spend caps check the charge the agent makes. A subscription is different: the agent agrees once, often to a free trial that costs 0.00, and the merchant charges the card later on its own schedule, without the agent asking again. So a per-purchase check passes the sign-up and never sees the renewals. Treat 'agree to recurring billing' as its own action that needs a human. Have the agent describe the full terms (merchant, price after the trial, billing interval, trial end date, how to cancel) and send them to request_human_approval, which binds the approval to the hash of exactly those terms. Use authorize_spend for the first charge with the subscription id in reference. Then control the renewals where they happen, on the card: one virtual card per approved subscription with a limit matched to the plan, or a card you can turn off. Card network rules (Visa since April 2020, Mastercard since 2022) require merchants to remind you before a trial converts, and ROSCA requires consent and a simple way to cancel, so send those reminders to an inbox a person reads.

What should I check, step by step?

1. Write the rule down: the agent may not accept recurring billing, auto-renewal or a trial that converts to paid without a human approving the specific terms. Put it in the agent's instructions, and enforce it in the checkout step rather than trusting the prompt.

  1. Have the agent extract the terms before it clicks: merchant, plan, price after the trial, currency, billing interval, trial end date, cancellation method and the account email the merchant will use. If it can't find them, it stops.
  2. Send those terms as the action object to request_human_approval (with a short summary and expires_in_minutes). The approval is bound to the SHA-256 of the canonical action, so approving a 9.00/month plan doesn't approve a 49.00/month one.
  3. Call authorize_spend for the first charge (even a small verification charge) with reference set to the subscription or order id, so the sign-up shows up in the signed spend record next to the approval.
  4. Pay recurring merchants with a dedicated virtual card per subscription. On Stripe Issuing, set spending_limits to the plan price per_authorization and a monthly (or yearly) interval, and add allowed_categories if you can. A renewal above the plan price, or an unexpected second charge, is declined at the card.
  5. Route merchant emails to a mailbox a person reads. Visa requires merchants to send the subscription terms at enrollment and a reminder with a cancellation link at least 7 days before a trial converts or terms change; Mastercard requires a reminder 3 to 7 days before a digital-goods trial ends.
  6. Keep a list of approved subscriptions with the trial end date and the card used. When a trial should end or the task is done, cancel with the merchant and set the card to inactive or canceled, so a missed cancellation can't keep billing.
  7. Review the card's authorizations monthly against the approved list. A recurring charge with no matching approval means the agent (or someone) signed up outside the process.

Why don't spend caps stop an AI agent from signing up for auto-renewing subscriptions?

A spend check runs when the agent asks to pay. A free trial costs nothing at sign-up, so it passes any cap, and the renewals are merchant-initiated charges on the stored card that the agent never requests. The decision that matters is agreeing to recurring billing, and that happens at sign-up.

How do I make a human approve the recurring terms before an AI agent starts a subscription?

request_human_approval takes the action as an object and stores its SHA-256 (canonical JSON), a summary and an expiry (default 24 hours, up to 30 days). Only the owner's account key can decide it, and the decision is a signed record. Put the recurring terms in the action so the approval covers the renewal price and interval, not just today's 0.00.

How do I cap subscription renewals an AI agent signed up for?

Renewals hit the stored payment method, so the hard limit has to live there. Stripe Issuing spending_limits set an amount per authorization, day, week, month, year or all time, and a cardholder's limits apply across all of their cards. One card per subscription makes a stray charge stand out and lets you stop one subscription without touching others.

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: “My agent wants to start a free trial of a SaaS tool that becomes 29.00 USD a month after 14 days. Ask me to approve those exact terms before it signs up, and tell me what the agent should record when the first charge happens.”

One-click setup

{
  "tool": "request_human_approval",
  "arguments": {
    "summary": "Agent wants to start a 14-day free trial that renews at 29.00 USD/month unless cancelled",
    "expires_in_minutes": 1440,
    "action": {
      "type": "subscription_signup",
      "merchant_domain": "app.example-saas.com",
      "plan": "Team",
      "trial_days": 14,
      "renewal_amount_minor": 2900,
      "currency": "USD",
      "interval": "month",
      "cancel_method": "online, account settings"
    }
  }
}

Rightshold records human approvals and spending policies and signs allow/deny decisions on a hash-chained ledger. It never holds, moves or settles money, does not see merchant-initiated renewals and cannot cancel subscriptions or cards: reading the terms, cancelling with the merchant and setting card limits are steps you run around those records. Not financial or 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}}'