The User ID module supports multiple ways of establishing pseudonymous IDs for users, which is an important way of increasing the value of header bidding. Instead of having several exchanges sync IDs with dozens of demand sources, a publisher can choose to integrate with one of these ID schemes:
pbjs.setConfig()
setConfig()
is called, and if the user has consented to storing IDs locally, the module is invoked to call the URL if needed
Note that User IDs aren’t needed in the mobile app world because device ID is available in those ad serving scenarios.
Also note that not all bidder adapters support all forms of user ID. See the tables below for a list of which bidders support which ID schemes.
When paired with the Consent Management module, privacy rules are enforced:
In addition, individual users may opt-out of receiving cookies and HTML5 local storage by setting these values:
_pbjs_id_optout
cookie or HTML5 local storage_pubcid_optout
cookie or HTML5 local storage (for backwards compatibility with the original PubCommonID module.By including this module and one or more of the sub-modules, a number of new options become available in setConfig()
,
all of them under the userSync
object as attributes of the userIds
array
of sub-objects. The table below has the options that are common across ID systems. See the sections below for specific configuration needed by each system and examples.
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
name | Required | String | May be: "britepoolId" , "criteo" , "digitrust" , "id5id" , identityLink , "liveIntentId" , "parrableId" , "netId" , "pubCommonId" , or "unifiedId" |
"unifiedId" |
params | Based on User ID sub-module | Object | ||
storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. This is not needed when value is specified or the ID system is managing its own storage |
|
storage.type | Required | String | Must be either "cookie" or "html5" . This is where the results of the user ID will be stored. |
"cookie" |
storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | "_unifiedId" |
storage.expires | Strongly Recommended | Integer | How long (in days) the user ID information will be stored. If this parameter isn’t specified, session cookies are used in cookie-mode, and local storage mode will create new IDs on every page. | 365 |
storage.refreshInSeconds | Optional | Integer | The amount of time (in seconds) the user ID should be cached in storage before calling the provider again to retrieve a potentially updated value for their user ID. If set, this value should equate to a time period less than the number of days defined in storage.expires . By default the ID will not be refreshed until it expires. |
|
value | Optional | Object | Used only if the page has a separate mechanism for storing a User ID. The value is an object containing the values to be sent to the adapters. | {"tdid": "1111", "pubcid": {2222}, "id5id": "ID5-12345" } |
BritePool ID, provided by BritePool is a Universal Identity resolution which does not depend on 3rd party cookies.
Add it to your Prebid.js package with:
gulp build –modules=britepoolIdSystem
Please reach out to prebid@britepool.com and request your api_key
.
The BritePool privacy policy is at https://britepool.com/services-privacy-notice/.
Param under usersync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
name | Required | String | "britepoolId" |
"britepoolId" |
params | Required | Object | Details for britepool initialization. | |
params.api_key | Required | String | BritePool API Key provided by BritePool | “458frgde-djd7-3ert-gyhu-12fghy76dnmko” |
params.url | Optional | String | BritePool API url | “https://sandbox-api.britepool.com/v1/britepool/id” |
params.identifier | Required | String | Where identifier in the params object is the key name. At least one identifier is required. Available Identifiers aaid dtid idfa ilid luid mmid msid mwid rida ssid hash |
params.ssid params.aaid |
1) Individual params may be set for the BritePool User ID Submodule. At least one identifier must be set in the params.
pbjs.setConfig({
usersync: {
userIds: [{
name: "britepoolId",
storage: {
name: "britepoolid",
type: "cookie",
expires: 30
},
params: {
url: "https://sandbox-api.britepool.com/v1/britepool/id", // optional. used for testing
api_key: "xxx", // provided by britepool
hash: "yyyy", // example identifier
ssid: "r894hvfnviurfincdejkencjcv" // example identifier
}
}],
syncDelay: 3000 // 3 seconds after the first auction
}
});
Criteo is the leading advertising platform for the Open Internet. The Criteo ID for Exchanges module enables publishers to access Criteo’s unique demand - more than 20.000 advertisers & brands - to monetize their exchange inventory with an optimal take rate across all browsing environments. Note that direct access to that demand is also available through Criteo Direct Bidder, in which case this module is unnecessary.
The Criteo privacy policy is at https://www.criteo.com/privacy/.
Add it to your Prebid.js package with:
gulp build –modules=criteoIdSystem
The Criteo ID module does not require any configuration parameters. It should work as-is provided that bidders use it in their adapters.
When calling Criteo RTB, partners should forward this id in the field user.ext.prebid_criteoid
.
NOTE: For optimal performance, the Criteo Id module should be called at every opportunity. It embeds its own optimal caching mechanism. It’s best not to use params.storage
with this module as it may only lower the performances. If you are using multiple id systems, however, you may use it for the other id systems that supports it.
pbjs.setConfig({
userSync: {
userIds: [{
name: "criteo",
}]
}
});
DigiTrust is a consortium of publishers, exchanges, and DSPs that provide a standard user ID for display advertising similar in concept to ID-for-Ads in the mobile world. Subscribers to the ID service get an anonymous, persistent and secure identifier for publishers and trusted third parties on all browser platforms, including those which do not support third party cookies by default.
Add it to your Prebid.js package with:
gulp build –modules=digiTrustIdSystem
In order to utilize DigiTrust a publisher must register and be approved for membership. You may register online at: https://www.digitru.st/signup/
In addition to general usage and configuration of the User Id module, follow the additional instructions for configuring and deploying DigiTrust as outlined in DigiTrust Module Usage and Configration.
The DigiTrust privacy policy as at https://www.digitru.st/privacy-policy/.
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
name | Required | String | "digitrust" |
"digitrust" |
params | Required for DigiTrust | Object | Details DigiTrust initialization. | |
params.init | Required for DigiTrust | Object | Defines the member and site | { member: 'example_member_id', site: 'example_site_id' } |
params.callback | Optional for DigiTrust | Function | Allows init error handling | See example above |
value | Optional | Object | Used only if the page has a separate mechanism for storing the DigiTrust ID. The value is an object containing the values to be sent to the adapters. In this scenario, no URL is called and nothing is added to local storage | {"digitrustid": {"data":{"id": "1111", ...}}} |
Please consult the DigiTrust Module Usage and Configration page for details on DigiTrust parameters and usage. For more complete instructions please review the Prebid Integration Guide for DigiTrust
1) Publisher is a DigiTrust member and supports both PubCommonID and DigiTrust ID integrated with Prebid
<script>
pbjs.setConfig({
userSync: {
userIds: [{
name: "pubCommonId",
storage: {
type: "cookie",
name: "_pubcid", // create a cookie with this name
expires: 365 // expires in 1 years
}
}, {
name: "digitrust",
params: {
init: {
member: 'example_member_id',
site: 'example_site_id'
},
callback: function (digiTrustResult) {
if (digiTrustResult.success) {
console.log('Success in Digitrust init', digiTrustResult.identity.id);
} else {
console.error('Digitrust init failed');
}
}
},
storage: {
type: "html5",
name: "pbjsdigitrust",
expires: 60
}
}]
}});
</script>
Other examples:
The ID5 Universal ID is a shared, neutral identifier that publishers and ad tech platforms can use to recognise users even in environments where 3rd party cookies are not available. The ID5 Universal ID is designed to respect users’ privacy choices and publishers’ preferences throughout the advertising value chain. For more information about the ID5 Universal ID, please visit our documentation. We also recommend that you sign up for our release notes to stay up-to-date with any changes to the implementation of the ID5 Universal ID in Prebid.
The ID5 Universal ID is free to use, but requires a simple registration with ID5. Please visit id5.io/universal-id to sign up and request your ID5 Partner Number to get started.
The ID5 privacy policy as at https://www.id5.io/platform-privacy-policy.
First, make sure to add the ID5 submodule to your Prebid.js package with:
gulp build –modules=id5IdSystem
The following configuration parameters are available:
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
params | Required | Object | Details for the ID5 Universal ID. | |
params.partner | Required | Number | This is the ID5 Partner Number obtained from registering with ID5. | 173 |
NOTE: The ID5 Universal ID that is delivered to Prebid will be encrypted by ID5 with a rotating key to avoid unauthorized usage and to enforce privacy requirements. Therefore, we strongly recommend setting storage.refreshInSeconds
to 8
hours (8*3600
seconds) to ensure all demand partners receive an ID that has been encrypted with the latest key, has up-to-date privacy signals, and allows them to transact against it.
1) Publisher wants to retrieve the ID5 Universal ID through Prebid.js
pbjs.setConfig({
userSync: {
userIds: [{
name: "id5Id",
params: {
partner: 173 // change to the Partner Number you received from ID5
},
storage: {
type: "cookie",
name: "pbjs-id5id", // create a cookie with this name
expires: 90, // cookie lasts for 90 days
refreshInSeconds: 8*3600 // refresh ID every 8 hours to ensure it's fresh
}
}],
syncDelay: 1000 // 1 second after the first bidRequest()
}
});
2) Publisher has integrated with ID5 on their own (e.g. via the ID5 API) and wants to pass the ID5 Universal ID directly through to Prebid.js
pbjs.setConfig({
userSync: {
userIds: [{
name: "id5Id",
value: { "id5id": "ID5-8ekgswyBTQqnkEKy0ErmeQ1GN5wV4pSmA-RE4eRedA" }
}]
}
});
IdentityLink, provided by LiveRamp is a single person-based identifier which allows marketers, platforms and publishers to perform personalized segmentation, targeting and measurement use cases that require a consistent, cross-channel view of the user in anonymous spaces.
Add it to your Prebid.js package with:
gulp build –modules=identityLinkIdSystem
Please reach out to prebid@liveramp.com and request your placementId
.
The IdentityLink privacy policy is at https://liveramp.com/privacy/service-privacy-policy/.
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
name | Required | String | "identityLink" |
"identityLink" |
params | Required for Id Link | Object | Details for identityLink initialization. | |
params.pid | This parameter is required for IdentityLink | String | This is the placementId, value needed for obtaining user’s IdentityLink envelope |
1) Publisher passes a placement ID and elects to store the IdentityLink envelope in a cookie.
pbjs.setConfig({
userSync: {
userIds: [{
name: "identityLink",
params: {
pid: '999' // Set your real identityLink placement ID here
},
storage: {
type: "cookie",
name: "idl_env", // create a cookie with this name
expires: 30 // cookie can last for 30 days
}
}],
syncDelay: 3000 // 3 seconds after the first auction
}
});
2) Publisher passes a placement ID and elects to store the IdentityLink envelope in HTML5 localStorage.
pbjs.setConfig({
userSync: {
userIds: [{
name: "identityLink",
params: {
pid: '999' // Set your real identityLink placement ID here
},
storage: {
type: "html5",
name: "idl_env", // set localstorage with this name
expires: 30
}
}],
syncDelay: 3000
}
});
LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent ID is a user identifier tied to an active, anonymized email hash in our graph that functions in cookie-challenged environments like mobile browsers.
Add LiveIntent ID to your Prebid.js package with:
gulp build –modules=liveIntentIdSystem
The request.userId.lipb
object would then look like
{
"lipbid": "T7JiRRvsRAmh88",
"segments": ["999"]
}
The adapters can be implemented to use the lipibid as the identifier, and segments to which that identifier is associated with.
To leverage the LiveIntent ID, you need to first set up a first-party cookie sync with LiveIntent. Please reach out to peoplebased@liveintent.com for more information.
The LiveIntent privacy policy is at https://www.liveintent.com/services-privacy-policy/.
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
name |
Required | String |
The name of this module. | 'liveIntentId' |
params |
Required | Object |
Container of all module params. | |
params.publisherId |
Required | String |
The unique identifier for each publisher. | '12432415' |
params.partner |
Optional | String |
The name of the partner whose data will be returned in the response. | 'prebid' |
params.identifiersToResolve |
Optional | Array[String] |
Used to send additional identifiers in the request for LiveIntent to resolve against the LiveIntent ID. | ['my-id'] |
params.url |
Optional | String |
Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain. | '//idx.my-domain.com' |
1.To receive the LiveIntent ID, the setup looks like this.
pbjs.setConfig({
userSync: {
userIds: [{
name: "liveIntentId",
params: {
publisherId: "9896876"
}
}]
}
})
2.If you are passing additional identifiers that you want to resolve to the LiveIntent ID, add those under the identifiersToResolve
array in the configuration parameters.
pbjs.setConfig({
userSync: {
userIds: [{
name: "liveIntentId",
params: {
publisherId: "9896876",
identifiersToResolve: ["my-own-cookie"]
}
}]
}
})
The Parrable ID is a Full Device Identifier that can be used to identify a device across different browsers and webviews on a single device including browsers that have third party cookie restrictions.
Add it to your Prebid.js package with:
gulp build –modules=parrableIdSystem
Please contact Parrable to obtain a Parrable Partner Client ID and/or use the Parrable Partner Client ID provided by the vendor for each Parrable-aware bid adapter you will be using. Note that if you are working with multiple Parrable-aware bid adapters you may use multiple Parrable Parter Client IDs.
The Parrable privacy policy as at https://www.parrable.com/privacy-policy/.
In addition to the parameters documented above in the Basic Configuration section the following Parrable specific configuration is required:
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
params | Required | Object | Details for the Parrable ID. | |
params.partner | Required | String | A list of one or more comma-separated Parrable Partner Client IDs for the Parrable-aware bid adapters you are using. Please obtain Parrable Partner Client IDs from them and/or obtain your own. | '30182847-e426-4ff9-b2b5-9ca1324ea09b' |
NOTE: The Parrable ID that is delivered to Prebid is encrypted by Parrable with a time-based key and updated frequently in the browser to enforce consumer privacy requirements and thus will be different on every page view, even for the same user.
We recommend setting storage.expires
to no more than364
days, which is the default cookie expiration that Parrable uses in the standalone Parrable integration.
pbjs.setConfig({
userSync: {
userIds: [{
name: `'parrableId'`,
params: {
partner: `'30182847-e426-4ff9-b2b5-9ca1324ea09b'` // change to the Parrable Partner Client ID(s) you received from the Parrable Partners you are using
},
storage: {
type: `'cookie'`,
name: `'_parrable_eid'`, // create a cookie with this name
expires: 364 // cookie can last for up to 1 year
}
}],
syncDelay: 1000
}
});
This module stores an unique user id in the first party domain and makes it accessible to all adapters. Similar to IDFA and AAID, this is a simple UUID that can be utilized to improve user matching, especially for iOS and MacOS browsers, and is compatible with ITP (Intelligent Tracking Prevention). It’s lightweight and self contained. Adapters that support Publisher Common ID will be able to pick up the user ID and return it for additional server-side cross device tracking.
There is no special registration or configuration for PubCommon ID. Each publisher’s privacy policy should take PubCommon ID into account.
Add it to your Prebid.js package with:
gulp build –modules=pubCommonIdSystem
1) Publisher supports PubCommonID and first party domain cookie storage
pbjs.setConfig({
userSync: {
userIds: [{
name: "pubCommonId",
storage: {
type: "cookie",
name: "_pubcid", // create a cookie with this name
expires: 365 // expires in 1 years
}
}]
}
});
2) Publisher supports both UnifiedID and PubCommonID and first party domain cookie storage
pbjs.setConfig({
userSync: {
userIds: [{
name: "unifiedId",
params: {
partner: "myTtdPid"
},
storage: {
type: "cookie",
name: "pbjs-unifiedid", // create a cookie with this name
expires: 60
}
},{
name: "pubCommonId",
storage: {
type: "cookie",
name: "_pubcid", // create a cookie with this name
expires: 180
}
}],
syncDelay: 5000 // 5 seconds after the first bidRequest()
}
});
The Unified ID solution is provided by adsrvr.org and the Trade Desk.
Add it to your Prebid.js package with:
gulp build –modules=unifiedIdSystem
You can set up Unified ID in one of these ways:
The Unified ID privacy is covered under the TradeDesk Services Privacy Policy.
Param under userSync.userIds[] | Scope | Type | Description | Example |
---|---|---|---|---|
name | Required | String | "unifiedId" |
"unifiedId" |
params | Required for UnifiedId | Object | Details for UnifiedId initialization. | |
params.partner | Either this or url required for UnifiedId | String | This is the partner ID value obtained from registering with The Trade Desk or working with a Prebid.js managed services provider. | "myTtdPid" |
params.url | Required for UnifiedId if not using TradeDesk | String | If specified for UnifiedId, overrides the default Trade Desk URL. | “https://unifiedid.org/somepath?args” |
value | Optional | Object | Used only if the page has a separate mechanism for storing the Unified ID. The value is an object containing the values to be sent to the adapters. In this scenario, no URL is called and nothing is added to local storage | {"tdid": "D6885E90-2A7A-4E0F-87CB-7734ED1B99A3"} |
1) Publisher has a partner ID with The Trade Desk, and is using the default endpoint for Unified ID.
Bug: The default URL did not support HTTPS in Prebid.js 2.10-2.14. So instead of using the ‘partner’ parameter, it’s best to supply the Trade Desk URL as shown in this example.
pbjs.setConfig({
userSync: {
userIds: [{
name: "unifiedId",
params: {
url: "//match.adsrvr.org/track/rid?ttd_pid=MyTtidPid&fmt=json"
},
storage: {
type: "cookie",
name: "pbjs-unifiedid", // create a cookie with this name
expires: 60 // cookie can last for 60 days
}
}],
syncDelay: 3000 // 3 seconds after the first auction
}
});
2) Publisher supports UnifiedID with a vendor other than Trade Desk and HTML5 local storage.
pbjs.setConfig({
userSync: {
userIds: [{
name: "unifiedId",
params: {
url: "URL_TO_UNIFIED_ID_SERVER"
},
storage: {
type: "html5",
name: "pbjs-unifiedid", // set localstorage with this name
expires: 60
}
}],
syncDelay: 3000
}
});
3) Publisher has integrated with UnifiedID on their own and wants to pass the UnifiedID directly through to Prebid.js.
pbjs.setConfig({
userSync: {
userIds: [{
name: "unifiedId",
value: {"tdid": "D6885E90-2A7A-4E0F-87CB-7734ED1B99A3"}
}]
}
});
The European netID Foundation (EnID) aims to establish with the netID an independent European alternative in the digital market for Demand and Supply side. With the netID Single-Sign-On, the EnID established an open standard for consumer logins for services of Buyers and Brands, that also includes user-centric consent management capabilities that results in a standardized, EU-GDPR compliant, IAB TCF aware, cross-device enabled Advertising Identifier, which can be leveraged by publishers and advertisers (and vendors supporting them) to efficiently deliver targeted advertising through programmatic systems to already more than 38 million Europeans on mobile and desktop devices.
The EnID is a non-profit organization which is open to any contributing party on both, the demand and supply side to make identity work for consumers as well as the advertising ecosystem.
1) Publisher stores netID via his own logic
pbjs.setConfig({
usersync: {
userIds: [{
name: "netId",
value: {
"netId":"fH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg"
}
}]
}
});
Bidder | IDs Supported |
---|---|
9MediaOnline | unifiedId/tradedesk, id5Id |
aardvark | unifiedId/tradedesk |
adtarget | unifiedId/tradedesk, id5Id |
adxcg | pubCommon, unifiedId/tradedesk |
appnexus | criteo |
beachfront | unifiedId/tradedesk |
cleanmedia | unifiedId/tradedesk, id5Id |
conversant | pubCommon |
emoteev | pubCommon |
gamoshi | unifiedId/tradedesk, id5Id |
gumgum | unifiedId/tradedesk, digitrustId |
kargo | unifiedId/tradedesk |
livewrapped | pubcommon |
mobsmart | pubCommon |
openx | pubCommon, unifiedId, identityLink |
pubmatic | pubcommonId, unifiedId/tradedesk, digitrustId, id5Id, criteo, identityLink, liveIntent, parrable, britepoolId |
pulsepoint | pubcommonId, unifiedId, digitrustId, id5Id, britepoolId, criteo, identityLink, parrable, liveIntent |
richaudience | pubcommonId, unifiedId/tradedesk, id5Id, criteo, identityLink, liveIntent |
rubicon | unifiedId/tradedesk, digitrust, liveIntent |
sharethrough | unifiedId/tradedesk |
smartrtb | unifiedId,pubCommonId,id5id,digitrust |
sonobi | pubCommon, unifiedId/tradedesk |
spotx | unifiedId/tradedesk, id5Id |
triplelift | unifiedId/tradedesk, identityLink |
yieldmo | pubCommon |
Bidders that want to support the User ID module in Prebid.js, need to update their bidder adapter to read the indicated bidRequest attributes and pass them to their endpoint.
ID System Name | ID System Host | Prebid.js Attr | Example Value |
---|---|---|---|
BritePool ID | BritePool | bidRequest.userId.britepoolid | "1111" |
CriteoID | Criteo | bidRequest.userId.criteoId | "1111" |
DigiTrust | IAB | bidRequest.userId.digitrustid | {data: {id: "DTID", keyv: 4, privacy: {optout: false}, producer: "ABC", version: 2} |
ID5 ID | ID5 | bidRequest.userId.id5id | "1111" |
IdentityLink | Trade Desk | bidRequest.userId.idl_env | "1111" |
LiveIntent ID | Live Intent | bidRequest.userId.lipb.lipbid | "1111" |
Parrable ID | Parrable | bidRequest.userId.parrableid | "eidVersion.encryptionKeyReference.encryptedValue" |
PubCommon ID | n/a | bidRequest.userId.pubcid | "1111" |
Unified ID | Trade Desk | bidRequest.userId.tdid | "1111" |
netID | netID | bidRequest.userId.netId | "fH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg" |
For example, the adapter code might do something like:
if (bidRequest.userId && bidRequest.userId.pubcid) {
url+="&pubcid="+bidRequest.userId.pubcid;
}
Bidders that want to support the User ID module in Prebid Server, need to update their server-side bid adapter to read the desired OpenRTB attributes noted in the example below and send them to their endpoint.
{
"user": {
"ext": {
"eids": [{
"source": "adserver.org", // Unified ID
"uids": [{
"id": "111111111111",
"ext": {
"rtiPartner": "TDID"
}
}]
},{
"source": "pubcid.org",
"uids": [{
"id":"11111111"
}]
},
{
"source": "id5-sync.com",
"uids": [{
"id": "ID5-12345"
}]
},
{
source: "parrable.com",
uids: [{
id: "01.1563917337.test-eid"
}]
},{
"source": "identityLink",
"uids": [{
"id": "11111111"
}]
},{
"source": "criteo",
"uids": [{
"id": "11111111"
}]
},{
"source": "britepool.com",
"uids": [{
"id": "11111111"
}]
},{
"source": "liveintent.com",
"uids": [{
"id": "11111111"
}]
},{
"source": "netid.de",
"uids": [{
"id": "11111111"
}]
}],
"digitrust": { // DigiTrust is not in the eids section
"id": "11111111111",
"keyv": 4
}
}
}
}
If you’re an ID provider that wants to get on this page:
If you need to export the user IDs stored by Prebid User ID module, the getUserIds()
function will return an object formatted the same as bidRequest.userId.
pbjs.getUserIds() // returns object like bidRequest.userId. e.g. {"pubcid":"1111", "tdid":"2222"}
User IDs from Prebid User ID module can be passed to GAM for targeting in Google Ad Manager or to pass ahead in Google Exchange Bidding using userIdTargeting
module. More details can be found here. In short, you just need to add the optional userIdTargeting sub-module into your gulp build
command and the additional userIdTargeting
config becomes available.