--- title: "Client-Side Encryption (CSE)" url: "https://docs.adyen.com/online-payments/classic-integrations/classic-api-integration/client-side-encryption" source_url: "https://docs.adyen.com/online-payments/classic-integrations/classic-api-integration/client-side-encryption.md" canonical: "https://docs.adyen.com/online-payments/classic-integrations/classic-api-integration/client-side-encryption" last_modified: "2026-05-24T12:54:31+02:00" language: "en" --- # Client-Side Encryption (CSE) [View source](/online-payments/classic-integrations/classic-api-integration/client-side-encryption.md) **The Client-Side Encryption (CSE) Web integrations are being phased out**\ This means we are: * No longer developing the CSE integration. * Not accepting new CSE integrations. Switch to one of our latest [Web integrations](/online-payments/build-your-integration/sessions-flow?platform=Web), to accept payments on your website. Mobile integrations aren't affected. **Local payment methods** If you want to learn how to accept local payment methods, see [Directory Lookup](/online-payments/classic-integrations/hosted-payment-pages/directory-lookup). The Client-Side Encryption (CSE) integration lets you accept payments on your website and mobile application while encrypting card data in your shopper's browser using the Adyen encryption library. To help you encrypt all sensitive card data on a client side, Adyen can host the JavaScript library and your key. In addition, you can decide to host the library by yourself, or use only the JavaScript in the HTML page. ## Requirements Before you begin to integrate, make sure you have followed the [Get started with Adyen guide](/get-started-with-adyen) to: * Get an overview of the steps needed to accept live payments. * Create your test account. After you have created your test account: * Get your [API key](/development-resources/api-credentials#generate-api-key) or [basic authentication](/development-resources/api-credentials#basic-authentication) credentials. Save a copy as you'll need it for API calls you make to the Adyen payments platform. * Get the [Library location from the Customer Area](/online-payments/classic-integrations/classic-api-integration/client-side-encryption/cse-library-public-key-location-and-token). This is a unique URL for you to retrieve the CSE library hosted by Adyen. ## Overview Your card payments go through many stages. The diagram below helps you understand the flow:  If you are integrating the Adyen payments platform with a third-party system, we strongly recommend you follow defensive programming best practices. ## Client side Create a payment form integrated with the Client-Side Encryption (CSE) library, which you can retrieve using the unique URL provided to you by Adyen. Ensure that your payment form includes the [mandatory fields](https://docs.adyen.com/api-explorer/#/Payment/latest/authorise). You must implement [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) in your CSE integration before March 31, 2025, to comply with [PCI DSS v4.0.1](/development-resources/pci-dss-compliance-guide/). To implement Subresource Integrity for your CSE integration: 1. In your [Customer Area](https://ca-test.adyen.com/), go to **Developers** > **API credentials**, and select your web service user (**ws\@Company.\[YourCompanyAccount]**) from the users list. 2. Under **Client side encryption**, copy the **Integrity hash**. 3. Include your integrity hash when loading the CSE library. ```xml
``` You must encrypt card input fields by annotating them with the `data-encrypted-name` attribute. **Do not** use the `name` attribute. This ensures that the call does not send unencrypted card data to your server. The `generationtime` field is used to include a server-side timestamp in the data you submit the form. It determines whether a payment request is valid or not. Adyen refuses the transactions sent later than 24 hours from the timestamp. This value must be obtained on the server-side as the client's system clock may not be correctly synchronized which can cause the payment transaction to fail. **generationtime:** * Format: [ISO 8601](http://www.w3.org/TR/NOTE-datetime); YYYY-MM-DDThh:mm:ss.sssTZD[](http://www.w3.org/TR/NOTE-datetime) * Example: *2017-07-17T13:42:40.428+01:00* ### Prevent payment form reload If you have implemented a single-page interface and do not want the form to reload the page when the payment gets submitted, implement the `onsubmit` option. After including the JavaScript cryptographic library, you can use JavaScript or AJAX to customize the POST submission behaviour. For example, you can: * Pass an additional options parameter in the `createEncryptedForm` method. * Change the name of the encrypted data container. Its default name is `adyen-encrypted-data`. * Submit the form using AJAX instead of the default submit action, as shown in this example: ```js var encryptedBlobFieldName = "myFieldName"; options.name = encryptedBlobFieldName; options.onsubmit = function(e) { var encryptedData = form.elements[encryptedBlobFieldName].value; // ... Your AJAX code here .... e.preventDefault(); }; adyen.createEncryptedForm(form, options); ``` ## Server side From your server, make an HTTP POST request to the [`/authorise` ](https://docs.adyen.com/api-explorer/#/Payment/authorise) endpoint. ### Authorise request **Test cards** To test the payment request, use one of our [test credit cards](/development-resources/test-cards-and-credentials/test-card-numbers). In this request, include `merchantAccount`, `reference`, and the payment `amount`. The amount's value is in minor units, e.g. 20000 is 200 euros. You can find the number of decimal points per currency in [Currency codes](/development-resources/currency-codes). The `additionalData` object in the payment authorisation request needs to include `card.encrypted.json`, which you should set to the `adyen.encrypted.data` value. This value contains encrypted information about the shopper's credit card, as well as the timestamp: * Card holder * Card number * CVC * Expiry date * Generation time #### JSON ```json { "additionalData":{ "card.encrypted.json":"adyenjs_0_1_4p1$..." }, "amount":{ "value":20000, "currency":"EUR" }, "reference":"YOUR_REFERENCE", "merchantAccount":"YOUR_MERCHANT_ACCOUNT" } ``` #### Soap ```xml