> ## 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.

# Context Match と Identity Match

> TMP の中核にある 2 つの操作、それらがどう機能するか、パブリッシャーが決定時にどうそれらを結合するか。

# Context Match と Identity Match

TMP は 2 つの操作を定義します。それらは設計上独立です — 別々のインフラで処理され、異なるデータを運び、異なる問いに答えます。パブリッシャーはそれらの結果を結合して最終的なアクティベーション決定を下します。

このページは、具体例を使って両操作と結合を説明します。

## シナリオ

リテールパブリッシャーは、バイヤーエージェントからの 3 つのアクティブな AdCP メディアバイを持ちます。各メディアバイはパッケージを含みます:

* **Package A**: スポンサープロダクト — コーヒーブランド、カルーセルフォーマット、検索とカテゴリーページで利用可能
* **Package B**: ホームページテイクオーバー — プレミアムディスプレイ、ホームページのみで利用可能
* **Package C**: 季節プロモーション — アイス飲料、ネイティブフォーマット、夏の間サイト全体で利用可能

買い物客が「best cold brew」を検索します。パブリッシャーの検索結果ページがロードされます。

## Context Match

パブリッシャーは Context Match リクエストを TMP ルーターに送り、それが各バイヤーのエージェントにファンアウトします。リクエストはページコンテキストを含みます。ユーザーアイデンティティもパッケージリストも含みません — バイヤーエージェントはこのプレースメントに同期されたパッケージセットを使います。

### パブリッシャーが送るもの

```json theme={null}
{
  "type": "context_match_request",
  "request_id": "ctx-7f3a",
  "property_rid": "01916f3a-7b2c-7000-8000-000000000001",
  "property_id": "retailer-web",
  "property_type": "website",
  "placement_id": "search-results-grid",
  "seller_agent_url": "https://retailer.example",
  "artifact_refs": [
    { "type": "custom", "value": "search:beverages-coffee" }
  ],
  "context_signals": {
    "topics": ["632"],
    "keywords": ["cold brew", "iced coffee", "coffee beans"],
    "sentiment": "positive",
    "summary": "Shopper searching for cold brew coffee products"
  },
  "geo": { "country": "US", "region": "US-CA" }
}
```

バイヤーエージェントはページが何についてか — コーヒー、ポジティブな購入意図、カリフォルニア — を見て、そのコンテキストに対してパッケージを評価します。欠けているものに注意してください: ユーザー ID なし、デバイス情報なし、セッショントークンなし、IP アドレスなし。

### バイヤーが応答するもの

バイヤーエージェントは各パッケージをコンテキストに対して評価します。Package B はホームページのみなので、検索結果ページに一致しません。Package A と C は一致します。バイヤーはそれぞれのオファーを返します。

```json theme={null}
{
  "type": "context_match_response",
  "request_id": "ctx-7f3a",
  "offers": [
    {
      "package_id": "pkg-A",
      "brand": { "domain": "bluebottle.example.com", "brand_id": "blue_bottle" },
      "summary": "Cold brew coffee carousel — featuring top-rated blends",
      "creative_manifest": {
        "format_id": { "agent_url": "https://retailer.example.com", "id": "sponsored_carousel" },
        "assets": {
          "items": {
            "type": "catalog-asset",
            "items": [
              { "gtin": "gtin-001", "image_url": "https://cdn.example.com/gtin-001.jpg" },
              { "gtin": "gtin-002", "image_url": "https://cdn.example.com/gtin-002.jpg" }
            ]
          }
        }
      },
      "macros": {
        "sponsor_label": "Sponsored by Blue Bottle"
      }
    },
    {
      "package_id": "pkg-C",
      "summary": "Free shipping on iced beverages — summer promotion",
      "price": { "amount": 0, "currency": "USD", "model": "flat" },
      "creative_manifest": {
        "format_id": { "agent_url": "https://retailer.example.com", "id": "native_text" },
        "assets": {
          "headline": { "content": "Free shipping on iced beverages" },
          "body": { "content": "Summer promotion — order any iced beverage and get free delivery." },
          "cta": { "content": "https://shop.example.com/promo/summer-iced" }
        }
      }
    }
  ],
  "signals": {
    "segments": ["coffee_enthusiast", "high_purchase_intent"],
    "targeting_kvs": [
      { "key": "category_affinity", "value": "beverages" },
      { "key": "seasonal_relevance", "value": "high" }
    ]
  }
}
```

バイヤーは一致したパッケージごとにオファーを返します。各オファーは `package_id` と、任意で `brand`、`price`、`summary`、`creative_manifest`、`macros` を運びます。`summary` はパブリッシャーに関連性を判断するのに十分なものを与えます。クリエイティブマニフェストがインラインで存在するとき、パブリッシャーはレンダリングに必要なすべてを持ちます。大きなクリエイティブ（例: VAST 動画）については、マニフェストは埋め込む代わりに URL 経由で外部アセットを参照します。レスポンスは、パブリッシャーがアドサーバーに渡せるエンリッチメントシグナル — オーディエンスセグメントとターゲティングキー値 — も含みます。

### Context Match が決して運ばないもの

* ユーザー ID（ハッシュ化されたものでも他でも）
* デバイス識別子
* セッショントークン
* IP アドレス
* 特定のユーザーを識別しうる任意のデータ

これはポリシー制限ではありません。アイデンティティデータへのアクセスを持たないルーターのコンテキストコードパスによって強制されます — 共有メモリなし、共有状態なし、アイデンティティコードパスへの通信チャネルなし。[TEE アテステーション](/docs/trusted-match/privacy-architecture) はこの分離を独立に検証可能にできます。

## Identity Match

別途 — そしてランダムな遅延とランダムな順序で、2 つのリクエストがタイミングやどちらが最初に着くかでペア化されないよう — パブリッシャーは Identity Match リクエストを TMP ルーターに送り、それが各バイヤーのエージェントにファンアウトします。リクエストはパブリッシャーの `seller_agent_url` とアイデンティティトークンを含みます。バイヤーは `seller_agent_url` からアクティブなパッケージセットを解決するか、パブリッシャーが送るとき明示的な `package_ids` リストに対して評価します。リクエストはページコンテキストを含みません。

### パブリッシャーが送るもの

```json theme={null}
{
  "type": "identity_match_request",
  "request_id": "id-9b2c",
  "seller_agent_url": "https://publisher.example",
  "identities": [
    { "user_token": "tok_hk82mfp1", "uid_type": "uid2" },
    { "user_token": "ID5*aB3xY...", "uid_type": "id5" },
    { "user_token": "a1b2c3d4e5f6...", "uid_type": "hashed_email" }
  ],
  "consent": {
    "gdpr": true,
    "tcf_consent": "CPx2XYZABC..."
  },
  "package_ids": ["pkg-A", "pkg-B", "pkg-C"]
}
```

`identities` の各エントリは `{user_token, uid_type}` ペアです。パブリッシャーは利用可能なすべてのトークンを含めるべきです（SHOULD） — バイヤーは一致するグラフで解決し、より多くのトークンを送ることで追加のページコンテキストを漏らさずにマッチ率を最大化します。各 `user_token` は既存のアイデンティティプロバイダー（ID5、LiveRamp、UID2）から来るか、パブリッシャー生成です。`uid_type` はバイヤーにどのアイデンティティグラフに対して解決するかを伝え、試行錯誤のマッチングを避けます。`consent` オブジェクトはユーザーの同意シグナルを運びます — 規制された管轄区域のバイヤーはそれなしにトークンを処理してはなりません（MUST NOT）。トークンはバイヤーにとって不透明です — バイヤーはそれらを自身のアイデンティティグラフにマップでき（一致があれば）ますが、PII に逆変換したり任意のページコンテキストと相関させたりできません。

欠けているものに注意してください: URL なし、検索クエリなし、コンテンツシグナルなし、トピック ID なし。バイヤーエージェントはこのリクエストを純粋にユーザーアイデンティティとパッケージ適格性に基づいて評価します。

### バイヤーが応答するもの

```json theme={null}
{
  "type": "identity_match_response",
  "request_id": "id-9b2c",
  "eligible_package_ids": ["pkg-A", "pkg-B"],
  "serve_window_sec": 60,
  "tmpx": "k1.dG1weC1leGFtcGxlLWVuY3J5cHRlZC10b2tlbi4uLg"
}
```

バイヤーは、このユーザーがパッケージ A と B に適格であることをレポートします。Package C は欠けています — ユーザーは適格でありません。パブリッシャーはなぜかを知る必要はありません — フリークエンシーキャッピング、オーディエンス不一致、その他の失格理由はバイヤー内部です。

`serve_window_sec: 60` はルーターに伝えます: 「これを 60 秒キャッシュせよ。」ルーターはこのキャッシュされた適格性を使って、存在するあらゆるプレースメント — 単一スロット、CTV 広告ポッド、複数の広告ユニットを持つページ — を、バイヤーに再クエリせずに埋めます。パブリッシャーはプレースメントをまたいでどう割り当てるかを決めます。

### Identity Match が決して運ばないもの

* ページ URL
* コンテンツハッシュ
* 検索クエリ
* トピック ID
* コンテンツレーティング
* ユーザーが何を見ているかを識別しうる任意のデータ

これはコンテキストデータへのアクセスを持たないルーターのアイデンティティコードパスによって強制されます — 共有メモリなし、共有状態なし、コンテキストコードパスへの通信チャネルなし。TEE アテステーションはこの分離を独立に検証可能にできます。

## パブリッシャー側の結合

パブリッシャーは今や 2 つの独立したレスポンスを持ちます。彼らはそれらを自身のインフラで結合します — バイヤーエージェントもルーターも結合された結果を見ません。

```
Context Match からの各オファーについて:

  pkg-A:
    Context は言う: cold brew カルーセルのオファー（クリエイティブマニフェストインライン）
    Identity は言う: 適格（eligible_package_ids 内）
    → オファーを受け入れる。インラインクリエイティブマニフェストを使ってレンダリング。
    → "coffee_enthusiast" セグメントをアドサーバーターゲティングに適用。

  pkg-C:
    Context は言う: アイス飲料プロモーションのオファー
    Identity は言う: 適格でない（eligible_package_ids に欠如）
    → このユーザーにこのオファーをスキップ。

結果: Package A を受け入れる。
ターゲティング KV を設定: category_affinity=beverages, seasonal_relevance=high。
```

パブリッシャーは Package A をどうレンダリングするかを既に知っています — それはスポンサーカルーセルスロットにマップします。インラインクリエイティブマニフェストは必要なカタログアイテムとアセットを運びます。パブリッシャーは残りを扱いました。

## オファーモデル

TMP のレスポンスモデルはオファーです。オファーは `package_id`（必須）と任意フィールド: `brand`、`price`、`summary`、`creative_manifest`、`macros`（動的な値のキー値マップ）を運びます。

**シンプルなケース（GAM/Prebid）**: オファーは `package_id` を運びます。パブリッシャーは、ラインアイテムマッチングのため `targeting_kvs` シグナル経由で `package_id` を GAM に流します。`macros` マップは、GAM がレンダリング時にクリエイティブに挿入できる動的な値（例: スポンサーラベル、プロモーションテキスト）を運びます。

**リッチなケース（AI アシスタント、動的リテール）**: オファーは `summary`（「cold brew 50% オフ — レシピ統合」）を含むため、パブリッシャーは関連性を判断でき、レンダリングに必要なすべてを持つインライン `creative_manifest` を含みます。大きなクリエイティブ（例: VAST 動画）については、マニフェストは完全なペイロードを埋め込む代わりに URL 経由で外部アセットを参照します。

**動的ブランド**: プロダクトが `dynamic_brands` をサポートするとき、バイヤーは、事前設定されたパッケージブランドにロックされる代わりに、マッチ時にポートフォリオから選択して、オファーに `brand` を含められます。

**可変価格**: プロダクトが可変価格をサポートするとき、バイヤーはオファーに `price` を含められます。

クリエイティブマニフェストは、カタログアイテム、テキスト、画像、レンダリングに必要な他すべてを運びます。これは既存の CreativeManifest スキーマを再利用します。

ユーザーごとの露出トラッキングは TMPX マクロ — パブリッシャーがクリエイティブトラッキング URL に代入する Identity Match からの暗号化トークン — を通じて流れます。バイヤーのインプレッションピクセルがトークンを復号し、ユーザーごとの露出をリアルタイムでログします。`get_media_buy_delivery` 経由の集約配信レポートが、再照合とペーシングデータを提供します。

## エンリッチメントシグナル

Context Match レスポンスは、パッケージアクティベーションと並んでエンリッチメントシグナルを含められます:

* **セグメント**: パブリッシャーのアドサーバーにターゲティングシグナルとして流れるオーディエンスまたはコンテキストセグメント（例: 「coffee\_enthusiast」「high\_purchase\_intent」）。
* **ターゲティングキー値**: パブリッシャーがラインアイテムターゲティング、レポート内訳、リアルタイム決定に使える任意のキー値ペア（例: `category_affinity=beverages`）。

エンリッチメントシグナルは加算的です — 特定のパッケージに結びついていません。バイヤーエージェントは、パッケージをアクティベートしないときでもエンリッチメントシグナルを返し、需要ソースではなくデータプロバイダーとして価値を提供するかもしれません。

これが既存の RTD（Real-Time Data）モジュールが今日機能する方法です。TMP はエンリッチメントとパッケージアクティベーションを単一のプロトコルに統一するため、バイヤーエージェントは 1 つのレスポンスで両方をできます。

## パッケージリスト管理

Identity Match は、特定のバイヤーのアクティブなパッケージ ID すべてを送ります — Context Match で一致したものだけではありません。これは意図的です: バイヤーがどのパッケージがページコンテンツに一致したかを相関させるのを防ぎます。バイヤーがハイキング記事に一致したパッケージのみを受け取ったら、ユーザーがハイキングについて読んでいたと知ってしまいます。

パッケージリストは、`create_media_buy` 経由で新しいメディアバイが作成されたときに更新されます。ルーターは、パブリッシャーとのバイヤーのメディアバイ履歴から導出された、バイヤーごとのアクティブなパッケージリストを維持します。

Context Match では、任意の `package_ids` フィールドが、パブリッシャーが特定の理由を持つとき評価を絞れます — 例えば、動画パッケージのみが適用される CTV ポッド構成。これは Identity Match に影響しません: Identity Match が `package_ids` を送るとき、その構成は現在のプレースメントと独立でなければなりません（all-active または fuzzed）、プレースメント固有のサブセットではありません。

期限切れまたはキャンセルされたメディアバイからの古いパッケージは、1 時間以内にアクティブリストから削除されるべきです。ルーターがこのクリーンアップに責任を負います。
