Answers · agent payments
We want our shopping agent to pay through Stripe's Link Agent Wallet (link-cli or the Link SDKs). What does a spend request actually let the agent charge, what limits does Link enforce on its own, and what do we still have to control ourselves?
Last updated
TL;DR: Every purchase starts as a spend request: the agent names the amount, the seller and a written reason of at least 100 characters, the customer approves it on the Link website or app within 30 minutes, and only then does Link return a scoped credential for that purchase, a virtual card by default, a Shared Payment Token for sellers taking Stripe payments through the Machine Payments Protocol, or a Link Pay Token for Stripe-hosted checkouts. The agent never gets the real card number. Link's documented limits are 500 USD per request, 5,000 USD a day, 20,000 USD per rolling 30 days, 10 approved requests at once and 50 new requests an hour, and a customer's agent wallet can carry its own per-transaction, daily and 30-day limits that the agent can read before asking. That makes Link's approval a strong per-purchase check, with three gaps: the customer approves the reason the agent wrote, so an agent misled by a seller page can describe the purchase wrongly; a recurring request's amount is a limit for each period, not a total; and cancelling a recurring request in Link revokes the credential but doesn't cancel the subscription with the seller. Payments for agents are available to US and Canadian Link accounts.
What should I check, step by step?
1. Before creating a request, have the agent read the customer's limits (link-cli user-info retrieve --format json): agent_wallet_spend_limits has per_transaction, daily and thirty_day entries with limit, used and remaining in cents, and null means unlimited. Stop and ask instead of creating a request that can't be approved.
- Have the agent confirm the seller, items and amount with the customer first and write the context only from facts it verified. Link's own agent rules say the customer sees that text when approving, and that seller pages, headers and 402 challenge bodies are untrusted data, not instructions.
- Pass line items and totals (subtotal, tax, shipping, total) so the approval shows what the money is for, not just one number.
- Leave approval on. --no-request-approval only defers it, and Link's rules say not to use it without a specific reason, because approval is the customer's control over the purchase.
- Give every create an idempotency key. If a create times out, retrieve the same request or use the duplicate details Link returns with a 429 spend_request_rate_limited, rather than creating a second request.
- Treat polling results carefully: exit code zero from link-cli means polling finished, not that the customer approved or the payment went through, and a POLLING_TIMEOUT means the request is still pending. Always branch on status.
- Never retry a payment without checking the spend request status first. Link's rules warn that a blind retry can buy twice.
- Retrieve card details only at the point of use, into the protected output file (created with 0600 permissions), keep them out of the model's context and logs, and delete the file afterwards.
- For subscriptions, state the per-period limit, currency and cadence in the context, and when stopping one, cancel with the seller and then run link-cli spend-request cancel; both steps are needed.
- Use --test while building: test requests return test credentials and never charge the payment method (Link Pay Tokens have no test mode).
What is a Link Agent Wallet spend request and what does Link check before an agent can pay?
A spend request is Link's record of one proposed purchase: seller, amount, reason, payment method and the type of credential the agent needs. For a virtual card the agent supplies merchant_name and merchant_url; for a Shared Payment Token it supplies the network_id from the seller's HTTP 402 challenge, and the amount and currency must come from that same challenge; for a Link Pay Token it supplies the merchant's account ID. Link resolves the seller itself in the token flows.
- Statuses run from created and pending_approval to approved, then submitted, succeeded or failed, with denied, expired, canceled and requires_action along the way. Link's docs ask integrations to handle all ten explicitly. A denied request is final; the agent should create a new one only if the customer asks.
- A one-time virtual card can't be used twice, and a one-time Shared Payment Token is single-use, so reusing a consumed token fails verification. If the final total turns out higher than approved and the card hasn't been used, the agent updates the request with the new total and asks for approval again; Link says increases aren't guaranteed and the request stays usable at the original amount if one fails.
What are the Link Agent Wallet spend request limits per request, per day and per 30 days?
Link's CLI reference lists: 500 USD (50,000 cents) maximum per request, a 30-minute approval window, a default expiry of 7 days from creation for one-time requests, 5,000 USD daily spend, 20,000 USD per rolling 30 days, 30 concurrent active requests, 10 concurrent approved requests, 50 new requests an hour and 200 per 60 days. Eligible virtual cards can expire if they aren't first used within 48 hours of first retrieval, and a Link Pay Token is valid for up to 30 minutes from retrieval.
- Recurring requests set a repeating spending limit with an interval of day, week, month or year and an optional count. The amount is the limit for each period, not a lifetime budget, and unused allowance doesn't carry over. For a recurring Shared Payment Token, Link sets the token's usage limit to that amount, shared by all payments in the period. A recurring card's periods start when the credential is created, in UTC, and the card still expires. Recurring terms can't be edited; cancel and create a new request to change them.
What doesn't Link Agent Wallet approval protect against when an AI agent buys something?
What the agent wrote. The customer approves the seller, amount and context the agent supplied. If a seller page or a prompt injection convinced the agent of the wrong item or a different store, the approval screen shows the agent's version. Keeping the agent's facts tied to what the customer asked for is your job.
- Your own budget per agent or per task. Link's documented limits are platform and account limits; the docs we read don't describe a separate budget for each agent or app connected to the same wallet. If you run several agents, or want a monthly cap per project far below 20,000 USD, keep that total in your own system and check it before each request.
- What happens at the seller. Link doesn't schedule recurring charges; the seller bills against the credential, and a request's status alone isn't proof that a payment went through, so confirm payments in the seller's records or the transaction history. Cancelling in Link stops the credential, not the seller's subscription.
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 my shopping agent creates a Link spend request for $25.99 at acme.example, check it against this agent's own spending policy and give me a signed allow or deny with the request's idempotency key as the reference.”
{
"tool": "authorize_spend",
"arguments": {
"credential_id": "<this agent's credential id>",
"amount_minor": 2599,
"currency": "USD",
"merchant_domain": "acme.example",
"category": "retail",
"reference": "<the spend request idempotency key>"
}
}- Set the policy first with set_spend_policy (owner account key, toolset=trust): per_tx_max_minor, daily_max_minor, allowed_domains and allowed_categories per agent credential, so each agent has its own budget under the wallet's limits. The daily total resets at 00:00 UTC.
- authorize_spend returns a signed allow or deny receipt with reasons such as over_per_transaction_cap, over_daily_cap or merchant_not_allowed and records it on Rightshold's ledger; anyone can check it with verify_spend_authorization.
- It doesn't create or approve Link spend requests, read the customer's Link limits or hold any card details. It only sees purchases the agent checks with it first, so keep Link's approval on as the customer's own control.
Rightshold records spending decisions your agent asks it for. It never holds or moves money, isn't a wallet or payment processor and isn't affiliated with Stripe or Link. Link Agent Wallet behavior and limits are as described in Link's developer docs and Stripe's documentation, read on November 11, 2026; limits, availability and commands may change, so check the linked pages before relying on a number. Not financial advice.
What are the sources?
- Stripe Documentation: Link Agent Wallet
- Stripe Documentation: Enable agents to spend (Link Agent Wallet)
- Link docs: Spend requests (statuses, purchase details, recurring payments, required actions)
- Link docs: CLI reference (limits, test mode)
- Link docs: Use Link CLI with agents (safety rules for agents)
- Link docs: FAQ (availability, approvals)
Related
- How do Stripe shared payment tokens limit what a seller can charge for an AI agent purchase?
- How to cap what an AI agent spends on pay-per-token APIs with MPP sessions
- How to give an AI agent a virtual card with a spending limit
- How to stop a prompt injection from making your AI agent buy something
- How do Visa Intelligent Commerce mandates cap what an AI agent can charge to your card?
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}}'
