Data Activation Platform (DAP)

Introduction

The DAP API is the primary method by which client applications and server interact with the the DAP platform. It is based on REST and aims to be as simple as possible. At a high level, the API allows clients to tokenize PII into a privacy-safe pseudonymization called a DAP Token, and retrieve cohort-level targeting parameters for those tokens.

Privacy Through Cohorts

A fundamental principle embraced by DAP is the concept of protecting privacy by placing individuals into large groups of individuals called cohorts. When an individual is "hidden among the crowd", it becomes extremely difficult or even impossible to track that one individual's behavior. This is why DAP only allows individuals to be targeted by a cohort, and never as an individual. The cohort concept also removes any individual identifiers from the bidstream further making it difficult or even impossible to build a profile on individual user behavior.

Terms

  • DAP Token: a privacy safe pseudonymization of end user PII based on JSON Web Token (JWT) and JSON Web Encryption (JWE)
    • DAP Identity Token: a DAP Token based on end user supplied PII
    • DAP Signature Token: a DAP Token based on an Symitri assigned server-side ID for an end user's device
    • DAP Secure Ad ID: a DAP Token containing an identity or signature token, as well as a timestamp, cohorts, and other data pertinent to the impression opportunity being auctioned for
  • Tokenize: the act of creating a token based on some form of identity PII
  • Signature: an Symitri assigned server-side ID acting as a synthetic ID for an end-user device
  • Membership: the concept of an individual being part of, or not part of a cohort or set of cohorts

Integrations

JavaScript

A DAP client include has been created to simplify the process for tokenizing end user identities and retrieving the associated cohorts for submission to the bid-stream.

<!-- DAP CLIENT BEGIN -->
<!-- Adjust jQuery include as needed; DAP does not depend on a specific version of jQuery, -->
<!-- it just needs $.ajax(). -->
<script src="https://code.jquery.com/jquery-3.2.1.min.js" crossorigin="anonymous"></script>
<script src="https://sym-dist.symitri.net/dap-x1.2.js"></script>
<script src="https://sym-dist.symitri.net/dap-client-x1.2.js"></script>
<script>
  config = {
    api_hostname: "api.dap.akadns.net",
    api_version: "x1",
    domain: "advertiser.com"
  };
  identity = {
    type: "dap-signature:1.3.0"
  };
  let ttl = 3600; // seconds
  let dap_token = dap_get_token( config, identity, ttl );
  let dap_segment = dap_get_segments( config, dap_token );
</script>
<!-- DAP CLIENT END -->

The dap_segment object is suitable for including into the OpenRTB user.data.segment array.

Testing & Verification

In order to test the code is working, deploy the code to your site, and then use DevTools to inspect the network traffic as the site loads. You should see a request of an object called tokenize, and then subsequently membership. The tokenize request should return 201 Created and carry with it a Symitri-DAP-Token response header with the DAP token for the supplied identity and type. The membership request should return 200 and have a set of cohorts and a Secure Ad ID (SAID) in the response body JSON.

API Location Snippet
Tokenize Response Header
Symitri-DAP-Token: eyJhbGci...
Membership Response Body (JSON)
{
  "cohorts": [ "1", "5", "7" ],
  "said": "eyJraWQI..."
}

Prebid.JS

User ID Module

The Symitri Data Activation Platform has been integrated into Prebid.JS through the use of Prebid's User ID module subsystem. This integration is a stop-gap until the bid-stream is ready to transact on segments, at which point we will deprecate this module in favor of our DAP Real Time Data module. For now, this integration requires the Trust-X SSP to receive and strip the token from the bid-stream, and subsequently map the cohorts returned by the Membership API into one or more Deal IDs.

In order to enable DAP within Prebid.JS you simply need to include the "symitriDAPIdSystem" along with your other modules when building Prebid.

The latest documentation for this integration, as well as an example of the required client-side configuration can be found in the module's documentation page.

A quick-start for supporting consenting but unauthenticated users with Prebid in "SSP-assist" mode would be:

pbjs.setConfig({
  userSync: {
    userIds: [{
      name: "symitriDAPId",
      params: {
        apiHostname: "prebid.dap.akadns.net",
        apiVersion: "x1",
        domain: "prebid.org",
        type: "dap-signature:1.0.0"
      },
    }],
  }
});

Testing & Verification

In order to test that the module is working, incorporate your DAP-enabled prebid.js build into a web page, make the appropriate prebid configurations, and inspect an outgoing bid looking for the presence of Symitri EIDS in the bid-stream. For example, the Symitri EIDS can be found in the following locations with the following bid adapters:

Bid Adapter Location Snippet
gridBidAdapter, pubmaticBidAdapter Request Body (JSON)
"user": {
  "ext": {
    "eids": [ {
        "source": "symitri.com",
        "uids": [ {
            "atype": 1,
            "id": "eyJhbGci..."
        } ]
    } ]
  }
}
rubiconBidAdapter Request Header
eid_symitri.com: eyJhbGci...

Google Tag Manager (GTM)

For non-bidding use-cases (e.g. audience cohort curation), GTM can be used to tokenize consented end users and capture their identities within the DAP system. A typical example would be tagging an interaction on an advertiser site that places the end user into a specific cohort to be targeted at some point in the future.

In the following example, the end user is placed into cohort 5 for 30 days (2,592,000 = 3600 x 24 x 30).

<!-- Begin DAP Signature Code -->
<!-- Adjust jQuery include as needed; DAP does not depend on a specific version of jQuery, -->
<!-- it just needs $.ajax(). -->
<script src="https://code.jquery.com/jquery-3.2.1.min.js" crossorigin="anonymous"></script>
<script src="https://sym-dist.symitri.net/dap-x1.2.js"></script>
<script src="https://sym-dist.symitri.net/dap-client-x1.2.js"></script>
<script>
  config = {
    "api_hostname": "api.dap.akadns.net",
    "api_version": "x1",
    "domain": "advertiser.com"
  };
  identity = {
    "type": "dap-signature:1.3.0",
    "attributes": {
      "cohorts": [ "5:2592000" ]
    }
  };
  ttl = 3600; // seconds
  dap_get_token( config, identity, ttl );
</script>
<noscript><!-- Unsupported --></noscript>
<!-- End DAP Signature Code -->

Testing & Verification

In order to test that the tag is working, deploy the tag above to your site, and then use DevTools to inspect the network traffic as the site loads. You should see a request for an object called tokenize which is an invocation of the DAP API to protect an identity by encapsulating it in a token. You should see a DAP Token returned in the Symitri-DAP-Token response header.

Location Snippet
Response Header
Symitri-DAP-Token: eyJhbGci...

DAP x1 API Endpoints

X1 Tokenize

Tokenize an identity into a secure pseudonymization suitable for privacy-safe, cohort membership lookups. Identities can be supplied by the client or can be requested from the server in the form of a signature.

Description

This API protects direct end user PII by tokenizing it into a pseudonymization in the form of a highly secure, JSON Web Token with Encryption (JWT/JWE) object called a DAP Token. DAP Tokens cannot be decrypted by anyone, and therefore prevent leakage or misuse of PII.

Once a DAP Token is returned in the response, it can be used as input to the Membership API to lookup cohorts this end user belongs to.

For cases where the end user is not supplying PII, a server-side device ID can be assigned by setting the type to a valid DAP signature format (e.g. dap-signature:1.3.0).

Usage

Identities only need to be tokenized once, or when the identity value itself changes. It is expected that identities will be tokenized in conjunction with a login event, or when an application assigns an ID to a device.

Synopsis

Authenticated Use-case

C->S: POST /data-activation/x1/domain/{domain}/identity/tokenize
      Host: api.dap.akadns.net
      Content-Type: application/json

      {
        "identity": "obiwan@jedi.com",
        "type": "email"
      }

S->C: HTTP/1.1 200 Ok
      Symitri-DAP-Token: eyJ0eXAi...

Unauthenticated Use-case

C->S: POST /data-activation/x1/domain/{domain}/identity/tokenize
      Host: api.dap.akadns.net
      Content-Type: application/json

      {
        "type": "dap-signature:1.3.0"
      }

S->C: HTTP/1.1 200 Ok
      Symitri-DAP-Token: eyJ0eXAi...

Input Parameters

Output

The output of the Tokenize API is a DAP Token containing the supplied domain, identity, and type.

 

X1 Membership

Retrieve the cohort membership and a new Secure Ad ID (SAID) for the supplied DAP Token. The cohorts and SAID are then supplied to the bidstream: the cohorts for targeting purposes, and the SAID for future measurement and attribution purposes. The cohorts allow the bidder to match on segments of the population they have previously curated. The SAID is meant to be collected and stored, and then submitted back to DAP where analysis can be done on large numbers of SAIDs and results returned at the cohort level--this is foundational to preventing unauthorized tracking and profiling of individuals.

Description

This API returns a set of cohorts to which this end-user belongs and a new so-called one-time use Secure Ad ID (SAID) to represent this impression opportunity. Cohorts are created by the buy-side, and periodically updated within DAP to represent the current needs of a campaign.

Along with the cohorts, a new SAID is returned as well. SAIDs allow the buy-side to collect information that can only be used to understand cohort level behavior if the appropriate permissions by the publisher have been granted.

Usage

This API must be invoked every "page load" to ensure that a new Secure Ad ID (SAID) is supplied along with the cohorts to the bidstream. It is imperative to privacy that SAIDs appear as ephemeral as possible to the bidstream so that the potential for tracking is minimized. It is intended that a new SAID be created for every set of impression opportunities on a page, or every ad in a pod is auctioned.

Synopsis

C->S: GET /data-activation/v1/token/{token}/membership
      Host: api.dap.akadns.net

S->C: HTTP/1.1 200 OK
      Content-Type: application/json

      {
        "cohorts": [ "1", "5", "7" ],
        "said": "eyJraWQiO..."
      }

Input Parameters

Output

 

X1 Attributes

Update token attributes such as associating cohorts.

Description

This API allows third-party systems to maintain attributes of a given token they have relationships with. The common use-case is to add or update cohorts that should be associated with the supplied token.

Cohorts additionally have an optional TTL associated with them and is specified by appending the TTL, in seconds, to the end of the cohort ID delimited by a colon.

Usage

It is expected that third-party systems will continuously be updating cohort membership throughout the life of a campaign. This API should be invoked as often as is necessary to satisfy campaign requirements.

Synopsis

C->S: POST /data-activation/x1/token/{token}/attributes
      Host: api.dap.akadns.net
      Content-Type: application/json

      {
          attributes: {
              cohorts: [ "39:2592000", "32:3600" ]
          }
      }

S->C: HTTP/1.1 200 OK
      

In this example, the third-party is establishing or updating two cohort memberships that read as follows:

  • "39:2592000": Add/update the token's membership with cohort 39 to expire in 30 days (2,592,000 seconds)
  • "32:3600": Add/update the token's membership with cohort 32 to expire in 1 hour (3,600 seconds)

Input Parameters

Output

The output of this API is an HTTP status code representing success or failure.

HTTP Status: