{"title":"Agentic Payments integration with UCP","category":"default","creationDate":1781866579,"content":"<p>Integrate with the Adyen UCP Tokenization Handler to securely tokenize payment credentials on behalf of merchants, following the <a href=\"https:\/\/ucp.dev\/2026-01-23\/specification\/tokenization-guide\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Universal Commerce Protocol (UCP) tokenization specification (2026-01-23)<\/a>. Your agent platform sends shopper payment credentials to Adyen, and Adyen returns a UCP token that is associated with the specific checkout session and merchant identifier. Your agent passes the token to the merchant, and the merchant uses the token to process the payment with Adyen.<\/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;\">Make sure that you have set up an integration that follows the <a href=\"https:\/\/ucp.dev\/2026-01-23\/specification\/tokenization-guide\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Universal Commerce Protocol (UCP) tokenization specification (2026-01-23)<\/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 (API key) 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>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">You must complete our security review to approve your platform.<\/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, reach out to your Adyen contact for the following: <ul><li markdown=\"1\">Access to UCP Tokenization Handler.<\/li><li markdown=\"1\">Your dedicated agent platform API key.<\/li><li markdown=\"1\">Merchant opt-in for your platform. Each merchant must independently authorize your platform to tokenize on their behalf. Your Adyen contact configures this for each merchant account.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>How it works<\/h2>\n<p>When a shopper initiates a transaction using your agent platform, the following flow occurs:<\/p>\n<ol>\n<li>The shopper enters their payment details in your agent platform.<\/li>\n<li>Your agent platform sends the payment credentials to Adyen by making a POST <code>\/ucp\/v1\/handler\/tokenize<\/code> request.<\/li>\n<li>Adyen validates the credentials and returns a UCP token to your agent platform.<\/li>\n<li>Your agent platform sends the UCP token to the merchant checkout application.<\/li>\n<li>The merchant's checkout application makes a <code>\/payments<\/code> request including the UCP token.<\/li>\n<li>Adyen authorizes the payment and returns the payment result to the merchant checkout application.<\/li>\n<\/ol>\n<div id=\"mermaid-6a35259195911-wrapper\"><div id=\"mermaid-6a35259195911\" class=\"mermaid-shortcode loading\">CnNlcXVlbmNlRGlhZ3JhbQphdXRvbnVtYmVyCnBhcnRpY2lwYW50IFNob3BwZXIKcGFydGljaXBhbnQgUGxhdGZvcm0gYXMgWW91ciBhZ2VudCBwbGF0Zm9ybQpwYXJ0aWNpcGFudCBBZHllbgpwYXJ0aWNpcGFudCBBcHAgYXMgTWVyY2hhbnQgY2hlY2tvdXQgYXBwbGljYXRpb24KCiAgICBTaG9wcGVyLT4+UGxhdGZvcm06IEVudGVycyBwYXltZW50IGRldGFpbHMKICAgIFBsYXRmb3JtLT4+QWR5ZW46IFBPU1QgL3VjcC92MS9oYW5kbGVyL3Rva2VuaXplCiAgICBBZHllbi0tPj5QbGF0Zm9ybTogVUNQIHRva2VuCiAgICBQbGF0Zm9ybS0+PkFwcDogU2VuZHMgVUNQIHRva2VuCiAgICBBcHAtPj5BZHllbjogL3BheW1lbnRzIChpbmNsdWRlcyBVQ1AgdG9rZW4pCiAgICBBZHllbi0tPj5BcHA6IFBheW1lbnQgcmVzdWx0IChBdXRob3JpemVkKQo=<\/div><\/div>\n<h3>Authentication<\/h3>\n<p>Authenticate your requests using your agent platform API key as a Bearer token in the <code>Authorization<\/code> header.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Bearer token authentication'\" :id=\"''\" :code-data='[{\"language\":\"http\",\"tabTitle\":\"\",\"content\":\"Authorization: Bearer AGENT_PLATFORM_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 credentials in a URL query string, or in agent-readable context. All calls must originate from your secure agent backend.<\/p>\n<\/div><\/div>\n<h2>Create a token with payment details<\/h2>\n<p>After the shopper enters their payment details, create a UCP token to securely store their payment information.<\/p>\n<p>Use the following endpoint URL:<\/p>\n<table>\n<thead>\n<tr>\n<th>Environment<\/th>\n<th>Endpoint 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\/ucp\/v1\/handler\/tokenize<\/code><\/td>\n<\/tr>\n<tr>\n<td>Live<\/td>\n<td><code>https:\/\/commerce-suite-live.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ol>\n<li>\n<p>Make a POST <code>\/tokenize<\/code> request, including the following:<\/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;\"><code>credential.type<\/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 credential type. Possible value: <strong>card<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.card_number_type<\/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 type of card number. Possible values: <ul><li markdown=\"1\"><strong>fpan<\/strong><\/li><li markdown=\"1\"><strong>network_token<\/strong><\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.number<\/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 shopper's card number.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.cryptogram<\/code><\/td>\n<td style=\"text-align: left;\">String<\/td>\n<td style=\"text-align: left;\"><span class=\"hint--bottom\" data-hint=\"Conditionally required\" markdown=\"1\"><img style=\"width: 25px;\" alt=\"Conditionally required\" src=\"\/user\/pages\/reuse\/image-library\/01.icons\/conditionally-required\/conditionally-required.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/span><\/td>\n<td style=\"text-align: left;\">Required if <code>card_number_type<\/code> is <strong>network_token<\/strong>. The cryptogram provided with network tokens.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.expiry_month<\/code><\/td>\n<td style=\"text-align: left;\">Integer<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The card expiry month.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.expiry_year<\/code><\/td>\n<td style=\"text-align: left;\">Integer<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The card expiry year (four digits).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.name<\/code><\/td>\n<td style=\"text-align: left;\">String<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The cardholder name.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.cvc<\/code><\/td>\n<td style=\"text-align: left;\">String<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The card CVC or CVV number.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>credential.eci_value<\/code><\/td>\n<td style=\"text-align: left;\">String<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The Electronic Commerce Indicator for network tokens.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>binding.checkout_id<\/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 checkout session identifier this token is bound to.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>binding.identity.access_token<\/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 public merchant identifier generated in the Adyen Customer Area.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>binding.identity<\/code><\/td>\n<td style=\"text-align: left;\">Object<\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The participant identity context.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Example request'\" :id=\"'ucp-tokenize-request-card'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl -X POST https:\\\/\\\/commerce-suite-test.adyen.com\\\/commerce-suite\\\/ucp\\\/v1\\\/handler\\\/tokenize \\\\\\n-H \\&quot;Authorization: Bearer AGENT_PLATFORM_API_KEY\\&quot; \\\\\\n-H \\&quot;Content-Type: application\\\/json\\&quot; \\\\\\n-H \\&quot;idempotency-key: YOUR_IDEMPOTENCY_KEY\\&quot; \\\\\\n-d '{\\n  \\&quot;credential\\&quot;: {\\n    \\&quot;type\\&quot;: \\&quot;card\\&quot;,\\n    \\&quot;card_number_type\\&quot;: \\&quot;fpan\\&quot;,\\n    \\&quot;number\\&quot;: \\&quot;4111111111111111\\&quot;,\\n    \\&quot;expiry_month\\&quot;: 12,\\n    \\&quot;expiry_year\\&quot;: 2026,\\n    \\&quot;cvc\\&quot;: \\&quot;123\\&quot;,\\n    \\&quot;name\\&quot;: \\&quot;Jane Doe\\&quot;\\n  },\\n  \\&quot;binding\\&quot;: {\\n    \\&quot;checkout_id\\&quot;: \\&quot;CS_XXXXXXXXXXXXX\\&quot;,\\n    \\&quot;identity\\&quot;: {\\n      \\&quot;access_token\\&quot;: \\&quot;MERCHANT_PUBLIC_ID_123\\&quot;\\n    }\\n  }\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>A successful response returns the UCP token. The token is valid for 1 hour. <\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Example response (200 OK)'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"token\\\": \\\"token_adyen_abc123xyz789\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>Possible HTTP status codes:<\/p>\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;\">Token created. Pass the <code>token<\/code> value to the merchant.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">401<\/td>\n<td style=\"text-align: left;\">Unauthorized<\/td>\n<td style=\"text-align: left;\">The API key is missing or does not hold the Commerce Suite role.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">403<\/td>\n<td style=\"text-align: left;\">Forbidden<\/td>\n<td style=\"text-align: left;\">Your platform is not authorized to tokenize for this merchant. Confirm the merchant has opted in to your platform.<\/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;\">Request validation failed. Check that all required fields are present and correctly formatted.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"notices green\">\n<p>If the token expires before the merchant completes the payment, call POST <code>\/tokenize<\/code> again to get a fresh token.<\/p>\n<\/div>\n<\/li>\n<li>\n<p>Pass the token to the merchant. The merchant uses it to <a href=\"#merchant-payment-request\">submit a payment request to adyen<\/a>.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"merchant-payment-request\">Merchant payment request with the UCP token<\/h2>\n<p>After you pass the token to the merchant, the merchant's checkout application makes a POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Checkout\/latest\/post\/payments\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/payments<\/a> request, including the following:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter name<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>shopperReference<\/code><\/td>\n<td>The <code>checkout_id<\/code> value from the checkout session.<\/td>\n<\/tr>\n<tr>\n<td><code>paymentMethod.storedPaymentMethodId<\/code><\/td>\n<td>The UCP <code>token<\/code> from your agent platform.<\/td>\n<\/tr>\n<tr>\n<td><code>merchantAccount<\/code><\/td>\n<td>The merchant account.<\/td>\n<\/tr>\n<tr>\n<td><code>amount.value<\/code><\/td>\n<td>The value of the payment, in minor units.<\/td>\n<\/tr>\n<tr>\n<td><code>amount.currency<\/code><\/td>\n<td>The three-character ISO currency code.<\/td>\n<\/tr>\n<tr>\n<td><code>shopperInteraction<\/code><\/td>\n<td><strong>ContAuth<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>recurringProcessingModel<\/code><\/td>\n<td><strong>UnscheduledCardOnFile<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>reference<\/code><\/td>\n<td>The merchant's reference for the order.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example payment request including the UCP token'\" :id=\"'payments-request-ucp'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl -X POST https:\\\/\\\/checkout-test.adyen.com\\\/v72\\\/payments \\\\\\n-H \\&quot;X-API-Key: MERCHANT_API_KEY\\&quot; \\\\\\n-H \\&quot;Content-Type: application\\\/json\\&quot; \\\\\\n-H \\&quot;Idempotency-Key: MERCHANT_IDEMPOTENCY_KEY\\&quot; \\\\\\n-d '{\\n  \\&quot;merchantAccount\\&quot;: \\&quot;ADYEN_MERCHANT_ACCOUNT\\&quot;,\\n  \\&quot;amount\\&quot;: {\\n    \\&quot;value\\&quot;: 1000,\\n    \\&quot;currency\\&quot;: \\&quot;USD\\&quot;\\n  },\\n  \\&quot;paymentMethod\\&quot;: {\\n    \\&quot;storedPaymentMethodId\\&quot;: \\&quot;UCP_TOKEN_FROM_AGENT_PLATFORM\\&quot;\\n  },\\n  \\&quot;shopperReference\\&quot;: \\&quot;Merchant-shopper-reference-xyz-890\\&quot;,\\n  \\&quot;shopperInteraction\\&quot;: \\&quot;ContAuth\\&quot;,\\n  \\&quot;recurringProcessingModel\\&quot;: \\&quot;UnscheduledCardOnFile\\&quot;,\\n  \\&quot;reference\\&quot;: \\&quot;MERCHANT_ORDER_REFERENCE\\&quot;\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>The response includes the following:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>pspReference<\/code><\/td>\n<td>Adyen's unique identifier for the transaction.<\/td>\n<\/tr>\n<tr>\n<td><code>resultCode<\/code><\/td>\n<td>Indicates the current status of the payment.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example response for an authorized payment'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"pspReference\\\": \\\"W78NTVXSJV84L675\\\",\\n  \\\"resultCode\\\": \\\"Authorised\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2>Test and go live<\/h2>\n<p>Use the test environment to verify your integration end-to-end before going live.<\/p>\n<p>Test endpoint URL:<\/p>\n<p><code>https:\/\/commerce-suite-test.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize<\/code><\/p>\n<h3>Test checklist<\/h3>\n<p>To verify your integration, confirm the following:<\/p>\n<ol>\n<li>Your API key holds the Commerce Suite role.<\/li>\n<li>The merchant has completed the opt-in setup in the test environment.<\/li>\n<li>A well-formed request with only required fields returns HTTP 200.<\/li>\n<li>A full request with all optional fields populated returns HTTP 200.<\/li>\n<li>A request with <code>credential.card_number_type<\/code>: <strong>network_token<\/strong> and a <code>credential.cryptogram<\/code> is handled correctly.<\/li>\n<li>Omitting <code>credential.number<\/code> returns HTTP 422.<\/li>\n<li>An unknown <code>binding.identity.access_token<\/code> returns HTTP 403.<\/li>\n<li>The returned <code>token<\/code> used in a POST <code>\/payments<\/code> request to the test endpoint returns an <strong>Authorised<\/strong> result.<\/li>\n<li>Test with an expired token (wait more than 1 hour) to verify your error handling.<\/li>\n<\/ol>\n<h3>Go live<\/h3>\n<p>When you are ready to go live, use the live endpoint URL:<\/p>\n<p><code>https:\/\/commerce-suite-live.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize<\/code><\/p>\n<h2>Specification of the UCP Tokenization Handler<\/h2>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'OpenAPI specification'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;json&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;openapi: 3.1.0\\ninfo:\\n  title: UcpPaymentHandlerResource\\n  description: OpenAPI spec for UcpPaymentHandlerResource\\n  termsOfService: https:\\\/\\\/www.adyen.com\\\/legal\\\/terms-and-conditions\\n  contact:\\n    name: Adyen Developer Experience team\\n    url: https:\\\/\\\/github.com\\\/Adyen\\\/adyen-openapi\\n  version: \\&quot;1\\&quot;\\n  x-framework: JERSEY\\n  x-origin-application: com.adyen.commercesuite.CommerceSuiteUcpApplication\\n  x-webapp: commerce-suite\\ntags:\\n- name: UcpPaymentHandlerResource\\npaths:\\n  \\\/v1\\\/handler\\\/tokenize:\\n    post:\\n      tags:\\n      - UcpPaymentHandlerResource\\n      summary: Universal Commerce Protocol (UCP) tokenize payment handler endpoint\\n      description: Creates PSP agentic token according to Universal Commerce Protocol\\n        (UCP) tokenize payment handler specification\\n      operationId: tokenize\\n      requestBody:\\n        content:\\n          application\\\/json:\\n            schema:\\n              $ref: \\&quot;#\\\/components\\\/schemas\\\/UcpTokenizeRequest\\&quot;\\n        required: true\\n      responses:\\n        \\&quot;200\\&quot;:\\n          description: OK - the request has succeeded.\\n          content:\\n            application\\\/json:\\n              schema:\\n                $ref: \\&quot;#\\\/components\\\/schemas\\\/UcpTokenizeResponse\\&quot;\\n      x-sortIndex: 0\\ncomponents:\\n  schemas:\\n    UcpBinding:\\n      required:\\n      - checkout_id\\n      type: object\\n      properties:\\n        checkout_id:\\n          minLength: 1\\n          type: string\\n          description: The checkout session identifier this token is bound to\\n        identity:\\n          description: The participant identity this token is bound to\\n          $ref: \\&quot;#\\\/components\\\/schemas\\\/UcpIdentity\\&quot;\\n    UcpCredential:\\n      required:\\n      - card_number_type\\n      - number\\n      - type\\n      type: object\\n      properties:\\n        card_number_type:\\n          minLength: 1\\n          pattern: ^fpan$|^network_token$\\n          type: string\\n          description: The type of card number provided\\n          enum:\\n          - fpan\\n          - network_token\\n        cryptogram:\\n          type: string\\n          description: The cryptogram for a network token\\n        cvc:\\n          pattern: \\&quot;^\\\\\\\\d{3,4}$\\&quot;\\n          type: string\\n          description: The card's security code\\n        eci_value:\\n          maxLength: 2\\n          minLength: 0\\n          type: string\\n          description: The Electronic Commerce Indicator value\\n        expiry_month:\\n          maximum: 12\\n          minimum: 1\\n          type: integer\\n          description: The card's expiration month\\n          format: int32\\n        expiry_year:\\n          type: integer\\n          description: The card's expiration year\\n          format: int32\\n        name:\\n          type: string\\n          description: The name of the cardholder\\n        number:\\n          minLength: 1\\n          pattern: \\&quot;^\\\\\\\\d{12,19}$\\&quot;\\n          type: string\\n          description: The card number\\n        type:\\n          minLength: 1\\n          pattern: ^card$\\n          type: string\\n          description: The credential type discriminator\\n          enum:\\n          - card\\n    UcpIdentity:\\n      required:\\n      - access_token\\n      type: object\\n      properties:\\n        access_token:\\n          minLength: 1\\n          type: string\\n          description: Unique identifier for this participant (merchant identifier)\\n    UcpTokenizeRequest:\\n      required:\\n      - binding\\n      - credential\\n      type: object\\n      properties:\\n        binding:\\n          description: Binding context for the token\\n          $ref: \\&quot;#\\\/components\\\/schemas\\\/UcpBinding\\&quot;\\n        credential:\\n          description: Credential to tokenize\\n          $ref: \\&quot;#\\\/components\\\/schemas\\\/UcpCredential\\&quot;\\n    UcpTokenizeResponse:\\n      required:\\n      - token\\n      type: object\\n      properties:\\n        token:\\n          type: string\\n          description: The token value\\n  securitySchemes:\\n    BearerAuth:\\n      type: http\\n      scheme: bearer\\n      description: Enter your API Key as the Bearer token.\\njsonSchemaDialect: https:\\\/\\\/spec.openapis.org\\\/oas\\\/3.1\\\/dialect\\\/base&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>","url":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce\/agent-platform\/agentic-payments-ucp","articleFields":{"description":"Tokenize payment credentials using the Universal Commerce Protocol (UCP) with Adyen.","robots":"noindex,nofollow","feedback_component":true,"filters_component":false,"decision_tree":"[]"},"algolia":{"url":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce\/agent-platform\/agentic-payments-ucp","title":"Agentic Payments integration with UCP","content":"Integrate with the Adyen UCP Tokenization Handler to securely tokenize payment credentials on behalf of merchants, following the Universal Commerce Protocol (UCP) tokenization specification (2026-01-23). Your agent platform sends shopper payment credentials to Adyen, and Adyen returns a UCP token that is associated with the specific checkout session and merchant identifier. Your agent passes the token to the merchant, and the merchant uses the token to process the payment with Adyen.\nRequirements\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nMake sure that you have set up an integration that follows the Universal Commerce Protocol (UCP) tokenization specification (2026-01-23).\n\n\nUser role\nMake sure that your Adyen credential (API key) has the following user role: Commerce Suite API\n\n\nLimitations\nYou must complete our security review to approve your platform.\n\n\nSetup steps\nBefore you begin, reach out to your Adyen contact for the following: Access to UCP Tokenization Handler.Your dedicated agent platform API key.Merchant opt-in for your platform. Each merchant must independently authorize your platform to tokenize on their behalf. Your Adyen contact configures this for each merchant account.\n\n\n\nHow it works\nWhen a shopper initiates a transaction using your agent platform, the following flow occurs:\n\nThe shopper enters their payment details in your agent platform.\nYour agent platform sends the payment credentials to Adyen by making a POST \/ucp\/v1\/handler\/tokenize request.\nAdyen validates the credentials and returns a UCP token to your agent platform.\nYour agent platform sends the UCP token to the merchant checkout application.\nThe merchant's checkout application makes a \/payments request including the UCP token.\nAdyen authorizes the payment and returns the payment result to the merchant checkout application.\n\nCnNlcXVlbmNlRGlhZ3JhbQphdXRvbnVtYmVyCnBhcnRpY2lwYW50IFNob3BwZXIKcGFydGljaXBhbnQgUGxhdGZvcm0gYXMgWW91ciBhZ2VudCBwbGF0Zm9ybQpwYXJ0aWNpcGFudCBBZHllbgpwYXJ0aWNpcGFudCBBcHAgYXMgTWVyY2hhbnQgY2hlY2tvdXQgYXBwbGljYXRpb24KCiAgICBTaG9wcGVyLT4+UGxhdGZvcm06IEVudGVycyBwYXltZW50IGRldGFpbHMKICAgIFBsYXRmb3JtLT4+QWR5ZW46IFBPU1QgL3VjcC92MS9oYW5kbGVyL3Rva2VuaXplCiAgICBBZHllbi0tPj5QbGF0Zm9ybTogVUNQIHRva2VuCiAgICBQbGF0Zm9ybS0+PkFwcDogU2VuZHMgVUNQIHRva2VuCiAgICBBcHAtPj5BZHllbjogL3BheW1lbnRzIChpbmNsdWRlcyBVQ1AgdG9rZW4pCiAgICBBZHllbi0tPj5BcHA6IFBheW1lbnQgcmVzdWx0IChBdXRob3JpemVkKQo=\nAuthentication\nAuthenticate your requests using your agent platform API key as a Bearer token in the Authorization header.\n\n    \n\n\nNever expose your credentials in a URL query string, or in agent-readable context. All calls must originate from your secure agent backend.\n\nCreate a token with payment details\nAfter the shopper enters their payment details, create a UCP token to securely store their payment information.\nUse the following endpoint URL:\n\n\n\nEnvironment\nEndpoint URL\n\n\n\n\nTest\nhttps:\/\/commerce-suite-test.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize\n\n\nLive\nhttps:\/\/commerce-suite-live.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize\n\n\n\n\n\nMake a POST \/tokenize request, including the following:\n\n\n\nParameter\nType\nRequired\nDescription\n\n\n\n\ncredential.type\nString\n\nThe credential type. Possible value: card.\n\n\ncredential.card_number_type\nString\n\nThe type of card number. Possible values: fpannetwork_token\n\n\ncredential.number\nString\n\nThe shopper's card number.\n\n\ncredential.cryptogram\nString\n\nRequired if card_number_type is network_token. The cryptogram provided with network tokens.\n\n\ncredential.expiry_month\nInteger\n\nThe card expiry month.\n\n\ncredential.expiry_year\nInteger\n\nThe card expiry year (four digits).\n\n\ncredential.name\nString\n\nThe cardholder name.\n\n\ncredential.cvc\nString\n\nThe card CVC or CVV number.\n\n\ncredential.eci_value\nString\n\nThe Electronic Commerce Indicator for network tokens.\n\n\nbinding.checkout_id\nString\n\nThe checkout session identifier this token is bound to.\n\n\nbinding.identity.access_token\nString\n\nThe public merchant identifier generated in the Adyen Customer Area.\n\n\nbinding.identity\nObject\n\nThe participant identity context.\n\n\n\n\n\n\nA successful response returns the UCP token. The token is valid for 1 hour. \n\n\n\nPossible HTTP status codes:\n\n\n\nHTTP\nMeaning\nDescription\n\n\n\n\n200\nOK\nToken created. Pass the token value to the merchant.\n\n\n401\nUnauthorized\nThe API key is missing or does not hold the Commerce Suite role.\n\n\n403\nForbidden\nYour platform is not authorized to tokenize for this merchant. Confirm the merchant has opted in to your platform.\n\n\n422\nUnprocessable\nRequest validation failed. Check that all required fields are present and correctly formatted.\n\n\n\n\nIf the token expires before the merchant completes the payment, call POST \/tokenize again to get a fresh token.\n\n\n\nPass the token to the merchant. The merchant uses it to submit a payment request to adyen.\n\n\nMerchant payment request with the UCP token\nAfter you pass the token to the merchant, the merchant's checkout application makes a POST  \/payments request, including the following:\n\n\n\nParameter name\nDescription\n\n\n\n\nshopperReference\nThe checkout_id value from the checkout session.\n\n\npaymentMethod.storedPaymentMethodId\nThe UCP token from your agent platform.\n\n\nmerchantAccount\nThe merchant account.\n\n\namount.value\nThe value of the payment, in minor units.\n\n\namount.currency\nThe three-character ISO currency code.\n\n\nshopperInteraction\nContAuth\n\n\nrecurringProcessingModel\nUnscheduledCardOnFile\n\n\nreference\nThe merchant's reference for the order.\n\n\n\n\n    \n\nThe response includes the following:\n\n\n\nParameter\nDescription\n\n\n\n\npspReference\nAdyen's unique identifier for the transaction.\n\n\nresultCode\nIndicates the current status of the payment.\n\n\n\n\n    \n\nTest and go live\nUse the test environment to verify your integration end-to-end before going live.\nTest endpoint URL:\nhttps:\/\/commerce-suite-test.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize\nTest checklist\nTo verify your integration, confirm the following:\n\nYour API key holds the Commerce Suite role.\nThe merchant has completed the opt-in setup in the test environment.\nA well-formed request with only required fields returns HTTP 200.\nA full request with all optional fields populated returns HTTP 200.\nA request with credential.card_number_type: network_token and a credential.cryptogram is handled correctly.\nOmitting credential.number returns HTTP 422.\nAn unknown binding.identity.access_token returns HTTP 403.\nThe returned token used in a POST \/payments request to the test endpoint returns an Authorised result.\nTest with an expired token (wait more than 1 hour) to verify your error handling.\n\nGo live\nWhen you are ready to go live, use the live endpoint URL:\nhttps:\/\/commerce-suite-live.adyen.com\/commerce-suite\/ucp\/v1\/handler\/tokenize\nSpecification of the UCP Tokenization Handler\n\n    \n","type":"page","locale":"en","boost":16,"hierarchy":{"lvl0":"Home","lvl1":"Online payments","lvl2":"Adyen Agentic","lvl3":"Agent platform","lvl4":"Agentic Payments integration with UCP"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/online-payments","lvl2":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce","lvl3":"https:\/\/docs.adyen.com\/online-payments\/agentic-commerce\/agent-platform","lvl4":"\/online-payments\/agentic-commerce\/agent-platform\/agentic-payments-ucp"},"levels":5,"category":"Online Payments","category_color":"green","tags":["Agentic","Payments","integration"]}}
