Skip to content

Upgrade for TCF Vendor Device Storage & Operational Disclosures v1.1

In November 2025, IAB Europe released an update to the Vendor Device Storage & Operational Disclosures specification (v1.1), previously known as Device Storage Duration & Access Disclosure, a sub-specification of the Transparency and Consent Framework (TCF). The update introduces new declaration requirements for vendors, including disclosures for non-TCF cookies, Special Purposes, and mobile SDK package identifiers.

To meet these requirements, Usercentrics has released App CMP SDK v2.25.1, which implements the new disclosure fields.

Action required — SDK update needed

You must update to SDK version 2.25.1 to stay compliant.

Your implementation will continue to function if you do not update immediately. However, we recommend including the update in your next scheduled release, as keeping your device storage declarations up to date is an important part of maintaining ongoing TCF compliance.

Upgrade your App SDK integration

Install the latest SDK (v2.25.1) for your platform: - iOS: - SPM: Core SDK, UI SDK - Cocoapods - Android: Maven Central - Unity: Unity SDK downloads - Flutter: pub.dev - React Native: npm

If you are using the default Usercentrics UI, you just need to update the SDK and the banner will automatically display the new fields in the TCF specification.

If you are using a custom UI, after installing the new SDK you'll need to map three new fields manually. The next section describes how to do this.

Update your custom UI

The following are the new fields that need to be mapped and accessible on the banner UI:

Property Object Type Optional Description Possible values
description ConsentDisclosure String? Yes Human-readable description of the storage entry, see the IAB documentation for more info Free-text string or null
specialPurposes ConsentDisclosure List<Int> Yes Special purposes associated with this storage entry, see the IAB documentation for more info List of IAB TCF special purpose IDs (e.g. [1, 2]), defaults to empty list
optOut ConsentDisclosure Boolean? Yes Indicates whether this storage entry is used for opting out of tracking (e.g. a global opt-out cookie), see the IAB documentation for more info true, false, or null
sdks ConsentDisclosureObject List<ConsentDisclosureSDK> Yes List of SDKs the vendor relies on, see the IAB documentation for more info
sdks.name ConsentDisclosureSDK String No Package identifier of the SDK as registered with the app store, see the IAB documentation for more info Package identifier (e.g. "com.gms.ads")
sdks.use ConsentDisclosureSDK String No Description of what the SDK is used for, see the IAB documentation for more info Free-text description (e.g. "Advertising")

To access these fields, call Usercentrics.instance.getCMPData() to retrieve UsercentricsCMPData, then iterate over .services. Each UsercentricsService exposes a .deviceStorage property of type ConsentDisclosureObject, which now contains:

  • .disclosures — the list of cookie/storage entries, each enriched with the new description, specialPurposes, and optOut fields.
  • .sdks (new) — a list of ConsentDisclosureSDK entries, each with name and use, describing the SDKs that service relies on.
Usercentrics.instance.getCMPData()
  └── UsercentricsCMPData.services            // List<UsercentricsService>
        └── UsercentricsService.deviceStorage  // ConsentDisclosureObject
              ├── .disclosures                 // List<ConsentDisclosure>
              │     ├── .description           // String? — NEW
              │     ├── .specialPurposes       // List<Int> — NEW
              │     └── .optOut                // Boolean? — NEW
              └── .sdks                        // List<ConsentDisclosureSDK> — NEW
                    ├── .name                  // String
                    └── .use                   // String

Example

val cmpData = Usercentrics.instance.getCMPData()

cmpData.services.forEach { service ->
    val deviceStorage = service.deviceStorage

    deviceStorage.disclosures.forEach { disclosure ->
        val description = disclosure.description
        val specialPurposes = disclosure.specialPurposes
        val optOut = disclosure.optOut
    }

    deviceStorage.sdks.forEach { sdk ->
        val name = sdk.name
        val use = sdk.use
    }
}
let cmpData = Usercentrics.shared.getCMPData()

for service in cmpData.services {
    let deviceStorage = service.deviceStorage

    for disclosure in deviceStorage.disclosures {
        let description = disclosure.description
        let specialPurposes = disclosure.specialPurposes
        let optOut = disclosure.optOut
    }

    for sdk in deviceStorage.sdks {
        let name = sdk.name
        let use = sdk.use
    }
}