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

# Media buy プロトコル

> AdCP media buy プロトコルのウォークスルー ― CTV、ディスプレイ、オーディオを横断するキャンペーンを、ひとつの統一ワークフローでブリーフから配信まで追う。

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-01-sams-desk.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=1328f6a79eab73dc449353a20cc04732" alt="メディアバイヤーが机に座り、それぞれ異なるデータ形式とインターフェースを表示する4つのプラットフォームダッシュボードに囲まれている" style={{ width: '100%', borderRadius: '12px', marginBottom: '2rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-01-sams-desk.png" />

Sam は Pinnacle Agency のメディアバイヤーです。クライアントが Acme Outdoor の Trail Pro 3000 向け Q2 キャンペーン ― スポーツとアウトドアライフスタイル系パブリッシャーへのプレミアム動画・ディスプレイ広告、予算 \$50,000 ― をようやくGoしました。評価すべきセラーが3社。合わせるべきクリエイティブあり。配信前にはガバナンスレビューも必要です。

前回これほどの規模のキャンペーンを回したときは2週間かかりました。4つのダッシュボード。4つのログイン。決して同じフォーマットでは届かないプロポーザルを比較するためのスプレッドシート。フライト日程を4つの別々のシステムに入力しました。

このウォークスルーでは、Sam が AdCP を使って同じキャンペーンを進める様子を追います ― プラットフォームごとに異なる4つのワークフローを、ひとつのプロトコルで置き換えます。

## ステップ 1: ブリーフを書く

Sam は自分が把握していることから始めます。キャンペーンの目標です。

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-02-brief-radiates.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=3736b945e433e3848806210e2f4dad27" alt="Sam のブリーフが画面上で光り、清潔なティール色の光線として3体のセラーエージェントロボットへと放射されています。各ロボットは自分のポディウムに立ち、届いたリクエストを検討している" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-02-brief-radiates.png" />

AdCP では、ブリーフは `get_products` の中の自然言語です。Sam は各パブリッシャーのターゲティング分類や在庫カテゴリを覚える必要はありません ― 欲しいものを説明すれば、各セールスエージェントが自社在庫に照らして解釈してくれます。

```javascript theme={null}
const products = await Promise.all(
  sellers.map(seller => seller.getProducts({
    buying_mode: "brief",
    brief: "Premium video inventory on sports and outdoor lifestyle publishers. Q2 flight, $50K budget. Adults 25-54, US and Canada.",
    brand: { domain: "acmeoutdoor.com" },
    account: { brand: { domain: "acmeoutdoor.com" }, operator: "pinnacle-agency.com" }
  }))
);
```

ブリーフひとつ。セラー3社。返ってくるのは同じ JSON 構造です。

<Accordion title="エージェンシー用語 → プロトコル用語">
  | Sam の言い方                 | プロトコルの呼び方                                                                                                |
  | ------------------------ | -------------------------------------------------------------------------------------------------------- |
  | キャンペーンブリーフ               | `get_products` の `brief` フィールド                                                                           |
  | メディアプラン                  | `get_products` から返されるプロダクト                                                                               |
  | IO / 挿入指示書               | `create_media_buy`                                                                                       |
  | クリエイティブのトラフィッキング         | ライブラリを持つセラーには `sync_creatives`、インライン専用のセラーにはインラインの `packages[].creatives`                                |
  | キャンペーンレポート               | エージェント横断での `get_media_buy_delivery`                                                                      |
  | フライト期間                   | メディアバイまたはパッケージの `start_time` / `end_time`                                                                |
  | ビューアビリティ / IVT / 完了の SLA | パッケージの `performance_standards` — [アカウンタビリティ](/docs/media-buy/advanced-topics/accountability)を参照          |
  | メイクグッド                   | `measurement_terms` の `makegood_policy` — [アカウンタビリティ](/docs/media-buy/advanced-topics/accountability)を参照 |
</Accordion>

## ステップ 2: プロポーザルを比較します

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-03-proposals.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=5c48567485de8d9a19263d06daabe304" alt="3体のセラーロボットがそれぞれの提案を披露している ― 動画スレート、ディスプレイバナー、ポッドキャストの波形。Sam はひとつの清潔な画面でそれらを並べてレビューし、満足そうな表情を浮かべている" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-03-proposals.png" />

プロダクトは標準フォーマットで返ってきます。Sam は初めて、価格・配信予測・ターゲティングオプション・クリエイティブ要件を ― すべて並べて ― 見ることができます。

| セラー        | プロダクト                 | CPM  | 予測           | フォーマット             |
| ---------- | --------------------- | ---- | ------------ | ------------------ |
| StreamHaus | CTV スポーツ プレロール        | \$28 | 89万インプレッション  | SSAI 30s 動画        |
| OutdoorNet | アドベンチャーライフスタイル ディスプレイ | \$12 | 210万インプレッション | 300x250, 728x90    |
| PodTrail   | アウトドア ポッドキャスト ミッドロール  | \$22 | 34万インプレッション  | オーディオ 30s + コンパニオン |

CSV なし。スプレッドシートなし。手入力なし。すべてのセラーが同じスキーマを返すため、プロダクトは比較可能です。

Sam は絞り込みたいと考えています。`refine` モードに切り替え、各エージェントに調整の指示を出します。

```javascript theme={null}
const refined = await seller.getProducts({
  buying_mode: "refine",
  refine: [
    {
      scope: "request",
      ask: "Only guaranteed packages. Must include completion rate SLA above 80%."
    }
  ],
  brand: { domain: "acmeoutdoor.com" },
  account: { brand: { domain: "acmeoutdoor.com" }, operator: "pinnacle-agency.com" }
});
```

`refine` 配列を使えば、最初からやり直すことなく制約を重ねられます。各リファインメントは前の結果セットをさらに絞り込みます。

## ステップ 3: クリエイティブを合わせる

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-04-creatives.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=4c26d9f16e065d1ce64b8f96d86a2046" alt="クリエイティブフォーマットのテンプレート ― 16:9 の動画フレーム、300x250 のバナー、コンパニオン付きのオーディオ波形 ― が小さなロボットに助けられながら実際の広告素材とパズルのピースのようにはまり合っている" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-04-creatives.png" />

各プロダクトにはクリエイティブ要件があります。Sam のプラットフォームは各セラーに `list_creative_formats` を呼び出し、必要なものを正確に把握します。

* **StreamHaus** は SSAI 対応の 30 秒動画（MP4、特定コーデック）が必要です
* **OutdoorNet** はディスプレイバナー（300x250 と 728x90）が必要です
* **PodTrail** は 30 秒オーディオと 300x250 コンパニオンバナーが必要です

Sam のクリエイティブチームはすでにライブラリに素材を持っています。プラットフォームは既存のマニフェストを各セラーのフォーマット要件に照合し、ギャップを検出します ― PodTrail にはまだ存在しないオーディオカットが必要です。

```javascript theme={null}
const result = await seller.syncCreatives({
  account: { brand: { domain: "acmeoutdoor.com" }, operator: "pinnacle-agency.com" },
  creatives: [
    {
      creative_id: "video_30s_trail_pro",
      name: "Trail Pro 3000 - 30s CTV Spot",
      format_id: { agent_url: "https://streamhaus.example", id: "ssai_30s" },
      assets: { video: { url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4", mime_type: "video/mp4" } }
    },
    {
      creative_id: "display_trail_pro_300x250",
      name: "Trail Pro 3000 - Display 300x250",
      format_id: { agent_url: "https://outdoornet.example", id: "display_300x250" },
      assets: { image: { url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png", mime_type: "image/png" } }
    }
  ]
});
if (result.errors) {
  console.error('Sync failed:', result.errors);
} else {
  console.log(`Synced ${result.creatives.length} creatives`);
}
```

## ステップ 4: キャンペーンを開始します

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-05-launch.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=8dd1aa42c625b62c73eacd5c08d8402b" alt="Sam が光るランチボタンを押すと、ホログラフィックのキャンペーン設計図が机の上に現れ、CTV・ディスプレイ・オーディオの3つのブランチが広がり、それぞれに予算額が流れている" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-05-launch.png" />

Sam はメディアバイを作成します。セラーごとに1回の呼び出し、どこでも同じ構造です。

```javascript theme={null}
const buy = await seller.createMediaBuy({
  account: { brand: { domain: "acmeoutdoor.com" }, operator: "pinnacle-agency.com" },
  brand: { domain: "acmeoutdoor.com" },
  start_time: "2026-04-01T00:00:00Z",
  end_time: "2026-06-30T23:59:59Z",
  packages: [{
    product_id: "streamhaus_sports_preroll_q2",
    budget: 25000,
    pricing_option_id: "cpm_standard",
    creative_assignments: [{ creative_id: "video_30s_trail_pro" }]
  }]
});
```

セラーはクリエイティブを検証し、バイを承認するかレビューに回します。Sam はどのダッシュボードにもログインしません ― ステータス更新はプロトコルが処理します。

## ステップ 5: ガバナンスチェック

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-06-governance.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=5f08f0b2aef4f189467ad2d9fbbf7295" alt="キャンペーン設計図がガバナンスロボットの配置するセキュリティチェックポイントを通過し、予算・ブランドセーフティ・ターゲティングコンプライアンスの3つのブランチそれぞれに緑のチェックマークが押されている" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-06-governance.png" />

資金が動く前に、Sam のガバナンスエージェントがバイを検証します。

* **予算**: \$25K は Sam の承認済み支出限度額の範囲内です
* **ブランドセーフティ**: StreamHaus は Acme Outdoor の承認済みパブリッシャーリストに掲載されています
* **コンプライアンス**: ターゲティングパラメーターは米国・カナダの規制要件を満たしています
* **クリエイティブ**: すべてのクリエイティブに必要な来歴メタデータが付与されています

バイが Sam の権限を超える場合 ― たとえばセラー全体の合計が \$75K に達した場合 ― ガバナンスエージェントはマネージャーにエスカレーションします。`create_media_buy` タスクは、人間が承認するまでタスクレイヤーで `submitted`（または `input-required`）にとどまります。承認されて初めてタスクが完了し、メディアバイが `media_buy_id` を得ます。

キャンペーンガバナンスは、いかなるガバナンスチェックの前にも、オーケストレーターが [`sync_plans`](/docs/governance/campaign/tasks/sync_plans) を通じてキャンペーンプランを登録することを要求します。プランは、認可されたパラメータ ― 予算限度、チャネル、フライト日、コンプライアンスポリシー ― を定義し、後続のすべてのアクションがそれに対して検証されます。ガバナンスの完全なシーケンスは `sync_plans` → `check_governance`（提案）→ `create_media_buy` → `check_governance`（セラーによるコミット）です。完全な仕様については[キャンペーンガバナンス](/docs/governance/campaign/index)を参照してください。

<Accordion title="プロトコルにおけるガバナンスの実装">
  ```javascript theme={null}
  // Step 1: Register the campaign plan with the governance agent
  const plan = await governance.syncPlans({
    plans: [{
      plan_id: "acme-q2-trail-pro",
      brand: { domain: "acmeoutdoor.com" },
      objectives: "Q2 Trail Pro 3000 launch across sports and outdoor lifestyle publishers",
      budget: { total: 50000, currency: "USD", reallocation_threshold: 5000 },
      flight: { start: "2026-04-01T00:00:00Z", end: "2026-06-30T23:59:59Z" },
      countries: ["US", "CA"]
    }]
  });

  // Step 2: Check governance before sending to seller (intent check)
  const check = await governance.checkGovernance({
    plan_id: "acme-q2-trail-pro",
    caller: "https://orchestrator.pinnacle-agency.example",
    tool: "create_media_buy",
    payload: buy
  });

  if (check.status === "denied") {
    // Don't proceed — governance rejected the plan
  }

  // Step 3: Send the buy to the seller with governance_context attached
  const governanceContext = check.governance_context;
  const mediaBuy = await seller.createMediaBuy({ ...buy, governance_context: governanceContext });

  // Step 4: The seller independently calls check_governance with media_buy_id +
  // planned_delivery before confirming — validating against the same plan
  ```
</Accordion>

## ステップ 6: 配信時にマッチングします

キャンペーンは承認され、稼働しています。ユーザーが StreamHaus のページを読み込む、OutdoorNet のアプリを開く、または AI アシスタントに質問すると、パブリッシャーの TMP ルーターが、Sam のどのパッケージを有効化すべきかを評価します。

二つの操作が別々に実行されます ― コンテキストマッチが「このコンテンツはパッケージのターゲティングに合うか？」を問い、アイデンティティマッチが「このユーザーは適格か？」を問います。パブリッシャーは両方のレスポンスをローカルで結合します。Sam のバイヤーエージェントは、ユーザーのアイデンティティとコンテンツのコンテキストを同時に見ることは決してありません ― この構造的な分離はプロトコルに組み込まれています。

同じフローがすべてのサーフェスで機能します。Sam は CTV、ウェブ、AI のそれぞれに対して、サーフェス固有の有効化コードを書きませんでした。TMP がそれらすべてを扱います。

<Accordion title="TMP がパッケージを有効化する仕組み">
  ユーザーがハイキングギアに関する StreamHaus の記事を訪れると:

  1. StreamHaus は、記事のコンテンツシグナルと Sam の利用可能なパッケージを添えてコンテキストマッチのリクエストを送ります
  2. Sam のバイヤーエージェントが応答します: 「pkg-outdoor-display を有効化 ― このハイキングコンテンツはターゲティングに一致する」
  3. StreamHaus は、ユーザートークンと Sam のすべてのアクティブなパッケージを添えて、別のアイデンティティマッチのリクエストを送ります
  4. Sam のバイヤーエージェントが応答します: 「このユーザーは pkg-outdoor-display に適格（intent\_score: 0.82）」
  5. StreamHaus は結果をローカルで結合し、ラインアイテムを有効化します

  完全な仕様については[トラステッドマッチプロトコル](/docs/trusted-match)を参照してください。
</Accordion>

## ステップ 7: 配信を監視します

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/walkthrough/media-buy-07-delivery.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=58edae73eeb30dfc7547855d15c444da" alt="Sam が机でリラックスして背もたれにもたれ、3社のセラーからの統合パフォーマンスチャートを表示する1つの清潔なダッシュボードを見ている ― 棒グラフが上昇し、折れ線グラフが収束し、すべてティール色で描かれている" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/walkthrough/media-buy-07-delivery.png" />

キャンペーンが動き始めました。Sam はひとつのビューで監視します ― プラットフォームは各セラーに `get_media_buy_delivery` を呼び出して結果をマージします。

```javascript theme={null}
const delivery = await seller.getMediaBuyDelivery({
  account: { brand: { domain: "acmeoutdoor.com" }, operator: "pinnacle-agency.com" },
  media_buy_ids: [buy.media_buy_id],
  include_package_daily_breakdown: true
});
```

すべてのセラーが同じフォーマットでレポートします: インプレッション、クリック、消化金額、完了率。Sam は4つではなく1つのダッシュボードを見ます。StreamHaus の CTV パッケージが未配信になったとき、彼は OutdoorNet に予算を再配分します ― 2つのプラットフォームにログインする代わりに、1回の `update_media_buy` 呼び出しで済みます。

## 全体像

<img src="https://mintcdn.com/pier1inc/vHTnro7E5QeRFhdT/images/concepts/media-buy-lifecycle.png?fit=max&auto=format&n=vHTnro7E5QeRFhdT&q=85&s=28b0950cc830f036b13fb276c83b9abf" alt="メディアバイの5つのステージを示す横並びのパイプライン: Discovery（虫眼鏡）、Planning（設計図）、Execution（ロケット打ち上げ）、Optimization（ダイヤル調整）、Reporting（清潔なダッシュボード）" style={{ width: '100%', borderRadius: '12px', marginBottom: '1rem' }} width="1376" height="768" data-path="images/concepts/media-buy-lifecycle.png" />

Sam は4つのダッシュボードから1つのプロトコルへと移行しました。CTV 在庫を購入したのと同じタスクが、ディスプレイとオーディオも購入しました ― プラットフォーム固有のコードなし、手動のデータ変換なし、スプレッドシートの突合せなしです。

| AdCP 導入前              | AdCP 導入後                         |
| --------------------- | -------------------------------- |
| 4つのダッシュボード、4つのログイン    | 1つのプロトコル、1つのビュー                  |
| 手動 CSV 比較             | 標準化されたプロダクトプロポーザル                |
| プラットフォーム固有のクリエイティブ仕様  | 任意のセラーへの `list_creative_formats` |
| 4つのキャンペーン設定ワークフロー     | どこでも `create_media_buy`          |
| 手動レポート突合せ             | `get_media_buy_delivery` で集約     |
| サーフェスごとの有効化のアドオペレーション | TMP が任意のサーフェスでパッケージを自動的にマッチング    |

## さらに深く学ぶ

* **プロダクト探索**: [`get_products` の仕組み](/docs/media-buy/product-discovery/media-products) ― ブリーフ、ホールセールモード、プロポーザル、リファインメント
* **キャンペーンライフサイクル**: [メディアバイの管理](/docs/media-buy/media-buys/index) ― ステータス遷移、更新、承認
* **最適化**: [配信とレポーティング](/docs/media-buy/media-buys/optimization-reporting) ― 指標、ディメンション別内訳、フィードバックループ
* **ガバナンス**: [キャンペーンガバナンス](/docs/governance/overview) ― 三者間信頼モデルが Sam の支出を保護する仕組み
* **クリエイティブ**: [クリエイティブウォークスルー](/docs/creative/index) ― Maya が Sam の使うクリエイティブをどのように作るか
* **リアルタイムマッチング**: [トラステッドマッチプロトコル](/docs/trusted-match) ― コンテキストマッチとアイデンティティマッチを通じて、配信時にパッケージがどのように有効化されるか
* **認定を取得する**: [バイヤートラック](/docs/learning/tracks/buyer)では、インタラクティブなモジュールを通じてメディアバイの完全なワークフローを学べます
