Select platform: [HTML5](https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/html5/pps "View this page for the HTML5 platform docs.") [Android](https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/android/pps "View this page for the Android platform docs.") [iOS](https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/ios/pps "View this page for the iOS platform docs.") [tvOS](https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/tvos/pps "View this page for the tvOS platform docs.") [Cast](https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/cast/pps "View this page for the Cast platform docs.") [Roku](https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/roku/pps "View this page for the Roku platform docs.")

<br />

You can send audience and contextual data as
[publisher provided signals](https://support.google.com/admanager/answer/12451124)
(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](https://support.google.com/admanager/answer/2805834), 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](https://iabtechlab.com/standards/audience-taxonomy/)), and
contextual data (
[IAB Content Taxonomy 2.2](https://iabtechlab.com/standards/content-taxonomy/)).
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`](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/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`](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/StreamRequest#public-abstract-void-setadtagparameters-mapstring,-string-adtagparameters).

    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)