{"title":"AI agent integration with Agentic Commerce Suite","category":"default","creationDate":1778252957,"content":"<p>The Adyen Agentic Commerce Suite API acts as a bridge between your AI agent platform and our merchants. This enables your agents to execute transactions on behalf of shoppers who use your AI agents. You communicate with Adyen through our API endpoints, and you do not communicate directly with merchants. Adyen handles the communication with our merchants and the downstream complexity of orchestrating stock validation, tax calculation, shipping, and payment authorization. We make the relevant information visible to your agents.<\/p>\n<h2>Requirements<\/h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Requirement<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong>Integration type<\/strong><\/td>\n<td style=\"text-align: left;\">This guide is for an integration using the OpenAI <a href=\"https:\/\/developers.openai.com\/commerce\/guides\/get-started\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Agentic Commerce Protocol (ACP)<\/a>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>User role<\/strong><\/td>\n<td style=\"text-align: left;\">Make sure that your Adyen credential has the following user role: <ul><li markdown=\"1\"><strong>Commerce Suite API<\/strong><\/li><\/ul>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Setup steps<\/strong><\/td>\n<td style=\"text-align: left;\">Before you begin, make sure that you have: <ul><li markdown=\"1\">Set up a Token Vault integration using the <a href=\"\/online-payments\/agentic-commerce\/delegated-payment-spec\">Delegated Payment Spec with Adyen<\/a>.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>How it works<\/h2>\n<p>Use the following base URL for the endpoints in the agentic commerce checkout lifecycle.<\/p>\n<p>The path parameter <code>{companyAccount}<\/code> is the Adyen account of the merchant the shopper makes the transaction with.<\/p>\n<table>\n<thead>\n<tr>\n<th>Environment<\/th>\n<th>Base URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Test<\/td>\n<td><code>https:\/\/commerce-suite-test.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}<\/code><\/td>\n<\/tr>\n<tr>\n<td>Live<\/td>\n<td><code>https:\/\/commerce-suite.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The agentic commerce checkout lifecycle consists of up to five phases.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">#<\/th>\n<th style=\"text-align: left;\">Phase<\/th>\n<th style=\"text-align: left;\">Method<\/th>\n<th style=\"text-align: left;\">Endpoint<\/th>\n<th style=\"text-align: left;\">Requirement<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">1<\/td>\n<td style=\"text-align: left;\"><strong>Create Session<\/strong><\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions<\/code><\/td>\n<td style=\"text-align: left;\">Mandatory<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">2<\/td>\n<td style=\"text-align: left;\"><strong>Get Session<\/strong><\/td>\n<td style=\"text-align: left;\"><code>GET<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}<\/code><\/td>\n<td style=\"text-align: left;\">Optional<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">3<\/td>\n<td style=\"text-align: left;\"><strong>Update Session<\/strong><\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}<\/code><\/td>\n<td style=\"text-align: left;\">Mandatory<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">4<\/td>\n<td style=\"text-align: left;\"><strong>Complete Session<\/strong><\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}\/complete<\/code><\/td>\n<td style=\"text-align: left;\">Mandatory<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5<\/td>\n<td style=\"text-align: left;\"><strong>Cancel Session<\/strong><\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}\/cancel<\/code><\/td>\n<td style=\"text-align: left;\">Optional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>See <a href=\"#sequence-diagrams\">Sequence diagrams<\/a> for visual representations of the flows.<\/p>\n<h3>Authentication<\/h3>\n<p>The Adyen Agentic Commerce Suite uses <strong>Bearer token authentication<\/strong>. Pass your Adyen API key as the Bearer token in the <code>Authorization<\/code> header. Your API key must have the <strong>Commerce Suite API<\/strong> role.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Bearer token authentication'\" :id=\"''\" :code-data='[{\"language\":\"http\",\"tabTitle\":\"\",\"content\":\"Authorization: Bearer ADYEN_API_KEY\\nContent-Type: application\\\/json\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<div class=\"sc-notice warning\"><div>\n<p>Never expose your API key in a URL query string, or in agent-readable context. All calls must originate from your secure agent backend or token vault infrastructure.<\/p>\n<\/div><\/div>\n<h2>1. Create Session<\/h2>\n<p>Initializes a new checkout session with a list of items and optional buyer and fulfillment information. Adyen calls the merchant's backend to validate stock and compute real-time totals, then returns the authoritative session state to your agent.<\/p>\n<p>Method and endpoint: POST <code>\/checkout_sessions<\/code><\/p>\n<p>Creates a new checkout session. Returns HTTP 200 with line items, fulfillment options, totals, and a <code>payment_provider<\/code> block identifying the merchant's PSP and accepted payment methods.<\/p>\n<h3>Request body<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Type<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>currency<\/code><\/td>\n<td style=\"text-align: left;\">string (ISO 4217) \u00b7 exactly 3 chars<\/td>\n<td style=\"text-align: left;\"><span class=\"hint--bottom\" data-hint=\"Required\" markdown=\"1\"><img style=\"width: 25px;\" alt=\"Required\" src=\"\/user\/pages\/reuse\/image-library\/01.icons\/required\/required.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/span><\/td>\n<td style=\"text-align: left;\">3-letter settlement currency code, for example, <code>USD<\/code>, <code>EUR<\/code>, <code>GBP<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>items<\/code><\/td>\n<td style=\"text-align: left;\">AcpItem[]<\/td>\n<td style=\"text-align: left;\"><span class=\"hint--bottom\" data-hint=\"Required\" markdown=\"1\"><img style=\"width: 25px;\" alt=\"Required\" src=\"\/user\/pages\/reuse\/image-library\/01.icons\/required\/required.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/span><\/td>\n<td style=\"text-align: left;\">Items to add to the session. Each item requires an <code>id<\/code> and <code>quantity<\/code> \u2265 1.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>buyer<\/code><\/td>\n<td style=\"text-align: left;\">AcpBuyer<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Buyer contact details: <code>email<\/code>, <code>first_name<\/code>, <code>last_name<\/code>, <code>phone_number<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>fulfillment_address<\/code><\/td>\n<td style=\"text-align: left;\">AcpAddress<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Shipping address. Required for physical goods where tax or shipping varies by location.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>fulfillment_option_id<\/code><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Pre-select a fulfillment option if already known.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>affiliate_attribution<\/code><\/td>\n<td style=\"text-align: left;\">AcpAffiliateAttribution<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Affiliate attribution data for tracking referral sources. Includes <code>provider<\/code>, <code>token<\/code>, <code>publisher_id<\/code>, <code>campaign_id<\/code>, and <code>touchpoint<\/code>. See <a href=\"#acpaffiliateattribution\">AcpAffiliateAttribution<\/a>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example request to create a checkout session'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/commerce-suite-test.adyen.com\\\/commerce-suite\\\/acp\\\/v1\\\/AdyenMerchantCompanyAccount\\\/checkout_sessions \\\\\\n-H 'Authorization: Bearer ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-X POST \\\\\\n-d '{\\n  \\&quot;currency\\&quot;: \\&quot;USD\\&quot;,\\n  \\&quot;items\\&quot;: [{ \\&quot;id\\&quot;: \\&quot;01\\&quot;, \\&quot;quantity\\&quot;: 1 }],\\n  \\&quot;buyer\\&quot;: {\\n    \\&quot;email\\&quot;: \\&quot;ada@example.com\\&quot;,\\n    \\&quot;first_name\\&quot;: \\&quot;Ada\\&quot;,\\n    \\&quot;last_name\\&quot;: \\&quot;Lovelace\\&quot;\\n  },\\n  \\&quot;fulfillment_address\\&quot;: {\\n    \\&quot;line_one\\&quot;: \\&quot;123 Market St\\&quot;,\\n    \\&quot;line_two\\&quot;: \\&quot;\\&quot;,\\n    \\&quot;city\\&quot;: \\&quot;San Francisco\\&quot;,\\n    \\&quot;state\\&quot;: \\&quot;CA\\&quot;,\\n    \\&quot;country\\&quot;: \\&quot;US\\&quot;,\\n    \\&quot;postal_code\\&quot;: \\&quot;94103\\&quot;\\n  }\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h3>Response<\/h3>\n<p>Identical to <code>AcpCheckoutSessionResponse<\/code> plus a required <code>payment_provider<\/code> object.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example response body for HTTP 200 OK'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"id\\\": \\\"cs_8xzQk2TmNpR\\\",\\n  \\\"status\\\": \\\"ready_for_payment\\\",\\n  \\\"currency\\\": \\\"USD\\\",\\n  \\\"payment_provider\\\": {\\n    \\\"provider\\\": \\\"adyen\\\",\\n    \\\"merchant_id\\\": \\\"ADYEN_MERCHANT_ACCOUNT\\\",\\n    \\\"supported_payment_methods\\\": [\\\"scheme\\\", \\\"googlepay\\\", \\\"applepay\\\"]\\n  },\\n  \\\"line_items\\\": [{\\n    \\\"id\\\": \\\"li_001\\\",\\n    \\\"item\\\": { \\\"id\\\": \\\"prod_headphones_pro\\\", \\\"quantity\\\": 1 },\\n    \\\"base_amount\\\": 34900,\\n    \\\"subtotal\\\": 34900,\\n    \\\"tax\\\": 2967,\\n    \\\"total\\\": 37867\\n  }],\\n  \\\"fulfillment_options\\\": [{\\n    \\\"id\\\": \\\"ship_standard\\\",\\n    \\\"type\\\": \\\"shipping\\\",\\n    \\\"carrier\\\": \\\"UPS\\\",\\n    \\\"title\\\": \\\"Standard Shipping\\\",\\n    \\\"subtitle\\\": \\\"5-7 business days\\\",\\n    \\\"subtotal\\\": 799,\\n    \\\"tax\\\": 0,\\n    \\\"total\\\": 799\\n  }],\\n  \\\"totals\\\": [],\\n  \\\"messages\\\": [],\\n  \\\"links\\\": []\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h3>Status codes<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">HTTP<\/th>\n<th style=\"text-align: left;\">Meaning<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">200<\/td>\n<td style=\"text-align: left;\">OK<\/td>\n<td style=\"text-align: left;\">Session created. Use the returned <code>id<\/code> for all subsequent calls.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\">Unprocessable<\/td>\n<td style=\"text-align: left;\">Business logic prevented creation (for example, out of stock). Inspect <code>messages[]<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>2. (Optional) Get Session<\/h2>\n<p>Retrieves the current authoritative state of a session. Use this to re-sync totals after an async event or verify status before confirming payment with the shopper.<\/p>\n<p>Method and endpoint: GET <code>\/checkout_sessions\/{sessionId}<\/code><\/p>\n<p>No request body. Returns the full <code>AcpCheckoutSessionResponse<\/code> for the given session ID.<\/p>\n<h3>Path parameters<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Type<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>companyAccount<\/code><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\"><span class=\"hint--bottom\" data-hint=\"Required\" markdown=\"1\"><img style=\"width: 25px;\" alt=\"Required\" src=\"\/user\/pages\/reuse\/image-library\/01.icons\/required\/required.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/span><\/td>\n<td style=\"text-align: left;\">Your Adyen company account identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>sessionId<\/code><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\"><span class=\"hint--bottom\" data-hint=\"Required\" markdown=\"1\"><img style=\"width: 25px;\" alt=\"Required\" src=\"\/user\/pages\/reuse\/image-library\/01.icons\/required\/required.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/span><\/td>\n<td style=\"text-align: left;\">The <code>id<\/code> returned from the Create Session call.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Status codes<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">HTTP<\/th>\n<th style=\"text-align: left;\">Meaning<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">200<\/td>\n<td style=\"text-align: left;\">OK<\/td>\n<td style=\"text-align: left;\">Session found and returned.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">404<\/td>\n<td style=\"text-align: left;\">Not Found<\/td>\n<td style=\"text-align: left;\">Session ID does not exist or has expired.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>3. Update Session<\/h2>\n<p>Updates an existing session with new items, address, buyer details, or a fulfillment selection. Each update re-triggers Adyen's call to the merchant's live calculator, ensuring your agent always has accurate totals.<\/p>\n<p>Method and endpoint: POST <code>\/checkout_sessions\/{sessionId}<\/code><\/p>\n<p>Returns the full updated <code>AcpCheckoutSessionResponse<\/code>. Only fields present in the request body are applied.<\/p>\n<h3>Request body<\/h3>\n<p>This endpoint uses a dedicated <code>AcpUpdateCheckoutSessionRequest<\/code> schema. Unlike Create Session, no fields are required \u2014 include only what needs to change.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Type<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>currency<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">string (ISO 4217)<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Must match the currency set at session creation if provided.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>items<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">AcpItem[]<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Replaces the entire item list.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>buyer<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">AcpBuyer<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Updated buyer contact information.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>fulfillment_address<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">AcpAddress<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">Updated shipping address. Triggers recalculation of tax and shipping costs.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>fulfillment_option_id<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">ID of the fulfillment option the shopper selected from <code>fulfillment_options[]<\/code> in the session response.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example request to update checkout session'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/commerce-suite-test.adyen.com\\\/commerce-suite\\\/acp\\\/v1\\\/AdyenMerchantCompanyAccount\\\/checkout_sessions\\\/cs_8xzQk2TmNpR \\\\\\n-H 'Authorization: Bearer ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-X POST \\\\\\n-d '{\\n  \\&quot;fulfillment_option_id\\&quot;: \\&quot;ship_express\\&quot;,\\n  \\&quot;fulfillment_address\\&quot;: {\\n    \\&quot;line_one\\&quot;: \\&quot;1 Infinite Loop\\&quot;,\\n    \\&quot;line_two\\&quot;: \\&quot;\\&quot;,\\n    \\&quot;city\\&quot;: \\&quot;Cupertino\\&quot;,\\n    \\&quot;state\\&quot;: \\&quot;CA\\&quot;,\\n    \\&quot;country\\&quot;: \\&quot;US\\&quot;,\\n    \\&quot;postal_code\\&quot;: \\&quot;95014\\&quot;\\n  }\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<div class=\"sc-notice info\"><div>\n<p>Call Update Session whenever the shopper changes their delivery address, selects a shipping tier, or modifies cart quantity. The response <code>line_items[].total<\/code>, <code>fulfillment_options[].total<\/code>, and <code>totals[]<\/code> are always authoritative \u2014 present these to the shopper before proceeding to Complete.<\/p>\n<\/div><\/div>\n<h3>Status codes<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">HTTP<\/th>\n<th style=\"text-align: left;\">Meaning<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">200<\/td>\n<td style=\"text-align: left;\">OK<\/td>\n<td style=\"text-align: left;\">Session updated. Response contains the latest authoritative state.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\">Unprocessable<\/td>\n<td style=\"text-align: left;\">Update rejected by merchant logic (for example, item now out of stock). Inspect <code>messages[]<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>4. Complete Session<\/h2>\n<p>Finalizes the session by submitting the payment token from your agent's Token Vault. Adyen validates the token, optionally calls the merchant's commit endpoint for a pre-authorization risk check, executes payment authorization, and returns the result \u2014 including the created <code>order<\/code> object on success.<\/p>\n<p>Method and endpoint: POST <code>\/checkout_sessions\/{sessionId}\/complete<\/code><\/p>\n<p>Submits payment data and triggers authorization. Returns <code>AcpCompleteSessionResponse<\/code> \u2014 the full session state plus an <code>order<\/code> object on successful authorization.<\/p>\n<h3>Request body<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Type<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>payment_data<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">AcpPaymentData<\/td>\n<td style=\"text-align: left;\"><span class=\"hint--bottom\" data-hint=\"Required\" markdown=\"1\"><img style=\"width: 25px;\" alt=\"Required\" src=\"\/user\/pages\/reuse\/image-library\/01.icons\/required\/required.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/span><\/td>\n<td style=\"text-align: left;\">Payment token and provider. Must include <code>provider<\/code> (for example, <code>adyen<\/code>) and <code>token<\/code> \u2014 the PSP transaction token from your vault's <code>delegate_payment<\/code> call.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Example request<\/h3>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Complete checkout session request'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/commerce-suite-test.adyen.com\\\/commerce-suite\\\/acp\\\/v1\\\/AdyenMerchantCompanyAccount\\\/checkout_sessions\\\/cs_8xzQk2TmNpR\\\/complete \\\\\\n-H 'Authorization: Bearer ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-X POST \\\\\\n-d '{\\n  \\&quot;payment_data\\&quot;: {\\n    \\&quot;provider\\&quot;: \\&quot;adyen\\&quot;,\\n    \\&quot;token\\&quot;: \\&quot;psp_tok_Ab7xQfN2YwR...\\&quot;\\n  }\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h3>Success response<\/h3>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example complete response body for HTTP 200 OK'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"id\\\": \\\"cs_8xzQk2TmNpR\\\",\\n  \\\"status\\\": \\\"completed\\\",\\n  \\\"order\\\": {\\n    \\\"id\\\": \\\"ORD-2026-001\\\",\\n    \\\"checkout_session_id\\\": \\\"cs_8xzQk2TmNpR\\\",\\n    \\\"permalink_url\\\": \\\"https:\\\/\\\/merchant.com\\\/orders\\\/ORD-2026-001\\\"\\n  },\\n  \\\"line_items\\\": [],\\n  \\\"fulfillment_options\\\": [],\\n  \\\"totals\\\": [],\\n  \\\"messages\\\": [],\\n  \\\"links\\\": []\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<div class=\"sc-notice info\"><div>\n<p>Present <code>order.permalink_url<\/code> to the shopper as their confirmation link. <code>order.id<\/code> is the unique order identifier \u2014 use it for post-purchase communication and support queries.<\/p>\n<\/div><\/div>\n<h3>Status codes<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">HTTP<\/th>\n<th style=\"text-align: left;\">Meaning<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">200<\/td>\n<td style=\"text-align: left;\">OK<\/td>\n<td style=\"text-align: left;\">Authorization executed. <code>order<\/code> present on success; <code>messages[]<\/code> contains details on declined authorization.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>5. (Optional) Cancel Session<\/h2>\n<p>Cancels an active session that has not been completed. Call this when the shopper abandons checkout or your agent cannot proceed. Signals the merchant to release any reserved inventory.<\/p>\n<p>Method and endpoint: POST <code>\/checkout_sessions\/{sessionId}\/cancel<\/code><\/p>\n<p>No request body required. Returns <code>AcpCheckoutSessionResponse<\/code> with <code>status: \"canceled\"<\/code>.<\/p>\n<h3>Status codes<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">HTTP<\/th>\n<th style=\"text-align: left;\">Meaning<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">200<\/td>\n<td style=\"text-align: left;\">OK<\/td>\n<td style=\"text-align: left;\">Session canceled. Response contains the final session state with <code>status: \"canceled\"<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Testing<\/h2>\n<p>Use the sandbox environment to test end-to-end before going live. The sandbox uses the same API spec and schemas as production.<\/p>\n<p>Use the following base URL for all sandbox requests besides Delegate Payment:<\/p>\n<pre><code class=\"language-text\">https:\/\/commerce-suite-test.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}<\/code><\/pre>\n<h3>Sandbox endpoints<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Operation<\/th>\n<th style=\"text-align: left;\">Method<\/th>\n<th style=\"text-align: left;\">Path<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">Create Session<\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Get Session<\/td>\n<td style=\"text-align: left;\"><code>GET<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Update Session<\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Complete Session<\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}\/complete<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Cancel Session<\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>\/checkout_sessions\/{sessionId}\/cancel<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Delegate Payment<\/td>\n<td style=\"text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"text-align: left;\"><code>https:\/\/pal-test.adyen.com\/paltokenization\/servlet\/Recurring\/Agentic\/acp\/v1\/agentic_commerce\/delegate_payment<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"sc-notice info\"><div>\n<p>The <code>delegate_payment<\/code> endpoint is part of our tokenization domain, not the Commerce Suite domain. It handles raw PSP credential material on behalf of the agent's Token Vault. Authenticate with <code>Authorization: Bearer<\/code> exactly as you would for all other Commerce Suite calls.<\/p>\n<\/div><\/div>\n<h3>Recommended test sequence<\/h3>\n<p>To verify your integration, follow these steps:<\/p>\n<ol>\n<li>\n<p>Create a session.<\/p>\n<p>Make a POST <code>\/checkout_sessions<\/code> request with your test API key in the <code>Authorization: Bearer<\/code> header. Note the returned <code>id<\/code> (for example, <code>cs_test_abc123<\/code>).<\/p>\n<\/li>\n<li>\n<p>Update with address and fulfillment selection.<\/p>\n<p>Make a POST <code>\/checkout_sessions\/cs_test_abc123<\/code> request. Confirm that <code>status<\/code> is <code>ready_for_payment<\/code> and that the totals are finalized.<\/p>\n<\/li>\n<li>\n<p>Delegate payment through the Token Vault.<\/p>\n<p>Make a POST <code>\/delegate_payment<\/code> request with your test API key in the <code>Authorization: Bearer<\/code> header. Capture the returned <code>psp_transaction_token<\/code>.<\/p>\n<\/li>\n<li>\n<p>Complete the session.<\/p>\n<p>Make a POST <code>\/checkout_sessions\/cs_test_abc123\/complete<\/code> request.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Example request body object'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"payment_data\\\": {\\n    \\\"provider\\\": \\\"adyen\\\",\\n    \\\"token\\\": \\\"&lt;psp_token&gt;\\\"\\n  }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>Confirm that <code>status<\/code> is <code>completed<\/code> and <code>order.id<\/code> is present.<\/p>\n<\/li>\n<\/ol>\n<h3>Test product catalogue<\/h3>\n<p>The Adyen test merchant exposes the following 10 products. Use these <code>id<\/code> values in the <code>items[]<\/code> array of any Create or Update Session request. Quantity must be \u2265 1.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Product ID<\/th>\n<th style=\"text-align: left;\">Name<\/th>\n<th style=\"text-align: left;\">Price<\/th>\n<th style=\"text-align: left;\">Category<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>01<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Polo shirt<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Clothing<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>02<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Headphones<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Electronics<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>03<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Sunglasses<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Accessories<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>04<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Boots<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Footwear<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>05<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Event ticket<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Tickets<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>06<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Backpack<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Accessories<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>07<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Joypad<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Electronics<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>08<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Food delivery<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Food<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>09<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Handbag<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Accessories<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>10<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Sneakers<\/strong><\/td>\n<td style=\"text-align: left;\">50.00<\/td>\n<td style=\"text-align: left;\">Footwear<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example object to create a session with a pair of Headphones and a Backpack'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"items\\\": [\\n    { \\\"id\\\": \\\"02\\\", \\\"quantity\\\": 1 },\\n    { \\\"id\\\": \\\"06\\\", \\\"quantity\\\": 1 }\\n  ]\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2>Sequence diagrams<\/h2>\n<p>The two diagrams below show the full lifecycle for both integration patterns. In both cases your agent's calls to Adyen are identical \u2014 the difference is entirely in how Adyen and the merchant orchestrate payment authorization on the back end.<\/p>\n<h4>Standard flow<\/h4>\n<p>Adyen executes payment authorization on behalf of the agent. The agent's Token Vault calls <code>delegate_payment<\/code> to obtain a PSP token, which the agent then submits via <code>\/complete<\/code>. Adyen handles the rest.<\/p>\n<div id=\"mermaid-69fe043485e62-wrapper\"><div id=\"mermaid-69fe043485e62\" class=\"mermaid-shortcode loading\">CnNlcXVlbmNlRGlhZ3JhbQogICAgcGFydGljaXBhbnQgU2hvcHBlcgogICAgcGFydGljaXBhbnQgQWdlbnQgYXMgQUkgQWdlbnQKICAgIHBhcnRpY2lwYW50IFZhdWx0IGFzIFRva2VuIFZhdWx0CiAgICBwYXJ0aWNpcGFudCBBZHllbgogICAgcGFydGljaXBhbnQgTWVyY2hhbnQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAxLiBDcmVhdGUgY2hlY2tvdXQKICAgIFNob3BwZXItPj5BZ2VudDogIkJ1eSB0aGVzZSBoZWFkcGhvbmVzIgogICAgQWdlbnQtPj5BZHllbjogW0FDUF0gUE9TVCAvY2hlY2tvdXRfc2Vzc2lvbnMKICAgIEFkeWVuLT4+TWVyY2hhbnQ6IFBPU1QgL2FnZW50aWMvc2Vzc2lvbnMve2lkfQogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwMCBzdGF0dXM6ICB0b3RhbHMsIHN0b2NrLCBzaGlwcGluZwogICAgQWR5ZW4tLT4+QWdlbnQ6IDIwMTogU2Vzc2lvbiBJRCArIHRvdGFscwogICAgQWdlbnQtLT4+U2hvcHBlcjogRGlzcGxheSBvcmRlciBzdW1tYXJ5CiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAyLiBEZWxlZ2F0ZSBwYXltZW50ICYgdG9rZW5pemF0aW9uCiAgICBTaG9wcGVyLT4+QWdlbnQ6ICJQYXkgbm93IgogICAgQWdlbnQtPj5WYXVsdDogSW5zdHJ1Y3QgZGVsZWdhdGVfcGF5bWVudAogICAgVmF1bHQtPj5BZHllbjogW0FDUF0gL2RlbGVnYXRlX3BheW1lbnQKICAgIEFkeWVuLS0+PlZhdWx0OiBwc3BfdHJhbnNhY3Rpb25fdG9rZW4KICAgIFZhdWx0LS0+PkFnZW50OiBwc3BfdHJhbnNhY3Rpb25fdG9rZW4KICAgIGVuZAoKICAgIHJlY3QgcmdiKDI0NSwgMjQ1LCAyNDUpCiAgICBOb3RlIG92ZXIgU2hvcHBlciwgTWVyY2hhbnQ6IFN0YWdlIDMuIENvbXBsZXRlICYgYXV0aG9yaXplCiAgICBBZ2VudC0+PkFkeWVuOiBbQUNQXSAvY2hlY2tvdXRfc2Vzc2lvbnMve2lkfS9jb21wbGV0ZQogICAgQWR5ZW4tPj5NZXJjaGFudDogUE9TVCAvYWdlbnRpYy9zZXNzaW9ucy97aWR9L2NvbW1pdAogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwMCBTVUNDRVNTCiAgICBOb3RlIG92ZXIgQWR5ZW46IEV4ZWN1dGUgQXV0aAogICAgQWR5ZW4tPj5NZXJjaGFudDogUE9TVCAvYWdlbnRpYy9zZXNzaW9ucy97aWR9L2ZpbmFsaXplCiAgICBNZXJjaGFudC0tPj5BZHllbjogMjA0IEFDSzogdHJpZ2dlciBmdWxmaWxsbWVudAogICAgQWR5ZW4tLT4+QWdlbnQ6IDIwMCBzdGF0dXM6IGNvbXBsZXRlZCwgb3JkZXJ7fQogICAgQWdlbnQtLT4+U2hvcHBlcjogIk9yZGVyIGNvbmZpcm1lZCEiCiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSA0LiBQb3N0LXB1cmNoYXNlCiAgICBNZXJjaGFudC0+PkFkeWVuOiBQT1NUIC9ldmVudHMgKHRyYWNraW5nIGluZm8pCiAgICBBZHllbi0+PkFnZW50OiBQdXNoIHRyYWNraW5nIHRvIEFnZW50CiAgICBBZ2VudC0tPj5TaG9wcGVyOiAiWW91ciBwYWNrYWdlIGlzIG9uIHRoZSB3YXkhIgogICAgZW5kCg==<\/div><\/div>\n<h4>Advanced flow<\/h4>\n<p>The agent's <code>\/complete<\/code> call is identical to the standard flow. The difference: Adyen delivers the payment token to the merchant, who then calls <code>POST \/payments<\/code> directly and triggers order fulfillment in a single synchronous step.<\/p>\n<div id=\"mermaid-69fe043485e66-wrapper\"><div id=\"mermaid-69fe043485e66\" class=\"mermaid-shortcode loading\">CnNlcXVlbmNlRGlhZ3JhbQogICAgcGFydGljaXBhbnQgU2hvcHBlcgogICAgcGFydGljaXBhbnQgQWdlbnQgYXMgQUkgQWdlbnQKICAgIHBhcnRpY2lwYW50IFZhdWx0IGFzIFRva2VuIFZhdWx0CiAgICBwYXJ0aWNpcGFudCBBZHllbgogICAgcGFydGljaXBhbnQgTWVyY2hhbnQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAxLiBDcmVhdGUgY2hlY2tvdXQKICAgIFNob3BwZXItPj5BZ2VudDogIkJ1eSB0aGVzZSBoZWFkcGhvbmVzIgogICAgQWdlbnQtPj5BZHllbjogW0FDUF0gUE9TVCAvY2hlY2tvdXRfc2Vzc2lvbnMKICAgIEFkeWVuLT4+TWVyY2hhbnQ6IFBPU1QgL2FnZW50aWMvc2Vzc2lvbnMve2lkfQogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwMDogdG90YWxzLCBzdG9jaywgc2hpcHBpbmcKICAgIEFkeWVuLS0+PkFnZW50OiAyMDE6IFNlc3Npb24gSUQgKyB0b3RhbHMKICAgIEFnZW50LS0+PlNob3BwZXI6IERpc3BsYXkgb3JkZXIgc3VtbWFyeQogICAgZW5kCgogICAgcmVjdCByZ2IoMjQ1LCAyNDUsIDI0NSkKICAgIE5vdGUgb3ZlciBTaG9wcGVyLCBNZXJjaGFudDogU3RhZ2UgMi4gRGVsZWdhdGUgcGF5bWVudCAmIHRva2VuaXphdGlvbgogICAgU2hvcHBlci0+PkFnZW50OiAiUGF5IG5vdyIKICAgIEFnZW50LT4+VmF1bHQ6IEluc3RydWN0IGRlbGVnYXRlX3BheW1lbnQKICAgIFZhdWx0LT4+QWR5ZW46IFtBQ1BdIC9kZWxlZ2F0ZV9wYXltZW50CiAgICBBZHllbi0tPj5WYXVsdDogcHNwX3RyYW5zYWN0aW9uX3Rva2VuCiAgICBWYXVsdC0tPj5BZ2VudDogcHNwX3RyYW5zYWN0aW9uX3Rva2VuCiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAzLiBDb21wbGV0ZSAmIGF1dGhvcml6ZSAobWVyY2hhbnQtZXhlY3V0ZWQpCiAgICBBZ2VudC0+PkFkeWVuOiBbQUNQXSAvY2hlY2tvdXRfc2Vzc2lvbnMve2lkfS9jb21wbGV0ZQogICAgQWR5ZW4tPj5NZXJjaGFudDogUGF5bWVudCB0b2tlbiArIHNlc3Npb24gZGF0YQogICAgTWVyY2hhbnQtPj5BZHllbjogUE9TVCAvcGF5bWVudHMgKHBzcF90b2tlbikKICAgIEFkeWVuLS0+Pk1lcmNoYW50OiBQYXltZW50IHJlc3VsdCAoQXV0aG9yaXNlZCkKICAgIE5vdGUgb3ZlciBNZXJjaGFudDogVHJpZ2dlciBmdWxmaWxsbWVudAogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwNCBBQ0s6IHBheW1lbnQgcmVzdWx0CiAgICBBZHllbi0tPj5BZ2VudDogMjAwIHN0YXR1czogY29tcGxldGVkLCBvcmRlcnt9CiAgICBBZ2VudC0tPj5TaG9wcGVyOiAiT3JkZXIgY29uZmlybWVkISBSZWY6IG9yZF8uLi4iCiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSA0LiBQb3N0LXB1cmNoYXNlCiAgICBNZXJjaGFudC0+PkFkeWVuOiBQT1NUIC9ldmVudHMgKHRyYWNraW5nIGluZm8pCiAgICBBZHllbi0+PkFnZW50OiBQdXNoIHRyYWNraW5nIHRvIEFnZW50CiAgICBBZ2VudC0tPj5TaG9wcGVyOiAiWW91ciBwYWNrYWdlIGlzIG9uIHRoZSB3YXkhIgogICAgZW5kCg==<\/div><\/div>\n<h2>Session statuses<\/h2>\n<p>Every response contains a <code>status<\/code> field. Evaluate this field on every call.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Status<\/th>\n<th style=\"text-align: left;\">Category<\/th>\n<th style=\"text-align: left;\">Agent action<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>not_ready_for_payment<\/code><\/td>\n<td style=\"text-align: left;\">Active<\/td>\n<td style=\"text-align: left;\">Session has blocking errors. Surface <code>messages[]<\/code> to the shopper and resolve before proceeding.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>ready_for_payment<\/code><\/td>\n<td style=\"text-align: left;\">Active<\/td>\n<td style=\"text-align: left;\">All data valid and totals confirmed. Prompt shopper to confirm, then call Complete Session.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>in_progress<\/code><\/td>\n<td style=\"text-align: left;\">Active<\/td>\n<td style=\"text-align: left;\">Session is actively being processed. Await the next status transition before taking further action.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>completed<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Terminal<\/strong><\/td>\n<td style=\"text-align: left;\">Payment authorized and order created. Present <code>order.permalink_url<\/code> and <code>order.id<\/code> to the shopper.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>canceled<\/code><\/td>\n<td style=\"text-align: left;\"><strong>Terminal<\/strong><\/td>\n<td style=\"text-align: left;\">Session explicitly canceled. Do not reuse this session ID.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Error codes<\/h2>\n<p>When the merchant rejects a request (HTTP <code>422<\/code>), the session response contains a <code>messages[]<\/code> array with structured error objects. Surface these to the shopper as appropriate.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">HTTP<\/th>\n<th style=\"text-align: left;\">Reason code<\/th>\n<th style=\"text-align: left;\">Phase<\/th>\n<th style=\"text-align: left;\">Agent handling<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">200<\/td>\n<td style=\"text-align: left;\">\u2014<\/td>\n<td style=\"text-align: left;\">Any<\/td>\n<td style=\"text-align: left;\">Valid. Proceed to the next step.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\"><code>OUT_OF_STOCK<\/code><\/td>\n<td style=\"text-align: left;\">Create \/ Update \/ Commit<\/td>\n<td style=\"text-align: left;\">Item unavailable. Offer alternatives or remove from cart.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\"><code>PARTIAL_STOCK<\/code><\/td>\n<td style=\"text-align: left;\">Create \/ Update \/ Commit<\/td>\n<td style=\"text-align: left;\">Only X of Y units available. Offer reduced quantity.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\"><code>INVALID_ADDRESS<\/code><\/td>\n<td style=\"text-align: left;\">Create \/ Update \/ Commit<\/td>\n<td style=\"text-align: left;\">Delivery to this address unsupported. Prompt for alternative.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\"><code>RISK_REJECTED<\/code><\/td>\n<td style=\"text-align: left;\">Commit only<\/td>\n<td style=\"text-align: left;\">Merchant fraud engine blocked. Do not expose risk details. Offer alternative payment method.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">422<\/td>\n<td style=\"text-align: left;\"><code>PRICE_MISMATCH<\/code><\/td>\n<td style=\"text-align: left;\">Commit only<\/td>\n<td style=\"text-align: left;\">Price changed since last fetch. Re-fetch session and present updated totals for shopper re-confirmation.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpMessage object<\/h3>\n<p>All session responses include a required <code>messages[]<\/code> array. Each entry follows the <code>AcpMessage<\/code> schema.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'AcpMessage example'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"code\\\": \\\"OUT_OF_STOCK\\\",\\n  \\\"content\\\": \\\"The item is no longer available.\\\",\\n  \\\"content_type\\\": \\\"plain\\\",\\n  \\\"type\\\": \\\"error\\\",\\n  \\\"path\\\": \\\"items[0]\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2>Schema Reference<\/h2>\n<p>Endpoint:<\/p>\n<table>\n<thead>\n<tr>\n<th>Environment<\/th>\n<th>Base URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Test<\/td>\n<td><code>https:\/\/commerce-suite-test.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}<\/code><\/td>\n<\/tr>\n<tr>\n<td>Live<\/td>\n<td><code>https:\/\/commerce-suite.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>All request and response objects follow these standardized schemas.<\/p>\n<h3>AcpItem<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Merchant's product or SKU identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>quantity<\/code><\/strong> <em>integer<\/em><\/td>\n<td style=\"text-align: left;\">Units requested. Must be \u2265 1.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpLineItem<\/h3>\n<p>Returned in all session responses. Represents a resolved cart line with merchant-computed pricing.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Unique identifier for this line item within the session.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>item<\/code><\/strong> <em>AcpItem<\/em><\/td>\n<td style=\"text-align: left;\">The underlying item reference (<code>id<\/code> and <code>quantity<\/code>).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>base_amount<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Pre-tax unit price \u00d7 quantity in minor currency units, for example, <code>34900<\/code> = $349.00.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>discount<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Discount applied to this line in minor currency units. <code>0<\/code> if no discount applies.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>subtotal<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Line subtotal after any adjustments, before tax, in minor currency units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>tax<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Tax amount for this line in minor currency units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>total<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Final line total (subtotal + tax) in minor currency units.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpAddress<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>line_one<\/code><\/strong> <em>string \u00b7 max: 256<\/em><\/td>\n<td style=\"text-align: left;\">Primary street address.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>line_two<\/code><\/strong> <em>string \u00b7 max: 256<\/em><\/td>\n<td style=\"text-align: left;\">Secondary address line (apartment, suite, unit).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>city<\/code><\/strong> <em>string \u00b7 max: 256<\/em><\/td>\n<td style=\"text-align: left;\">City name.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>state<\/code><\/strong> <em>string \u00b7 min: 1<\/em><\/td>\n<td style=\"text-align: left;\">State or province code.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>country<\/code><\/strong> <em>string \u00b7 exactly 2 chars<\/em><\/td>\n<td style=\"text-align: left;\">ISO 3166-1 alpha-2 country code, for example, <code>US<\/code>, <code>GB<\/code>, <code>NL<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>postal_code<\/code><\/strong> <em>string \u00b7 max: 20<\/em><\/td>\n<td style=\"text-align: left;\">ZIP or postal code.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>name<\/code><\/strong> <em>string \u00b7 max: 256<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Recipient name for the address.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpBuyer<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>email<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Buyer's email address.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>first_name<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Buyer's first name.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>last_name<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Buyer's last name.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>phone_number<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Buyer's contact phone number.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpPaymentData<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>provider<\/code><\/strong> <em>string \u00b7 minLength: 1<\/em><\/td>\n<td style=\"text-align: left;\">Payment provider identifier. Use <code>adyen<\/code> for Adyen-issued tokens.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>token<\/code><\/strong> <em>string \u00b7 minLength: 1<\/em><\/td>\n<td style=\"text-align: left;\">PSP transaction token from your vault's <code>delegate_payment<\/code> call.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>billing_address<\/code><\/strong> <em>AcpAddress<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Billing address associated with the payment instrument. If omitted, the <code>fulfillment_address<\/code> is used for billing.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpPaymentProvider<\/h3>\n<p>Returned in Create Session response.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>provider<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Always \"adyen\" for this integration.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>merchant_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Adyen merchant account identifier for the connected merchant.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>supported_payment_methods<\/code><\/strong> <em>string[]<\/em><\/td>\n<td style=\"text-align: left;\">Accepted payment methods (e.g., [\"scheme\", \"googlepay\"]).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpFulfillmentOption (discriminated union)<\/h3>\n<p><code>AcpFulfillmentOption<\/code> is a discriminated union keyed on <code>type<\/code>. The base object only requires <code>type<\/code>. Use the subtype schemas based on the value of <code>type<\/code>.<\/p>\n<p><strong>Base<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Discriminator field. Determines which subtype schema applies. Values: <code>shipping<\/code>, <code>digital<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>AcpFulfillmentOptionShipping<\/strong> (type: <code>shipping<\/code>)<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Unique identifier. Pass as <code>fulfillment_option_id<\/code> in Update or Create Session.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Must be <code>shipping<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>title<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Human-readable shipping option name.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>subtotal<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Fulfillment subtotal before tax in minor currency units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>tax<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Tax on the fulfillment option in minor currency units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>total<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Total fulfillment cost (subtotal + tax) in minor currency units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>carrier<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Carrier name, for example, <code>UPS<\/code>, <code>DHL<\/code>, <code>FedEx<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>subtitle<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Additional description, for example, \"Delivered in 5\u20137 business days\".<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>earliest_delivery_time<\/code><\/strong> <em>string (date-time)<\/em><\/td>\n<td style=\"text-align: left;\">Optional. ISO 8601 timestamp for earliest expected delivery.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>latest_delivery_time<\/code><\/strong> <em>string (date-time)<\/em><\/td>\n<td style=\"text-align: left;\">Optional. ISO 8601 timestamp for latest expected delivery.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>AcpFulfillmentOptionDigital<\/strong> (type: <code>digital<\/code>)<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Unique identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Must be <code>digital<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>title<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Human-readable option name.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>subtotal<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Fulfillment subtotal before tax.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>tax<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Tax amount.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>total<\/code><\/strong> <em>integer (int64)<\/em><\/td>\n<td style=\"text-align: left;\">Total cost (subtotal + tax).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>subtitle<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Additional description.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpTotal<\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Total type (e.g., \"subtotal\", \"tax\", \"total\").<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>amount<\/code><\/strong> <em>integer<\/em><\/td>\n<td style=\"text-align: left;\">Amount in minor currency units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>display_text<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Localized label for display (e.g., \"Order Total\").<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpOrder<\/h3>\n<p>Included in <code>AcpCompleteSessionResponse<\/code> when authorization succeeds.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Unique order identifier. Present to the shopper as their order reference.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>checkout_session_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">The originating checkout session ID for correlation.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>permalink_url<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Permanent URL to the merchant's order details page. Share with the shopper for tracking and support.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpMessage<\/h3>\n<p>All responses include a required <code>messages[]<\/code> array. Evaluate it on every response, not only on error HTTP codes.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>code<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Machine-readable reason code, for example, <code>OUT_OF_STOCK<\/code>, <code>PRICE_MISMATCH<\/code>, <code>INVALID_ADDRESS<\/code>, <code>RISK_REJECTED<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>content<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Human-readable message text. Surface to the shopper when <code>type<\/code> is <code>error<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>content_type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Format of <code>content<\/code>. Either <code>plain<\/code> or <code>markdown<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Message category. Either <code>error<\/code> (agent must act) or <code>info<\/code> (informational notice).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>path<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. JSON path identifying the specific field that triggered the message, for example, <code>items[0]<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpLink<\/h3>\n<p>All session responses include a required <code>links[]<\/code> array of merchant policy and support URLs.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>type<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Link category, for example, <code>terms_of_service<\/code>, <code>return_policy<\/code>, <code>privacy_policy<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>url<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">The fully-qualified URL.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpUpdateCheckoutSessionRequest<\/h3>\n<p>Dedicated schema for the Update Session endpoint. All fields are optional \u2014 include only what needs to change.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>currency<\/code><\/strong> <em>string (ISO 4217) \u00b7 exactly 3 chars<\/em><\/td>\n<td style=\"text-align: left;\">Currency. Must match the session currency if provided.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>items<\/code><\/strong> <em>AcpItem[]<\/em><\/td>\n<td style=\"text-align: left;\">Replaces the entire item list.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>buyer<\/code><\/strong> <em>AcpBuyer<\/em><\/td>\n<td style=\"text-align: left;\">Updated buyer contact information.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>fulfillment_address<\/code><\/strong> <em>AcpAddress<\/em><\/td>\n<td style=\"text-align: left;\">Updated shipping address.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>fulfillment_option_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">ID of the selected fulfillment option.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AcpAffiliateAttribution<\/h3>\n<p>Optional affiliate attribution object for tracking referral sources at session creation. Include this to credit publishers, influencers, or campaign sources.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>provider<\/code><\/strong> <em>string \u00b7 minLength: 1<\/em><\/td>\n<td style=\"text-align: left;\">Attribution provider namespace identifier, for example, <code>impact.com<\/code>, <code>partnerize<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>token<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Opaque provider-issued attribution token for fraud-resistant validation.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>publisher_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Provider-scoped affiliate or publisher identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>campaign_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Provider-scoped campaign identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>creative_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Provider-scoped creative identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>sub_id<\/code><\/strong> <em>string<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Provider-scoped sub-tracking identifier.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>touchpoint<\/code><\/strong> <em>string (enum)<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Attribution touchpoint. Either <code>first<\/code> (session creation) or <code>last<\/code> (session completion).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>source<\/code><\/strong> <em>AcpAffiliateAttributionSource<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Context about where the attribution originated (<code>type<\/code> + optional <code>url<\/code>).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>issued_at<\/code><\/strong> <em>string (date-time)<\/em><\/td>\n<td style=\"text-align: left;\">Optional. ISO 8601 timestamp when the attribution token was issued.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>expires_at<\/code><\/strong> <em>string (date-time)<\/em><\/td>\n<td style=\"text-align: left;\">Optional. ISO 8601 timestamp when the attribution token expires.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>metadata<\/code><\/strong> <em>object<\/em><\/td>\n<td style=\"text-align: left;\">Optional. Arbitrary key-value metadata for additional attribution context.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>","url":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce\/ai-agent-integration","articleFields":{"description":"Integrate with the Adyen Agentic Commerce Suite API to enable your AI agent platform to execute transactions with Adyen merchants."},"algolia":{"url":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce\/ai-agent-integration","title":"AI agent integration with Agentic Commerce Suite","content":"The Adyen Agentic Commerce Suite API acts as a bridge between your AI agent platform and our merchants. This enables your agents to execute transactions on behalf of shoppers who use your AI agents. You communicate with Adyen through our API endpoints, and you do not communicate directly with merchants. Adyen handles the communication with our merchants and the downstream complexity of orchestrating stock validation, tax calculation, shipping, and payment authorization. We make the relevant information visible to your agents.\nRequirements\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nThis guide is for an integration using the OpenAI Agentic Commerce Protocol (ACP).\n\n\nUser role\nMake sure that your Adyen credential has the following user role: Commerce Suite API.\n\n\nSetup steps\nBefore you begin, make sure that you have: Set up a Token Vault integration using the Delegated Payment Spec with Adyen.\n\n\n\nHow it works\nUse the following base URL for the endpoints in the agentic commerce checkout lifecycle.\nThe path parameter {companyAccount} is the Adyen account of the merchant the shopper makes the transaction with.\n\n\n\nEnvironment\nBase URL\n\n\n\n\nTest\nhttps:\/\/commerce-suite-test.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}\n\n\nLive\nhttps:\/\/commerce-suite.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}\n\n\n\nThe agentic commerce checkout lifecycle consists of up to five phases.\n\n\n\n#\nPhase\nMethod\nEndpoint\nRequirement\n\n\n\n\n1\nCreate Session\nPOST\n\/checkout_sessions\nMandatory\n\n\n2\nGet Session\nGET\n\/checkout_sessions\/{sessionId}\nOptional\n\n\n3\nUpdate Session\nPOST\n\/checkout_sessions\/{sessionId}\nMandatory\n\n\n4\nComplete Session\nPOST\n\/checkout_sessions\/{sessionId}\/complete\nMandatory\n\n\n5\nCancel Session\nPOST\n\/checkout_sessions\/{sessionId}\/cancel\nOptional\n\n\n\nSee Sequence diagrams for visual representations of the flows.\nAuthentication\nThe Adyen Agentic Commerce Suite uses Bearer token authentication. Pass your Adyen API key as the Bearer token in the Authorization header. Your API key must have the Commerce Suite API role.\n\n    \n\n\nNever expose your API key in a URL query string, or in agent-readable context. All calls must originate from your secure agent backend or token vault infrastructure.\n\n1. Create Session\nInitializes a new checkout session with a list of items and optional buyer and fulfillment information. Adyen calls the merchant's backend to validate stock and compute real-time totals, then returns the authoritative session state to your agent.\nMethod and endpoint: POST \/checkout_sessions\nCreates a new checkout session. Returns HTTP 200 with line items, fulfillment options, totals, and a payment_provider block identifying the merchant's PSP and accepted payment methods.\nRequest body\n\n\n\nParameter\nType\nRequired\nDescription\n\n\n\n\ncurrency\nstring (ISO 4217) \u00b7 exactly 3 chars\n\n3-letter settlement currency code, for example, USD, EUR, GBP.\n\n\nitems\nAcpItem[]\n\nItems to add to the session. Each item requires an id and quantity \u2265 1.\n\n\nbuyer\nAcpBuyer\n\nBuyer contact details: email, first_name, last_name, phone_number.\n\n\nfulfillment_address\nAcpAddress\n\nShipping address. Required for physical goods where tax or shipping varies by location.\n\n\nfulfillment_option_id\nstring\n\nPre-select a fulfillment option if already known.\n\n\naffiliate_attribution\nAcpAffiliateAttribution\n\nAffiliate attribution data for tracking referral sources. Includes provider, token, publisher_id, campaign_id, and touchpoint. See AcpAffiliateAttribution.\n\n\n\n\n    \n\nResponse\nIdentical to AcpCheckoutSessionResponse plus a required payment_provider object.\n\n    \n\nStatus codes\n\n\n\nHTTP\nMeaning\nDescription\n\n\n\n\n200\nOK\nSession created. Use the returned id for all subsequent calls.\n\n\n422\nUnprocessable\nBusiness logic prevented creation (for example, out of stock). Inspect messages[].\n\n\n\n2. (Optional) Get Session\nRetrieves the current authoritative state of a session. Use this to re-sync totals after an async event or verify status before confirming payment with the shopper.\nMethod and endpoint: GET \/checkout_sessions\/{sessionId}\nNo request body. Returns the full AcpCheckoutSessionResponse for the given session ID.\nPath parameters\n\n\n\nParameter\nType\nRequired\nDescription\n\n\n\n\ncompanyAccount\nstring\n\nYour Adyen company account identifier.\n\n\nsessionId\nstring\n\nThe id returned from the Create Session call.\n\n\n\nStatus codes\n\n\n\nHTTP\nMeaning\nDescription\n\n\n\n\n200\nOK\nSession found and returned.\n\n\n404\nNot Found\nSession ID does not exist or has expired.\n\n\n\n3. Update Session\nUpdates an existing session with new items, address, buyer details, or a fulfillment selection. Each update re-triggers Adyen's call to the merchant's live calculator, ensuring your agent always has accurate totals.\nMethod and endpoint: POST \/checkout_sessions\/{sessionId}\nReturns the full updated AcpCheckoutSessionResponse. Only fields present in the request body are applied.\nRequest body\nThis endpoint uses a dedicated AcpUpdateCheckoutSessionRequest schema. Unlike Create Session, no fields are required \u2014 include only what needs to change.\n\n\n\nParameter\nType\nRequired\nDescription\n\n\n\n\ncurrency\nstring (ISO 4217)\n\nMust match the currency set at session creation if provided.\n\n\nitems\nAcpItem[]\n\nReplaces the entire item list.\n\n\nbuyer\nAcpBuyer\n\nUpdated buyer contact information.\n\n\nfulfillment_address\nAcpAddress\n\nUpdated shipping address. Triggers recalculation of tax and shipping costs.\n\n\nfulfillment_option_id\nstring\n\nID of the fulfillment option the shopper selected from fulfillment_options[] in the session response.\n\n\n\n\n    \n\n\nCall Update Session whenever the shopper changes their delivery address, selects a shipping tier, or modifies cart quantity. The response line_items[].total, fulfillment_options[].total, and totals[] are always authoritative \u2014 present these to the shopper before proceeding to Complete.\n\nStatus codes\n\n\n\nHTTP\nMeaning\nDescription\n\n\n\n\n200\nOK\nSession updated. Response contains the latest authoritative state.\n\n\n422\nUnprocessable\nUpdate rejected by merchant logic (for example, item now out of stock). Inspect messages[].\n\n\n\n4. Complete Session\nFinalizes the session by submitting the payment token from your agent's Token Vault. Adyen validates the token, optionally calls the merchant's commit endpoint for a pre-authorization risk check, executes payment authorization, and returns the result \u2014 including the created order object on success.\nMethod and endpoint: POST \/checkout_sessions\/{sessionId}\/complete\nSubmits payment data and triggers authorization. Returns AcpCompleteSessionResponse \u2014 the full session state plus an order object on successful authorization.\nRequest body\n\n\n\nParameter\nType\nRequired\nDescription\n\n\n\n\npayment_data\nAcpPaymentData\n\nPayment token and provider. Must include provider (for example, adyen) and token \u2014 the PSP transaction token from your vault's delegate_payment call.\n\n\n\nExample request\n\n    \n\nSuccess response\n\n    \n\n\nPresent order.permalink_url to the shopper as their confirmation link. order.id is the unique order identifier \u2014 use it for post-purchase communication and support queries.\n\nStatus codes\n\n\n\nHTTP\nMeaning\nDescription\n\n\n\n\n200\nOK\nAuthorization executed. order present on success; messages[] contains details on declined authorization.\n\n\n\n5. (Optional) Cancel Session\nCancels an active session that has not been completed. Call this when the shopper abandons checkout or your agent cannot proceed. Signals the merchant to release any reserved inventory.\nMethod and endpoint: POST \/checkout_sessions\/{sessionId}\/cancel\nNo request body required. Returns AcpCheckoutSessionResponse with status: \"canceled\".\nStatus codes\n\n\n\nHTTP\nMeaning\nDescription\n\n\n\n\n200\nOK\nSession canceled. Response contains the final session state with status: \"canceled\".\n\n\n\nTesting\nUse the sandbox environment to test end-to-end before going live. The sandbox uses the same API spec and schemas as production.\nUse the following base URL for all sandbox requests besides Delegate Payment:\nhttps:\/\/commerce-suite-test.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}\nSandbox endpoints\n\n\n\nOperation\nMethod\nPath\n\n\n\n\nCreate Session\nPOST\n\/checkout_sessions\n\n\nGet Session\nGET\n\/checkout_sessions\/{sessionId}\n\n\nUpdate Session\nPOST\n\/checkout_sessions\/{sessionId}\n\n\nComplete Session\nPOST\n\/checkout_sessions\/{sessionId}\/complete\n\n\nCancel Session\nPOST\n\/checkout_sessions\/{sessionId}\/cancel\n\n\nDelegate Payment\nPOST\nhttps:\/\/pal-test.adyen.com\/paltokenization\/servlet\/Recurring\/Agentic\/acp\/v1\/agentic_commerce\/delegate_payment\n\n\n\n\nThe delegate_payment endpoint is part of our tokenization domain, not the Commerce Suite domain. It handles raw PSP credential material on behalf of the agent's Token Vault. Authenticate with Authorization: Bearer exactly as you would for all other Commerce Suite calls.\n\nRecommended test sequence\nTo verify your integration, follow these steps:\n\n\nCreate a session.\nMake a POST \/checkout_sessions request with your test API key in the Authorization: Bearer header. Note the returned id (for example, cs_test_abc123).\n\n\nUpdate with address and fulfillment selection.\nMake a POST \/checkout_sessions\/cs_test_abc123 request. Confirm that status is ready_for_payment and that the totals are finalized.\n\n\nDelegate payment through the Token Vault.\nMake a POST \/delegate_payment request with your test API key in the Authorization: Bearer header. Capture the returned psp_transaction_token.\n\n\nComplete the session.\nMake a POST \/checkout_sessions\/cs_test_abc123\/complete request.\n\n\n\nConfirm that status is completed and order.id is present.\n\n\nTest product catalogue\nThe Adyen test merchant exposes the following 10 products. Use these id values in the items[] array of any Create or Update Session request. Quantity must be \u2265 1.\n\n\n\nProduct ID\nName\nPrice\nCategory\n\n\n\n\n01\nPolo shirt\n50.00\nClothing\n\n\n02\nHeadphones\n50.00\nElectronics\n\n\n03\nSunglasses\n50.00\nAccessories\n\n\n04\nBoots\n50.00\nFootwear\n\n\n05\nEvent ticket\n50.00\nTickets\n\n\n06\nBackpack\n50.00\nAccessories\n\n\n07\nJoypad\n50.00\nElectronics\n\n\n08\nFood delivery\n50.00\nFood\n\n\n09\nHandbag\n50.00\nAccessories\n\n\n10\nSneakers\n50.00\nFootwear\n\n\n\n\n    \n\nSequence diagrams\nThe two diagrams below show the full lifecycle for both integration patterns. In both cases your agent's calls to Adyen are identical \u2014 the difference is entirely in how Adyen and the merchant orchestrate payment authorization on the back end.\nStandard flow\nAdyen executes payment authorization on behalf of the agent. The agent's Token Vault calls delegate_payment to obtain a PSP token, which the agent then submits via \/complete. Adyen handles the rest.\nCnNlcXVlbmNlRGlhZ3JhbQogICAgcGFydGljaXBhbnQgU2hvcHBlcgogICAgcGFydGljaXBhbnQgQWdlbnQgYXMgQUkgQWdlbnQKICAgIHBhcnRpY2lwYW50IFZhdWx0IGFzIFRva2VuIFZhdWx0CiAgICBwYXJ0aWNpcGFudCBBZHllbgogICAgcGFydGljaXBhbnQgTWVyY2hhbnQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAxLiBDcmVhdGUgY2hlY2tvdXQKICAgIFNob3BwZXItPj5BZ2VudDogIkJ1eSB0aGVzZSBoZWFkcGhvbmVzIgogICAgQWdlbnQtPj5BZHllbjogW0FDUF0gUE9TVCAvY2hlY2tvdXRfc2Vzc2lvbnMKICAgIEFkeWVuLT4+TWVyY2hhbnQ6IFBPU1QgL2FnZW50aWMvc2Vzc2lvbnMve2lkfQogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwMCBzdGF0dXM6ICB0b3RhbHMsIHN0b2NrLCBzaGlwcGluZwogICAgQWR5ZW4tLT4+QWdlbnQ6IDIwMTogU2Vzc2lvbiBJRCArIHRvdGFscwogICAgQWdlbnQtLT4+U2hvcHBlcjogRGlzcGxheSBvcmRlciBzdW1tYXJ5CiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAyLiBEZWxlZ2F0ZSBwYXltZW50ICYgdG9rZW5pemF0aW9uCiAgICBTaG9wcGVyLT4+QWdlbnQ6ICJQYXkgbm93IgogICAgQWdlbnQtPj5WYXVsdDogSW5zdHJ1Y3QgZGVsZWdhdGVfcGF5bWVudAogICAgVmF1bHQtPj5BZHllbjogW0FDUF0gL2RlbGVnYXRlX3BheW1lbnQKICAgIEFkeWVuLS0+PlZhdWx0OiBwc3BfdHJhbnNhY3Rpb25fdG9rZW4KICAgIFZhdWx0LS0+PkFnZW50OiBwc3BfdHJhbnNhY3Rpb25fdG9rZW4KICAgIGVuZAoKICAgIHJlY3QgcmdiKDI0NSwgMjQ1LCAyNDUpCiAgICBOb3RlIG92ZXIgU2hvcHBlciwgTWVyY2hhbnQ6IFN0YWdlIDMuIENvbXBsZXRlICYgYXV0aG9yaXplCiAgICBBZ2VudC0+PkFkeWVuOiBbQUNQXSAvY2hlY2tvdXRfc2Vzc2lvbnMve2lkfS9jb21wbGV0ZQogICAgQWR5ZW4tPj5NZXJjaGFudDogUE9TVCAvYWdlbnRpYy9zZXNzaW9ucy97aWR9L2NvbW1pdAogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwMCBTVUNDRVNTCiAgICBOb3RlIG92ZXIgQWR5ZW46IEV4ZWN1dGUgQXV0aAogICAgQWR5ZW4tPj5NZXJjaGFudDogUE9TVCAvYWdlbnRpYy9zZXNzaW9ucy97aWR9L2ZpbmFsaXplCiAgICBNZXJjaGFudC0tPj5BZHllbjogMjA0IEFDSzogdHJpZ2dlciBmdWxmaWxsbWVudAogICAgQWR5ZW4tLT4+QWdlbnQ6IDIwMCBzdGF0dXM6IGNvbXBsZXRlZCwgb3JkZXJ7fQogICAgQWdlbnQtLT4+U2hvcHBlcjogIk9yZGVyIGNvbmZpcm1lZCEiCiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSA0LiBQb3N0LXB1cmNoYXNlCiAgICBNZXJjaGFudC0+PkFkeWVuOiBQT1NUIC9ldmVudHMgKHRyYWNraW5nIGluZm8pCiAgICBBZHllbi0+PkFnZW50OiBQdXNoIHRyYWNraW5nIHRvIEFnZW50CiAgICBBZ2VudC0tPj5TaG9wcGVyOiAiWW91ciBwYWNrYWdlIGlzIG9uIHRoZSB3YXkhIgogICAgZW5kCg==\nAdvanced flow\nThe agent's \/complete call is identical to the standard flow. The difference: Adyen delivers the payment token to the merchant, who then calls POST \/payments directly and triggers order fulfillment in a single synchronous step.\nCnNlcXVlbmNlRGlhZ3JhbQogICAgcGFydGljaXBhbnQgU2hvcHBlcgogICAgcGFydGljaXBhbnQgQWdlbnQgYXMgQUkgQWdlbnQKICAgIHBhcnRpY2lwYW50IFZhdWx0IGFzIFRva2VuIFZhdWx0CiAgICBwYXJ0aWNpcGFudCBBZHllbgogICAgcGFydGljaXBhbnQgTWVyY2hhbnQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAxLiBDcmVhdGUgY2hlY2tvdXQKICAgIFNob3BwZXItPj5BZ2VudDogIkJ1eSB0aGVzZSBoZWFkcGhvbmVzIgogICAgQWdlbnQtPj5BZHllbjogW0FDUF0gUE9TVCAvY2hlY2tvdXRfc2Vzc2lvbnMKICAgIEFkeWVuLT4+TWVyY2hhbnQ6IFBPU1QgL2FnZW50aWMvc2Vzc2lvbnMve2lkfQogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwMDogdG90YWxzLCBzdG9jaywgc2hpcHBpbmcKICAgIEFkeWVuLS0+PkFnZW50OiAyMDE6IFNlc3Npb24gSUQgKyB0b3RhbHMKICAgIEFnZW50LS0+PlNob3BwZXI6IERpc3BsYXkgb3JkZXIgc3VtbWFyeQogICAgZW5kCgogICAgcmVjdCByZ2IoMjQ1LCAyNDUsIDI0NSkKICAgIE5vdGUgb3ZlciBTaG9wcGVyLCBNZXJjaGFudDogU3RhZ2UgMi4gRGVsZWdhdGUgcGF5bWVudCAmIHRva2VuaXphdGlvbgogICAgU2hvcHBlci0+PkFnZW50OiAiUGF5IG5vdyIKICAgIEFnZW50LT4+VmF1bHQ6IEluc3RydWN0IGRlbGVnYXRlX3BheW1lbnQKICAgIFZhdWx0LT4+QWR5ZW46IFtBQ1BdIC9kZWxlZ2F0ZV9wYXltZW50CiAgICBBZHllbi0tPj5WYXVsdDogcHNwX3RyYW5zYWN0aW9uX3Rva2VuCiAgICBWYXVsdC0tPj5BZ2VudDogcHNwX3RyYW5zYWN0aW9uX3Rva2VuCiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSAzLiBDb21wbGV0ZSAmIGF1dGhvcml6ZSAobWVyY2hhbnQtZXhlY3V0ZWQpCiAgICBBZ2VudC0+PkFkeWVuOiBbQUNQXSAvY2hlY2tvdXRfc2Vzc2lvbnMve2lkfS9jb21wbGV0ZQogICAgQWR5ZW4tPj5NZXJjaGFudDogUGF5bWVudCB0b2tlbiArIHNlc3Npb24gZGF0YQogICAgTWVyY2hhbnQtPj5BZHllbjogUE9TVCAvcGF5bWVudHMgKHBzcF90b2tlbikKICAgIEFkeWVuLS0+Pk1lcmNoYW50OiBQYXltZW50IHJlc3VsdCAoQXV0aG9yaXNlZCkKICAgIE5vdGUgb3ZlciBNZXJjaGFudDogVHJpZ2dlciBmdWxmaWxsbWVudAogICAgTWVyY2hhbnQtLT4+QWR5ZW46IDIwNCBBQ0s6IHBheW1lbnQgcmVzdWx0CiAgICBBZHllbi0tPj5BZ2VudDogMjAwIHN0YXR1czogY29tcGxldGVkLCBvcmRlcnt9CiAgICBBZ2VudC0tPj5TaG9wcGVyOiAiT3JkZXIgY29uZmlybWVkISBSZWY6IG9yZF8uLi4iCiAgICBlbmQKCiAgICByZWN0IHJnYigyNDUsIDI0NSwgMjQ1KQogICAgTm90ZSBvdmVyIFNob3BwZXIsIE1lcmNoYW50OiBTdGFnZSA0LiBQb3N0LXB1cmNoYXNlCiAgICBNZXJjaGFudC0+PkFkeWVuOiBQT1NUIC9ldmVudHMgKHRyYWNraW5nIGluZm8pCiAgICBBZHllbi0+PkFnZW50OiBQdXNoIHRyYWNraW5nIHRvIEFnZW50CiAgICBBZ2VudC0tPj5TaG9wcGVyOiAiWW91ciBwYWNrYWdlIGlzIG9uIHRoZSB3YXkhIgogICAgZW5kCg==\nSession statuses\nEvery response contains a status field. Evaluate this field on every call.\n\n\n\nStatus\nCategory\nAgent action\n\n\n\n\nnot_ready_for_payment\nActive\nSession has blocking errors. Surface messages[] to the shopper and resolve before proceeding.\n\n\nready_for_payment\nActive\nAll data valid and totals confirmed. Prompt shopper to confirm, then call Complete Session.\n\n\nin_progress\nActive\nSession is actively being processed. Await the next status transition before taking further action.\n\n\ncompleted\nTerminal\nPayment authorized and order created. Present order.permalink_url and order.id to the shopper.\n\n\ncanceled\nTerminal\nSession explicitly canceled. Do not reuse this session ID.\n\n\n\nError codes\nWhen the merchant rejects a request (HTTP 422), the session response contains a messages[] array with structured error objects. Surface these to the shopper as appropriate.\n\n\n\nHTTP\nReason code\nPhase\nAgent handling\n\n\n\n\n200\n\u2014\nAny\nValid. Proceed to the next step.\n\n\n422\nOUT_OF_STOCK\nCreate \/ Update \/ Commit\nItem unavailable. Offer alternatives or remove from cart.\n\n\n422\nPARTIAL_STOCK\nCreate \/ Update \/ Commit\nOnly X of Y units available. Offer reduced quantity.\n\n\n422\nINVALID_ADDRESS\nCreate \/ Update \/ Commit\nDelivery to this address unsupported. Prompt for alternative.\n\n\n422\nRISK_REJECTED\nCommit only\nMerchant fraud engine blocked. Do not expose risk details. Offer alternative payment method.\n\n\n422\nPRICE_MISMATCH\nCommit only\nPrice changed since last fetch. Re-fetch session and present updated totals for shopper re-confirmation.\n\n\n\nAcpMessage object\nAll session responses include a required messages[] array. Each entry follows the AcpMessage schema.\n\n    \n\nSchema Reference\nEndpoint:\n\n\n\nEnvironment\nBase URL\n\n\n\n\nTest\nhttps:\/\/commerce-suite-test.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}\n\n\nLive\nhttps:\/\/commerce-suite.adyen.com\/commerce-suite\/acp\/v1\/{companyAccount}\n\n\n\nAll request and response objects follow these standardized schemas.\nAcpItem\n\n\n\nParameter\nDescription\n\n\n\n\nid string\nMerchant's product or SKU identifier.\n\n\nquantity integer\nUnits requested. Must be \u2265 1.\n\n\n\nAcpLineItem\nReturned in all session responses. Represents a resolved cart line with merchant-computed pricing.\n\n\n\nParameter\nDescription\n\n\n\n\nid string\nUnique identifier for this line item within the session.\n\n\nitem AcpItem\nThe underlying item reference (id and quantity).\n\n\nbase_amount integer (int64)\nPre-tax unit price \u00d7 quantity in minor currency units, for example, 34900 = $349.00.\n\n\ndiscount integer (int64)\nDiscount applied to this line in minor currency units. 0 if no discount applies.\n\n\nsubtotal integer (int64)\nLine subtotal after any adjustments, before tax, in minor currency units.\n\n\ntax integer (int64)\nTax amount for this line in minor currency units.\n\n\ntotal integer (int64)\nFinal line total (subtotal + tax) in minor currency units.\n\n\n\nAcpAddress\n\n\n\nParameter\nDescription\n\n\n\n\nline_one string \u00b7 max: 256\nPrimary street address.\n\n\nline_two string \u00b7 max: 256\nSecondary address line (apartment, suite, unit).\n\n\ncity string \u00b7 max: 256\nCity name.\n\n\nstate string \u00b7 min: 1\nState or province code.\n\n\ncountry string \u00b7 exactly 2 chars\nISO 3166-1 alpha-2 country code, for example, US, GB, NL.\n\n\npostal_code string \u00b7 max: 20\nZIP or postal code.\n\n\nname string \u00b7 max: 256\nOptional. Recipient name for the address.\n\n\n\nAcpBuyer\n\n\n\nParameter\nDescription\n\n\n\n\nemail string\nBuyer's email address.\n\n\nfirst_name string\nBuyer's first name.\n\n\nlast_name string\nBuyer's last name.\n\n\nphone_number string\nBuyer's contact phone number.\n\n\n\nAcpPaymentData\n\n\n\nParameter\nDescription\n\n\n\n\nprovider string \u00b7 minLength: 1\nPayment provider identifier. Use adyen for Adyen-issued tokens.\n\n\ntoken string \u00b7 minLength: 1\nPSP transaction token from your vault's delegate_payment call.\n\n\nbilling_address AcpAddress\nOptional. Billing address associated with the payment instrument. If omitted, the fulfillment_address is used for billing.\n\n\n\nAcpPaymentProvider\nReturned in Create Session response.\n\n\n\nParameter\nDescription\n\n\n\n\nprovider string\nAlways \"adyen\" for this integration.\n\n\nmerchant_id string\nAdyen merchant account identifier for the connected merchant.\n\n\nsupported_payment_methods string[]\nAccepted payment methods (e.g., [\"scheme\", \"googlepay\"]).\n\n\n\nAcpFulfillmentOption (discriminated union)\nAcpFulfillmentOption is a discriminated union keyed on type. The base object only requires type. Use the subtype schemas based on the value of type.\nBase\n\n\n\nParameter\nDescription\n\n\n\n\ntype string\nDiscriminator field. Determines which subtype schema applies. Values: shipping, digital.\n\n\n\nAcpFulfillmentOptionShipping (type: shipping)\n\n\n\nParameter\nDescription\n\n\n\n\nid string\nUnique identifier. Pass as fulfillment_option_id in Update or Create Session.\n\n\ntype string\nMust be shipping.\n\n\ntitle string\nHuman-readable shipping option name.\n\n\nsubtotal integer (int64)\nFulfillment subtotal before tax in minor currency units.\n\n\ntax integer (int64)\nTax on the fulfillment option in minor currency units.\n\n\ntotal integer (int64)\nTotal fulfillment cost (subtotal + tax) in minor currency units.\n\n\ncarrier string\nOptional. Carrier name, for example, UPS, DHL, FedEx.\n\n\nsubtitle string\nOptional. Additional description, for example, \"Delivered in 5\u20137 business days\".\n\n\nearliest_delivery_time string (date-time)\nOptional. ISO 8601 timestamp for earliest expected delivery.\n\n\nlatest_delivery_time string (date-time)\nOptional. ISO 8601 timestamp for latest expected delivery.\n\n\n\nAcpFulfillmentOptionDigital (type: digital)\n\n\n\nParameter\nDescription\n\n\n\n\nid string\nUnique identifier.\n\n\ntype string\nMust be digital.\n\n\ntitle string\nHuman-readable option name.\n\n\nsubtotal integer (int64)\nFulfillment subtotal before tax.\n\n\ntax integer (int64)\nTax amount.\n\n\ntotal integer (int64)\nTotal cost (subtotal + tax).\n\n\nsubtitle string\nOptional. Additional description.\n\n\n\nAcpTotal\n\n\n\nParameter\nDescription\n\n\n\n\ntype string\nTotal type (e.g., \"subtotal\", \"tax\", \"total\").\n\n\namount integer\nAmount in minor currency units.\n\n\ndisplay_text string\nLocalized label for display (e.g., \"Order Total\").\n\n\n\nAcpOrder\nIncluded in AcpCompleteSessionResponse when authorization succeeds.\n\n\n\nParameter\nDescription\n\n\n\n\nid string\nUnique order identifier. Present to the shopper as their order reference.\n\n\ncheckout_session_id string\nThe originating checkout session ID for correlation.\n\n\npermalink_url string\nPermanent URL to the merchant's order details page. Share with the shopper for tracking and support.\n\n\n\nAcpMessage\nAll responses include a required messages[] array. Evaluate it on every response, not only on error HTTP codes.\n\n\n\nParameter\nDescription\n\n\n\n\ncode string\nMachine-readable reason code, for example, OUT_OF_STOCK, PRICE_MISMATCH, INVALID_ADDRESS, RISK_REJECTED.\n\n\ncontent string\nHuman-readable message text. Surface to the shopper when type is error.\n\n\ncontent_type string\nFormat of content. Either plain or markdown.\n\n\ntype string\nMessage category. Either error (agent must act) or info (informational notice).\n\n\npath string\nOptional. JSON path identifying the specific field that triggered the message, for example, items[0].\n\n\n\nAcpLink\nAll session responses include a required links[] array of merchant policy and support URLs.\n\n\n\nParameter\nDescription\n\n\n\n\ntype string\nLink category, for example, terms_of_service, return_policy, privacy_policy.\n\n\nurl string\nThe fully-qualified URL.\n\n\n\nAcpUpdateCheckoutSessionRequest\nDedicated schema for the Update Session endpoint. All fields are optional \u2014 include only what needs to change.\n\n\n\nParameter\nDescription\n\n\n\n\ncurrency string (ISO 4217) \u00b7 exactly 3 chars\nCurrency. Must match the session currency if provided.\n\n\nitems AcpItem[]\nReplaces the entire item list.\n\n\nbuyer AcpBuyer\nUpdated buyer contact information.\n\n\nfulfillment_address AcpAddress\nUpdated shipping address.\n\n\nfulfillment_option_id string\nID of the selected fulfillment option.\n\n\n\nAcpAffiliateAttribution\nOptional affiliate attribution object for tracking referral sources at session creation. Include this to credit publishers, influencers, or campaign sources.\n\n\n\nParameter\nDescription\n\n\n\n\nprovider string \u00b7 minLength: 1\nAttribution provider namespace identifier, for example, impact.com, partnerize.\n\n\ntoken string\nOptional. Opaque provider-issued attribution token for fraud-resistant validation.\n\n\npublisher_id string\nOptional. Provider-scoped affiliate or publisher identifier.\n\n\ncampaign_id string\nOptional. Provider-scoped campaign identifier.\n\n\ncreative_id string\nOptional. Provider-scoped creative identifier.\n\n\nsub_id string\nOptional. Provider-scoped sub-tracking identifier.\n\n\ntouchpoint string (enum)\nOptional. Attribution touchpoint. Either first (session creation) or last (session completion).\n\n\nsource AcpAffiliateAttributionSource\nOptional. Context about where the attribution originated (type + optional url).\n\n\nissued_at string (date-time)\nOptional. ISO 8601 timestamp when the attribution token was issued.\n\n\nexpires_at string (date-time)\nOptional. ISO 8601 timestamp when the attribution token expires.\n\n\nmetadata object\nOptional. Arbitrary key-value metadata for additional attribution context.\n\n\n","type":"page","locale":"en","boost":17,"hierarchy":{"lvl0":"Home","lvl1":"Online payments","lvl2":"Agentic Commerce","lvl3":"AI agent integration with Agentic Commerce Suite"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/online-payments","lvl2":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce","lvl3":"\/online-payments\/agentic-commerce\/ai-agent-integration"},"levels":4,"category":"Online Payments","category_color":"green","tags":["agent","integration","Agentic","Commerce","Suite"]}}
