API

Usage

The Didomi Web SDK exposes a complete API on the page via JavaScript for interacting with the Didomi platform. This allows your scripts to programmatically interact with the Didomi SDK. You can check the user consent status, register consents that you would collect yourself, and show/hide the Didomi UI.

Didomi ready

The API is exposed on the window.Didomi object. All calls to the Didomi API (except for the standard IAB __cmp function) must be enclosed within a window.didomiOnReady callback to ensure that the SDK is ready before calling it:

<script type="text/javascript">
window.didomiOnReady = window.didomiOnReady || [];
window.didomiOnReady.push(function (Didomi) { 
    // Call other functions on the SDK
});
</script>

The window.didomiOnReady callbacks are called after the SDK is initialized and has loaded its configuration.

Setting window.didomiConfig in a window.didomiOnReady callback has no effect as the SDK is already initialized at that point. window.didomiConfig must be set at the root of the page and outside of any callback.

postMessage API

If your JavaScript is not directly present on the page where the Didomi Web SDK is embedded but is present within an iframe on that page, you can communicate with the Didomi Web SDK through the postMessage API of the browser.

Available functions

Currently only getCurrentUserStatus is exposed via this API to allow reading the consent status of the user. To better understand its usage, you can refer to its definition.

Messages structure

The Didomi API is exposed with the same structure as the IAB CMP API.

The message to send should have the below form where:

  • command is the name of the function on the window.Didomi object to call

  • parameter is an array of parameters passed to the function called on the window.Didomi object

  • callId is a unique value that will be sent back with the response from Didomi, allowing you to identify what call the response is for

window.parent.postMessage({
  __cmpCall: 
    {
      command: "*command*", 
      parameter: [param1, param2, ...], 
      callId: *uniqueId*
    }
}, "*");

The Didomi Web SDK will send back the message below to your frame with the postMessage API containing a response for your command where:

  • returnValue is the value returned by the API function called

  • success is a boolean flag indicating whether the call was successful or not

  • callId is the unique value provided as callId in your original message

{
  __cmpReturn: 
    {
      returnValue: *returnValue*, 
      success: *boolean*, 
      callId: *uniqueId*
    }
}

Usage example

Here is a complete example of how to call one of the available functions of the postMessage API (getUserStatus) and collect its response:

window.addEventListener(
  "message",
  function (event) {
    try {
      var data = typeof event.data === "string" ? JSON.parse(event.data) : event.data;
      
      if (data && data.__cmpReturn) {
        // data.__cmpReturn contains the response from the CMP
        if (data.__cmpReturn.callId === "get-user-status") {
          // This is the response to our call for getting the user status
          // The status is in data.__cmpReturn.returnValue
          // Do something
        }
      }
    } catch(e) {
      // An error happened when decoding the message data
      // Most likely, the message wasn't related to the CMP so do nothing
    }
  },
  false
);

window.parent.postMessage({
  __cmpCall: 
    {
      command: "getUserStatus", 
      parameter: [], 
      callId: "get-user-status"
    }
}, "*");

Determining the frame containing the Didomi CMP

The frame to send the postMessage to can be determined by the ancestor with a .frames["cmpLocator"] child iframe present.

If your code runs in a direct iframe of the page containing the window.Didomi object then you can simply use window.parent as the reference to send messages to.

If your code might run multiple levels removed from the frame containing the window.Didomi object, you can search for the correct frame to send a message to with the following code:

var f = window;
var cmpFrame;

while(!cmpFrame) {
  try {
    if(f.frames["__cmpLocator"]) cmpFrame = f;
  } catch(e) {}

  if(f === window.top) break;

  f = f.parent;
}

Notice config

getExperiment()

Get the currently configured AB test (experiment) and the user information for that test.

Parameters

No parameter.

Returns

An object with the following properties:

NameTypeDescription

id

string

ID of the experiment as configured in your tag

group

string

Group that the user is assigned to for the experiment

control if the user is part of the control group

test if the user is part of the test group

null if the user is not part of the experiment

size

number

Size of the test group (number between 0 and 1)

startDate

string

Start date of the test as ISO 8601 with millisecond precision

Example

{
    "id": "experiment-id",
    "group": "control",
    "size": 0.1,
    "startDate": "2019-03-06T23:38:50.000Z"
}

isRegulationApplied(regulation)

Check if a given regulation applies to the current user.

Parameters

NameTypeDescription

regulation

string

gdpr for GDPR

ccpa for CCPA

Returns

A boolean indicating whether the user is subject to the regulation and support for the regulation is enabled for the website.

Example

if (Didomi.isRegulationApplied('gdpr')) {
  // The user is subject to GDPR, do something
}

if (Didomi.isRegulationApplied('ccpa')) {
  // the user is subject to CCPA, do something
}

Simulate a user input by indicating to the SDK that the user has pressed a button on an input device like a keyboard or a TV remote control. This function is usually called when mapping TV remote control inputs to the Didomi SDK.

This function is only available if the TV mode of the SDK is enabled by adding the following didomiConfig to your page:

window.didomiConfig = {
  mode: 'tv' // Enable TV mode
};

window.didomiConfig must be set outside of any callback like window.didomiOnReady to be effective.

If no UI view is displayed from the Didomi SDK (notice, purposes, or vendors), this function has no effect and will log an error message that can be ignored.

Parameters

Name

Type

Description

button

string

The button that was pressed by the user. See below for the acceptable values for this parameter.

The button parameter can take one of the following values:

ValueDescription

confirm

When the user presses a confirmation button (like OK or Enter). This input validates the user choice when pressed on UI buttons like Agree or Disagree.

cancel

When the user presses a cancellation button (like Return or Exit). This input cancels the current action and, usually, closes the current UI view.

up

When the user presses a button to move up (like an Up arrow). This input moves the focus to the closest action button located above the current focused element. If no such input exists, the focus is moved to the last element of the current UI view.

right

When the user presses a button to move right (like a Right arrow). This input moves the focus to the closest action button located to the right of the current focused element. If no such input exists, the focus is moved to the next element of the current UI view.

down

When the user presses a button to move down (like a Down arrow). This input moves the focus to the closest action button located below the current focused element. If no such input exists, the focus is moved to the first element of the current UI view.

left

When the user presses a button to move left (like a Left arrow). This input moves the focus to the closest action button located to the left of the current focused element. If no such input exists, the focus is moved to the previous element of the current UI view.

Returns

No return value.

Example

Didomi.navigate('down');
Didomi.navigate('confirm');

notice.isVisible()

Check if the consent notice is currently displayed.

Parameters

No parameter.

Returns

Boolean

Example

Didomi.notice.isVisible();

preferences.show(view)

Show the preferences manager. This can be used to allow the user to update their consent choices after the notice has been closed. We suggest adding a link with this function call somewhere on your website.

Parameters

NameTypeDescription

view

string

The view you want to open.

Possible options for GDPR: information, purposes and vendors. (information will only work if you enabled the information view). For CCPA, the Do Not Sell view is always open.

This parameter is optional. If it is not provided, it will display the purposes view or the information view if information is enabled for GDPR.

Returns

Nothing

Example

Didomi.preferences.show('purposes');

User status

getCurrentUserStatus()

Definition

Exposes the user status for the current regulation that applies.

Parameters

No parameters.

Returns

The user status containing the computed global status for Vendors and purposes:

  • A vendor's global status is enabled, if and only if:

    • the vendor is enabled directly in the vendors layer in all legal basis

    • AND all its related purposes are enabled or essential.

  • A purpose's global status is enabled in one of the two conditions:

    • the purpose is enabled for all the legal basis that it is configured for.

    • OR when the purpose is essential.

ParameterTypeDescription

vendors

object

  • Object that maps the ID of a vendor to an object representing its status.

  • Vendors with undefined user status are included in the response with enabled: false.

  • Vendors with ONLY essential purposes are automatically set with enable: true

purposes

object

  • Object that maps the ID of a purpose to an object representing its status.

  • Purposes with undefined user status are included in the response with enabled: false.

  • Essential purposes are automatically set with enable: true

regulation

string

  • Representation of the current regulation as a Regulation enum value, such as GDPR, CCPA, CPRA, or NONE.

  • Note that some regulations present as enum values are not available yet.

userId

string

Didomi user id.

created

string

User choices creation date.

updated

string

User choices update date.

consentString

string

TCF consent as string

additionalConsent

string

Additional consent.

Examples

Didomi.getCurrentUserStatus();

getObservableOnUserConsentStatusForVendor(vendorId)

Get an observable on the consent status for a given vendor. By subscribing to the observable, you can define a function that gets called whenever the consent status of a given vendor changes.

We use the list of purposes declared for the vendor to make sure that it has consent for all of them. The required purposes are automatically setup for IAB or Didomi vendors and you must specify the required purposes for your custom vendors when configuring the tag.

It also allows you to filter for specific types of updates so that you can react to certain events only. It is an alternative to listening to the consent.changed event that helps in dealing with vendor-specific operations.

This is commonly used to observe the consent status for a vendor to decide when to load/enable the vendor on a page.

Parameters

NameTypeDescription

vendor

string

The ID of vendor that to check the user consent for. If you are checking an IAB vendor, use an integer instead of a string. Custom vendor IDs must be prefixed with c:.

Returns

Observable on the consent status of the vendor.

The observable is not a real RxJS observable and only supports the following operators: distinctUntilChanged, filter and first. These operators behave the same as in RxJS.

Examples:

Example 1 - Get all updates to the consent status for a vendor

With this structure, your function gets called when the user gets on the page and every time the consent status of the user changes.

Didomi.getObservableOnUserConsentStatusForVendor('vendor-id')
    .subscribe(function (consentStatus) {
        if (consentStatus === undefined) {
            // The consent status for the vendor is unknown
        } else if (consentStatus === true) {
            // The user has given consent to the vendor
        } else if (consentStatus === false) {
            // The user has denied consent to the vendor
        }
    });

Example 2 - Get updates when the consent status is true or false

With this structure, your function only gets called after the user has given consent information. It could be on page load if the user had already given consent on a previous page or every time the user interacts with the Didomi widgets to change their consent information. When the consent status is unknown, your function does not get called.

Didomi.getObservableOnUserConsentStatusForVendor('vendor-id')
    .filter(function (status) { return status !== undefined })
    .subscribe(function (consentStatus) {
        if (consentStatus === undefined) {
            // The consent status for the vendor is unknown
        } else if (consentStatus === true) {
            // The user has given consent to the vendor
        } else if (consentStatus === false) {
            // The user has denied consent to the vendor
        }
    });

Example 3 - Get the first update to the consent status of the vendor

With this structure, your function gets called exactly once with the first available consent status. If the user has not given consent yet, your function will get called with undefined. If the user has already given consent, your function will get called with the consent status from the user.

Didomi.getObservableOnUserConsentStatusForVendor('vendor-id')
    .first()
    .subscribe(function (consentStatus) {
        if (consentStatus === undefined) {
            // The consent status for the vendor is unknown
        } else if (consentStatus === true) {
            // The user has given consent to the vendor
        } else if (consentStatus === false) {
            // The user has denied consent to the vendor
        }
    });

Example 4 - Get the first true or false update to the consent status of the vendor

With this structure, your function gets called exactly once when the consent status becomes available. If the user has not given consent yet, your function will only be called after the user has given consent. If the user has already given consent, your function will immediately get called with the consent status from the user. Your function will never get called with undefined.

Didomi.getObservableOnUserConsentStatusForVendor('vendor-id')
    .first()
    .filter(function(status) { return status !== undefined; })
    .subscribe(function (consentStatus) {
        if (consentStatus === true) {
            // The user has given consent to the vendor
        } else if (consentStatus === false) {
            // The user has denied consent to the vendor
        }
    });

getRequiredPurposeIds

Get the list of purpose IDs that are configured for the consent notice and that consent is collected for.

Parameters

No parameter.

Returns

An array of purpose IDs.

Example

// Returns ['cookies']
Didomi.getRequiredPurposeIds();

getRequiredVendorIds

Get the list of vendor IDs that are configured for the consent notice and that consent is collected for.

Parameters

No parameter.

Returns

An array of vendor IDs.

Example

// Returns ['google']
Didomi.getRequiredVendorIds();

isUserStatusPartial()

This function assesses whether the user has made choices regarding all the vendors and data processing tasks specified by the regulation. It returns true if there are any vendors or data processing activities for which the user has yet to express a preference.

Requires SDK to be initialized.

Parameters

No parameter.

Returns

Boolean

The function returns true when the following conditions are all met:

  1. A relevant regulation applies to the current user, meaning the regulation is not classified as none.

  2. There is at least one vendor configured. Without any configured vendors, the function defaults to false since there are no statuses to evaluate.

  3. There is a lack of user status for certain vendors or for specific purposes.

In all other scenarios, the function will return false.

For example, when the regulation is set to none, indicating that no specific regulation is applicable to the end-user, the function will yield false.

An important edge case to consider is when a new vendor is introduced to the system and their status has not yet been collected. In such instances, the function will return true until the user updates their preferences through the notice banner.

Example

Didomi.isUserStatusPartial();

openTransaction()

Allow you to easily enable/disable a purpose/vendor from the existing consents.

Parameters

No parameter.

Returns

a Transaction object that contain the current consents. You can then modify them with the functions below.

Example

const transaction = Didomi.openTransaction();
// enable a purpose
transaction.enablePurpose('cookies');
// enable purposes
transaction.enablePurposes('cookies', 'analytics');
// disable a purpose
transaction.disablePurpose('analytics');
// disable purposes
transaction.disablePurposes('cookies', 'analytics');
// enable a vendor
transaction.enableVendor(1);
// enable vendors
transaction.enableVendors(2, 3);
// disable a vendor
transaction.disableVendor(2);
// disable vendors
transaction.disableVendors(2, 3);
// Save and set the token/cookie with the new values
transaction.commit();

reset()

Reset all the consent information for the current user and assign a new user ID. This will remove all cookies created by Didomi and will trigger re-collection of consent. The consent notice will be displayed again.

Parameters

No parameter.

Returns

Nothing

Example

Didomi.reset();

setUser(userConfiguration)

Update the user configuration details. You can provide the user configuration options as part of the userConfiguration parameter. The function limits to update the internal values of the user configuration. Note: the setUser function will update any of the provided properties, if a property is not provided it will remain with the existing value.

Parameters

NameTypeDescription

userConfiguration

object

An object containing any of the following properties: organizationUserId: Organization User ID to associate with the user organizationUserIdAuthAlgorithm: Algorithm used for computing the digest organizationUserIdAuthSid: ID of the secret used for computing the digest organizationUserIdAuthSalt: Salt used for computing the digest organizationUserIdAuthDigest: Digest of the organization user ID and secret organizationUserIdExp: Unix timestamp organizationUserIdIv: If encryption is used and an IV was used for encrypting the message

Returns

Nothing

Example

Didomi.setUser({ organizationUserId: 'organizationUserID' });

setUserAgreeToAll()

Report that the user has enabled consents and legitimate interests for all purposes and vendors configured for your website.

This function will log the user choice on our platform and close the notice.

Consent statuses for essential purposes are not stored. Read our detailed section to see how essential purposes behave and how to configure them.

Please read our article on what to expect from your analytics when setting a custom behavior for your consent notice.

Parameters

No parameter.

Returns

Nothing

Example

Didomi.setUserAgreeToAll();

setUserDisagreeToAll()

Report that the user has disabled consents and legitimate interests for all purposes and vendors configured for your website.

This function will log the user choice on our platform and close the notice.

Consent statuses for essential purposes are not stored. Read our detailed section to see how essential purposes behave and how to configure them.

Please read our article on what to expect from your analytics when setting a custom behavior for your consent notice.

Parameters

No parameter.

Returns

Nothing

Example

Didomi.setUserDisagreeToAll();

setCurrentUserStatus

Definition

Set the user status for purposes and vendors. This function will trigger events and API calls every time it is called (and the user status changes) so make sure to push all user choices at once and not one by one.

Please read our article on what to expect from your analytics when setting a custom behavior for your consent notice.

Parameters

Add the desired global status for each vendor and each purpose:

  • the vendor status specified in this function will be reflected on the vendor’s layer.

    • vendor enabled : true → means the vendor is enabled in all the legal basis that this vendor uses.

    • vendor enabled : false → means the vendor is disabled in all the legal basis that this vendor uses

  • the purposes status specified in this function will be reflected on the preferences layer.

    • purpose enabled : true → means the purpose is enabled in all the legal basis in which it’s defined.

    • purpose enabled : false → means the purpose is disabled in all the legal basis in which it’s defined.

Returns

boolean

true if the user choices have changed (i.e. the user had made different choices before this function got called).

Examples

Didomi.getCurrentUserStatus();

shouldUserStatusBeCollected()

Determine if user status (consent) should be collected for the visitor. Returns true if user status is required for the current user and one of following two conditions is met:

  • User status has never been collected for this visitor yet

  • New user status should be collected (as new vendors have been added) AND the number of days before recollecting them has exceeded

  • The ignoreConsentBefore flag has been set with a date that applies to force consent renewal

If none of these conditions is met, the function returns false. This function is mainly present to allow you to know when to display your own notice if you have disabled our standard notice.

Parameters

No parameter.

Returns

Boolean

Example

Didomi.shouldUserStatusBeCollected()

GDPR

__tcfapi(command, version, callback, parameter)

Didomi is fully compliant with the CMP API from the IAB Transparency and Consent framework version 2. We expose a __tcfapi function and listen to postMessage events as per the specification.

Example (getting the IAB consent string):

__tcfapi('getTCData', null, function(result) {
  // The IAB consent string is available in the `tcString` property of the object
  console.log(result.tcString);
});

Read more in the IAB documentation

Last updated