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

# モバイルアプリ向け TMP

> TMP がモバイルメディエーション SDK と統合し、プログラマティック需要と並んで事前交渉された AdCP パッケージをどうアクティベートするか。

# モバイルアプリ向け TMP

モバイルアプリは、各インプレッションをどのアドネットワークが提供するかを選択するためにメディエーション層を使います。メディエーターは需要ソース — アドネットワーク、入札パートナー、直接ディール — を評価し勝者を選びます。TMP はこのモデル内の追加需要ソースとして統合します。メディエーターのオークションまたはウォーターフォールで既存のネットワーク需要と並んで競う、事前交渉された AdCP パッケージをアクティベートします。

## 今日どう機能するか

モバイルパブリッシャーは、アドネットワーク、ウォーターフォール優先度またはインアプリ入札ルール、プレースメント定義でメディエーション SDK を設定します。広告機会が生じると、メディエーターは期待収益に基づいて最良のソースを選択します。AdCP パッケージはこの決定へのパスを持ちません — AdCP システムに存在しますが、メディエーション層はそれらを評価する方法を持ちません。

TMP はこのギャップを橋渡しします。パブリッシャーのアプリは、広告機会が生じると TMP ルーターを呼ぶ TMP SDK を含みます。アクティベートされたパッケージは、事前交渉された CPM を伴うカスタム需要ソースとしてメディエーション層に渡されます。メディエーターはその標準の選択ロジックを使ってそれらをネットワーク入札と並んで評価します。

## 統合モデル

TMP SDK はアプリとメディエーション層の間に位置します。メディエーターを置き換えません — パッケージをそれに供給します。

```
Ad opportunity
  -> TMP SDK sends Context Match (content signals, placement context)
  -> TMP SDK sends Identity Match (device token, all buyer packages)
  -> TMP SDK joins results locally
  -> Eligible, activated packages passed to mediator as demand sources
  -> Mediator runs its auction / waterfall as usual
  -> Winner serves
```

2 つの統合パターンがほとんどのモバイル広告フォーマットをカバーします:

* **アクティベーション**: バイヤーが ID でパッケージをアクティベートする。TMP SDK はパッケージをその事前交渉された CPM とともにメディエーターに渡す。メディエーターはその標準のレンダリングパスを通じてクリエイティブをフェッチする。これはメディエーションを通じて提供されるインタースティシャル、リワード動画、バナーの典型的なパターン。プロダクトの `trusted_match` 設定がアクティベーションをサポートされるレスポンスタイプとして宣言する。

* **クリエイティブ**: バイヤーが完全なクリエイティブマニフェストをインラインで返す。アプリはメディエーターを通さずに広告を直接レンダリングする。これはアプリがレンダリングを制御するネイティブインフィード広告の典型的なパターン。プロダクトの `trusted_match` 設定がクリエイティブをサポートされるレスポンスタイプとして宣言する。

## Context Match

広告機会が生じると、TMP SDK は Context Match リクエストをルーターに送ります。リクエストはプレースメントのコンテンツコンテキストを記述します。

### インタースティシャルの例

フィットネスアプリがワークアウト完了後にインタースティシャルをトリガーします:

#### Request

```json theme={null}
{
  "type": "context_match_request",
  "request_id": "ctx-mob-7f3a91",
  "property_rid": "01916f3a-b4e7-7000-8000-000000000030",
  "property_id": "pulsefit-ios",
  "property_type": "mobile_app",
  "placement_id": "interstitial_main",
  "seller_agent_url": "https://pulsefit.example",
  "artifact_refs": [
    { "type": "custom", "value": "screen:workout-complete" },
    { "type": "custom", "value": "screen:workout-summary" }
  ]
}
```

リクエストごとにパッケージリストは送られません。プロバイダーはメディアバイセットアップからの同期されたパッケージセットを使って、`interstitial_main` プレースメントのすべての適格なパッケージを評価します。同じパッケージがすべてのユーザーについて評価されます — ユーザーによるフィルタリングはアイデンティティをコンテキストパスに漏らします。

#### Response

```json theme={null}
{
  "type": "context_match_response",
  "request_id": "ctx-mob-7f3a91",
  "offers": [
    {
      "package_id": "pkg-sports-inter-01"
    },
    {
      "package_id": "pkg-nutrition-inter-02",
      "summary": "Post-workout recovery shake promo"
    }
  ]
}
```

2 つのパッケージがアクティベートしました。スポーツギアと栄養のパッケージがフィットネスコンテンツコンテキストに一致します。テレコムと自動車のパッケージは一致せずオファーリストから欠けています。プロダクトの `trusted_match` 設定がアクティベーションをレスポンスタイプとして宣言するとき、オファーは `package_id`（と任意の summary）のみを運びます。メディエーターがクリエイティブフェッチを扱います。

### ネイティブフィードの例

レシピアプリがそのレシピフィードにスポンサーコンテンツカードを表示します:

#### Request

```json theme={null}
{
  "type": "context_match_request",
  "request_id": "ctx-mob-b2c419",
  "property_rid": "01916f3a-c5f8-7000-8000-000000000031",
  "property_id": "tastecraft-android",
  "property_type": "mobile_app",
  "placement_id": "banner_feed",
  "seller_agent_url": "https://tastecraft.example",
  "artifact_refs": [
    { "type": "url", "value": "https://tastecraft.example.com/weeknight-pasta-recipes" }
  ]
}
```

#### Response

```json theme={null}
{
  "type": "context_match_response",
  "request_id": "ctx-mob-b2c419",
  "offers": [
    {
      "package_id": "pkg-grocery-native-01",
      "brand": { "domain": "freshmart.example.com" },
      "price": { "amount": 6.50, "currency": "USD", "model": "cpm" },
      "summary": "Pasta night ingredients — 20% off with in-app coupon",
      "creative_manifest": {
        "format_id": { "agent_url": "https://tastecraft.example.com", "id": "native_card" },
        "assets": {
          "headline": { "content": "Everything for pasta night" },
          "body": { "content": "Fresh basil, San Marzano tomatoes, and artisan pasta. 20% off your next order." },
          "image": { "url": "https://cdn.freshmart.example/campaigns/pasta-night-card.jpg", "width": 1200, "height": 628 },
          "cta": { "content": "Shop Now" }
        }
      },
      "macros": {
        "campaign_ref": "fm-pasta-2026q2",
        "promo_code": "PASTA20"
      }
    },
    {
      "package_id": "pkg-kitchenware-native-02",
      "brand": { "domain": "ironpan.example.com", "brand_id": "ironpan" },
      "summary": "Cast iron skillet — pairs with pasta recipes",
      "creative_manifest": {
        "format_id": { "agent_url": "https://tastecraft.example.com", "id": "native_card" },
        "assets": {
          "headline": { "content": "The only pan you need" },
          "body": { "content": "Pre-seasoned 12-inch cast iron. Free shipping this week." },
          "image": { "url": "https://cdn.ironpan.example/campaigns/skillet-card.jpg", "width": 1200, "height": 628 },
          "cta": { "content": "Learn More" }
        }
      }
    }
  ]
}
```

プロダクトの `trusted_match` 設定がクリエイティブをレスポンスタイプとして宣言するとき、バイヤーは完全なクリエイティブ詳細をインラインで返します。アプリは別途クリエイティブフェッチなしにネイティブカードをレンダリングするのに必要なすべてを持ちます。ミールキットパッケージ（`pkg-meal-native-03`）は一致せずレスポンスから欠けています。

## Identity Match

TMP SDK は、パブリッシャースコープのデバイストークンとパブリッシャーの `seller_agent_url` を伴う Identity Match リクエストを送ります。このリクエストは Context Match から構造的に分離されています — コンテンツシグナルを運ばず、時間的相関除去とともに送られます: 100-2000ms のランダムな遅延、加えてランダム化された順序（各機会は Context Match または Identity Match が先に送られるほぼ等しい確率を持つ）。

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

#### Request

```json theme={null}
{
  "type": "identity_match_request",
  "request_id": "id-mob-e4d782",
  "seller_agent_url": "https://mobile-publisher.example",
  "identities": [
    { "user_token": "tok_idfv_a9c3e7", "uid_type": "publisher_first_party" },
    { "user_token": "A1B2C3D4-E5F6-7890-1234-567890ABCDEF", "uid_type": "maid" }
  ],
  "consent": {
    "gpp": "DBACNYA~CPXxRfAPXxRfAAfKABENB-CgAAAAAAAAAAYgAAAAAAAA"
  },
  "package_ids": [
    "pkg-sports-inter-01",
    "pkg-nutrition-inter-02",
    "pkg-telecom-inter-03",
    "pkg-auto-inter-04",
    "pkg-sports-banner-05",
    "pkg-nutrition-banner-06",
    "pkg-sports-rewarded-07"
  ]
}
```

7 つのパッケージ ID — 例は all-active モードを使います（Context Match によってアクティベートされた 2 つだけでなく、すべてのプレースメントとフォーマットにわたるこのバイヤーのすべてのアクティブパッケージ）。バイヤーが黙って落とす合成の存在しない ID でパディングされた、同様のサイズの fuzzed リストは、同じプライバシー不変条件を満たします。

#### Response

```json theme={null}
{
  "type": "identity_match_response",
  "request_id": "id-mob-e4d782",
  "eligible_package_ids": [
    "pkg-sports-inter-01",
    "pkg-nutrition-inter-02",
    "pkg-auto-inter-04",
    "pkg-sports-banner-05",
    "pkg-sports-rewarded-07"
  ],
  "serve_window_sec": 60
}
```

適格なパッケージのみがリストされます。バイヤーはフリークエンシーキャップ、オーディエンスメンバーシップ、購入履歴、その他のアイデンティティベースのシグナルから適格性を計算します。理由はパブリッシャーにとって不透明です。パブリッシャーは `pkg-telecom-inter-03` がなぜ不適格かを学びません — リストに欠如していることだけです。

`serve_window_sec` はルーターにこのレスポンスをどのくらいキャッシュするかを伝えます。TTL ウィンドウ中、ルーターはバイヤーに再クエリせずにキャッシュされた適格性を使ってインタースティシャル、バナー、リワード広告を埋めます。

## 結合とアクティベーション

TMP SDK は Context Match と Identity Match の結果をローカルで結合します。両方のレスポンスに現れるパッケージ — コンテキストによってアクティベートされ、アイデンティティによって適格 — のみがメディエーターに進みます。

### インタースティシャルアクティベーション

上のインタースティシャルの例から:

| Package                  | Context Match | Identity Match | Result                 |
| ------------------------ | ------------- | -------------- | ---------------------- |
| `pkg-sports-inter-01`    | Activated     | Eligible       | メディエーターに渡す             |
| `pkg-nutrition-inter-02` | Activated     | Eligible       | メディエーターに渡す             |
| `pkg-telecom-inter-03`   | Not activated | Ineligible     | スキップ                   |
| `pkg-auto-inter-04`      | Not activated | Eligible       | スキップ（context match なし） |

2 つのパッケージが通過: `pkg-sports-inter-01` と `pkg-nutrition-inter-02`。TMP SDK はそれらを事前交渉された CPM とともにメディエーション層にカスタム需要ソースとして登録します。

```
Mediation auction:
  Network A bid:       $6.50 CPM
  Network B bid:       $5.20 CPM
  pkg-sports-inter-01: $8.00 CPM (pre-negotiated)
  pkg-nutrition-inter-02: $7.00 CPM (pre-negotiated)

Winner: pkg-sports-inter-01 at $8.00 CPM
  -> Mediator serves the sports gear interstitial
```

AdCP パッケージが勝たない場合、メディエーターは通常どおりネットワーク広告を提供します。TMP は AdCP パッケージが考慮されたことを保証します — メディエーターの選択ロジックを上書きしません。

### ネイティブフィードアクティベーション

プロダクトの `trusted_match` 設定がクリエイティブをレスポンスタイプとして宣言するネイティブ広告については、アプリは Context Match レスポンスで返されたクリエイティブマニフェストから直接レンダリングします。メディエーターは関与しません。アプリは context match オファーを identity match の `eligible_package_ids` と交差させ、独自のランキングロジックを使って最良の適格オファーを選び、`creative_manifest` アセットを使ってネイティブカードをレンダリングします。

## リワード動画

リワード動画はインタースティシャルと同じアクティベーションパターンに従います。プレースメントはリワードスロットを識別します:

```json theme={null}
{
  "type": "context_match_request",
  "request_id": "ctx-mob-c8f201",
  "property_rid": "01916f3a-d6a9-7000-8000-000000000032",
  "property_id": "puzzlequest-ios",
  "property_type": "mobile_app",
  "placement_id": "rewarded_video",
  "seller_agent_url": "https://puzzlequest.example",
  "artifact_refs": [
    { "type": "custom", "value": "screen:level-complete-42" }
  ]
}
```

メディエーターはリワード動画完了コールバックとリワード付与を扱います。TMP はパッケージをアクティベートし、メディエーターはリワードライフサイクルを管理します。

## プライバシー考慮事項

モバイル TMP はすべてのサーフェスと同じ構造的分離に従います:

* **Context Match** はコンテンツシグナルとプレースメントデータを運ぶ。リクエストにデバイス識別子なし、ユーザートークンなし、IDFA/IDFV なし。
* **Identity Match** はパブリッシャースコープのデバイストークンとバイヤーパッケージ ID の完全なリストのみを運ぶ。コンテンツシグナルなし、画面名なし、トピック ID なし。
* **時間的相関除去** が 2 つのリクエスト間のタイミングと順序ベースの相関を防ぐ。TMP SDK はランダムな遅延（100-2000ms）を導入し **かつ** どちらのリクエストが先に送られるかをランダム化する — 各機会は Context Match または Identity Match が先に行くほぼ等しい確率を持つ。
* **パッケージセット相関除去**: Context Match はパッケージリストを送らない — プロバイダーはプレースメント上のすべてのユーザーについて同じ同期されたパッケージセットを評価する。Identity Match はバイヤーのすべてのパッケージを送る。どちらのパスも、どのパッケージが現在の機会に関連するかを明かさない。

パブリッシャーは両方のレスポンスが到着した後、交差をローカルで実行します。バイヤーは結合された結果を決して見ません。
