商取引モデル
すべての AdCP 取引には7つの根本的な問いがあります。
セラーは
get_adcp_capabilities の require_operator_auth でアカウントモデルを宣言します。そのフィールドは誰が認証しなければならないかを宣言します。それ自体は OAuth が使われるか、list_accounts が公開されるか、どの sync_accounts モードがサポートされるかを宣言しません。
require_operator_auth が true(アカウント ID 名前空間)の場合、オペレーターは独立して認証し、セラーまたは上流プラットフォームが正準のアカウント名前空間を所有するため、バイヤーはセラー割り当ての account_id 値を渡します。クレデンシャルが複数のアカウントにアクセスし得る場合、セラーは list_accounts を公開しなければならず(MUST)、バイヤーは最初のアカウントスコープリクエストの前に明示的な account_id を解決しなければなりません(MUST)。クレデンシャルが正確に 1 つのアカウントに束縛される場合、セラーはそのシングルトンを返す list_accounts を公開すべきで(SHOULD)、同じ明示的な account_id が別の宣言されたパスまたはアウトオブバンドのオンボーディングを通じて供給される場合のみ省略してもよい(MAY)。
require_operator_auth が false(バイヤー宣言アカウント)の場合、エージェントは信頼され、バイヤーは sync_accounts でブランド/オペレーターのペアを宣言してアカウントをプロビジョニングします。
広告ネットワークは両方のモデルを同時に利用できます — バイヤー向けにはバイヤー宣言アカウント(ネットワークはエージェント信頼)、各基盤プラットフォームとはアカウント ID 名前空間(ネットワークはオペレーターとして認証)。完全なアカウントチェーン(バイヤーエージェント → ネットワーク(バイヤー宣言)→ AI プラットフォーム(アカウント ID 名前空間))については Sponsored Intelligence ガイド — ネットワークのアカウントモデル を参照してください。
配信後、オーケストレーターは report_usage を呼び出し、ベンダーエージェント(シグナル、ガバナンス、クリエイティブ)にサービスの消費状況を通知します。これは精算ではなく、ベンダーが獲得収益を追跡し請求を検証するための消費報告です。
スコープ
アカウントプロトコルはすべてのベンダープロトコルに適用されます。オーケストレーターはブランド/オペレーターのペアごとにベンダーエージェントとのアカウントを一度確立し、そのエージェントとのすべてのやり取りで同じアカウント参照を再利用します。
アカウント参照はセラーが割り当てた
account_id(セラー所有の名前空間、通常 require_operator_auth: true)または自然キー — brand + operator(バイヤー宣言アカウント、require_operator_auth: false)のいずれかになります。バイヤー宣言アカウントでは、セラーが内部 account_id もエコーしても、自然キーの AccountRef は後続の呼び出しで有効なままでなければなりません(MUST)。サンドボックスの場合、アカウント ID 名前空間は list_accounts で探索するかアウトオブバンドで供給される既存のテストアカウントを使い、バイヤー宣言アカウントは sandbox: true を付けた sync_accounts でサンドボックスを宣言します。詳細は アカウント参照 を参照してください。
アカウントステータスライフサイクル
アカウントは定義された状態のセットを進みます。終端状態(rejected、closed)はそれ以上の遷移を許しません。
pending_approval→active: セラーが与信/契約/アイデンティティレビュー後に承認pending_approval→rejected: セラーが拒否。終端 — バイヤーは新しいアカウントリクエストを提出しなければならない。active→payment_required: 与信限度に達したか資金が枯渇したとき自動payment_required→active: バイヤーが未払い残高を解決したとき。セラーは自動遷移してもよい(MAY)し、手動再アクティベーションを要求してもよい(MAY)。active→suspended: セラー起因(ポリシー違反、請求紛争、不正レビュー)。セラーは Webhook でオーケストレーターに通知しなければならない(MUST)。suspended→active: セラー起因の再アクティベーションsuspended→closed: セラー起因の恒久クローズactive→closed: セラーまたはバイヤー起因の恒久クローズ。終端。- セラーは終端状態のアカウントへのオペレーションを
ACCOUNT_NOT_FOUNDまたは適切なエラーで拒否しなければならない(MUST)
アカウントステータス別のオペレーション
アカウントステータスは、どのタスクが許可されるかのゲートとして機能します。読み取り専用オペレーションは常に利用可能。変更オペレーションはステータスに基づいて制限されます。payment_requiredは新規支出(create_media_buy)をブロックするが、既存バイの管理とセットアップの解決を許可。パッケージ追加は機能的に新規支出と同等なので、セラーはアカウントがpayment_requiredのときupdate_media_buy内のnew_packagesも拒否すべき(SHOULD)。suspendedは既存データへの読み取り専用アクセスを許可するが、すべての変更をブロック- セラーは、停止アカウントのブロックされたオペレーションには
ACCOUNT_SUSPENDEDを、payment-required アカウントのブロックされたオペレーションにはACCOUNT_PAYMENT_REQUIREDを返さなければならない(MUST)
Caller authorization
アカウントにアクセスできるすべての呼び出し元が同じ付与を持つわけではありません。ベンダーエージェントは、ある呼び出しエージェントに完全なスコープを、別のエージェントに狭い読み取り+更新スコープを発行できます。認証は呼び出し元が主張どおりの者であることを確認します。認可は「この呼び出し元はこのアカウントで何をしてよいか?」に答えます。すべてのベンダープロトコルに適用。 ここで説明する認可メカニズムは共有 Accounts Protocol の一部です —
sync_accounts / list_accounts を実装するすべてのエージェント(media-buy sales agent、signals agent、governance agent、creative agent、brand agent)に適用されます。signals エージェントはアクティベーション vs カタログアクセスをスコープし、governance エージェントは監査読み取り vs プラン管理をスコープし、creative エージェントはライブラリ読み取り vs アップロードをスコープします。標準の名前付きスコープ attestation_verifier のみが Media Buy Protocol 固有です(AAO Verified (Live) 修飾子にバインド)。残りの仕組み — allowed_tasks、field_scopes、read_only、custom: プレフィックスのスコープ — はプロトコル中立です。/schemas/v3/core/account-authorization.json
スコープイントロスペクションをサポートするベンダーエージェントは、sync_accounts と list_accounts のレスポンスの各アカウントごとエントリに authorization オブジェクトを付加します:
フィールド
存在と不在のセマンティクス
- 存在: ベンダーエージェントは、形状がこの瞬間のこのアカウントに対するこの呼び出し元への強制を反映すると表明します。数秒古いのは問題ないが、体系的に発散するのは非コンフォーマント。
- 単一アカウントで不在: ベンダーエージェントはそのアカウントについて呼び出し元にスコープを伝えていません。呼び出し元はエラー駆動ディスカバリー(タスクを試し、RBAC エラーコードを処理)にフォールバックします。
- すべてのアカウントで不在: ベンダーエージェントはスコープイントロスペクションを実装していません。呼び出し元は不在からアクセスを推論してはならない(MUST NOT)— ベンダーエージェントは依然ローカルでスコープを強制し、任意のタスク呼び出しで
SCOPE_INSUFFICIENT/READ_ONLY_SCOPE/FIELD_NOT_PERMITTEDを返し得ます。 authorizationは 3.x でオプション。破壊的変更を避けたいベンダーエージェントは設定を延期できます。設定は厳密に追加的です — 呼び出し元が試行で発見するはずのエラーを先取りできるようにします。
attestation_verifier 標準スコープ(Media Buy Protocol 固有)を主張するベンダーエージェントは authorization を設定しなければなりません(MUST)— AAO Verified (Live) 証明フローは、宣伝されたスコープが強制に一致することの検証に依存します。
アイデンティティバインディング、リフレッシュケイデンス、一貫性
authorization オブジェクトは読み取り時に (呼び出し元アイデンティティ, account_id) タプルに暗黙的にスコープされます。異なる認証済み呼び出し元に返される同じアカウントは異なる authorization オブジェクトを返してもよい(MAY)— それが RBAC モデルの要点です。ベンダーエージェントは呼び出し元アイデンティティを認証済みリクエストから解決しなければならず(MUST、クライアント供給フィールドからではない)、返す authorization をその解決されたアイデンティティにバインドしなければなりません(MUST)。
リフレッシュケイデンス。
- 呼び出し元は、アカウントに対する能動的使用の少なくとも 300 秒ごとに、
sync_accountsまたはlist_accounts(保持するaccountでフィルタ)を介してauthorizationを再読み取りすべき(SHOULD)。 - ベンダーエージェントは、オペレーター起因のスコープ変更を、変更がなされてから 300 秒以内に
sync_accounts/list_accountsレスポンスに反映しなければならない(MUST)。300 秒ごとにポーリングするコンフォーマントな呼び出し元は、最大 1 リフレッシュサイクル以内にオペレーター変更を見ます。 - ベンダーエージェントは
authorizationオブジェクトを短期間キャッシュしてもよい(MAY)が、再検証なしに 300 秒を超えてキャッシュしてはならない(MUST NOT)。 - 300 秒の数字はターゲットではなくフロアです — スコープがより頻繁に変わるベンダーエージェントはより速く表面化すべきで(SHOULD)、AAO Verified (Live) 証明を実行する呼び出し元は check-7 ケイデンス(ローリングウィンドウごとに少なくとも 1 回、加えて観測されたすべてのスコープ変更時)で探るべき(SHOULD)。
(呼び出し元アイデンティティ, account_id) タプルについて、リフレッシュウィンドウ内の逐次読み取りは、オペレーター起因のスコープ変更を除き、同一の authorization オブジェクトを返さなければならない(MUST)。ロードバランスされたまたは結果整合性のバックエンドからのちらつき — 異なるレプリカにヒットして 10 秒離れた 2 つの読み取りが異なる allowed_tasks を返す — は非コンフォーマント。コンプライアンスエンジンとコーディングエージェントは状態追跡にスコープの安定性に依存します。それを保証できないベンダーエージェントは、一貫性なく設定するのではなく authorization を省略しなければなりません(MUST)。
これは上記の存在セマンティクスの「体系的に発散するのは非コンフォーマント」保証の具体形です — 検証可能です: コンフォーマンスチェックはリフレッシュウィンドウ内で同じアイデンティティから同じアカウントを 2 回読み、結果を diff できます。
リフレッシュウィンドウ内での SCOPE_INSUFFICIENT へのバイヤー応答
単一のSCOPE_INSUFFICIENT レスポンスは、2 つの原因間で観測的に区別不能です: 有効な付与をまだ伝播していないセラーレプリカ(一時的インフラアーティファクト — 解決する)と、オペレーターによる正当なスコープ削減(永続的 — 表面化しなければならない)。エラーをオペレーター介入が必要な確定的な correctable シグナルとして分類する前に、バイヤーは 2 つを区別するため小さな制限されたリトライバジェットを使い果たしてもよい(MAY):
- リトライバジェット: 3 回以下、各回 1〜5 秒のジッター付きバックオフで分離。これは曖昧性解消ロジック —
correctable分類を信頼する前にスコープが本当に不十分かを確立 — であり、correctable エラーの復旧アクションではありません。 - 300 秒ウィンドウではない: リトライバジェットはセラーの伝播 SLA ではありません。バイヤーはすべての偽陰性で 300 秒ウィンドウ全体を待つべきではありません(SHOULD NOT)。累積 15 秒までのバックオフ遅延が典型的なレプリカラグを吸収するのに十分です。
- リトライ尽きた後: バイヤーはエラーを表面化しなければなりません(MUST)。「表面化」とは: 呼び出し層に構造化エラー(アカウント ID、失敗したタスク、試行回数を持つ
error.details.retry_countを含む)を返す AND 失敗をオペレーターがアクセス可能なチャネル — 構造化ログ、ダッシュボードアラート、通知 — で可視にすることを意味します。エスカレーションメカニズムは実装依存。要件はエラーが黙って飲み込まれないことです。
READ_ONLY_SCOPE は、バイヤーが付与伝播ラグ(書き込み付与更新に遅れているレプリカ)を疑うとき、同じ制限リトライロジックに従います。注意: 書き込みアクセスが最近失効した場合、古いレプリカは、失効したスコープが拒否すべきだった変更を受け入れるかもしれません。制限リトライが成功した場合、バイヤーは結果を信頼できるとして扱う前に authorization を再読み取りしなければならず(MUST)、再読み取りで書き込みアクセスが失効したことが確認された場合、バイヤーは変更を潜在的に未認可としてフラグするアラートをオペレーターに表面化しなければならず(MUST)、正しいものとして黙って受け入れてはなりません(MUST NOT)。
FIELD_NOT_PERMITTED はこのパターンに従いません。エージェント自律の復旧パス — 許可されないフィールドを削除して再送 — がリトライの考慮に優先します。バイヤーは FIELD_NOT_PERMITTED について同一の失敗リクエストをリトライしてはならず(MUST NOT)、即座に修正して再送すべき(SHOULD)。
これらのコードの規範的なリトライ例外条項は Authorization (RBAC) を参照。
標準の名前付きスコープ: attestation_verifier
AAO Verified (Live) 準備(#2965 で追跡)を宣伝する media-buy sales agent は、次の最小形状で scope_name: "attestation_verifier" で識別される名前付きスコープをサポートしなければなりません(MUST):
allowed_tasks(最小限 — ベンダーエージェントは追加の読み取り専用タスクを含めてもよい):get_adcp_capabilitiesget_productsget_media_buysget_media_buy_deliverylist_creativesupdate_media_buy
field_scopes.update_media_buy:["reporting_webhook"]read_only:false
create_media_buy、sync_creatives、update_media_buy のすべての支出コミットまたはターゲティング変更フィールドを意図的に省略します。継続的な可観測性検証のために狭く設計されています — コンプライアンスエンジンはライブキャンペーンを発見し、インベントリとクリエイティブの状態を読み、検証レポート Webhook を接続し、デリバリーを読めますが、インベントリを予約したり、予算を変更したり、フライト日を変えたり、クリエイティブをアップロードしたり、何かをキャンセルしたりはできません。
get_products と list_creatives が含まれるのは、AAO Verified (Live) の可観測性が、セラーの宣言されたインベントリとアクティブなバイのクリエイティブパイプライン状態のサニティ読み取りを必要とするためです。
attestation_verifier は Media Buy Protocol 固有です — AAO Verified (Live) 修飾子にバインドし、それはメディアバイフロー(ライブ観測は実際の広告配信を必要とする)です。signals、governance、creative、brand エージェント向けの同等の可観測性スコープはまだ標準化されていません。標準化されるまで、それらのエージェントは custom: スコープを使います。
レポートのみ — ライフサイクル実行は将来のスコープ。
attestation_verifier は (Live) のレポート半分です: エンジンはセラーがトラフィックしたキャンペーンを観測し、デリバリーを読み、検証 Webhook を接続します。意図的にキャンペーンを作成したり、クリエイティブを接続したり、予算を変更したりはできません。補完的なライフサイクル実行の役割 — エンジンが正準の PSA をセラーのライブエージェントを通じてエンドツーエンドでトラフィックする、#3046 で検討される AAO 運用の正準キャンペーンランナー向け — はより広い書き込みスコープ(attestation_runner、#3561 で追跡)を必要とします。今日のブラウンフィールド登録(Path B)は attestation_verifier のみを必要とします。ランナー側のスコープは正準キャンペーンランナー自体とともに点灯します。他のベンダープロトコル向けのカスタムスコープ
任意のベンダーエージェントはcustom: プレフィックスを使ってカスタムスコープを定義してもよい(MAY)。バイヤーは custom-prefixed スコープ名からいかなるセマンティクスも仮定してはなりません(MUST NOT)— 名前はエージェント定義で、帯域外(ドキュメント、オンボーディング)で学ばれます。
例示的な例(標準化されていない — 各エージェントが独自に命名):
- Signals agent:
custom:activation_only—allowed_tasks: [get_signals, activate_signal, get_adcp_capabilities]、カタログ管理なし、クロスアカウントメタデータなし。 - Governance agent:
custom:audit_viewer—allowed_tasks: [get_plan_audit_logs, get_adcp_capabilities]、read_only: true。ガバナンストレイルへの読み取りアクセスを付与された規制当局や外部監査人に有用。 - Creative agent:
custom:library_reader—allowed_tasks: [list_creatives, list_creative_formats]、read_only: true。アップロードしないバイヤー(例: 測定パートナー)が変更せずにライブラリの中身を発見できる。 - Brand agent(権利):
custom:rights_viewer—allowed_tasks: [get_rights, get_brand_identity]、read_only: true。クリアランス権限なしのディスカバリー。
custom:activation_only を設定する signals エージェントは、attestation_verifier を設定する media-buy セラーと同じ 300 秒リフレッシュ義務を負います。
先行技術
イントロスペクションモデル — 「呼び出し元が認可を強制する当事者に付与が何かを尋ねる」— は、AdCP のタスク・フィールド認可モデルに特化した RFC 7662 OAuth 2.0 Token Introspection と構造的に類似しています。レスポンスを別個のタスクに分割するのではなく sync/list に埋め込むことは、アカウントディスカバリーとスコープイントロスペクションが同じ自然な問い(「私のアカウントは何で、それで何ができるか?」)であることを反映します — 2 つは一緒に返されます。トランザクションライフサイクル
プリンシパル
アカウントプロトコルは4種類のプリンシパルで動作します。請求階層、信頼モデル、認可オペレーターの詳細は アカウントとエージェント を参照してください。タスク
ブランドレジストリとの接続
アカウント参照のbrand.domain は任意の識別子ではありません — ブランドのドメインであり、ブランドの正規アイデンティティ、サブブランド、認可オペレーター、プロパティを宣言する brand.json ファイルに解決可能です。
ベンダーエージェントはブランドレジストリに対してバイヤーの主張を検証できます: オーケストレーターが acme-corp.com を代表すると主張した場合、ベンダーは acme-corp.com/.well-known/brand.json を取得して認可オペレーターとブランド階層を確認できます。これによりアカウントプロトコルは改ざん耐性を持ちます — アカウント関係は公開検証可能なブランドアイデンティティに基づきます。
ブランドアイデンティティの解決方法については ブランドプロトコル を参照してください。
取引相手の検証
広告のすべての商取引関係は、実際に取引している相手が誰であるかを知ることに依存します。アカウントプロトコルはブランドレジストリを通じてプロトコルレベルでこれに対応します。 オーケストレーターがアカウントを参照する際、brand.domain が広告主を識別します。ベンダーエージェントは brand.domain/.well-known/brand.json を取得して以下を検証できます。
- ブランドアイデンティティ: このブランドは主張通りか?
- オペレーター認可: リクエストのオペレーターはこのブランドの代理購入が許可されているか?
- ブランド階層: このハウスポートフォリオにはどのサブブランドが含まれるか?
pending_approval アカウント状態では人間によるレビューが行われます: 与信審査、法的合意、本人確認。これらのステップが必要なベンダーエージェントは人間がプロセスを完了するための setup.url を返します。アカウントがアクティブになる前に完了が必要です。
ブランドレジストリとコントリビュートバックパターン
AgenticAdvertising.org ブランドレジストリ は、独自のbrand.json を公開していないブランドに対してコミュニティが維持するブランドアイデンティティレイヤーを提供します。アカウント設定前にブランドを解決するバイヤーエージェントは、通常のワークフローの副産物としてレジストリにデータをコントリビュートできます — 追加作業なしにエコシステムのアイデンティティカバレッジを向上させます。
バイヤーエージェントに推奨されるパターンは3つのビルディングブロックを使用します(#1166 参照)。
confirmWithUser はUXに合った確認メカニズムのプレースホルダーです — 明示的なプロンプト、ワークフローUIのレビューステップ、または人間のレビューをトリガーする低信頼フラグ。確認ステップが改善ループを機能させます: エンリッチメントデータはサードパーティから来るため正確さは保証されません。本番キャンペーンで使用される前のユーザー検証がレジストリの精度を保ちます。
ソース権威
レジストリはブランドデータがどこから来たかを追跡します。権威の降順でソースを示します。
エージェントが
save_brand または research_brand を呼び出すと、レジストリはマージロジックを適用します: より高い権威ソースの既存フィールドは保持され、欠落フィールドのみが補完されます。ブランドが宣言した内容を尊重しながらギャップを埋めます。
research_brand は最近の enriched データがドメインのレジストリに既に存在する場合、再エンリッチをスキップして冗長な API 呼び出しを避けます。
ブランドの完全な編集履歴(誰が、いつ、どのような概要でコントリビュートしたか)は GET /api/brands/history で照会できます。
プロパティコントリビュートバック
同じパターンがパブリッシャープロパティにも適用されます。バイヤーエージェントがセールスエージェントとのやり取りを通じて新しいパブリッシャーを発見した場合、POST /api/properties/save 経由でそのプロパティをレジストリにコントリビュートできます。これはブランドコントリビュートバックがブランドカバレッジを向上させるのと同様に、プロパティカバレッジを向上させます。詳細は レジストリ API — プロパティを保存 を参照してください。
利用報告
ベンダーエージェント(シグナル、ガバナンス、クリエイティブ)はキャンペーン実行の直接参加者ではなく、オーケストレーターがメディアバイへの入力としてサービスを使用します。配信後、report_usage はこれらのベンダーに消費状況を伝え、獲得収益を追跡し請求を検証できるようにします。
report_usage はバイヤー報告です: オーケストレーターが消費を計算して報告します。各レコードは独自の account、operator_id、kind("signal"、"content_standards"、"creative")を持ちます。ベンダーエージェントは報告された pricing_option_id を使用して正しいレートが適用されたことを検証します。
部分的な受け入れは有効です — 単一のリクエストが複数のアカウント、オペレーター、キャンペーンにまたがることができます。レスポンスは受け入れられたレコード数と(もしあれば)失敗したレコードを確認します。