> ## Documentation Index
> Fetch the complete documentation index at: https://developer.onetrust.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrating from the Legacy SDK to the CMP API

This page is only relevant if you are using a legacy SDK and need to adopt the CMP API solution.

If your app is using the legacy HTML5 SDK and you need to move to the Server-Side CMP API, follow the steps below to migrate consent from the SDK to the server-side solution.

> 📘
>
> See here for implementation guidance on the [CMP API](https://developer.onetrust.com/onetrust/docs/server-side-cmp-api-introduction).

# 1. Replace the Legacy SDK with the OneTrust CMP API

> 📘
>
> Consent data stored in local storage from the legacy SDK should be intact.

# 2. Migration Process

The app will need to create an `OT-Consent-String` based on the previously stored consent data along with a few additional parameters to persist consent.

> 📘
>
> For more information about the `OT-Consent-String`, see [Persisting Consent](https://developer.onetrust.com/onetrust/docs/persisting-consent).

## 2.1. Create the Consent Object

Create a **Consent** object and populate it with data from the `ONETRUST_WEB_STORE` from local storage.

`const ONETRUST_WEB_STORE = window.localStorage.getItem('ONETRUST_WEB_STORE');`

```javascript
Const consentObject = {
    shouldShowBanner: localStorage.getItem("shouldshowBanner"),
    lastLaunchDate: getTimestamp(ONETRUST_PROFILE_RESPONSE.info.lastLaunch.date),
    appId: ONETRUST_PROFILE_RESPONSE.info.encodedRequestJSON.application.applicationId,
    cdn: ONETRUST_PROFILE_RESPONSE.info.encodedRequestJSON.application.location,
    isAnonymous: userData.ANONYMOUS,
    dsId: userData.DSID,
    lastConsentDate: userData.CREATED_TIME_STAMP,
    identifierType: IF userData.ANONYMOUS THEN.ONETRUST_PROFILE_RESPONSE.culture.CommonData.ConsentIntegration.DefaultAnonymousIdentifier ELSE ONETRUST_PROFILE_RESPONSE.culture.CommonData.ConsentIntegration.DefaultIdentifier,
    expiryDate: "",
    groupConsents: {}, // retrieve from the ONETRUST_WEB_STORE.CONSENT.preference  
    groupLIConsents: {} // retrieve from the ONETRUST_WEB_STORE.CONSENT.preference
}
```

Example Consent Object:

```javascript
{  
  "shouldShowBanner": 0,  
  "lastLaunchDate": 1695200000000,  
  "appId": "sample-app-id",  
  "cdn": "cdn-location",  
  "isAnonymous": 0,  
  "dsId": "sample-dsid",  
  "lastConsentDate": 1695205000000,  
  "identifierType": "DefaultIdentifier",  
  "expiryDate": "",  
  "groupConsents": {  
    "group1": 1,  
    "group2": 0  
  },  
  "groupLIConsents": {  
    "group3": 1,  
    "group4": 1  
  }  
}
```

## 2.2. Encode the Consent Object

Convert the consent object into a **base64 string**.

**Pseudo-code**

```javascript
const encoder = new TextEncoder();  
const uint8Array = encoder.encode(JSON.stringify(consentObject));  
const base64Encoded = btoa(String.fromCharCode(...Array.from(uint8Array)));
```

## 3. Pass the Encoded String into the CMP API Header

Based on implementation guidance [here](https://developer.onetrust.com/onetrust/docs/implementation-guidance), pass the encoded string in the API call as a header.

### 3.1 (Optional, only if using IAB TCF or GPP) Retrieve IAB Consent Strings

If you are using IAB TCF or IAB GPP, pass in these additional headers:

* **TC String** - `IABTCF_TCString`
* **Additional Consent String** - `IABTCF_AddtlConsent`
* **OT-Gpp-String** - `gppString`

TC String and Additional Consent String are stored in the `CONSENT` object of `ONETRUST_WEB_STORE`. The GPP String is stored under `IABGPP_HDR_GppString`.

```javascript
consentData = JSON.parse(userData.CONSENT)  
tcString   = consentData.tcf[0].token  
addConsent = consentData.tcf[0].encodedList.IABTCF_AddtlConsent

gppString = window.localStorage.getItem('IABGPP_HDR_GppString')
```

Sample request:

```
curl --location 'https://mobile-data.onetrust.io/cfw/cmp/v1/banner' \
--header 'OT-CDN-Location: cdnLocation' \
--header 'OT-App-Id: appID' \
--header 'OT-Device-Type: mobile' \
--header 'OT-SDK-Version: sdkVersion' \
--header 'OT-Language: en' \
--header 'OT-Tcf-Eu2v2-Consent-String: tcString' \
--header 'OT-Gpp-String: gppString' \
--header 'OT-Addtl-Consent-String: addtlString'
```