> ## Documentation Index
> Fetch the complete documentation index at: https://adcp-docs-ja.pier1.co.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# CTV 向け TMP

> TMP がクリエイティブバリアント選択で CTV ポッド構成のためにパッケージをどうアクティベートするか。

# CTV 向け TMP

コネクテッド TV アプリは広告ポッド — ストリーミングコンテンツ中のコマーシャルブレイクを埋める広告のシーケンス — を構成します。ポッド構成は、競合分離、フリークエンシー制限、duration 制約を尊重しながら複数のパッケージを同時にアクティベートすることを意味します。TMP はパッケージアクティベーションとアイデンティティ適格性を扱い、放送局のアドサーバーがポッド組み立てを扱います。

## 今日どう機能するか

放送局は、そのアドサーバー（FreeWheel、Google Ad Manager、SpringServe）を通じて CTV ディールを管理します。各ディールはターゲティングルール、競合分離制約、クリエイティブローテーションロジックで設定されます。ポッド構成はアドサーバーのポッド最適化エンジンによって扱われます。バイヤーエージェントが、どのパッケージをアクティベートするか、特定のポッドにどのクリエイティブバリアントを優先するかについてリアルタイム入力を提供する標準的な方法はありません。

## 4 つのメッセージ

CTV 広告ブレイクは 4 つの TMP メッセージを含みます: context match リクエストとレスポンス（何のコンテンツが再生中か、どのパッケージが一致するか）、次に identity match リクエストとレスポンス（この世帯は適格か）。パブリッシャーは結果をローカルで結合してポッドを構成します。

### Context Match Request

ポッドブレイクが近づくと、放送局は context match リクエストを送ります。`placement_id` は広告ブレイク位置（例: `pre_roll`、`mid_roll_1`、`pod_break_2`）を識別します。`artifact_refs` は番組とエピソードを参照し、バイヤーエージェントがコンテンツレベルのターゲティングに使います。パッケージリストは送られません — プロバイダーはこのプレースメントの同期されたパッケージセットを使います。

```json theme={null}
{
  "type": "context_match_request",
  "request_id": "ctx-9f3a-e7b2",
  "property_rid": "01916f3a-a1d3-7000-8000-000000000020",
  "property_id": "riverview-streaming",
  "property_type": "ctv_app",
  "placement_id": "mid_roll_1",
  "seller_agent_url": "https://riverview.example",
  "artifact_refs": [
    { "type": "gracenote", "value": "SH032541890000" },
    { "type": "eidr", "value": "10.5240/B1A2-C3D4-E5F6-7890-1234-X" }
  ]
}
```

要点:

* **アーティファクトは業界 ID で番組とエピソードを参照する。** バイヤーエージェントは、番組（「The Night Kitchen」は料理ドラマ、食品ブランドに好適合）をその Gracenote ID 経由で、特定のエピソードをその EIDR 経由で、または両方でマッチできる。
* **リクエストごとにパッケージリストは送られない。** プロバイダーはメディアバイセットアップからの同期されたパッケージセットを使って、このプレースメントのすべての適格なパッケージを評価する。同じパッケージがすべての世帯について評価される — 世帯によるフィルタリングは identity match で起こる。
* **クリエイティブサポートはプロダクトの `trusted_match` 設定で宣言される。** プロダクトの設定がクリエイティブレスポンスタイプを含むとき、バイヤーエージェントはクリエイティブマニフェストを返し、放送局が直接レンダリングできる。

### Context Match Response

各バイヤーエージェントはコンテンツコンテキストを評価し、アクティベートしたいパッケージのオファーで応答します。ルーターはすべてのレスポンスをマージします。ここでは 2 つのバイヤーがアクティベートしました:

```json theme={null}
{
  "type": "context_match_response",
  "request_id": "ctx-9f3a-e7b2",
  "offers": [
    {
      "package_id": "pkg-sparklean-30s",
      "brand": { "domain": "sparklean.example.com" },
      "summary": "Kitchen cleaning product — contextual fit with cooking drama",
      "creative_manifest": {
        "format_id": { "agent_url": "https://riverview.example.com", "id": "video_30s" },
        "assets": {
          "video": {
            "delivery_type": "url",
            "url": "https://creatives.sparklean.example/vast/kitchen-30s.xml"
          }
        }
      }
    },
    {
      "package_id": "pkg-greenleaf-15s",
      "summary": "Organic grocery — recipe content alignment",
      "creative_manifest": {
        "format_id": { "agent_url": "https://riverview.example.com", "id": "video_15s" },
        "assets": {
          "video": {
            "delivery_type": "url",
            "url": "https://creatives.greenleaf.example/vast/spring-15s.xml"
          }
        }
      }
    }
  ]
}
```

Vaultline（金融サービス）と Driftmoto（バイクブランド）は料理ドラマのコンテキストに一致せず、オファーから欠けています。

CTV クリエイティブについては、`creative_manifest` は通常クリエイティブをインラインで含むのではなく VAST URL を参照します。動画アセットは大きく、マニフェストは外部アセットを指し、放送局のアドサーバーがレンダリング時にそれをフェッチします。

### Identity Match Request

別途、放送局は世帯トークンと放送局の `seller_agent_url` を伴う identity match リクエストを送ります。バイヤーは `seller_agent_url` からアクティブなパッケージセットを解決します。放送局が（下記のように）`package_ids` を明示的に送るとき、構成は現在のポッドブレイクと独立でなければなりません（MUST） — all-active（この放送局でのそのバイヤーのすべてのアクティブパッケージ）または fuzzed（バイヤーが黙って落とす合成の存在しない ID でパディングされたランダムサンプル）のいずれか。ポッドブレイク固有のサブセットは禁止されています — それはバイヤーがパッケージセットを比較して identity リクエストを特定の context リクエストと相関させることを許します。

```json theme={null}
{
  "type": "identity_match_request",
  "request_id": "id-7k2m-p4w1",
  "seller_agent_url": "https://broadcaster.example",
  "identities": [
    { "user_token": "tok_household_q7w2", "uid_type": "publisher_first_party" },
    { "user_token": "ID5*mN4pQ...", "uid_type": "id5" }
  ],
  "consent": {
    "us_privacy": "1YNN"
  },
  "package_ids": [
    "pkg-sparklean-30s",
    "pkg-sparklean-display-web",
    "pkg-sparklean-native-mobile",
    "pkg-greenleaf-15s",
    "pkg-greenleaf-display-web",
    "pkg-vaultline-30s",
    "pkg-vaultline-audio",
    "pkg-driftmoto-15s",
    "pkg-driftmoto-30s"
  ]
}
```

リストは他のサーフェス（web ディスプレイ、モバイルネイティブ、音声）からのパッケージを含みます。例は all-active モードを使います — 放送局はバイヤーごとのすべてのアクティブパッケージのキャッシュされたリストを維持し、毎回完全なセットを送ります。fuzzed モード（合成 ID でパディングされたランダムサンプル）は、そのキャッシュを維持したくない放送局のための等価なプライバシー保証です。

### Identity Match Response

各バイヤーエージェントは、世帯トークンを自身のデータ（フリークエンシーキャップ、オーディエンスメンバーシップ、購入履歴）に対して評価し、適格なパッケージの ID と TTL を返します。バイヤーは理由を開示しません — パブリッシャーは世帯が資格を満たすかどうかだけを知る必要があります。

```json theme={null}
{
  "type": "identity_match_response",
  "request_id": "id-7k2m-p4w1",
  "eligible_package_ids": [
    "pkg-sparklean-30s",
    "pkg-sparklean-display-web",
    "pkg-greenleaf-15s",
    "pkg-greenleaf-display-web",
    "pkg-vaultline-30s",
    "pkg-vaultline-audio",
    "pkg-driftmoto-30s"
  ],
  "serve_window_sec": 90
}
```

レスポンスは CTV のものだけでなくすべてのパッケージをカバーします。`serve_window_sec: 90` は広告ブレイクの duration をカバーします — ルーターは再クエリせずにキャッシュされた適格性を使ってすべてのポッドスロットを埋めます。パブリッシャーは現在のポッドに関連するパッケージ ID のみを抽出します。

## ポッド構成

放送局は今や 2 セットの結果を持ち、ポッドをローカルで構成します:

1. **コンテキストアクティベーションでフィルター。** context match からのオファーを持つパッケージのみが候補: Sparklean（30s）と Greenleaf（15s）。Vaultline と Driftmoto はアクティベートしなかった。
2. **アイデンティティ適格性でフィルター。** コンテキストアクティベートされたパッケージのうち、世帯適格性を確認: Sparklean は適格、Greenleaf は適格。両方通過。
3. **適格なオファーをランク付け。** アドサーバー自身の優先度とペーシングルールを使って適格なオファーをランク付け。
4. **競合分離を適用。** 放送局のアドサーバーが競合分離ルールを強制 — 同じ広告主カテゴリーの 2 つのブランドは同じポッドに現れられない。Sparklean（クリーニング）と Greenleaf（食料品）は異なるカテゴリーなので衝突なし。
5. **ポッドを組み立てる。** 利用可能な duration を埋める。典型的なミッドロールポッドは 60 秒かもしれません:
   * Slot 1（30s）: Sparklean — context match、世帯適格
   * Slot 2（15s）: Greenleaf — context match、世帯適格
   * 残り 15s: 他の需要ソース（プログラマティック、ハウス広告）で埋める

競合分離はパブリッシャーの責任です。TMP はアクティベーションと適格性のシグナルを提供し、放送局のアドサーバーがどのブランドが一緒に現れられるかについてのビジネスルールを適用します。これはプロトコルをシンプルに保ち、カテゴリータクソノミーを TMP メッセージにエンコードすることを避けます。

## SSAI 統合

サーバーサイド広告挿入（SSAI）は支配的な CTV 配信モデルです。TMP ルーターは SSAI エンジンと並んでサーバーサイドで実行され、アクティベーションフロー全体をクライアントデバイスから外します。

* **フロー。** SSAI エンジンはコンテンツストリームからポッドブレイクシグナルを受け取り、コンテキストとアイデンティティのマッチについて TMP ルーターにクエリし、オファーを受け取り、配信前に VAST クリエイティブをストリームにステッチする。
* **クリエイティブ配信。** Context Match レスポンスの `creative_manifest` は、SSAI エンジンが直接フェッチしスプライスできる VAST URL を含む。クライアント側の広告ロードは不要。
* **レイテンシー予算。** SSAI エンジンの全体的な広告挿入予算は通常 200-500ms（クライアント側挿入より大きい）。ステッチがストリーム配信前に起こるため。TMP ルーターは依然としてその部分に 50ms 未満をターゲットにする。追加の予算は SSAI エンジンに VAST フェッチとストリームステッチの時間を与える。
* **コンパニオン広告。** VAST レスポンスがコンパニオンクリエイティブを含む場合、SSAI エンジンはそれらを CTV アプリのディスプレイ層に渡して動画コンテンツと並べてレンダリングできる。

## 番組とエピソードのアーティファクト Refs

CTV アーティファクトは通常、業界標準の識別子を使って番組と特定のエピソードの両方を参照します:

```json theme={null}
"artifact_refs": [
  { "type": "gracenote", "value": "SH032541890000" },
  { "type": "eidr", "value": "10.5240/B1A2-C3D4-E5F6-7890-1234-X" }
]
```

EIDR（Entertainment Identifier Registry）は番組、シーズン、エピソードのグローバルに一意な ID を提供します。Gracenote TMS ID も等しく有効です。鍵となる要件: 識別子は、バイヤーが独立してメタデータをルックアップできるよう公開に解決可能でなければなりません。

バイヤーエージェントはこれらを異なる粒度で使えます:

* **番組レベルのターゲティング。** 「The Night Kitchen の任意のエピソードでアクティベート」 — エージェントは Gracenote 番組 ID がそのターゲティングルールにあるかを確認する。
* **エピソードレベルのターゲティング。** 「シーズンプレミアでのみアクティベート」 — エージェントは特定の EIDR エピソード ID を確認する。
* **ジャンルまたはトピックのターゲティング。** エージェントはキャッシュされたアーティファクトデータからジャンルとトピックのメタデータを解決する。これは、特定の番組 ID をターゲティングルールにハードコードせずに広範なカテゴリーターゲティングに機能する。

## フロー例

```
Mid-roll break in "The Night Kitchen" S02E07

  Context Match
  --> Broadcaster sends request: show + episode artifacts, placement context
  --> Sparklean agent: activate pkg-sparklean-30s (VAST creative, cooking context fit)
  --> Greenleaf agent: activate pkg-greenleaf-15s (VAST creative, food content)
  --> Vaultline agent: no activation (financial services, no context fit)
  --> Driftmoto agent: no activation (motorcycle brand, no context fit)

  Identity Match (after temporal decorrelation — random delay + random order)
  --> Broadcaster sends request: all 9 active packages across all buyers
  --> Response: eligible_package_ids includes Sparklean, Greenleaf, Vaultline, Driftmoto-30s
  --> serve_window_sec: 90 (covers the ad break)

  Pod Assembly (broadcaster's ad server)
  --> Join: Sparklean and Greenleaf both activated and eligible
  --> Competitive separation: different categories, no conflict
  --> Pod: Sparklean 30s + Greenleaf 15s + 15s backfill
  --> Fetch VAST creatives from manifest URLs
  --> Serve pod during commercial break
```
