Primary navigation

Delegated Payment Spec

Payment Service Providers implement the Delegated Payment Spec to handle and secure Agentic Commerce transactions

Building with the Agentic Commerce Protocol is open to all. Instant Checkout in ChatGPT is currently available to approved partners. To apply to participate in Instant Checkout, fill out this form here.

Overview

The delegated payment spec allows OpenAI to securely share payment details with the merchant or its designated payment service provider (PSP). The merchant and its PSP then handle the transaction and process the related payment in the same manner as any other order and payment they collect.

Who is this spec for?

Directly integrating with OpenAI via the Delegated Payment Spec is only for PSPs or PCI DSS level 1 merchants using their own vaults. For others, Stripe’s Shared Payment Token is the first Delegated Payment Spec-compatible implementation, with more PSPs coming soon.

How it works

  1. Buyers check out using their preferred payment method and save it in ChatGPT.
  2. The delegated payment payload is sent to the merchant’s PSP or vault directly. The delegated payment is single-use and set with allowances.
  3. The PSP or vault returns a payment token scoped to the delegated payment outside of PCI scope.
  4. OpenAI forwards the token during the complete-checkout call to enable the merchant to complete the transaction.

Key points

  • OpenAI is not the merchant of record. Under the Agentic Commerce Protocol, merchants bring their own PSP and process payments as they would for any other digital transaction.
  • Single-use and constrained. The payment token is restricted by the delegated payment’s max amount and expiry, helping protect users and prevent misuse.
  • Merchant-owned payments. Settlement, refunds, chargebacks, and compliance remain with the merchant and their PSP.
  • Security by design. The Delegated Payment Spec ensures PSP-returned credentials are narrowly scoped and cannot be used outside the defined limits of the user-approved purchase.
  • PCI Scope. Directly integrating with the Delegated Payment Spec involves directly handling cardholder data (CHD) and may affect your PCI scope.

REST endpoints

POST /agentic_commerce/delegate_payment

Call direction: OpenAI -> PSP

Headers

FieldDescriptionExample Value
AuthorizationAPI Key used to make requestsBearer api_key_123
Accept-LanguageThe preferred locale for content like messages and errorsen-US
User-AgentInformation about the client making this requestChatGPT/2.0 (Mac OS X 15.0.1; arm64; build 0)
Idempotency-KeyKey used to ensure requests are idempotentidempotency_key_123
Request-IdUnique key for each request for tracing purposesrequest_id_123
Content-TypeType of request contentapplication/json
SignatureBase64 encoded signature of the request bodyeyJtZX...
TimestampFormatted as an RFC 3339 string.2025-09-25T10:30:00Z
API-VersionAPI version2025-09-12

Exactly one of the following inputs must be present in the request body: card.

Request

FieldTypeRequiredDescriptionExampleValidation
payment_methodObjectYesType of credential. The only accepted value is “CARD”.See Payment MethodNone
allowanceAllowance objectYesUse cases that the stored credential can be applied to.See Allowance object definitionNone
billing_addressAddress objectNoAddress associated with the payment method.See Address object definitionNone
risk_signalslist[Risk Signal object]YesList of risk signalsSee Risk Signal definitionNone
metadataObject (map)YesArbitrary key/value pairs.{ "campaign": "q4"}None

Response

Success

Response code: HTTP 201

Response Body

FieldTypeRequiredDescriptionValidation
idStringYesUnique vault token identifier vt_….None
createdStringYesTime formatted as an RFC 3339 stringNone
metadataObjectYesArbitrary key/value pairs for correlation (e.g., source, merchant_id, idempotency_key).None
Error

Response code: HTTP 4xx/5xx

Response Body

FieldTypeRequiredDescriptionExampleValidation
typeString enum YesError typeinvalid_request rate_limit_exceeded processing_error service_unavailableNone
codeStringYesError codeinvalid_card None
messageStringYesHuman‑readable description suitable for logs/support (often end‑user safe).Missing/malformed fieldNone
paramJSONPathNoName of the offending request field, when applicable.payment_method.numberNone

Code values and meanings

  • invalid_request — Missing or malformed field; typically returns 400.

    Example message: ”card field is required when payment_method_type=card”.

    • invalid_card — Credential failed basic validation (such as length or expiry); returns 400 or 422.

    • duplicate_request — Safe duplicate with the same idempotency key.

    • idempotency_conflict — Same idempotency key but different parameters; returns 409.

  • rate_limit_exceeded — Too many requests; returns 429.

  • processing_error — Downstream gateway or network failure; returns 500.

  • service_unavailable — Temporary outage or maintenance; returns 503 with an optional retry_after header.

Object definitions

Payment method

FieldTypeRequiredDescriptionExampleValidation
typeString enumYesThe type of payment method used. Currently only card.cardMust be card
card_number_typeString enumYesThe type of card number. Network tokens are preferred with fallback to FPAN. See PCI Scope for more details.“fpan” or “network_token”Must be “fpan” or “network_token”
numberStringYesCard number.”4242424242424242”
exp_monthStringNoExpiry month.”11”Max. length 2
exp_yearStringNo4 digit expiry year.”2026”Max. length 4
nameStringNoCardholder name.”Jane Doe”
cvcStringNoCard CVC number.”223”Max. length 4
cryptogramStringNoCryptogram provided with network tokens.”gXc5UCLnM6ckD7pjM1TdPA==“
eci_valueStringNoElectronic Commerce Indicator / Security Level Indicator provided with network tokens.”07”
checks_performedList<String>NoChecks already performed on the card.[avs, cvv, ani, auth0]
iinStringNoInstitution Identification Number (aka BIN). The first 6 digits on a card identifying the issuer.”123456”Max. length 6
display_card_funding_typeString enumYesFunding type of the card to display.“credit” or “debit” or “prepaid”Must be “credit” or “debit” or “prepaid”
display_wallet_typeStringNoIf the card came via a digital wallet, what type of wallet.“wallet”
display_brandStringNoBrand of the card to display.“Visa”, “amex”, “discover”
display_last4StringNoIn case of non-PAN, this is the original last 4 digits of the card for customer display.”1234”Max. length 4
metadataObject (map)YesArbitrary key/value pairs.Example: { “issuing\_bank”: “temp” }

Address

FieldTypeRequiredDescriptionExampleValidation
nameStringYesCustomer name“John Doe”Max. length 256
line_oneStringYesStreet line 1”123 Fake St.”Max. length 60
line_twoStringNoStreet line 2”Unit 1”Max. length 60
cityStringYesCity”San Francisco”Max. length 60
stateStringNoState/region (ISO‑3166‑2 where applicable)“CA”Should follow the ISO 3166-2 standard
countryStringYesISO‑3166‑1 alpha‑2”US”Should follow the ISO 3166-1 standard
postal_codeStringYesPostal/ZIP code”12345”Max. length 20

Allowance

FieldTypeRequiredDescriptionExampleValidation
reasonString enumYesCurrent possible values: “one_time”“one_time”: should not be used again for other flows. Usage upto max amount.Must be one_time
max_amountintYesMax amount the payment method can be charged forcheckout_total
currencyStringYescurrencyISO-4217 (e.g., “USD”).Should follow the ISO 4217 standard in lower case
checkout_session_idStringYesReference to checkout_session_id”1PQrsT…“
merchant_idStringYesMerchant identifying descriptorXXMax. length 256
expires_atStringYesTime formatted as an RFC 3339 string“2025-10-09T07:20:50.52Z”Should follow RFC 3339 standard

Risk Signal

FieldTypeRequiredDescriptionExampleValidation
typeString enumYesThe type of risk signal“card_testing”None
scoreintYesDetails of the risk signal10None
actionString enumYesAction taken“blocked” “manual_review” “authorized”None