Answers · agent payments
When an AI agent pays a seller with a Stripe shared payment token (SPT), what stops the seller charging more than the purchase, charging again later, or keeping the card? How do I set the limits, revoke a token and tell when it's been used?
Last updated
TL;DR: The token carries its own limits, and Stripe enforces them. A shared payment token (SPT) is Stripe's scoped payment credential for purchases an agent makes. The seller gets the token, not the card number. When the agent creates one, usage_limits is required: a currency, a max_amount in the currency's smallest unit (1000 is $10.00), and an expires_at timestamp. Stripe's seller docs say the agent sets max_amount to match the transaction total. The token is also tied to one seller, through that seller's Stripe profile (network_business_profile). Once the seller reaches the amount, the token is deactivated with reason consumed. It can also end as expired, revoked or resolved. Deactivated is terminal, so no new payments can be made with it. For a later charge from the same token, the token must have usage_limits.recurring_interval set, and Stripe rejects setup_future_usage on PaymentIntents made with an SPT, so a seller can't quietly save the card from a one-time token. The agent can revoke a token at any time, which stops the seller creating a payment with it, and webhooks tell you when it's used or deactivated. Three things to watch. SPTs are a preview product (API version 2026-09-30.preview, Agentic Commerce preview terms), available in the US, Canada and listed European countries. Revoking stops new payments but doesn't refund one already made. And a seller can resolve the token into network credentials for a third-party processor, after which charging happens outside Stripe's own payment flow.
What should I check, step by step?
1. Issue one token per purchase. Set usage_limits[max_amount] to the confirmed total in the smallest currency unit, including tax and shipping, and usage_limits[currency] to the checkout currency.
- Set usage_limits[expires_at] as close as the checkout allows: minutes or hours for a one-off purchase, not the far-future example timestamp in the docs.
- Grant the token to the right seller. Pass the seller's Stripe profile in seller_details[network_business_profile], collected during seller onboarding.
- Only set usage_limits.recurring_interval when the customer has agreed to a subscription. Without it, a seller can't reuse the token for later charges, and Stripe blocks setup_future_usage on SPT payments either way.
- Subscribe to shared_payment.issued_token.used and shared_payment.issued_token.deactivated, and verify webhook signatures. Show the customer when a payment is made and when the token is finished.
- Handle shared_payment.issued_token.requires_action. 3D Secure can be triggered by the issuer, the seller or Stripe, and the customer has to complete it on your surface before the token becomes active again.
- Revoke tokens you no longer need, for example when the user cancels or a checkout times out: POST /v1/shared_payment/issued_tokens/{id}/revoke. Check deactivated_reason afterwards.
- If you're the seller, retrieve the granted token and read its usage_limits before you create the PaymentIntent, and listen for shared_payment.granted_token.deactivated so you don't try to charge a dead token.
- Keep your own record of what the agent was allowed to buy alongside the SPT ID. The token caps the amount, but it doesn't know whether the item was the one the customer wanted.
How does a Stripe shared payment token get from an agent to a seller?
Stripe's agent guide sets out the flow. The customer gives the agent a payment method, usually collected with Stripe's Payment Element. The agent issues an SPT to the seller's Stripe profile for that transaction and sends the token ID to the seller. The seller creates a PaymentIntent with it, and Stripe processes the payment. When the PaymentIntent is confirmed, Stripe clones the customer's payment method into a new PaymentMethod for the seller, and refunds and reporting then work as if the seller had been given that payment method directly.
- Supported methods include cards, Link, Apple Pay, Google Pay, Klarna and, with restrictions, Affirm. For cards, Stripe says it may use network tokens from programs such as Mastercard Agent Pay and Visa Intelligent Commerce on the agent's behalf.
- A seller retrieving a granted token sees only limited payment method details, such as the card brand and last four digits, plus the usage_limits.
What do Stripe shared payment token usage limits enforce?
usage_limits is required when a token is created, and it holds the currency, max_amount and expires_at, plus recurring_interval for recurring tokens. Stripe's API reference lists four deactivation reasons: consumed (the allowed amount limit has been reached), expired, revoked and resolved (resolved by a seller). Deactivated is a terminal state.
- A token can move between active and requires_action, for example when 3D Secure is needed, and back again. After the customer completes the action, Stripe sends shared_payment.issued_token.active, unless the token was deactivated in the meantime.
- Recurring charges are allowed only from a token with recurring_interval set (Stripe's example uses month). Stripe rejects setup_future_usage, including the card-specific option, on PaymentIntents created or confirmed with any SPT, and checks off_session separately against the token's permissions.
Does revoking a Stripe shared payment token refund a payment?
Revoking prevents new payments. It doesn't reverse a payment the seller has already created, so refunds and disputes go through the seller and your card issuer as usual. For the Agentic Commerce Protocol, OpenAI's Delegated Payment Spec says OpenAI isn't the merchant of record, and refunds and chargebacks stay with the merchant and its payment provider.
- A seller using another processor can call the SPT Resolve API to get network credentials and submit them to that processor. The token is then deactivated as resolved, and from that point the seller's processor handles the charge. Stripe's own payment flow no longer sees it.
- SPTs are covered by Stripe's Agentic Commerce preview service terms, and the requests in the docs use the preview API version 2026-09-30.preview. Fields and behaviour may change before general availability, so pin the API version you tested and re-read the docs before upgrading.
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 agent issues a shared payment token, check this $42.50 checkout at shop.example against its own spending policy and record the decision with the token ID as the reference.”
{
"tool": "authorize_spend",
"arguments": {
"credential_id": "YOUR_AGENT_CREDENTIAL_ID",
"amount_minor": 4250,
"currency": "USD",
"merchant_domain": "shop.example",
"category": "retail",
"reference": "spt_..."
}
}- Needs your API key, and set_spend_policy sets the per-transaction and daily caps and allowed merchants first. It returns a signed allow or deny with reasons such as over_per_transaction_cap or merchant_not_allowed, valid for 15 minutes, and records it on Rightshold's ledger. Use the allowed amount as the token's max_amount.
- It doesn't call Stripe. It can't create, revoke or read a shared payment token, doesn't see webhooks, and doesn't know whether the seller charged. A deny only stops a payment if your agent checks it before issuing the token.
Rightshold records spending decisions your agent asks for. It never holds or moves money, isn't affiliated with Stripe or OpenAI, and doesn't process cards or tokens. Stripe details are from its shared payment token docs and API reference (preview API version 2026-09-30.preview), checked on November 10, 2026. Not financial advice.
What are the sources?
- Stripe docs: Shared payment tokens, agent guide (usage limits, revoke, statuses, webhooks)
- Stripe docs: Shared payment tokens, seller guide (recurring_interval, setup_future_usage, Resolve API)
- Stripe API reference: The SharedPaymentIssuedToken object (deactivated_reason values)
- Stripe API reference: Create a SharedPaymentIssuedToken (usage_limits required)
- Stripe blog: Developing an open standard for agentic commerce (Agentic Commerce Protocol with OpenAI, September 29, 2025)
- Stripe Services Agreement: Agentic Commerce service terms (preview)
Related
- How to give an AI agent a virtual card with a spending limit
- How to require quote-bound approval before an agent payment settles
- How to handle tax, tip and shipping that push an agent charge above its quote-bound approval
- Can you dispute a purchase your AI agent made with 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}}'
