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 newdescription,specialPurposes, andoptOutfields..sdks(new) — a list ofConsentDisclosureSDKentries, each withnameanduse, 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
}
}