Publisher provided signals

You can send audience and contextual data as publisher provided signals (PPS) in ad requests. With PPS, you can use your user data to improve programmatic monetization by communicating your audience characteristics to bidders in all transaction types, using standard taxonomies, without the need to share user identifiers. Your audience characteristics can include behavioral and interest-based data ( IAB Audience Taxonomy 1.1), and contextual data ( IAB Content Taxonomy 2.2). You can also send publisher provided structured signals, which are defined by Google, and allow for additional signals to be sent.

Construct the user signals JSON

At the top level, create a JSON object with a single key-value pair. The key should be PublisherProvidedTaxonomySignals, and its value should be an array of objects. Each object in the array should have 2 key-value pairs:

  • The taxonomy key, which accepts the following values that are mapped to following IAB public specifications:

    • IAB_AUDIENCE_1_1 for Audience Taxonomy 1.1
    • IAB_CONTENT_2_2 for Content Taxonomy 2.2
  • The values key with a corresponding array of string taxonomy values.

Construct the structured signals array

For structured signals, add the PublisherProvidedStructuredSignals key with a value of an array of objects. Construct the object based on the following list of signal key-values:

Toggle view of structured signals table

Signal "type" Value Possible "single_value" Values Possible "values" Values
Audio Feed Type "audio_feed"
  • "af_1": Music
  • "af_2": Broadcast
  • "af_3": Podcast
n/a
Content Rating "content_rating"
  • "cr_1": G
  • "cr_2": PG
  • "cr_3": T
  • "cr_4": MA
n/a
Content Delivery "delivery" n/a
  • "cd_1": Streaming
  • "cd_2": Progressive
  • "cd_3": Download
Production Quality "prodq"
  • "pq_1": Professionally Produced
  • "pq_2": Prosumer
  • "pq_3": User Generated (UGC)
n/a

See the following example that uses the IAB_AUDIENCE_1_1 and IAB_CONTENT_2_2 for taxonomy signals and includes structured signals.

const userSignals = {
  "PublisherProvidedTaxonomySignals": [{
     "taxonomy": "IAB_AUDIENCE_1_1",
     "values": ["6", "284"]
     // '6' = 'Demographic | Age Range | 30-34'
     // '284' = 'Interest | Business and Finance |  Mergers and Acquisitions'
  },
  {
     "taxonomy": "IAB_CONTENT_2_2",
     "values": ["49", "138"]
     // '49' = 'Books and Literature | Poetry'
     // '138' = 'Education | College Education | College Planning'
  }],
  "PublisherProvidedStructuredSignals": [{
      "type": "audio_feed",
      "single_value": "af_1",
    },
    {
      "type": "delivery",
      "values": ["cd_1", "cd_3"],
    },
  ],
};

Configure your stream request

Follow these steps to send PPS with your StreamRequest:

  • Create a JSON string with the user's interest, behavior, or contextual data.
  • Create a Base64-encoded ASCII string from the JSON string above.
  • Add your encoded JSON using StreamRequest.setAdTagParameters.
JSONObject userSignalsObject = new JSONObject();
JSONArray userSignalsArray = new JSONArray();
JSONObject audienceTaxonomyObject = new JSONObject();
JSONArray valuesArray = new JSONArray();
valuesArray.put("1");
valuesArray.put("284");
try {
  audienceTaxonomyObject.put("taxonomy", "IAB_AUDIENCE_1_1");
  audienceTaxonomyObject.put("values", valuesArray);
} catch (JSONException e) {
  e.printStackTrace();
}

userSignalsArray.put(audienceTaxonomyObject);

try {
  userSignalsObject.put("PublisherProvidedTaxonomySignals", userSignalsArray);
} catch (JSONException e) {
  e.printStackTrace();
}

byte[] userSignalsByte=new byte[0];
try {
  userSignalsByte = userSignals.getBytes(StandardCharsets.UTF_8);
  String encodedBas64Signals = android.util.Base64.encodeToString(
    userSignalsByte,
    android.util.Base64.URL_SAFE);
  encodedSignals = URLEncoder.encode(encodedBas64Signals, "UTF-8");
} catch (java.io.UnsupportedEncodingException error) {
  Log.w("Sample app", error);
}

Map<String, String> adTagParamMap = new java.util.HashMap<String, String>();
adTagParamMap.put("ppsj", encodedSignals);

streamRequest.setAdTagParameters(adTagParamMap)