Documentation Index

Fetch the complete documentation index at: https://usercentrics.document360.io/llms.txt

Use this file to discover all available pages before exploring further.

Build your own banner

Prev Next

Use the Usercentrics App SDK Core module that provides all the information and functionality needed to build a consent banner of your own.

Compliance Note

Because the SDK enables many customization options, it is important that your Data Protection Officer (DPO) reviews and approves the compliance of your design, e.g.:

  • A user should always have clear options to accept, deny or save granular choices available as call to actions in the first or second layer.

  • The first layer should always allow a path to the second layer.

  • Calls to action should be equally prominent.

Regulation dependent

There are implementation differences between each legal framework, due to divergent legal requirements.

Jump to the following sections of this page to learn how to implement your banner in the different legal frameworks:

General Data Protection Regulation (GDPR)

The European Union's General Data Protection Regulation applies to any business in the EU as well as organizations outside the EU that collect, process and store information on EU citizens, as well as non-citizens residing in the EU.

To get you started, we have provided a compliance checklist to help you understand the requirements of GDPR.

Data source

UsercentricsCore.isReady { _ in

    let data = UsercentricsCore.shared.getCMPData()
    let settings = data.settings
    let services = data.services
    let categories = data.categories

} onFailure: { error in
    // Handle non-localized error
}
Usercentrics.isReady({

    val data = Usercentrics.instance.getCMPData()
    val settings = data.settings
    val services = data.services
    val categories = data.categories

}, { error ->
    // Handle non-localized error
})
try {
  final data = await Usercentrics.cmpData;
  final settings = data.settings;
  final services = data.services;
  final categories = data.categories;
} catch (error) {
  // Handle non-localized error
}
try {
  const data = await Usercentrics.getCMPData();
  const settings = data.settings;
  const services = data.services;
  const categories = data.categories;
} catch (error) {
  // Handle non-localized error
}

Matching categories and services

You may match services to categories with category.slug == service.categorySlug.

Matching legal basis and Services Legal Basis list

You may match legal basis keys with each service's legal basis.

cmpData.services.forEach { service ->
    service.legalBasisList.forEach { serviceLegalBasis ->
        val legalBasis = cmpData.legalBasis.data?.get(serviceLegalBasis) ?: serviceLegalBasis
        print("UsercentricsUseCase", "${service.dataProcessor} - Legal Basis: $legalBasis")
    }
}

Data source content

The following content mapping tables show the content of the data source:

First layer properties

First Layer

SDK Property

1. Title

settings.labels.firstLayerTitle

2. Description

settings.firstLayerDescriptionHtml (raw input) or settings.firstLayerDescription

3. Short Description

settings.firstLayerMobileDescriptionHtml (raw input) or settings.firstLayerMobileDescription

4. Read More

settings.labels.btnBannerReadMore

5. Accept Button Title

settings.labels.btnAcceptAll

6. Deny Button Title

settings.labels.btnDeny

7. More Button Title

settings.labels.btnMore

Second layer properties

Second Layer

SDK Property

8. Title

settings.labels.secondLayerTitle

9. Description

settings.labels.secondLayerDescriptionHtml (raw input) or settings.labels.secondLayerDescription

10. Accept Button Title

settings.secondLayer.acceptButtonText

11. Deny Button Title

settings.secondLayer.denyButtonText

Banner elements properties

Banner Elements

SDK Property

12. Privacy Policy Text

settings.labels.privacyPolicyLinkText

13. Privacy Policy URL

settings.privacyPolicyUrl

14. Imprint Text

settings.labels.imprintLinkText

15. Imprint URL

settings.imprintUrl

16. Language Selected

settings.language

17. Languages Available

settings.languagesAvailable

18. Categories Tab

settings.secondLayer.tabsCategoriesLabel

19. Services Tab

settings.secondLayer.tabsServicesLabel

20. Save Button Title

settings.labels.btnSave

Category components properties

Category Component

SDK Property

21. Category Name

category.label

22. Category Description

category.description

Services components properties

Services Component

SDK Property

23. Service Name

service.dataProcessor

24. Service Description Title

settings.labels.descriptionOfService

25. Service Description

service.descriptionOfService

26. Processing Company Title

settings.labels.processingCompanyTitle

27. Processing Company

service.nameOfProcessingCompany + service.addressOfProcessingCompany

28. Data Purposes Title

settings.labels.dataPurposes

29. Data Purposes Description

settings.labels.dataPurposesInfo

30. Data Purposes

service.dataPurposesList

31. Technologies Used Title

settings.labels.technologiesUsed

32. Technologies Used Description

settings.labels.technologiesUsedInfo

33. Technologies Used

service.technologyUsed

34. Data Collected Title

settings.labels.dataCollectedList

35. Data Collected Description

settings.labels.dataCollectedListInfo

36. Data Collected

service.dataCollectedList

37. Legal Bases Title

settings.labels.legalBasisList

38. Legal Bases Description

settings.labels.legalBasisInfo

39. Legal Bases

service.legalBasisList

40. Processing Location Title

settings.labels.locationOfProcessing

41. Processing Location

service.locationOfProcessing

42. Retention Period Title

settings.labels.retentionPeriod

43. Retention Period

service.retentionPeriodDescription

44. Third Country Distribution Title

settings.labels.transferToThirdCountries

45. Third Country Distribution

service.thirdCountryTransfer

46. Is Essential

service.isEssential

47. Data Recipients Title

settings.labels.dataRecipientsList

48. Data Recipients

service.dataRecipientsList

49. Privacy Policy Title

settings.labels.policyOf

50. Privacy Policy

service.privacyPolicyURL

51. Cookie Policy Title

settings.labels.cookiePolicyInfo

52. Cookie Policy

service.cookiePolicyURL

53. Opt Out Link Title

settings.labels.optOut

54. Opt Out Link

service.optOutUrl

55. History Title

settings.labels.history

56. History

service.consent.history

57. History Consent Given

settings.labels.yes

58. History Consent Not Given

settings.labels.no

59. History Explicit Consent

settings.labels.explicit

60. History Implicit Consent

settings.labels.implicit

Action delegates

You can use the following functions to collect consent.

Accept All

let consents = UsercentricsCore.shared.acceptAll(consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.acceptAll(consentType = <UsercentricsConsentType>)
final consents = Usercentrics.acceptAll(consentType: <UsercentricsConsentType>);
const consents = Usercentrics.acceptAll(<UsercentricsConsentType>);

Deny All

val consents = Usercentrics.instance.denyAll(consentType = <UsercentricsConsentType>)
val consents = Usercentrics.instance.denyAll(consentType = <UsercentricsConsentType>)
final consents = Usercentrics.denyAll(consentType: <UsercentricsConsentType>);
const consents = Usercentrics.denyAll(<UsercentricsConsentType>);

Save

For granular selection, you may pass specific sets of consent with an array of decisions:

let consents = UsercentricsCore.shared.saveDecisions(decisions: <[UserDecision]>, consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.saveDecisions(decisions = <[UserDecision]>, consentType = <UsercentricsConsentType>)
final consents = Usercentrics.saveDecisions(decisions: List<UserDecision>, consentType: <UsercentricsConsentType>);
const consents = Usercentrics.saveDecisions([<UserDecision], <UsercentricsConsentType>);

Consent type

The consent type should be based on whether a customer made an explicit action to provide consent. Implicit can be used if the user ignores or skips the CMP. We highly recommend you only use implicit consent with the denyAll() method, which will accept only essential services.

Interaction analytics

To gather events in the Usercentrics analytics dashboard the following API is provided to track the available events:

UsercentricsCore.shared.track(event: <UsercentricsAnalyticsEventType>)
Usercentrics.instance.track(event = <UsercentricsAnalyticsEventType>)
Usercentrics.track(event: <UsercentricsAnalyticsEventType>);
Usercentrics.track(<UsercentricsAnalyticsEventType>);

Events

[iOS] Event

[Android] Event

Notes

.cmpShown

.CMP_SHOWN

The banner was displayed to the user. It doesn't matter which layer.

.acceptAllFirstLayer

.ACCEPT_ALL_FIRST_LAYER

The Accept All button was pressed from the first layer.

.denyAllFirstLayer

.DENY_ALL_FIRST_LAYER

The Deny All button was pressed from the first layer.

.saveFirstLayer

.SAVE_FIRST_LAYER

The Save button was pressed from the first layer. Save is mainly used for granular decisions.

.acceptAllSecondLayer

.ACCEPT_ALL_SECOND_LAYER

The Accept All button was pressed from the second layer.

.denyAllSecondLayer

.DENY_ALL_SECOND_LAYER

The Deny All button was pressed from the second layer.

.saveSecondLayer

.SAVE_SECOND_LAYER

The Save button was pressed from the second layer. Save is mainly used for granular decisions.

.imprintLink

.IMPRINT_LINK

The Imprint link/button was pressed.

.moreInformationLink

.MORE_INFORMATION_LINK

The More Information link/button was pressed. This button is usually used to navigate from first layer to second layer.

.privacyPolicyLink

.PRIVACY_POLICY_LINK

The Privacy policy link/button was pressed.

Next steps

After the above, apply the user’s privacy choices to the third-party SDKs on your app. Read how to manage core consent.

Transparency & Consent Framework (TCF 2.2)

The Interactive Advertising Bureau (IAB Europe) has created the GDPR Transparency and Consent Framework (TCF 2.2) to support publishers, technology vendors and advertisers in being compliant with EU’s GDPR and ePrivacy Directive.

Be aware that a validation process with the IAB is required, in order to become a licensed TCF 2.2 CMP provider.

IAB data source

UsercentricsCore.isReady { status in

    // CMP Data
    let data = UsercentricsCore.shared.getCMPData()
    let settings = data.settings
    let tcfSettings = settings.tcf2

    // TCF Data
    UsercentricsCore.shared.getTCFData() { tcfData in
        let purposes = tcfData.purposes
        let specialPurposes = tcfData.specialPurposes
        let features = tcfData.features
        let specialFeatures = tcfData.specialFeatures
        let stacks = tcfData.stacks
        let vendors = tcfData.vendors

        // TCString
        let tcString = tcfData.tcString
    }

} onFailure: { error in
    // Handle non-localized error
}
Usercentrics.isReady({

    // CMP Data
    val data = Usercentrics.instance.getCMPData()
    val settings = data.settings
    val tcfSettings = settings.tcf2

    // TCF Data
    Usercentrics.instance.getTCFData() { tcfData ->
        val purposes = tcfData.purposes
        val specialPurposes = tcfData.specialPurposes
        val features = tcfData.features
        val specialFeatures = tcfData.specialFeatures
        val stacks = tcfData.stacks
        val vendors = tcfData.vendors

        // TCString
        val tcString = tcfData.tcString
    }

}, { error ->
    // Handle non-localized error
})
try {
  final data = await Usercentrics.cmpData;
  final settings = data.settings;
  final tcfSettings = settings.tcf2;

  // TCF Data
  final tcfData = await Usercentrics.tcfData;
  final tcString = tcfData.tcString;
  final purposes = tcfData.purposes;
  final specialPurposes = tcfData.specialPurposes;
  final features = tcfData.features;
  final specialFeatures = tcfData.specialFeatures;
  final stacks = tcfData.stacks;
  final vendors = tcfData.vendors;

  // TODO - Add TCString property

} catch (error) {
    // Handle non-localized error
}
try {
  const data = await Usercentrics.getCMPData();
  const settings = data.settings;
  const tcfSettings = settings.tcf2;

  // TCF Data
  const tcfData = await Usercentrics.getTCFData();
  const purposes = tcfData.purposes;
  const specialPurposes = tcfData.specialPurposes;
  const features = tcfData.features;
  const specialFeatures = tcfData.specialFeatures;
  const stacks = tcfData.stacks;
  const vendors = tcfData.vendors;

  // TCString
  const tcString = tcfData.tcString;

} catch (error) {
    // Handle non-localized error
}

Non-IAB data source

UsercentricsCore.isReady { status in

    let data = UsercentricsCore.shared.getCMPData()
    let settings = data.settings
    let services = data.services
    let categories = data.categories

} onFailure: { error in
    // Handle non-localized error
}
Usercentrics.isReady({

    val data = Usercentrics.instance.getCMPData()
    val settings = data.settings
    val services = data.services
    val categories = data.categories

}, { error ->
    // Handle non-localized error
})
try {
  final data = await Usercentrics.cmpData;
  final settings = data.settings;
  final services = data.services;
  final categories = data.categories;

} catch (error) {
    // Handle non-localized error
}
try {
  const data = await Usercentrics.getCMPData();
  const settings = data.settings;
  const services = data.services;
  const categories = data.categories;
} catch (error) {
    // Handle non-localized error
}

Matching categories and services

You may match services to categories with category.slug == service.categorySlug.

Matching Legal Basis and Services Legal Basis list

You may match legal basis keys with each service's legal basis.

cmpData.services.forEach { service ->
    service.legalBasisList.forEach { serviceLegalBasis ->
        val legalBasis = cmpData.legalBasis.data?.get(serviceLegalBasis) ?: serviceLegalBasis
        print("UsercentricsUseCase", "${service.dataProcessor} - Legal Basis: $legalBasis")
    }
}

Data source content

The following content mapping tables show the content of the data source:

First layer properties

First Layer

SDK Property

1. First layer title

tcf2.firstLayerTitle

2. First layer description

tcf2.firstLayerDescription

3. First layer additional Info

tcf2.firstLayerAdditionalInfo

4. First layer resurface note

tcf2.firstLayerNoteResurface

5. Vendorlist link title

tcf2.linksVendorListLinkLabel

6. Manage settings link title

tcf2.linksManageSettingsLabel

7. Label purposes

tcf2.labelsPurposes

8. Label features

tcf2.labelsFeatures

Second layer properties

Second Layer

SDK Property

1. Second layer title

tcf2.secondLayerTitle

2. Second layer description

tcf2.secondLayerDescription

3. Purposes tab

tcf2.tabsPurposeLabel

4. Vendors tab

tcf2.tabsVendorsLabel

5. Vendors who are part of TCF

tcf2.labelsIabVendors

6. Vendors who are NOT part of TCF

tcf2.labelsNonIabVendors

7. Non IAB purposes

tcf2.labelsNonIabPurposes

Buttons properties

Buttons

SDK Property

1. Accept all button title

tcf2.buttonsAcceptAllLabel

2. Deny all button title

tcf2.buttonsDenyAllLabel

3. Save button title

tcf2.buttonsSaveLabel

General Properties

General

SDK Property

1. Language Selected

settings.language

2. Languages Available

settings.languagesAvailable

3. Privacy Policy Text

settings.labels.privacyPolicyLinkText

4. Privacy Policy URL

settings.privacyPolicyUrl

5. Imprint Text

settings.labels.imprintLinkText

6. Imprint URL

settings.imprintUrl

Toggles properties

Toggles

SDK Property

1. Toggle consent label

tcf2.togglesConsentToggleLabel

2. Toggle legitimate interest label

tcf2.togglesLegIntToggleLabel

Vendors properties

Vendors

SDK Property

1. Label title

vendor.name

2. Purpose label

tcf2.vendorPurpose

3. Purpose Name

vendor.purposes[n].[findByPurposeId].name

4. Legitimate interest purpose label

tcf2.vendorLegitimateInterestPurposes

5. Legitimate Interest Purpose name

vendor.legitimateInterestPurposes[n].[findByPurposeId].name

6. Special purpose label

tcf2.vendorSpecialPurposes

7. Special purpose name

vendor.specialPurposes[n].[findByPurposeId].name

8. Feature label

tcf2.vendorFeatures

9. Feature name

vendor.features[n].[findByPurposeId].name

10. Special Feature label

tcf2.vendorSpecialFeatures

11. Special Feature name

vendor.specialFeatures[n].[findByPurposeId].name

12. Cookie refresh value

vendor.cookieRefresh

13. Cookie Age value

vendor.cookieMaxAgeSeconds

14. Cookie storage value

vendor.usesCookie

15. Non-cookie storage value

vendor.usesNonCookieAccess

Purposes properties

Purposes

SDK Property

1. Label title

purpose.name

2. Legitimate interest consent

purpose.legitimateInterestConsent

3. Legal Description

purpose.descriptionLegal

4. Purpose Description

purpose.purposeDescription

5. Consent

purpose.consent

Special purposes properties

Special Purposes

SDK Property

1. Label title

specialPurpose.name

2. Legal Description

specialPurpose.descriptionLegal

3. Purpose Description

purpose.purposeDescription

Features properties

Features

SDK Property

1. Label title

feature.name

2. Legitimate interest consent

feature.legitimateInterestConsent

3. Legal Description

feature.descriptionLegal

Special features properties

Special Features

SDK Property

1. Label title

specialFeature.name

2. Consent

specialFeature.consent

3. Description

specialFeature.purposeDescription

4. Legal Description

specialFeature.descriptionLegal

Stacks properties

Stacks

SDK Property

1. Label title

stack.name

3. Description

stack.description

3. Purposes

stack.purposeIds

4. Special Features

stack.specialFeatureIds

Set CMP ID

When building your own TCF 2.2 CMP, it is required to have your CMP UI design certified by the IAB. Once certified, you will need to provide your CMP ID as follows:

UsercentricsCore.shared.setCMPId(id: <ID>)
Usercentrics.instance.setCMPId(<ID>)
Usercentrics.setCmpIdForTCF(id: <ID>)
Usercentrics.setCMPId(<ID>)

Action delegates

You can use the following functions to collect consent.

Accept All

let consents = UsercentricsCore.shared.acceptAllForTCF(fromLayer: <TCFDecisionUILayer>, consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.acceptAllForTCF(fromLayer = <TCFDecisionUILayer>, consentType = <UsercentricsConsentType>)
final consents = Usercentrics.acceptAllForTCF(fromLayer: <TCFDecisionUILayer>, consentType: <UsercentricsConsentType>)
const consents = Usercentrics.acceptAllForTCF(<TCFDecisionUILayer>, <UsercentricsConsentType>)

Deny All

let consents = UsercentricsCore.shared.denyAllForTCF(fromLayer: <TCFDecisionUILayer>, consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.denyAllForTCF(fromLayer = <TCFDecisionUILayer>, consentType = <UsercentricsConsentType>)
final consents = Usercentrics.denyAllForTCF(fromLayer: <TCFDecisionUILayer>, consentType: <UsercentricsConsentType>)
const consents = Usercentrics.denyAllForTCF(<TCFDecisionUILayer>, <UsercentricsConsentType>)

Save

For granular selection, you may pass specific sets of consent with an array of TCFUserDecisions.

let consents = UsercentricsCore.shared.saveDecisionsForTCF(tcfDecisions: <[TCFUserDecisions]>, 
                                                           fromLayer: <TCFDecisionUILayer>,
                                                           serviceDecisions: <[UserDecision]>,
                                                           consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.saveDecisionsForTCF(
    tcfDecisions = <[TCFUserDecisions]>, 
    fromLayer = TCFDecisionUILayer.FIRST_LAYER,
    serviceDecisions = <[UserDecision]>, 
    consentType = <UsercentricsConsentType>
)
final consents = await Usercentrics.saveDecisionsForTCF(
  tcfDecisions: List<TCFDecisions>,
  fromLayer: <TCFDecisionUILayer>,
  serviceDecisions: List<UserDecision>,
  consentType: <UsercentricsConsentType>
);
const consents = await Usercentrics.saveDecisionsForTCF(
  [<TCFDecisions>],
  <UsercentricsConsentType>,
  [UserDecision],
  <UsercentricsConsentType>
);

TCF decision UI layer

Depending on your design, you might have 1 or 2 layers for collecting consent. It is required by the IAB that you specify in which layer the consent was collected. For this, you may pass the corresponding enum value from TCF_DECISION_UI_LAYER.

Consent type

The consent type should be based on whether a customer made an explicit action to provide consent. Implicit can be used if the user ignores or skips the CMP. We highly recommend you only use implicit consent with the denyAllForTCF() method, which will accept only essential services.

Interaction Analytics

To gather events in the Usercentrics analytics dashboard the following API is provided to track the available events:

UsercentricsCore.shared.track(event: <UsercentricsAnalyticsEventType>)
Usercentrics.instance.track(event = <UsercentricsAnalyticsEventType>)
Usercentrics.track(event: <UsercentricsAnalyticsEventType>);
Usercentrics.track(<UsercentricsAnalyticsEventType>);

Events

[iOS] Event

[Android] Event

Notes

.cmpShown

.CMP_SHOWN

The banner was displayed to the user. It doesn't matter which layer.

.acceptAllFirstLayer

.ACCEPT_ALL_FIRST_LAYER

The Accept All button was pressed from the first layer.

.denyAllFirstLayer

.DENY_ALL_FIRST_LAYER

The Deny All button was pressed from the first layer.

.saveFirstLayer

.SAVE_FIRST_LAYER

The Save button was pressed from the first layer. Save is mainly used for granular decisions.

.acceptAllSecondLayer

.ACCEPT_ALL_SECOND_LAYER

The Accept All button was pressed from the second layer.

.denyAllSecondLayer

.DENY_ALL_SECOND_LAYER

The Deny All button was pressed from the second layer.

.saveSecondLayer

.SAVE_SECOND_LAYER

The Save button was pressed from the second layer. Save is mainly used for granular decisions.

.imprintLink

.IMPRINT_LINK

The Imprint link/button was pressed.

.moreInformationLink

.MORE_INFORMATION_LINK

The More Information link/button was pressed. This button is usually used to navigate from first layer to second layer.

.privacyPolicyLink

.PRIVACY_POLICY_LINK

The Privacy policy link/button was pressed.

Next steps

After the above, apply the user’s privacy choices to the third-party SDKs on your app.

California Consumer Privacy Act (CCPA)

The California Consumer Privacy Act of 2018 (CCPA) gives consumers more control over the personal information that businesses collect about them and provide guidance on how to implement the law. This landmark law secures new privacy rights for California consumers, including:

  • The right to know about the personal information a business collects about them and how it is used and shared;

  • The right to delete personal information collected from them (with some exceptions);

  • The right to opt-out of the sale of their personal information; and

  • The right to non-discrimination for exercising their CCPA rights.

Businesses are required to give consumers certain notices explaining their privacy practices. The CCPA applies to many businesses, including data brokers.

Data source

UsercentricsCore.isReady { status in

    let data = UsercentricsCore.shared.getCMPData()
    let settings = data.settings
    let services = data.services
    let categories = data.categories

} onFailure: { error in
    // Handle non-localized error
}
Usercentrics.isReady({

    val data = Usercentrics.instance.getCMPData()
    val settings = data.settings
    val services = data.services
    val categories = data.categories

}, { error ->
    // Handle non-localized error
})
try {
  final data = await Usercentrics.cmpData;
  final settings = data.settings;
  final services = data.services;
  final categories = data.categories;

} catch (error) {
    // Handle non-localized error
}
try {
  const data = await Usercentrics.getCMPData();
  const settings = data.settings;
  const services = data.services;
  const categories = data.categories;
} catch (error) {
    // Handle non-localized error
}

Matching categories and services

You may match services to categories with category.slug == service.categorySlug.

Matching Legal Basis and Services Legal Basis list

You may match legal basis keys with each service's legal basis.

cmpData.services.forEach { service ->
    service.legalBasisList.forEach { serviceLegalBasis ->
        val legalBasis = cmpData.legalBasis.data?.get(serviceLegalBasis) ?: serviceLegalBasis
        print("UsercentricsUseCase", "${service.dataProcessor} - Legal Basis: $legalBasis")
    }
}

Data source content

The following content mapping tables show the content of the data source:

First layer properties

First Layer

SDK Property

1. Title

ccpa.firstLayerTitle

2. Description

ccpa.appFirstLayerDescription

3. Short Description

ccpa.firstLayerMobileDescription

4. Read More

settings.labels.btnBannerReadMore

5. Do not sell my info label

ccpa.optOutNoticeLabel

6. Save Button Title

ccpa.btnSave

Banner elements properties

Banner Elements

SDK Property

7. Privacy Policy Text

settings.labels.privacyPolicyLinkText

8. Privacy Policy URL

settings.privacyPolicyUrl

9. Imprint Text

settings.labels.imprintLinkText

10. Imprint URL

settings.imprintUrl

11. Language Selected

settings.language

12. Languages Available

settings.languagesAvailable

13. Categories Tab

settings.secondLayer.tabsCategoriesLabel

14. Services Tab

settings.secondLayer.tabsServicesLabel

Category component properties

Category Component

SDK Property

16. Category Name

category.label

17. Category Description

category.description

Services component properties

Services Component

SDK Property

18. Service Name

service.dataProcessor

19. Service Description Title

settings.labels.descriptionOfService

20. Service Description

service.descriptionOfService

21. Processing Company Title

settings.labels.processingCompanyTitle

22. Processing Company

service.nameOfProcessingCompany + service.addressOfProcessingCompany

23. Data Purposes Title

settings.labels.dataPurposes

24. Data Purposes Description

settings.labels.dataPurposesInfo

25. Data Purposes

service.dataPurposesList

26. Technologies Used Title

settings.labels.technologiesUsed

27. Technologies Used Description

settings.labels.technologiesUsedInfo

28. Technologies Used

service.technologyUsed

29. Data Collected Title

settings.labels.dataCollectedList

30. Data Collected Description

settings.labels.dataCollectedListInfo

31. Data Collected

service.dataCollectedList

32. Legal Bases Title

settings.labels.legalBasisList

33. Legal Bases Description

settings.labels.legalBasisInfo

34. Legal Bases

service.legalBasisList

35. Processing Location Title

settings.labels.locationOfProcessing

36. Processing Location

service.locationOfProcessing

37. Retention Period Title

settings.labels.retentionPeriod

38. Retention Period

service.retentionPeriodDescription

39. Third Country Distribution Title

settings.labels.transferToThirdCountries

40. Third Country Distribution

service.thirdCountryTransfer

41. Is Essential

service.isEssential

42. Data Recipients Title

settings.labels.dataRecipientsList

43. Data Recipients

service.dataRecipientsList

44. Privacy Policy Title

settings.labels.policyOf

45. Privacy Policy

service.privacyPolicyURL

46. Cookie Policy Title

settings.labels.cookiePolicyInfo

47. Cookie Policy

service.cookiePolicyURL

48. Opt Out Link Title

settings.labels.optOut

49. Opt Out Link

service.optOutUrl

50. History Title

settings.labels.history

51. History

service.consent.history

52. History Consent Given

settings.labels.yes

53. History Consent Not Given

settings.labels.no

54. History Explicit Consent

settings.labels.explicit

55. History Implicit Consent

settings.labels.implicit

Action delegates

CCPA is a global opted out framework. This means:

  • Consent is a boolean, no granular consent of services.

  • The consent is given by default and the user has to explicitly opt-out.

To collect consent for CCPA, we offer one simplified method:

Save

let ccpaConsents = UsercentricsCore.shared.saveOptOutForCCPA(isOptedOut: <Bool>, consentType: <UsercentricsConsentType>)
val ccpaConsents = Usercentrics.instance.saveOptOutForCCPA(isOptedOut = <Bool>, consentType = <UsercentricsConsentType>)
val ccpaConsents = Usercentrics.saveOptOutForCCPA(isOptedOut: <Bool>, consentType: <UsercentricsConsentType>)
val ccpaConsents = Usercentrics.saveOptOutForCCPA(<boolean>, <UsercentricsConsentType>)

Consent type

The consent type should be based on whether a customer made an explicit action to provide consent. Implicit can be used if the user ignores or skips the CMP.

Interaction Analytics

To gather events in the Usercentrics analytics dashboard the following API is provided to track the available events:

UsercentricsCore.shared.track(event: <UsercentricsAnalyticsEventType>)
Usercentrics.instance.track(event = <UsercentricsAnalyticsEventType>)
Usercentrics.track(event: <UsercentricsAnalyticsEventType>);
Usercentrics.track(<UsercentricsAnalyticsEventType>);

Events

[iOS] Event

[Android] Event

Notes

.cmpShown

.CMP_SHOWN

The banner was displayed to the user. It doesn't matter which layer.

.acceptAllFirstLayer

.ACCEPT_ALL_FIRST_LAYER

The Accept All button was pressed from the first layer.

.denyAllFirstLayer

.DENY_ALL_FIRST_LAYER

The Deny All button was pressed from the first layer.

.saveFirstLayer

.SAVE_FIRST_LAYER

The Save button was pressed from the first layer. Save is mainly used for granular decisions.

.acceptAllSecondLayer

.ACCEPT_ALL_SECOND_LAYER

The Accept All button was pressed from the second layer.

.denyAllSecondLayer

.DENY_ALL_SECOND_LAYER

The Deny All button was pressed from the second layer.

.saveSecondLayer

.SAVE_SECOND_LAYER

The Save button was pressed from the second layer. Save is mainly used for granular decisions.

.imprintLink

.IMPRINT_LINK

The Imprint link/button was pressed.

.moreInformationLink

.MORE_INFORMATION_LINK

The More Information link/button was pressed. This button is usually used to navigate from first layer to second layer.

.privacyPolicyLink

.PRIVACY_POLICY_LINK

The Privacy policy link/button was pressed.

.ccpaTogglesOn

.CCPA_TOGGLES_ON

The CCPA toggle has been set to ON.

.ccpaTogglesOff

.CCPA_TOGGLES_OFF

The CCPA toggle has been set to OFF.

Next steps

After the above, apply the user’s privacy choices to the third-party SDKs on your app.

Brazil’s Lei Geral de Proteção de Dados (LGPD)

LGPD applies to any business or organization that processes the personal data of people in Brazil, regardless of where that business or organization itself might be located. So, if your company has any customers or clients in Brazil, you should begin preparing for LGPD compliance.

If you are already GDPR compliant, then you have already done the bulk of the work necessary to comply with LGPD. It is only necessary that you set the appropriate legal basis for all your services.

Data source

UsercentricsCore.isReady { status in

    let data = UsercentricsCore.shared.getCMPData()
    let settings = data.settings
    let services = data.services
    let categories = data.categories

} onFailure: { error in
    // Handle non-localized error
}
Usercentrics.isReady({

    val data = Usercentrics.instance.getCMPData()
    val settings = data.settings
    val services = data.services
    val categories = data.categories

}, { error ->
    // Handle non-localized error
})
try {
  final data = await Usercentrics.cmpData;
  final settings = data.settings;
  final services = data.services;
  final categories = data.categories;

} catch (error) {
    // Handle non-localized error
}
try {
  const data = await Usercentrics.getCMPData();
  const settings = data.settings;
  const services = data.services;
  const categories = data.categories;
} catch (error) {
    // Handle non-localized error
}

Matching categories and services

You may match services to categories with category.slug == service.categorySlug.

Matching Legal Basis and Services Legal Basis list

You may match legal basis keys with each service's legal basis.

cmpData.services.forEach { service ->
    service.legalBasisList.forEach { serviceLegalBasis ->
        val legalBasis = cmpData.legalBasis.data?.get(serviceLegalBasis) ?: serviceLegalBasis
        print("UsercentricsUseCase", "${service.dataProcessor} - Legal Basis: $legalBasis")
    }
}

Data source content

The following content mapping tables show the content of the data source:

First layer properties

First Layer

SDK Property

1. Title

settings.labels.firstLayerTitle

2. Description

settings.firstLayerDescriptionHtml (raw input) or settings.firstLayerDescription

3. Short Description

settings.firstLayerMobileDescriptionHtml (raw input) or settings.firstLayerMobileDescription

4. Read More

settings.labels.btnBannerReadMore

5. Accept Button Title

settings.labels.btnAcceptAll

6. Deny Button Title

settings.labels.btnDeny

7. More Button Title

settings.labels.btnMore

Second layer properties

Second Layer

SDK Property

8. Title

settings.labels.secondLayerTitle

9. Description

settings.labels.secondLayerDescriptionHtml (raw input) or settings.labels.secondLayerDescription

10. Accept Button Title

settings.secondLayer.acceptButtonText

11. Deny Button Title

settings.secondLayer.denyButtonText

Banner elements properties

Banner Elements

SDK Property

12. Privacy Policy Text

settings.labels.privacyPolicyLinkText

13. Privacy Policy URL

settings.privacyPolicyUrl

14. Imprint Text

settings.labels.imprintLinkText

15. Imprint URL

settings.imprintUrl

16. Language Selected

settings.language

17. Languages Available

settings.languagesAvailable

18. Categories Tab

settings.secondLayer.tabsCategoriesLabel

19. Services Tab

settings.secondLayer.tabsServicesLabel

20. Save Button Title

settings.labels.btnSave

Category component properties

Category Component

SDK Property

21. Category Name

category.label

22. Category Description

category.description

Services component properties

Services Component

SDK Property

23. Service Name

service.dataProcessor

24. Service Description Title

settings.labels.descriptionOfService

25. Service Description

service.descriptionOfService

26. Processing Company Title

settings.labels.processingCompanyTitle

27. Processing Company

service.nameOfProcessingCompany + service.addressOfProcessingCompany

28. Data Purposes Title

settings.labels.dataPurposes

29. Data Purposes Description

settings.labels.dataPurposesInfo

30. Data Purposes

service.dataPurposesList

31. Technologies Used Title

settings.labels.technologiesUsed

32. Technologies Used Description

settings.labels.technologiesUsedInfo

33. Technologies Used

service.technologyUsed

34. Data Collected Title

settings.labels.dataCollectedList

35. Data Collected Description

settings.labels.dataCollectedListInfo

36. Data Collected

service.dataCollectedList

37. Legal Bases Title

settings.labels.legalBasisList

38. Legal Bases Description

settings.labels.legalBasisInfo

39. Legal Bases

service.legalBasisList

40. Processing Location Title

settings.labels.locationOfProcessing

41. Processing Location

service.locationOfProcessing

42. Retention Period Title

settings.labels.retentionPeriod

43. Retention Period

service.retentionPeriodDescription

44. Third Country Distribution Title

settings.labels.transferToThirdCountries

45. Third Country Distribution

service.thirdCountryTransfer

46. Is Essential

service.isEssential

47. Data Recipients Title

settings.labels.dataRecipientsList

48. Data Recipients

service.dataRecipientsList

49. Privacy Policy Title

settings.labels.policyOf

50. Privacy Policy

service.privacyPolicyURL

51. Cookie Policy Title

settings.labels.cookiePolicyInfo

52. Cookie Policy

service.cookiePolicyURL

53. Opt Out Link Title

settings.labels.optOut

54. Opt Out Link

service.optOutUrl

55. History Title

settings.labels.history

56. History

service.consent.history

57. History Consent Given

settings.labels.yes

58. History Consent Not Given

settings.labels.no

59. History Explicit Consent

settings.labels.explicit

60. History Implicit Consent

settings.labels.implicit

Action delegates

You can use the following functions to collect consent.

Accept All

let consents = UsercentricsCore.shared.acceptAll(consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.acceptAll(consentType = <UsercentricsConsentType>)
final consents = Usercentrics.acceptAll(consentType: <UsercentricsConsentType>);
const consents = Usercentrics.acceptAll(<UsercentricsConsentType>);

Deny All

let consents = UsercentricsCore.shared.denyAll(consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.denyAll(consentType = <UsercentricsConsentType>)
final consents = Usercentrics.denyAll(consentType: <UsercentricsConsentType>);
const consents = Usercentrics.denyAll(<UsercentricsConsentType>);

Save

For granular selection, you may pass specific sets of consent with an array of decisions:

let consents = UsercentricsCore.shared.saveDecisions(decisions: <[UserDecision]>, consentType: <UsercentricsConsentType>)
val consents = Usercentrics.instance.saveDecisions(decisions = <[UserDecision]>, consentType = <UsercentricsConsentType>)
final consents = Usercentrics.saveDecisions(decisions: List<UserDecision>, consentType: <UsercentricsConsentType>);
const consents = Usercentrics.saveDecisions([<UserDecision], <UsercentricsConsentType>);

Consent type

The consent type should be based on whether a customer made an explicit action to provide consent. Implicit can be used if the user ignores or skips the CMP. We highly recommend you only use implicit consent with the denyAll() method, which will accept only essential services.

Interaction Analytics

To gather events in the Usercentrics analytics dashboard the following API is provided to track the available events:

UsercentricsCore.shared.track(event: <UsercentricsAnalyticsEventType>)
Usercentrics.instance.track(event = <UsercentricsAnalyticsEventType>)
Usercentrics.track(event: <UsercentricsAnalyticsEventType>);
Usercentrics.track(<UsercentricsAnalyticsEventType>);

Events

[iOS] Event

[Android] Event

Notes

.cmpShown

.CMP_SHOWN

The banner was displayed to the user. It doesn't matter which layer.

.acceptAllFirstLayer

.ACCEPT_ALL_FIRST_LAYER

The Accept All button was pressed from the first layer.

.denyAllFirstLayer

.DENY_ALL_FIRST_LAYER

The Deny All button was pressed from the first layer.

.saveFirstLayer

.SAVE_FIRST_LAYER

The Save button was pressed from the first layer. Save is mainly used for granular decisions.

.acceptAllSecondLayer

.ACCEPT_ALL_SECOND_LAYER

The Accept All button was pressed from the second layer.

.denyAllSecondLayer

.DENY_ALL_SECOND_LAYER

The Deny All button was pressed from the second layer.

.saveSecondLayer

.SAVE_SECOND_LAYER

The Save button was pressed from the second layer. Save is mainly used for granular decisions.

.imprintLink

.IMPRINT_LINK

The Imprint link/button was pressed.

.moreInformationLink

.MORE_INFORMATION_LINK

The More Information link/button was pressed. This button is usually used to navigate from first layer to second layer.

.privacyPolicyLink

.PRIVACY_POLICY_LINK

The Privacy policy link/button was pressed.

Next steps

After the above, apply the user’s privacy choices to the third-party SDKs on your app.