Skip to Content
🚀Agentic Commerce Protocol is now live! Instant Checkout is available in ChatGPT. Learn more →
DocumentationStripe Integration

Stripe Integration Guide

This guide covers integrating ACP with Stripe, from uploading your product catalog to processing payments with Shared Payment Tokens.

Private Preview: Agentic commerce is currently in private preview. Join the waitlist  or apply for Instant Checkout .


Overview

In an agentic checkout flow:

ComponentTraditional CheckoutAgentic Checkout
UI/InterfaceSeller providesAI agent provides
Data modelSeller managesSeller manages
Payment processingSeller handlesSeller handles
Payment credentialsCustomer enters on seller siteAgent issues Shared Payment Token

The AI agent presents the checkout interface and collects payment credentials. You keep your existing data model and payment processing.


Key Concepts

Sellers

Sellers are businesses or platforms that provide e-commerce goods, subscriptions, digital content, or API functions. You use the AI agent as a sales channel for your products.

AI Agents

Agents are LLM-powered applications that discover and recommend products for purchase. When a customer prompts the agent, it can display products through its interface.

The AI agent creates a Customer object for each customer and stores their payment information for reuse.

Shared Payment Tokens (SPTs)

SPTs are scoped grants of a payment method. Key properties:

PropertyDescription
Seller-boundUniquely granted to your account
Amount-limitedCapped at the transaction amount
Time-limitedExpires after a set window
Single-useCan only be used once
Credential-freeNever contains real PANs or raw credentials

You use SPTs directly in PaymentIntents flows.


Transaction Flow

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Customer │ │ AI Agent │ │ Seller │ │ Stripe │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ Payment method │ │ │ │──────────────────>│ │ │ │ │ │ │ │ │ Request SPT │ │ │ │───────────────────────────────────────> │ │ │ │ │ │ SPT issued │ │ │ │<─────────────────────────────────────── │ │ │ │ │ │ Send SPT + amount │ │ │ │──────────────────>│ │ │ │ │ │ │ │ │ Create PaymentIntent │ │ │──────────────────>│ │ │ │ │ │ │ │ Payment processed │ │ │ │<──────────────────│ │ │ │ │
  1. Customer provides payment method to the agent
  2. Agent requests SPT from Stripe (specifies seller, amount, payment method)
  3. Agent sends SPT and transaction amount to seller
  4. Seller creates PaymentIntent using the SPT
  5. Stripe processes the transaction

Set Up Your Stripe Account

Create and activate your account

If you don’t have a Stripe account, create one . Then:

  • Verify your email
  • Activate payments (provide business/personal info)
  • Link a bank account for payouts
  • Set up two-step authentication

Create your public profile

Set up a Stripe profile in the Dashboard. This is what customers see.

Configure taxes

Use Stripe Tax  to manage taxes. Follow the tax setup guide .

In your product catalog CSV, set the stripe_product_tax_code column to associate products with tax treatments.

Third-party tax providers supported: Anrok, Avalara, Sphere


Upload Your Product Catalog

You can upload via the Dashboard or API.

Step 1: Upload your CSV

Use the Files API. Specify data_management_manual_upload as the purpose.

curl https://files.stripe.com/v1/files \ -u sk_test_YOUR_KEY: \ -F purpose=data_management_manual_upload \ -F file="@/path/to/your/file.csv;type=text/csv"

Requirements:

  • MIME type must match file format (CSV or TSV)
  • Each row = one product or variant
  • Maximum file size: 200 MB
  • Returns a File object with id

Step 2: Create an ImportSet

curl https://api.stripe.com/v1/data_management/import_sets \ -H "Stripe-Version: 2025-09-30.clover;udap_beta=v1" \ -u sk_test_YOUR_KEY: \ -d file={{FILE_ID}} \ --data-urlencode standard_data_format="product_catalog_feed"

This starts catalog processing and makes data available in the Dashboard.

Step 3: Monitor status

Check the status field on the ImportSet:

curl https://api.stripe.com/v1/data_management/import_sets/{{IMPORT_SET_ID}} \ -u sk_test_YOUR_KEY:

Possible statuses:

  • pending — Processing
  • succeeded — Complete, no errors
  • succeeded_with_errors — Complete, some rows failed
  • failed — Processing failed
  • pending_archive / archived — Archived

Handle errors

If status is succeeded_with_errors:

  1. Find result.errors.file in the response
  2. Download the error file:
curl https://files.stripe.com/v1/files/{{ERROR_FILE_ID}}/contents \ -u sk_test_YOUR_KEY:

The CSV contains failed rows with a stripe_error_message column.

Tip: Use sandbox mode to validate parsing, field mappings, and data quality before enabling live updates. You can send updates every 15 minutes.


Working with Shared Payment Tokens

Create a test SPT

Use test helpers to simulate receiving an SPT:

curl https://api.stripe.com/v1/test_helpers/shared_payment/granted_tokens \ -u sk_test_YOUR_KEY: \ -d payment_method=pm_card_visa \ -d "usage_limits[currency]"=usd \ -d "usage_limits[max_amount]"=10000 \ -d "usage_limits[expires_at]"={{TIME_IN_FUTURE}} \ -d "seller_details[network_id]"=internal \ -d "seller_details[external_id]"={{ANY_STRING}}

Parameters:

ParameterDescription
usage_limitsMax amount and expiration. Agent sets max to match transaction total.
seller_details.network_idYour Network ID
seller_details.external_idOptional identifier (cart ID, connected account, etc.)
payment_methodThe customer’s selected payment method

Use an SPT to complete payment

Create a PaymentIntent with the granted token:

curl https://api.stripe.com/v1/payment_intents \ -u sk_test_YOUR_KEY: \ -d amount=10000 \ -d currency=usd \ -d shared_payment_granted_token=spt_123 \ -d confirm=true

When confirmed, Stripe sets payment_method to a new PaymentMethod cloned from the customer’s original. Subsequent events (refunds, reporting) behave as if you provided the PaymentMethod directly.

Retrieve SPT details

curl https://api.stripe.com/v1/shared_payment/granted_tokens/{id} \ -u sk_test_YOUR_KEY:

Response includes:

  • Limited info about the underlying payment method (card brand, last four)
  • Usage limits
{ "id": "spt_1RgaZcFPC5QUO6ZCDVZuVA8q", "object": "shared_payment.granted_token", "created": 1751500820, "usage_limits": { "currency": "usd", "expires_at": 1751587220, "max_amount": 1000 } }

SPT Webhook Events

EventReceived ByDescription
shared_payment.granted_token.usedSellerSPT has been used
shared_payment.granted_token.deactivatedSellerSPT revoked or expired
shared_payment.issued_token.usedAgentSeller used the SPT
shared_payment.issued_token.deactivatedAgentSPT no longer valid

ACP Protocol Integration

The Agentic Commerce Protocol is a RESTful interface (or MCP server) with four endpoints.

Checkout Lifecycle

  1. Customer expresses intent → Agent sends CreateCheckoutRequest
  2. Seller generates cart → Responds with checkout state
  3. Agent renders UI → Shows total, options to customer
  4. Customer makes selections → Agent/seller exchange UpdateCheckoutRequest
  5. Customer confirms → Agent provisions SPT, sends CompleteCheckoutRequest
  6. Seller creates PaymentIntent → Sends confirmation to agent

Required Endpoints

EndpointDescription
Create CheckoutGenerate cart from SKU. Return payment methods, fulfillment options, etc.
Update CheckoutHandle quantity changes, fulfillment method, customer details
Complete CheckoutReceive SPT, process payment, return order details
Cancel CheckoutRelease inventory, set status to canceled

Every response includes the current checkout state as a reference for the agent.

Events (Webhooks)

After checkout completes, notify the agent about order updates:

  • Order created
  • Order shipped
  • Refund processed
  • etc.

This enables the agent to communicate status changes to the customer.

Security Requirements

  • All requests require HTTPS with Authorization: Bearer {token}
  • Sign all webhook events with HMAC signature in request header
  • The agent provides authorization and signing keys during onboarding

Enable Selling on AI Agents

When ready to go live:

  1. Review agent terms in the Stripe Dashboard
  2. Enable the agent
  3. Stripe sends approval request to the agent
  4. Agent accepts → You’re live

Pause or stop selling

Disable the agent in the Dashboard, or via API:

curl -X POST https://api.stripe.com/v2/agentic_commerce/agreements/{{AGREEMENT_ID}}/terminate \ -u sk_test_YOUR_KEY:

Agreement webhooks

  • agentic_commerce_agreement.confirmed — Agreement active
  • agentic_commerce_agreement.terminated — Agreement ended

Optional Configuration

Manual capture

By default, payments capture immediately. To use manual capture:

  1. Open Agentic Settings in Dashboard
  2. Set capture mode to manual
  3. Call capture when ready:
curl -X POST https://api.stripe.com/v1/payment_intents/pi_xxx/capture \ -u sk_test_YOUR_KEY: \ -H "Stripe-Version: 2025-09-30.preview"

Pre-confirmation approval hook

Add control over whether to complete a purchase. Before checkout completes, Stripe sends an approval request to your endpoint.

Setup:

  1. Specify your endpoint in the Dashboard
  2. Implement your logic

Request format:

{ "type": "String", "id": "String", "data": { "amount_total": 10000, "currency": "usd", "line_items_details": [...], "payment_method_details": {...}, "fulfillment_details": {...} } }

Response format:

{ "manual_approval_details": { "type": "approved" | "declined", "declined": { "reason": "Out of stock" } } }

ChatGPT App Monetization

Two options for accepting payments in ChatGPT apps:

FeatureRedirectInstant Checkout
Integration effortLowHigh
Customer experienceOpens new tabStays in chat
Best forStandard use casesComplex flows
AvailabilityPublicPrivate beta
Payment methods40+ methodsCards, Apple Pay, Google Pay, Link
SubscriptionsBuilt-inRequires API work
Promo codesBuilt-inRequires API work
TaxBuilt-inRequires API work

Redirect: Use Stripe’s prebuilt checkout page. Customers open a new tab to pay.

Instant Checkout: Build a custom integration. Customers complete checkout without leaving ChatGPT.


Next Steps

Specification maintained by OpenAI and Stripe

AboutPrivacyTermsRSS

Apache 2.0 · Open Source