Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ads/concepts/breaks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,8 @@ A `static` asset is a media resource the player retrieves directly — a video o
}
```

See [Static assets](../player-integration/optiview-ads-sdk/ad-workflows/static-assets.mdx) for the supported creative formats and layouts in the OptiView Ads SDK.

#### VAST assets

A `vast` asset points to an ad server that responds with a VAST XML document describing how the ad should be played. The `uri` is the VAST tag URL, and the `mimeType` should be `application/xml` or `text/xml`:
Expand All @@ -415,6 +417,8 @@ A `vast` asset points to an ad server that responds with a VAST XML document des
}
```

A `vast` asset can also carry `assetParameters`, which the player appends to the VAST tag URL as query parameters. See [VAST](../player-integration/optiview-ads-sdk/ad-workflows/vast.mdx) for how the OptiView Ads SDK plays VAST tags, and the layouts they support.

#### Vendor assets

A `vendor` asset is delivered through an [ad vendor integration](../integrations/index.mdx), such as Google Ad Manager. The vendor decides the ad content; you identify the vendor and pass the vendor-specific parameters:
Expand Down
27 changes: 16 additions & 11 deletions ads/getting-started/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,11 @@ await sdk.startSession({

Follow the platform guide for [Web](/ads/player-integration/optiview-ads-sdk/web), [Android](/ads/player-integration/optiview-ads-sdk/android), [iOS](/ads/player-integration/optiview-ads-sdk/ios), or [React Native](/ads/player-integration/optiview-ads-sdk/react-native). If you use the OptiView Player, the legacy [OptiView Player integration](/ads/player-integration/optiview-player/) is also available.

This integration plays every [ad workflow](/ads/player-integration/optiview-ads-sdk/#ad-workflows): static assets from your CDN, VAST tags from your ad server, and Google Pod Serving. Static assets need nothing more; for VAST or Google Pod Serving on Web, the workflow page lists the Google IMA script to add to your page.

## 4. Schedule a break

A [break](/ads/concepts/breaks) describes an ad opportunity: when it starts, how long it lasts, and which ad experience plays. The simplest break plays a single full-screen ad from a VAST tag.
A [break](/ads/concepts/breaks) describes an ad opportunity: when it starts, how long it lasts, and which ad experience plays. The simplest break plays a single full-screen video ad from your CDN, as a [static asset](/ads/player-integration/optiview-ads-sdk/ad-workflows/static-assets).

Dashboard: open the channel → **Breaks → Schedule now**. Or via the API, scheduling a 30-second break a few minutes from now:

Expand All @@ -102,16 +104,18 @@ curl -X POST 'https://us.ads.optiview.dolby.com/api/v1/channels/<channel-id>/bre
"format": "single",
"assets": [
{
"type": "vast",
"type": "static",
"mediaType": "video",
"uri": "https://cdn.example.com/vast.xml"
"uri": "https://cdn.example.com/ads/spot.m3u8"
}
]
}
}'
```

Replace `<start-time>` with an ISO 8601 UTC timestamp a few minutes in the future, for example `2026-01-01T12:00:00.000Z`.
Replace `<start-time>` with an ISO 8601 UTC timestamp a few minutes in the future, for example `2026-01-01T12:00:00.000Z`, and the `uri` with the URL of an ad video on your CDN.

To let an ad server choose the ad instead, use a [VAST](/ads/player-integration/optiview-ads-sdk/ad-workflows/vast) asset or [Google Pod Serving](/ads/player-integration/optiview-ads-sdk/ad-workflows/google-pod-serving).

Once you schedule breaks regularly, [templates](/ads/concepts/templates) let you preconfigure the break payload so scheduling becomes a one-liner.

Expand All @@ -121,16 +125,17 @@ Start playback of your stream on your device. Shortly before the scheduled start

You can follow along on both sides:

- **In the dashboard or API:** the break's [lifecycle status](/ads/concepts/breaks#break-lifecycle) moves from `PREPARING` to `READY`, and to `SIGNALED` once it is announced to players.
- **In the dashboard or API:** the break's [lifecycle status](/ads/concepts/breaks#break-lifecycle) is `READY` (a Google pod break passes through `PREPARING` first), and moves to `SIGNALED` once it is announced to players.
- **In the player:** the ad plays at the scheduled time and your content resumes afterwards.

If the break does not play, verify that the Break Manifest URL from step 2 returns the break, and that your stream carries the time metadata required by the channel's timebase.

## Next steps

| Resource | Description |
| ------------------------------------------------------------- | ----------------------------------------------------------------- |
| [Player integration](/ads/player-integration/) | The full integration guides for the SDK and the OptiView Player. |
| [Breaks](/ads/concepts/breaks) | Everything a break can do: layouts, variants, controls, punching. |
| [Origins and Break Detection](/ads/concepts/marker-detection) | Turn the ad markers in your stream into breaks automatically. |
| [Google Ad Manager](/ads/integrations/google/) | Let Google Ad Manager decision the ads that fill your breaks. |
| Resource | Description |
| ---------------------------------------------------------------------- | ----------------------------------------------------------------- |
| [Player integration](/ads/player-integration/) | The full integration guides for the SDK and the OptiView Player. |
| [Ad workflows](/ads/player-integration/optiview-ads-sdk/#ad-workflows) | Static assets, VAST, and Google Pod Serving with the SDK. |
| [Breaks](/ads/concepts/breaks) | Everything a break can do: layouts, variants, controls, punching. |
| [Origins and Break Detection](/ads/concepts/marker-detection) | Turn the ad markers in your stream into breaks automatically. |
| [Google Ad Manager](/ads/integrations/google/) | Let Google Ad Manager decision the ads that fill your breaks. |
67 changes: 51 additions & 16 deletions ads/how-to-guides/ad-tag-parameters.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,30 @@ sidebar_position: 3

# Ad targeting parameters

When an ad server such as Google Ad Manager decisions a break, you can pass key-value parameters with the request to personalize the ads — for example the content genre, the placement type, or custom targeting values. In OptiView Ads, these parameters are called **`assetParameters`**. For Google, they map directly to the [ad tag parameters](https://support.google.com/admanager/answer/10678356) (`adTagParameters`) on the ad request.
When an ad server decides which ad fills a break, you can pass key-value parameters with the ad request to personalize the ads — for example the content genre, the placement type, or custom targeting values. In OptiView Ads, these parameters are called **`assetParameters`**. How they reach the ad server depends on the [ad workflow](../player-integration/optiview-ads-sdk/index.mdx#ad-workflows):

You can set `assetParameters` in two places: on the break in the **backend**, and in the **OptiView Ads SDK** on the client. Client-side values overwrite the backend values when the same key is set in both.
- **[VAST](../player-integration/optiview-ads-sdk/ad-workflows/vast.mdx):** the SDK appends them to the VAST tag URL as URL-encoded query parameters.
- **[Google Pod Serving](../player-integration/optiview-ads-sdk/ad-workflows/google-pod-serving.mdx):** they are sent to Google as [ad tag parameters](https://support.google.com/admanager/answer/10678356) (`adTagParameters`).
- **[Static assets](../player-integration/optiview-ads-sdk/ad-workflows/static-assets.mdx)** involve no ad request, so they do not use `assetParameters`.

You can set `assetParameters` in two places: on the break in the **backend**, and in the **OptiView Ads SDK** on the client.

## Asset parameters in the backend

When you [schedule a break](../concepts/breaks.mdx#scheduling) with a vendor asset, you can add an `assetParameters` map to the asset:
When you [schedule a break](../concepts/breaks.mdx#scheduling) with a VAST or vendor asset, you can add an `assetParameters` map to the asset. For a VAST asset:

```json
{
"type": "vast",
"mediaType": "video",
"uri": "https://adserver.example.com/vast?slot=midroll",
"assetParameters": {
"content_genre": "sports"
}
}
```

For a Google Pod Serving vendor asset:

```json
{
Expand All @@ -26,22 +43,24 @@ When you [schedule a break](../concepts/breaks.mdx#scheduling) with a vendor ass
}
```

OptiView Ads forwards these parameters to the ad server when the break is announced, and also delivers them to the player through the [Break Manifest](../concepts/break-manifest.mdx) so they are included on the ad request. See [Google Pod Serving](../integrations/google/pod-serving.mdx#required-google-parameters) for the parameters Google requires.
OptiView Ads delivers these parameters to the player through the [Break Manifest](../concepts/break-manifest.mdx), so they are included on the ad request. For Google, they are also forwarded to Google when the break is announced; see [Google Pod Serving](../integrations/google/pod-serving.mdx#required-google-parameters) for the parameters Google requires.

## Overwriting from the OptiView Ads SDK
## Asset parameters in the OptiView Ads SDK

The OptiView Ads SDK can supply its own `assetParameters` and overwrite the backend values. There are two client-side layers:
The OptiView Ads SDK can add its own `assetParameters`. There are two client-side layers:

- **Session parameters** — passed to `startSession()`, they apply to every break in the session.
- **Live updates** — passed to `updateAssetParameters()` during an active session, for values that change while the viewer is watching.

The three layers are merged **per key**, from lowest to highest precedence:
## How the layers are merged

1. The break's `assetParameters` from the backend.
2. The session's `assetParameters` from `startSession()`.
3. The latest `updateAssetParameters()` call.
The layers are merged **per key**, from lowest to highest precedence:

Overwriting one key never discards the others, and live updates apply to **future** breaks only: a break whose ad request has already been sent cannot be retargeted.
1. The session's `assetParameters` from `startSession()`.
2. The latest `updateAssetParameters()` call.
3. The break's `assetParameters` from the backend.

A value set on the break wins over the same key set in the SDK, so set each key in one place only. Overwriting one key never discards the others, and live updates apply to **future** breaks only: a break whose ad request has already been sent cannot be retargeted.

## Backend or client?

Expand All @@ -50,6 +69,20 @@ As a rule of thumb:
- **Set through the backend** the values that describe the break or the content and are the same for every viewer — such as `description_url`, the placement declaration, and campaign or content targeting that is known when the break is scheduled.
- **Set through the SDK** the values that depend on the viewer, the device, or the moment of playback — such as device identifiers, consent state, autoplay/mute state (`vpa`, `vpmute`), or audience context that changes during the session.

## Macros

A parameter value can contain macros: `$NAME$` tokens that the SDK replaces when it builds the ad request. Macros let a value on the break carry information that is only known on the device. The SDK provides these built-in macros:

| Macro | Value |
| ----------------------------------- | ---------------------------------------------------------------------------- |
| `$OPTIVIEW_PLAYER_WIDTH$` | Width of the ad container, in logical pixels. |
| `$OPTIVIEW_PLAYER_HEIGHT$` | Height of the ad container, in logical pixels. |
| `$OPTIVIEW_BREAK_DURATION_SECONDS$` | Duration of the ad, in seconds: the asset's `duration`, else the break's. |
| `$OPTIVIEW_BREAK_DURATION_MS$` | The same duration, in whole milliseconds. |
| `$OPTIVIEW_USER_AGENT$` | The user agent of the device. Not available on iOS; register your own value. |

For example, `"size": "$OPTIVIEW_PLAYER_WIDTH$x$OPTIVIEW_PLAYER_HEIGHT$"` is sent as `size=1920x1080`. You can register your own macros, or override a built-in one, with `assetParameterMacros` in the session configuration. Tokens the SDK does not know, such as `$PUBLISHER_ID$`, are sent unchanged, so your ad server can still expand its own macros. See `SessionConfig` in the API reference of your platform for the details.

## Platform examples

The examples below start a session with session-level `assetParameters` and update them mid-session. See the [OptiView Ads SDK](../player-integration/optiview-ads-sdk/index.mdx) documentation for the full integration.
Expand Down Expand Up @@ -118,8 +151,10 @@ ads.updateAssetParameters({ cust_params: 'sport=basketball' });

## Related resources

| Resource | Description |
| -------------------------------------------------------------------- | ----------------------------------------------- |
| [Google Pod Serving](../integrations/google/pod-serving.mdx) | Required Google parameters and pod decisioning. |
| [Breaks](../concepts/breaks.mdx) | Scheduling breaks with vendor assets. |
| [OptiView Ads SDK](../player-integration/optiview-ads-sdk/index.mdx) | Integrating the SDK with your player. |
| Resource | Description |
| ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
| [VAST](../player-integration/optiview-ads-sdk/ad-workflows/vast.mdx) | Playing VAST tags with the SDK. |
| [Google Pod Serving with the SDK](../player-integration/optiview-ads-sdk/ad-workflows/google-pod-serving.mdx) | Playing Google pods with the SDK. |
| [Google Pod Serving](../integrations/google/pod-serving.mdx) | Required Google parameters and pod decisioning. |
| [Breaks](../concepts/breaks.mdx) | Scheduling breaks with VAST and vendor assets. |
| [OptiView Ads SDK](../player-integration/optiview-ads-sdk/index.mdx) | Integrating the SDK with your player. |
20 changes: 10 additions & 10 deletions ads/integrations/google/pod-serving.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Google performs the decisioning, so no asset URI is needed: once Google has deci

The optional `assetParameters` map contains the [Google ad tag parameters](https://support.google.com/admanager/answer/10678356) (`adTagParameters`) for the break. OptiView Ads forwards them to Google when the break is announced, and delivers them to the player through the Break Manifest so they are included on the pod request.

Players can extend these parameters: the OptiView player SDKs accept `adTagParameters` on the ad description (`TheoAdDescription`). When the same parameter is set both on the break and on the player, the player-side value wins. See [Ad tag parameters](../../how-to-guides/ad-tag-parameters.mdx) for the player-side API on each platform.
Players can extend these parameters. The OptiView Ads SDK accepts `assetParameters` in its session configuration; when the same parameter is set both on the break and in the SDK, the break's value wins. See [Ad targeting parameters](../../how-to-guides/ad-tag-parameters.mdx) for the SDK API on each platform. The legacy OptiView Player SDKs accept `adTagParameters` on the ad description (`TheoAdDescription`); there, the player-side value wins.

As a rule of thumb:

Expand Down Expand Up @@ -147,12 +147,12 @@ Additionally, creating a pod break that starts too close to the live point is re

## Related resources

| Resource | Relationship |
| -------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [Google Ad Manager](./index.mdx) | The prerequisites shared by both Google delivery modes. |
| [Google DAI](./dai.mdx) | Server-side (SSAI) delivery for platforms without server-guided support. |
| [Channels](../../concepts/channels.mdx) | Hold the custom asset key used for Google Pod Serving. |
| [Breaks](../../concepts/breaks.mdx) | Carry the vendor asset that Google uses to make ad decisions. |
| [Break Manifest](../../concepts/break-manifest.mdx) | The manifest that announces the channel's breaks to players. |
| [Ad tag parameters](../../how-to-guides/ad-tag-parameters.mdx) | Passing ad tag parameters from the player. |
| [Player integration](../../player-integration/index.mdx) | Set up a player with pod serving. |
| Resource | Relationship |
| ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [Google Ad Manager](./index.mdx) | The prerequisites shared by both Google delivery modes. |
| [Google DAI](./dai.mdx) | Server-side (SSAI) delivery for platforms without server-guided support. |
| [Channels](../../concepts/channels.mdx) | Hold the custom asset key used for Google Pod Serving. |
| [Breaks](../../concepts/breaks.mdx) | Carry the vendor asset that Google uses to make ad decisions. |
| [Break Manifest](../../concepts/break-manifest.mdx) | The manifest that announces the channel's breaks to players. |
| [Ad tag parameters](../../how-to-guides/ad-tag-parameters.mdx) | Passing ad tag parameters from the player. |
| [Google Pod Serving with the SDK](../../player-integration/optiview-ads-sdk/ad-workflows/google-pod-serving.mdx) | Set up the OptiView Ads SDK in your app for pod serving. |
2 changes: 2 additions & 0 deletions ads/integrations/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ sidebar_label: Integrations

An integration connects OptiView Ads to an ad decisioning or "pod" serving vendor. Vendors are supported by providing [assets of type Vendor](../concepts/breaks.mdx#vendor-assets) in a break variant: the vendor makes the ad decisions, and OptiView Ads delivers the result to players. [Google Ad Manager 360](./google/index.mdx) is the first supported integration.

You do not need an integration to play [static assets](../player-integration/optiview-ads-sdk/ad-workflows/static-assets.mdx) from your CDN or [VAST](../player-integration/optiview-ads-sdk/ad-workflows/vast.mdx) tags from your own ad server: those breaks work on any channel.

## Supported vendors

| Vendor | Enum value | Delivery |
Expand Down
Loading
Loading