AdCP 3.0 提案 - この仕様は AdCP 3.0 向けに開発中です。フィードバックは GitHub Discussions から歓迎します。
概要
メディアバイプロトコルは、AI による広告自動化のための標準インターフェースを定義します。このプロトコルにより、AIエージェントは広告インベントリの発見、キャンペーンの作成・管理、クリエイティブアセットの同期、自然言語インタラクションを通じたパフォーマンストラッキングを行えるようになります。プロトコルの概要
メディアバイプロトコルが提供する機能:- キャンペーンブリーフに基づく自然言語によるインベントリ発見
- パッケージレベルの予算とターゲティングを伴うキャンペーン作成
- クリエイティブアセットの管理と同期
- パフォーマンストラッキングと最適化フィードバック
- 人間参加型の承認ワークフロー
トランスポート要件
セールスエージェントは以下のトランスポートのうち少なくとも1つをサポートしなければなりません。
セールスエージェントは優先トランスポートとして MCP をサポートすべきです。
セールスエージェントは
get_adcp_capabilities を通じてメディアバイプロトコルのサポートを宣言しなければなりません。
コアコンセプト
リクエストロール
すべてのメディアバイリクエストには3つのエンティティが関与します。- オーケストレーター: APIリクエストを行うプラットフォーム(例: DSP、トレーディングデスク)
- アカウント: 請求関係 — 誰に請求が行き、どのレートが適用されるか(
account_idで識別) - エージェント: バイを実行するエンティティ(認証トークンで識別)
セールスエージェントの種類
パブリッシャーセールスエージェント — 単一パブリッシャーのインベントリを代表する:- セールスエージェントは販売を許可されたインベントリの商品のみを返さなければなりません
- セールスエージェントは該当する場合
adagents.jsonを通じて認可を検証しなければなりません
- セールスエージェントは各商品のソースパブリッシャーを明確に特定しなければなりません
- セールスエージェントはインベントリの出所を偽って伝えてはなりません
識別子
-
media_buy_id: メディアバイの一意識別子。セールスエージェントは作成成功時にこれを返さなければなりません。オーケストレーターはメディアバイに対するすべての後続操作にこれを使用しなければなりません。media_buy_idは、認証済みアカウントが所有するセラーのアドサーバー上の任意のオーダーへの安定したハンドルです——元々 AdCP 経由で発注されたオーダーに限りません。 -
package_id: メディアバイ内のパッケージの一意識別子。セールスエージェントは作成された各パッケージに対してこれを返さなければなりません。 -
idempotency_key: 安全なリトライのためのクライアント生成の一意キー。同じアカウントに対して重複キーを受け取ったセールスエージェントは、再実行するのではなく元のレスポンスを返さなければなりません。
アカウントの所有権と作成サーフェス
AdCP はセラーの広告オペレーションに対するプロトコルであり、その傍らに置かれる影の台帳ではありません。アカウントスコープのタスク(get_media_buys、get_media_buy_delivery、update_media_buy、該当する場合はクリエイティブの同期)は、リソースがどのサーフェスを通じて作成されたかではなく、アカウントの所有権によってスコープされます。セールスエージェントは、これらのタスクのために自身のインベントリを「AdCP 管理」と「AdCP 外」のサブセットに分割してはなりません(MUST NOT)。
具体的には:
get_media_buysは、認証済みアカウントが所有するすべてのメディアバイを返さなければなりません(MUST)——create_media_buy経由で作成されたか、セラーのネイティブ API や UI 経由か、手動トラフィッキング経由か、レガシー/サードパーティのシステム経由かを問いません。適用されるのは宣言されたstatus_filterとページネーションのみです。get_media_buysが返すmedia_buy_idはすべて、get_media_buy_deliveryの有効な引数であり、かつそのvalid_actionsに列挙されたすべてのアクションについてupdate_media_buyの有効な引数でなければなりません(MUST)。- セールスエージェントは、元々 AdCP を通じて発注されたものではないことを理由に、バイを読み取り専用としたり、隠したり、
MEDIA_BUY_NOT_FOUNDを返したりしてはなりません(MUST NOT)。 - 特定のアクションがビジネス上の理由(契約上の義務、プラットフォームの制約、ポリシー)で利用できない場合、セールスエージェントはそれを、アカウントスコープの一覧からバイを拒むのではなく、そのアクションを
valid_actionsから省略することで表現します。 - 作成サーフェスは決してビジネス上の理由になりません。 セールスエージェントは、バイが AdCP の外で作成されたという理由だけで、
valid_actionsからアクションを省略したり、それ以外は有効な更新に対してINVALID_STATEを返したりしてはなりません(MUST NOT)。valid_actionsの省略が正当なのは、同じ状態にある AdCP 作成のバイにも等しく適用されるであろう、実際の契約上、プラットフォーム上、またはポリシー上の制約に根拠がある場合のみです。AdCP 外のバイを体系的に空のvalid_actionsで返すセラーは非準拠です。その振る舞いはバイを隠しているのと区別がつかず、上記のルールの規範的な意図を無効にするからです。
分離はアカウント境界で行う
セラーが、あるバイの集合を呼び出し元の運用上の到達範囲の外に置く正当な理由を持つ場合——子セラーのモデル、NDA スコープの PMP ディール、サンドボックスと本番の分離、テナントレベルのプライバシー分割——正しいメカニズムはアカウント内でのフィルタリングではなく、アカウントの分割です:- 隠すサブセットを、呼び出し元が参照する権限を持たない別のアカウント(またはサブアカウント)として公開します。
- 呼び出し元が権限を持つ任意のアカウント内では、上記のルールに従って、そのアカウントが所有するバイの完全な集合を返します。
get_agent_capabilities は、あるアカウントに対して付与されたスコープを調べるためのサーフェスです。呼び出し元は自分が見られるものを見られます。見られないものは、彼らが持たないアカウント参照の背後にあります。アカウント内でのフィルタリング——あるアカウントに権限を持つ呼び出し元に対して、そのアカウントのバイの一部しか返さないこと——は、このルールが禁じる影の台帳の問題を再導入します。
非同期オペレーション
メディアバイプロトコルは設計上非同期です。オペレーションは即座に返ってくる場合も、延長された処理が必要な場合もある:- 同期レスポンス: セールスエージェントは完了した結果を即座に返してもよい
- 非同期レスポンス: セールスエージェントはタスクリファレンスとともに
status: "submitted"またはstatus: "working"を返してもよい - 人間参加型: セールスエージェントは、レビュアーが動くまでタスクを
status: "submitted"に保つことで、内部の人によるレビュー(例: IO への署名)を要求してもよい(MAY)。セールスエージェントは、バイヤーが応答しなければならない場合(例: 予算の確認)にstatus: "input-required"を使ってもよい(MAY)。人による承認はタスクレイヤーでモデル化されます——pending_approvalというメディアバイのステータスは存在しません(その値はアカウントのオンボーディングレビュー向けに Account.status にのみ存在します) - 拒否: セールスエージェントは、プラットフォームのセットアップによってオーダーを履行できないことが判明した場合(例: インベントリの売り切れ、アドサーバーのセットアップ中に発見されたポリシー上の問題)、
pending_creativesまたはpending_startステータスのメディアバイを拒否してもよい(MAY)。オーケストレーターはrejectedを終端状態として扱わなければなりません。セラーが作成時にオーダーを受け入れたくない場合は、rejectedステータスのメディアバイを作成するのではなく、create_media_buyをエラーで失敗させるべきです(SHOULD)。
メディアバイの状態遷移
メディアバイは定義された状態の集合を進みます。終端状態(completed、rejected、canceled)からのそれ以上の遷移はありません。
- セールスエージェントは
create_media_buyからactive、paused、pending_creatives、pending_startを返してもよい(MAY)(プラットフォームのセットアップ時間とバイヤーの作成時のpausedリクエストに基づくセラーの選択) - セールスエージェントは、フライト日が到来したときにメディアバイを
pending_startからactiveへ遷移させなければなりません(MUST)。セールスエージェントは、この遷移が起きたときにウェブフックでオーケストレーターに通知すべきです(SHOULD)。 - コミットされた
create_media_buyの成功レスポンスはオーダーの確定を構成します。セールスエージェントは create/get のレスポンスにconfirmed_atを含めなければなりません(MUST)。その値はセラーのコミットのタイムスタンプ、または、存在するもののまだセラーのコミットを待っている暫定的なバイの場合はnullです。 - セールスエージェントは create、get、update のレスポンスに
revisionを含めなければなりません(MUST)。リビジョン番号は、状態を変更するあらゆる変更または更新のたびに増加しなければなりません(MUST)。 active↔pausedの遷移は、paused: trueまたはpaused: falseを指定したupdate_media_buyを使います- トップレベルの
paused: trueを指定したcreate_media_buyは、そうでなければactiveになるはずのメディアバイを保留状態で作成します。セットアップのブロッカーは依然として優先されます: クリエイティブがなければpending_creativesに、将来のフライトなら開始条件が満たされるまでpending_startになります。それらのブロッカーが見えている間、保留は潜在的な状態です。クリエイティブが揃いフライトが開始できるようになると、そのバイはactiveではなくpausedに入ります。 paused: falseを指定したupdate_media_buyは、現在pausedのバイを再開するか、可視状態がまだpending_creativesまたはpending_startである間に、作成時の潜在的な保留を解除します。潜在的な保留の解除はセットアップのブロッカーを迂回しません。可視ステータスは、クリエイティブが提供されフライトが開始できるようになるまで pending のままです。- フライトが終了、ゴールが達成、または予算が消化されたとき、
activeまたはpaused→completed(セラー起点) - バイヤー起点のキャンセルは、
canceled: trueと任意のcancellation_reasonを指定したupdate_media_buyを使います - セラー起点のキャンセル(例: ポリシー違反、インベントリの引き上げ)は、メディアバイを
cancellation.canceled_by: "seller"とともにcanceledへ遷移させます。セラー起点のキャンセルを行う場合、セラーはウェブフックでオーケストレーターに通知しなければなりません(MUST)。 - セラー起点の拒否(
pending_creativesまたはpending_startから)も、push_notification_configを通じてオーケストレーターに通知しなければなりません(MUST)。ウェブフックのペイロードにはmedia_buy_id、status: "rejected"、rejection_reasonを含めなければなりません(MUST)。 - セールスエージェントは、メディアバイまたはパッケージを
canceledへ遷移させるとき、canceled_atとcanceled_byを持つcancellationオブジェクトを含めなければなりません(MUST) - セールスエージェントは、終端状態でないメディアバイのバイヤーによるキャンセルを、エラーコード
NOT_CANCELLABLEで拒否してもよい(MAY)(例: セラーが契約上フライト途中のキャンセルを拒む場合) - バイヤーが既に
canceledのメディアバイをキャンセルしようとした場合(canceledのバイに対するcanceled: true)、セールスエージェントはNOT_CANCELLABLEで拒否しなければなりません(MUST) - 終端状態(
completed、rejected、canceled)のメディアバイに対するその他すべての更新——completedまたはrejectedのバイに対するcanceled: trueの試みを含む——はINVALID_STATEで拒否しなければなりません(MUST) - 拒否(
rejectedステータス)はpending_creativesまたはpending_startからのみ有効です。セールスエージェントは、既にactiveへ遷移したメディアバイを拒否してはなりません(MUST NOT)。 - セラー起点のキャンセル通知は、
create_media_buyまたはupdate_media_buyの際にオーケストレーターが提供したpush_notification_configのウェブフックを使わなければなりません(MUST)。ウェブフックのペイロードにはmedia_buy_id、status: "canceled"、およびcanceled_at、canceled_by: "seller"、reasonを持つcancellationオブジェクトを含めなければなりません(MUST)。 - update リクエストの
canceledフィールドは"const": trueを使います——trueのみが有効です。canceled: falseを送るとスキーマバリデーションに失敗します。キャンセルは取り消し不可であり、「キャンセルの取り消し」操作はありません。 - クリエイティブの割り当てはバイの拒否またはキャンセルで解放されます。 メディアバイが
rejectedまたはcanceledへ遷移すると、そのメディアバイ上のすべてのパッケージ・クリエイティブの割り当てが解放されます。creative.has_creative_library: trueを表明しているセラーでは、割り当ての状態とクリエイティブの状態に従ってクリエイティブはクリエイティブライブラリに残り、後続のcreate_media_buyやsync_creativesの呼び出しでcreative_idにより参照してもかまいません(MAY)。クリエイティブライブラリなしでinline_creative_managementを表明しているインライン専用のセラーは、送信されたクリエイティブをパッケージスコープに保ってもかまいません(MAY)。それらはバイをまたぐ再利用やlist_creativesによる読み戻しを表明しません。 - クリエイティブのレビューはバイの結果から独立しています。 セールスエージェントは、クリエイティブを含むバイが拒否されたことを理由に、そのクリエイティブを暗黙的に拒否してはなりません(MUST NOT)。クリエイティブの拒否は、それ自身の
rejection_reasonを持つ意図的なレビューの判断でなければなりません(MUST)。クリエイティブがコンテンツポリシーに違反したためにバイが拒否された場合、セールスエージェントはそのクリエイティブを拒否してもかまいませんが(MAY)、それは通常のレビュー経路を通じて、それ自身のrejection_reasonとともに行う場合に限ります。バイのrejectedステータスはそれ自体では十分ではありません。 - 解放された割り当ての可観測性。 メディアバイレベルの
canceledまたはrejectedの遷移(バイのhistoryと上記で必須とされるウェブフック通知で公開されます)が、解放されたすべての割り当てに対する監査記録そのものです。バイヤーは割り当てごとの差分の可観測性に依拠してはなりません(MUST NOT)。解放された割り当ては、そのバイのget_media_buysレスポンスにはもう現れません。ライブラリでの再利用可能性を確認するバイヤーは、クリエイティブがまだライブラリにあることを確認し現在のステータスを観測するためにlist_creativesを呼ぶべきです(SHOULD)。get_media_buysはパッケージレベルの承認状態を公開するのであってクリエイティブ本体の完全な取得ではないため、インライン専用のバイヤーは送信したクリエイティブ本体を保持しておくべきです。以前のパッケージ上のパッケージスコープの期限(creative_deadline)は、ライブラリのクリエイティブの新しいバイへの適格性には関係しません。 - 保持。 クリエイティブライブラリを持つセールスエージェントは、最後の割り当てが解放されてから少なくとも 90 日間、解放されたクリエイティブをライブラリに保持すべきです(SHOULD)。規範的な保持期間の下限は #2260 で追跡されているクリエイティブ保持の契約で規定されます。その契約が着地するまでの間、長期の再利用に依拠するバイヤーは、解放されたクリエイティブを新しいバイで参照する前に
list_creativesで永続性を確認すべきです(SHOULD)。
リビジョンと確定のセマンティクス
revision はメディアバイの楽観的並行性制御のトークンです。update_media_buy のワイヤーフィールド名は revision です。実装が内部的に expected_revision と呼んでもかまいませんが、セマンティクスは同じです: 呼び出し元は「現在保存されているメディアバイのリビジョンがまだこの値と等しい場合にのみ、この更新を適用せよ」と言っているのです。
セラーは、状態を変更するすべての更新について、永続化の境界でリビジョンのチェックをアトミックに強制しなければなりません(MUST)。アプリケーションのメモリ内での read-compare-write のシーケンスは、別のライターと競合して更新の喪失を許してしまう可能性があります。更新と比較は、一つのデータベーストランザクション、条件付き更新、または同等のアトミックなプリミティブの中に属します。不一致の場合は CONFLICT を返し、メディアバイは変更しないままにします。
状態を変更する更新は revision を増加させ、新しい値を返します。これには予算、フライト日、ターゲティング、ステータス、パッケージ、クリエイティブの割り当て、レポーティングのウェブフック、請求書送付先、コミット済みメトリクスの変更が含まれます。バリデーションのみのリクエスト、既に適用された操作の完全な冪等の再実行、get_media_buys による読み取りでは、リビジョンは増えません。
バイヤーは、状態変更を意図したすべての update_media_buy 呼び出しで、最後に観測した revision を渡すべきです(SHOULD)。リクエストフィールドは後方互換性のために任意のままです。revision が存在する場合、セラーは書き込みとアトミックにそれを比較し、古い値を CONFLICT で拒否しなければなりません(MUST)。CONFLICT の場合は、get_media_buys でメディアバイを再読み込みし、現在の状態と突き合わせてから、新しい revision と新鮮な idempotency_key でリトライします。
confirmed_at はセラーのコミットのタイムスタンプであり、配信ステータスのタイムスタンプではありません。一度値が入ると、その後の一時停止、再開、キャンセル、完了、レポーティングの遷移を通じて安定したままです。バイヤーに media_buy_id を返さない場合は submitted のレスポンス分岐を使います。セラーは代わりに、暫定的なバイに対して media_buy_id、packages、confirmed_at: null を伴う同期的な成功を返してもかまいません(MAY)。そのようなバイは get_media_buys で取得可能でなければならず(MUST)、コミット時に confirmed_at をちょうど一度設定することで遷移しなければなりません(MUST)。confirmed_at: null の暫定的なバイは active であってはならず(MUST NOT)、packages[].committed_metrics を含んでもなりません(MUST NOT)。
パッケージレベルのライフサイクル:
パッケージはメディアバイと同じ一時停止/キャンセルのパターンに従います。加えて:
- パッケージは
creative_deadlineを持ってもよい(MAY)——この期限の後、パッケージへのクリエイティブの変更はCREATIVE_DEADLINE_EXCEEDEDで拒否されます。不在の場合、メディアバイのcreative_deadlineが適用されます。CREATIVE_REJECTEDはコンテンツポリシー上の失敗のために予約されています。 - パッケージのキャンセル(パッケージ更新での
canceled: true)は取り消し不可であり、メディアバイのステータスから独立しています——メディアバイがactiveのまま、単一のパッケージだけをキャンセルできます。キャンセルされたパッケージ上のクリエイティブの割り当ては、上記のメディアバイレベルのルールに従って解放されます。同じメディアバイ上の他のアクティブなパッケージに割り当てられたクリエイティブは影響を受けません。 - セールスエージェントはキャンセルされたパッケージの配信データを保持しなければなりません(MUST)。
include_snapshotが true の場合、セールスエージェントはキャンセル時点の配信状態を反映した最終スナップショットを返すべきです(SHOULD)。 - メディアバイ内のすべてのパッケージがキャンセルされた場合、メディアバイ自体は現在のステータス(
activeまたはpaused)のままです。フライト途中のパッケージ追加をサポートするセラーはvalid_actionsにadd_packagesを表明します——バイヤーはupdate_media_buyのnew_packagesを通じて新しいパッケージを追加できます。そうでない場合、バイヤーはメディアバイを明示的にキャンセルすべきです(SHOULD)。セールスエージェントは、最後のアクティブなパッケージがキャンセルされたときに(update レスポンスのcontext.notesを通じて)オーケストレーターに通知すべきです(SHOULD)。セールスエージェントは、新しい活動がなければ、セラーが定めた猶予期間の後にメディアバイをcanceledへ自動遷移させてもかまいません(MAY)。
パッケージ上のクリエイティブ承認
スキーマ:enums/creative-approval-status.json
各パッケージは、クリエイティブのライブラリレベルのステータスとは別に、クリエイティブごとの承認ステータスを追跡します。クリエイティブがライブラリでは approved でありながら、特定のパッケージでは rejected であることもあります(例: そのプレースメントに対してフォーマットが誤っている)。
拒否は終端ではありません——バイヤーはクリエイティブを修正し、セラーが表明しているクリエイティブの経路を通じて再送信します。これにより承認は
pending_review にリセットされます。再送信の経路:
get_media_buysのレスポンスでrejection_reasonを確認する- クリエイティブを修正する(アセットの更新、マニフェストの調整)
- ライブラリを持つセラーには
sync_creativesで、インライン専用のセラーにはupdate_media_buyのpackages[].creativesで再送信する - 承認が
pending_reviewにリセットされる
creative_deadline との相互作用: クリエイティブがパッケージの creative_deadline の後に拒否された場合、バイヤーはそれでも再送信してもかまいません(MAY)——バイヤーはセラーが特定した問題を修正しているのですから、セラーは期限を過ぎていても拒否されたクリエイティブの再送信を受け入れるべきです(SHOULD)。遅れた再送信を受け入れられないセラーは CREATIVE_DEADLINE_EXCEEDED を返さなければなりません(MUST)。
検証タグの強制
確定したパッケージのperformance_standards が vendor を持つエントリを含む場合、そのパッケージに割り当てられるクリエイティブは、指定された各ベンダーに対応する url_type: "tracker_script" または url_type: "tracker_pixel" の URL アセットを少なくとも一つ含まなければなりません(MUST)。セールスエージェントは、必要な検証タグを欠くクリエイティブの割り当てを、CREATIVE_REJECTED と、不足しているベンダータグを特定する details メッセージとともに拒否すべきです(SHOULD)。バイヤーエージェントは、クリエイティブを送信する前に、合意された measurement_terms に基づいてベンダータグを事前に含めておくべきです(SHOULD)。
タスク
メディアバイプロトコルは以下のタスクを定義します。完全なリクエスト/レスポンススキーマと例については、タスクリファレンスページを参照すること。get_products
スキーマ:media-buy/get-products-request.json / media-buy/get-products-response.json
リファレンス: get_products タスク
自然言語ブリーフまたは明示的なホールセールインテントを使って広告インベントリを発見します。
要件:
- オーケストレーターは
buying_modeを"brief"、"wholesale"、または"refine"に設定しなければなりません - オーケストレーターは
buying_modeが"brief"の場合にbriefを含めなければなりません - オーケストレーターは
buying_modeが"wholesale"または"refine"の場合にbriefを含めてはなりません - オーケストレーターは
buying_modeが"refine"の場合にrefineを含めなければなりません - オーケストレーターは
buying_modeが"brief"または"wholesale"の場合にrefineを含めてはなりません - オーケストレーターは
refine内の各商品エントリにscopeとproduct_idを、各プロポーザルエントリにscopeとproposal_idを提供しなければなりません - オーケストレーターは商品エントリおよびプロポーザルエントリの
actionを省略してもよい(デフォルトは"include") - オーケストレーターは単一の
refine配列に同一の商品IDまたはプロポーザルIDを持つ複数のエントリを含めてはなりません - セールスエージェントはブリーフが提供された場合、ブリーフ条件に一致する商品を返さなければなりません
- セールスエージェントは各商品に
product_idとpricing_optionsを含めなければなりません - セールスエージェントは複数の商品が一致する場合、関連性スコアを含めるべきです
buying_mode: "refine" を持つ各 get_products リクエストは自己完結している — セールスエージェントはトランスポートレベルのセッション状態に依存してはなりません。各リクエストの refine 配列と filters がリファインメントの意図を完全に指定します。セラーは自身の商品およびプロポーザルレジストリを維持します。「ステートレス」とは、プロトコル交換がコール間で暗黙的な状態を持たないことを意味します。これによりステートレスな実装と安全なリトライが可能になります。
- セールスエージェントは、商品エントリおよびプロポーザルのリファインエントリで
actionが欠けている場合、action: "include"として扱わなければなりません - セールスエージェントは
action: "omit"を持つ商品をレスポンスから除外しなければなりません - セールスエージェントは
action: "omit"を持つプロポーザルをレスポンスから除外しなければなりません - セールスエージェントは
action: "include"を持つ商品を更新された価格とともに返さなければなりません - セールスエージェントは
action: "include"を持つ商品エントリのaskを満たすべきです - セールスエージェントは
action: "more_like_this"を持つ商品に類似した追加商品を元の商品とともに返すべきです - セールスエージェントはレスポンスを構成する際にリクエストレベルの ask(
scope: "request")を考慮すべきだ — これにより明示的に参照された商品以外の追加商品が含まれる場合があります。商品ごとのアクションはリクエストレベルの指示より優先されます。 - セールスエージェントは
action: "include"を持つプロポーザルエントリのaskを満たすべきです - セールスエージェントはレスポンスに
refinement_appliedを含めるべきで、位置でマッチした各変更リクエストに1エントリを持ちます refinement_appliedを返すセールスエージェントは、オーケストレーターが整合性を相互検証できるよう、各エントリでscopeをエコーしなければならず、商品スコープとプロポーザルスコープについてはproduct_id/proposal_idをエコーしなければなりません- セールスエージェントはオーケストレーターがプロポーザルエントリを含めていない場合でも、リファインモードで商品と並んでプロポーザルを返してもよい
list_creative_formats
スキーマ:media-buy/list-creative-formats-request.json / media-buy/list-creative-formats-response.json
リファレンス: list_creative_formats タスク
クリエイティブフォーマットの要件と仕様を発見します。
要件:
- セールスエージェントはサポートするすべてのクリエイティブフォーマットを返さなければなりません
- セールスエージェントは各フォーマットの技術仕様を含めなければなりません
- セールスエージェントは該当する場合、クリエイティブプロトコルの標準フォーマットIDを参照すべきです
create_media_buy
スキーマ:media-buy/create-media-buy-request.json / media-buy/create-media-buy-response.json
リファレンス: create_media_buy タスク
選択したパッケージからメディアバイを作成するか、プロポーザルを実行します。
要件:
- オーケストレーターは
packages配列またはproposal_idのいずれかを含めなければなりません - オーケストレーターはキャンペーンの
start_timeとend_timeを含めなければなりません - セールスエージェントは作成成功時に
media_buy_idを返さなければなりません - セールスエージェントは作成成功時に
confirmed_atを返さなければなりません。その値はセラーのコミットのタイムスタンプ、またはレスポンスがまだコミットされていない暫定的なバイを作成する場合はnullです。 - セールスエージェントは作成成功時に
revisionを返さなければなりません - セールスエージェントは、クリエイティブをアップロードすべき期限を示す
creative_deadlineを返さなければなりません - セールスエージェントは価格オプションに対して予算を検証しなければなりません
- 検証失敗時、セールスエージェントは
errors配列を返さなければなりません
update_media_buy
スキーマ:media-buy/update-media-buy-request.json / media-buy/update-media-buy-response.json
リファレンス: update_media_buy タスク
既存のメディアバイの予算、ターゲティング、または設定を変更します。
パッケージの操作は構造的に明示的です——操作の種類は、パッケージがリクエストのどこに現れるかで決まります:
要件:
- オーケストレーターは
media_buy_idを含めなければなりません - セールスエージェントは、認証済みアカウントについて
get_media_buysが返した任意のmedia_buy_idを受け入れなければならず、バイが元々 AdCP の外で作成されたことを理由に更新を拒否してはなりません。特定の操作に対するビジネス上の制約は、それらをvalid_actionsから省略することで表現します。アカウントの所有権と作成サーフェスを参照。 - セールスエージェントは PATCH セマンティクスを適用しなければなりません: 指定されたフィールドのみ更新され、省略されたフィールドは変更されない
- バイヤーが既に
canceledのメディアバイをキャンセルしようとした場合(canceledのバイに対するcanceled: true)、セールスエージェントはNOT_CANCELLABLEで拒否しなければなりません - 終端状態(
completed、rejected、canceled)のメディアバイに対するその他すべての更新——completedまたはrejectedのバイに対するcanceled: trueの試みを含む——はINVALID_STATEで拒否しなければなりません - オーケストレーターは
canceled: trueと任意のcancellation_reasonを設定してメディアバイをキャンセルしてもよい - セールスエージェントはキャンセルを受理した際、メディアバイを
canceledステータスへ遷移させなければなりません - セールスエージェントは、終端状態でないメディアバイのキャンセルをエラーコード
NOT_CANCELLABLEで拒否してもよい - オーケストレーターはパッケージ更新で
canceled: trueを設定して個別のパッケージをキャンセルしてもよい - セールスエージェントは、
creative_deadlineを過ぎたパッケージへのクリエイティブの変更をエラーコードCREATIVE_DEADLINE_EXCEEDEDで拒否しなければなりません - オーケストレーターは
new_packagesを通じて既存のメディアバイに新しいパッケージを追加してもよい。これをサポートするセールスエージェントはvalid_actionsにadd_packagesを表明しなければなりません。パッケージの追加をサポートしないセールスエージェントはUNSUPPORTED_FEATUREで拒否しなければなりません。 - update リクエストで
canceled: trueが他のフィールドと同時に存在する場合、セールスエージェントはキャンセルを適用しなければならず、cancellation_reasonを除く他のすべてのフィールドを無視しなければなりません。キャンセルは並行する変更よりも優先されます。セールスエージェントは、キャンセル以外のフィールドが存在し無視された場合、レスポンスのcontextに警告を含めるべきです。 - セールスエージェントは更新適用後(または承認保留中の場合は提案された状態)の直接変更された各パッケージの状態を含む
affected_packagesを返さなければなりません。キャンペーンレベルのフィールド(例:paused、start_time)のみが更新される場合は空の配列も有効です - 手動承認が必要な場合、セールスエージェントは保留中の更新リクエストを永続化しなければならず、
implementation_date: nullを返さなければならず、空のaffected_packagesを返してはなりません - セールスエージェントは更新されたメディアバイの状態を返すべきです
sync_catalogs
スキーマ:media-buy/sync-catalogs-request.json / media-buy/sync-catalogs-response.json
リファレンス: sync_catalogs タスク
セラーアカウントのカタログ(商品、インベントリ、ストア、垂直フィード)を同期します。
要件:
- オーケストレーターは
account_idを含めなければなりません catalogsが提供される場合、少なくとも1つのカタログを含めなければなりませんcatalogsが省略された場合、そのコールは発見のみを目的とし、変更なしに既存のカタログを返す- セールスエージェントはカタログごとの結果を返さなければならず、取られたアクションとアイテムレベルの問題を含めます
- セールスエージェントは変更を適用せずに検証するための
dry_runをサポートすべきです
list_creatives
list_creatives は クリエイティブプロトコル で定義されています。クリエイティブライブラリをホストするセールスエージェントはクリエイティブプロトコルの一部として list_creatives を実装してもよい。list_creatives タスクリファレンスを参照すること。sync_creatives
sync_creatives は クリエイティブプロトコル で定義されています。クリエイティブライブラリをホストするエージェントはクリエイティブプロトコルの一部として sync_creatives を実装します。sync_creatives タスクリファレンスを参照すること。get_media_buys
スキーマ:media-buy/get-media-buys-request.json / media-buy/get-media-buys-response.json
リファレンス: get_media_buys タスク
パッケージステータス、クリエイティブ承認、不足フォーマット、オプションの配信スナップショットを含む運用上のメディアバイ状態を取得します。
要件:
- オーケストレーターは
account_id、media_buy_ids、status_filterでフィルタリングしてもよい - オーケストレーターは広範なスコープのクエリに対してカーソルページネーション(
pagination.max_results/pagination.cursor)を使用すべきです - セールスエージェントは、認証済みアカウントが所有し宣言されたフィルターの集合に一致するすべてのメディアバイを、そのバイがどのように作成されたか(AdCP、セラーのネイティブ API/UI、手動トラフィッキング、レガシーシステム)に関わらず返さなければなりません。アカウントの所有権と作成サーフェスを参照。
- セールスエージェントは一致した各メディアバイの現在のメディアバイステータスとパッケージレベルの運用状態を返さなければなりません
- セールスエージェントは、返されるメディアバイレベルの
statusがキャッシュから提供される場合、または上流のレグからロールアップされたステータスとして計算される場合、status_as_ofを含めるべきです。ロールアップされたステータスの場合、status_as_ofは、返されるロールアップに影響しうる上流ステータス観測のうち最も古いものより後であってはなりません。そうすることで鮮度を過大に主張することがなくなります。鮮度について何も主張しない場合は省略するかnullを返します。バイヤーは、省略または null の値がステータスがライブであることを意味すると推論してはなりません。バイヤーは一覧のステータスの鮮度を解釈するためにstatus_as_ofを使います。updated_atは引き続きメディアバイの最終更新時刻です。 - セールスエージェントは各メディアバイについて、現在の状態でバイヤーが実行できるアクションを列挙した
valid_actionsを含めるべきです。これにより、エージェントが状態機械を内部に取り込む必要がなくなります。期待されるマッピング:
セラーはビジネスルールに基づいてアクションを省略してもかまいません(例: 契約上の義務がキャンセルを妨げる場合に
cancel を省略する、プラットフォームがフライト途中の追加をサポートしない場合に add_packages を省略する)。
pending_creatives または pending_start が paused: true による作成時の保留を覆い隠している場合、セラーは、セットアップのブロッカーが解消する前にバイヤーが保留を解除できるよう、resume も含めるべきです。
valid_actions には変更操作のみが含まれます——読み取り専用の操作(get_media_buys、get_media_buy_delivery)は状態に関わらず常に許可されます。エージェントは valid_actions を最適化のヒントとして使うべきですが、INVALID_STATE エラーを適切に処理しなければなりません。valid_actions は並行操作によるリアルタイムの状態変化を反映していない可能性があるからです。アクションの不在は「このセラーが宣言していない」ことを意味するのであって、必ずしも「禁止されている」ことを意味しません。
クリエイティブの変更について、valid_actions にある sync_creatives はレガシーなクリエイティブ変更のアクションラベルであり、sync_creatives タスクが存在する証明ではありません。バイヤーはセラーが表明しているクリエイティブの経路を使います: creative.has_creative_library: true のセラーでは sync_creatives と creative_assignments、media_buy.features.inline_creative_management: true を表明しているインライン専用のセラーでは update_media_buy の packages[].creatives です。
- オーケストレーターは、
include_historyに希望する直近のエントリ数を設定してリビジョン履歴をリクエストしてもよい。セールスエージェントは、include_history > 0のとき、リビジョン番号、タイムスタンプ、サーバーが導出したアクターの識別情報、アクションの種類、任意のサマリーを含むhistory配列をメディアバイごとに返すべきです。履歴エントリは新しい順に並べなければなりません。 - セールスエージェントはメディアバイ通貨を含めなければならず、通貨フィールドを一貫して表示しなければなりません(
snapshot.currency->package.currency->media_buy.currency) - セールスエージェントは利用可能な場合、クリエイティブ承認結果と保留中のフォーマット要件を含めるべきです
include_snapshotが true でパッケージのスナップショットデータが省略される場合、セールスエージェントはsnapshot_unavailable_reasonを返さなければなりませんinclude_snapshotが true でスナップショットが返される場合、各スナップショットはas_ofとstaleness_secondsを含めなければなりません- デフォルトの
status_filter: ["active"]はmedia_buy_idsが省略された場合のみ適用されます
get_media_buy_delivery
スキーマ:media-buy/get-media-buy-delivery-request.json / media-buy/get-media-buy-delivery-response.json
リファレンス: get_media_buy_delivery タスク
パフォーマンス指標とキャンペーン配信をトラッキングします。
要件:
- オーケストレーターは
media_buy_idを含めなければなりません - セールスエージェントは、認証済みアカウントについて
get_media_buysが返した任意のmedia_buy_idを、その作成サーフェスに関わらず受け入れなければなりません。アカウントの所有権と作成サーフェスを参照。 - セールスエージェントはパッケージレベルで配信指標を返さなければなりません
- セールスエージェントはリクエストされた場合、次元ごとの内訳を含めるべきです
- セールスエージェントはデータの鮮度を示す
as_ofタイムスタンプを含めなければなりません
provide_performance_feedback
スキーマ:media-buy/provide-performance-feedback-request.json / media-buy/provide-performance-feedback-response.json
リファレンス: provide_performance_feedback タスク
パブリッシャーの最適化を可能にするためのパフォーマンスシグナルを送信します。
要件:
- オーケストレーターは
media_buy_idとパフォーマンス指標を含めなければなりません - セールスエージェントはフィードバックの受信を確認しなければなりません
- セールスエージェントはキャンペーン制約内での配信最適化にフィードバックを使用すべきです
sync_event_sources
スキーマ:media-buy/sync-event-sources-request.json / media-buy/sync-event-sources-response.json
リファレンス: sync_event_sources タスク
アップサートセマンティクスでコンバージョントラッキング用のイベントソースをセラーアカウントに設定します。
要件:
- オーケストレーターは
account_idを含めなければなりません event_sourcesが提供される場合、少なくとも1つのイベントソースを含めなければなりませんevent_sourcesが省略された場合、そのコールは発見のみを目的とし、変更なしにアカウントのすべてのイベントソースを返す- セールスエージェントは何が起きたかを示す
actionを含むソースごとの結果を返さなければなりません - セールスエージェントは存在する場合、セラー管理のイベントソースをレスポンスに含めなければなりません
- セールスエージェントは新しく作成されたイベントソースの
setup手順を返すべきです - セールスエージェントはセラーのプラットフォームでのクロスリファレンス用に
seller_idを含めてもよい
log_event
スキーマ:media-buy/log-event-request.json / media-buy/log-event-response.json
リファレンス: log_event タスク
アトリビューションと最適化のためのコンバージョンまたはマーケティングイベントを送信します。
要件:
- オーケストレーターは設定済みのイベントソースを参照する
event_source_idを含めなければなりません - オーケストレーターは
event_id、event_type、event_timeを持つ少なくとも1つのイベントを含めなければなりません - セールスエージェントは
events_receivedとevents_processedのカウントを返さなければなりません - セールスエージェントは
event_id+event_type+event_source_idでイベントを重複排除しなければなりません - セールスエージェントは個別に失敗したイベントの
partial_failuresを報告すべきです - セールスエージェントはユーザーマッチングが試みられた場合、
match_qualityスコアを返すべきです
sync_audiences
スキーマ:media-buy/sync-audiences-request.json / media-buy/sync-audiences-response.json
リファレンス: sync_audiences タスク
セラーアカウントでファーストパーティ CRM オーディエンスを管理します。ハッシュ化された顧客リストをアップロードし、マッチングステータスを確認し、ターゲティングオーバーレイで結果のオーディエンスを参照します。
要件:
- オーケストレーターは
account_idを含めなければなりません - オーケストレーターはハッシュ化されたメンバーデータを持つ少なくとも1つのオーディエンスを含めなければなりません
- セールスエージェントはマッチングステータスを含むオーディエンスごとの結果を返さなければなりません
- セールスエージェントは非同期マッチング完了のための
push_notification_configをサポートすべきです - セールスエージェントは SHA-256 ハッシュ化された識別子を受け入れなければならず、
hashed_email/hashed_phoneフィールドの平文のメールアドレス/電話番号を拒否しなければなりません(トランスポート境界での PII の最小化。ハッシュ化では満たされない保持と同意の義務についてはプライバシーに関する考慮事項を参照)
エラーハンドリング
セールスエージェントは AdCP 標準エラースキーマ を使用してエラーを返さなければなりません。 一般的なエラーコード:MEDIA_BUY_NOT_FOUND: 参照されたメディアバイが存在しませんPACKAGE_NOT_FOUND: 参照されたパッケージが存在しませんPRODUCT_NOT_FOUND: 参照された商品が存在しませんBUDGET_EXCEEDED: 操作が割り当て予算を超過しますCREATIVE_REJECTED: クリエイティブがコンテンツポリシーのレビューに失敗しましたCREATIVE_DEADLINE_EXCEEDED: パッケージのcreative_deadlineの後にクリエイティブの変更が送信されましたINVALID_STATE: リソースの現在のステータスではその操作が許可されていない(例: 完了またはキャンセルされたメディアバイの更新)NOT_CANCELLABLE: メディアバイまたはパッケージを現在の状態でキャンセルできませんGOVERNANCE_DENIED: 登録されたガバナンスエージェントがトランザクションを拒否しました。バイヤーはバイを組み直すか、人の支出権限にエスカレーションするか、ガバナンスエージェントに連絡できます。TERMS_REJECTED: バイヤーが提案したmeasurement_termsがセラーに拒否されました。エラーの詳細は、どの条件が失敗したか、およびセラーの許容範囲またはサポートするベンダーを特定すべきです。復旧方法: 提案した条件を調整してリトライするか、measurement_termsを省略してプロダクトのデフォルトを受け入れます。REQUOTE_REQUIRED:update_media_buyリクエストが、元の見積もりが価格付けの前提としたパラメータのエンベロープ(予算、フライト日、ボリューム、ターゲティング)を変更しています。pricing_optionはロックされたままです。セラーはその価格でリクエストされた形を断っています。TERMS_REJECTED(計測)やPOLICY_VIOLATION(コンテンツ)とは異なります。3.1 での復旧方法は、現在の見積もりに収まるよう更新を調整する、プロダクト/条件を再発見する、add_packagesが利用可能なときにパッケージを追加する、または別のメディアバイを作成することです。AdCP 3.1 はupdate_media_buyに添付できる修正見積もりのアーティファクトを定義していません。セラーは、バイヤーのエージェントが自律的に再発見できるよう、エンベロープに違反したフィールドのパス(例:packages[0].budget、end_time)をerror.details.envelope_fieldに設定すべきです。VALIDATION_ERROR: リクエストフォーマットまたはパラメータのエラーAUTH_MISSING: 認証情報が提示されませんでした。復旧: 訂正可能。AUTH_INVALID: 認証情報は提示されたが拒否されました(期限切れ/失効/不正な形式)。復旧: 終端。
セキュリティの考慮事項
トランスポートセキュリティ
すべてのメディアバイプロトコル通信は TLS 1.2 以上の HTTPS を使用しなければなりません。認証
- オーケストレーターは有効な認証情報を使用してセールスエージェントに対して認証しなければなりません
- セールスエージェントはリクエストを処理する前に認証情報を検証しなければなりません
- セールスエージェントはインベントリアクセスを決定するためにアカウントコンテキストを使用しなければなりません
予算認可
- セールスエージェントはアカウントが要求された予算レベルに対して認可されているかを検証しなければなりません
- セールスエージェントは明示的な承認なしに認可された予算上限を超えてはなりません
クリエイティブセキュリティ
- セールスエージェントはポリシー準拠のためにクリエイティブコンテンツを検証しなければなりません
- セールスエージェントはクリエイティブのマルウェアおよび悪意のあるコンテンツをスキャンすべきです
- セールスエージェントはセキュリティ検証に失敗したクリエイティブを配信してはなりません
適合性
セールスエージェントの適合性
適合するメディアバイプロトコルのセールスエージェントは以下を行わなければなりません:- 指定されたトランスポート(MCP または A2A)のうち少なくとも1つをサポートします
- スキーマに従ってすべてのタスクを実装します
- レスポンススキーマで定義された必須フィールドを返す
- 指定されたエラーコードを使用します
- 非同期オペレーションを適切に処理します
- 認証と認可を強制します
オーケストレーターの適合性
適合するメディアバイプロトコルのオーケストレーターは以下を行わなければなりません:- セールスエージェントに対して認証します
- リクエストスキーマで定義された必須フィールドを含めます
- 完了アーティファクトのウェブフック配信を含め、タスクレベルの非同期レスポンス(
submitted、working、input-required)を処理します - 後続の操作でメディアバイを参照するために
media_buy_idを使用します - クリエイティブアップロードの
creative_deadlineを遵守します
実装ノート
レスポンスタイムの目安
セールスエージェントは以下のレスポンスタイムを目標とすべきだ:冪等性
セールスエージェントはidempotency_key を使った冪等なオペレーションをサポートすべきだ:
- 同じアカウントに対して
idempotency_keyが以前に見られた場合、セールスエージェントは既存のリソースを返すべきです - これにより重複作成なしに安全なリトライが可能になります
update_media_buy、sync_creatives)では、オーケストレーターは安全なリトライのために idempotency_key(16〜255文字)を含めてもよい。レスポンスなしでリクエストが失敗した場合、同じ idempotency_key で再送することで最大1回の実行が保証されます。
人間参加型
セールスエージェントはどの操作に対しても人間の承認を要求してもよい。承認はタスクレイヤーでモデル化されます:- セラーが内部の人(例: IO への署名、トラフィックマネージャーのレビュー)を待っている場合、セールスエージェントはレビュアーが動くまでタスクを
status: "submitted"に保たなければなりません。完了すると、タスクはcompletedへ遷移し、最終アーティファクトがmedia_buy_idと完全な成功ペイロードを運びます。 - セラーがバイヤーの応答を必要とする場合(例: 事前承認された上限を超える予算の確認)、セールスエージェントは何が必要かを説明するメッセージとともに
status: "input-required"を返さなければなりません。バイヤーは同じ A2A コンテキスト内で応答します。 - セールスエージェントはタスクのメッセージで推定承認タイムラインを提供すべきです。
- オーケストレーターはポーリングではなく、完了通知のためのウェブフックハンドラー(
push_notification_config経由)を実装すべきです。
pending_approval はメディアバイやタスクの有効なステータスではありません——その値は(アカウントのオンボーディングレビュー向けに)Account.status にのみ存在します。メディアバイやタスクレベルの承認のために転用しないでください。