| エンティティ | 問い | 識別方法 |
|---|---|---|
| ブランド | 誰のプロダクトが広告されるか? | ブランド参照: domain + オプションの brand_id(brand.json) |
| アカウント | 誰が請求されるか? どのレートが適用されるか? | アカウント参照 |
| オペレーター | 誰がブランドのために操作するか? | ドメイン(例: pinnacle-media.com) |
| エージェント | どのソフトウェアが購入を配置するか? | 認証済みセッション |
brand 参照(domain + オプションの brand_id)で識別され、/.well-known/brand.json を通じて解決されます。シングルブランドの企業はドメインのみを使用する(brand_id なし)。
アカウント — バイヤーとセラーの間の請求関係。レートカード、支払条件、信用限度、請求書を受け取る人を決定します。すべての請求可能な操作にはアカウント参照が必要だ — セラーが割り当てた account_id(明示的アカウント)または自然キー(brand、operator)(暗黙的アカウント)。サンドボックスアカウントは同じモデルに従う — 明示的サンドボックスは account_id を使用し、暗黙的サンドボックスは sandbox: true を含む自然キーを使用します。
オペレーター — 購入を主導するエンティティ — エージェンシートレーディングデスク、ブランドの内部チーム、または広告主の代わりに行動する別のエンティティ。ドメインで識別され、brand.json の認可オペレーターを通じて検証可能です。
エージェント — 購入を配置してキャンペーンを管理するソフトウェア。セラーで認証し、複数のオペレーターとブランドのために操作することがあります。
完全な商業モデルについてはアカウントプロトコルの概要を、タスクリファレンスについてはsync_accountsを参照。
セラーが宣言するもの
セラーはget_adcp_capabilities の account セクションを設定します:
1. どの請求モデルをサポートするか?(supported_billing)
バイヤーはすべての sync_accounts エントリで billing としてこれらの値の1つを渡す必要があります。セラーは受け入れるか拒否するかを決める。
| 請求 | 請求される対象 | ユースケース |
|---|---|---|
operator | オペレーター(エージェンシーまたはブランドが直接購入) | オペレーターが自分の条件で購入 |
agent | エージェント | エージェントがブランド間で請求を統合 |
require_operator_auth)
この単一フィールドが認証モデルとアカウント参照方法の両方を決定する:
false(デフォルト)の場合 — 暗黙的アカウント: セラーはエージェントを信頼します。エージェントは一度認証して sync_accounts を通じてアカウントを宣言します。後続のリクエストでは、バイヤーは自然キー(brand + operator)を渡し、セラーが内部で解決します。
true の場合 — 明示的アカウント: 各オペレーターはセラーと直接認証する必要があります。エージェントはオペレーターごとにクレデンシャルを取得する — セラーの authorization_endpoint を使った OAuth、またはアウトオブバンドの API キーで。バイヤーは list_accounts を通じてアカウントを発見し、セラーが割り当てた account_id を渡します。
サンドボックスの場合、パスはアカウントモデルに従う: 明示的アカウント(require_operator_auth: true)は list_accounts を通じて既存のテストアカウントを発見し、暗黙的アカウントは sandbox: true を含む sync_accounts を通じてサンドボックスを宣言して自然キーで参照します。
セラーは account_financials: true を宣言して get_account_financials を通じてアカウントレベルの財務データ(支出、信用、請求書)を公開することもできます。これはオペレーター請求アカウントにのみ適用されます。
ケイパビリティの例:
セラーパターン
どのようなプラットフォームから購入するか? それがアカウントセットアップパターンを決定します。| プラットフォームタイプ | require_operator_auth | supported_billing |
|---|---|---|
| ソーシャル / ウォールドガーデン | true | ["operator"] |
| ダイレクトパブリッシャー | false | ["operator"] または ["operator", "agent"] |
| DSP / プログラマティック | false | ["agent"] |
ソーシャルプラットフォーム
オペレーターはすでにプラットフォーム上にアカウントを持っている — 広告アカウント、ビジネスマネージャー、セルフサービスダッシュボード。エージェントはオペレーターのクレデンシャルを取得(OAuth または API キーで)して、オペレーターごとのセッションを開く。プラットフォームはオペレーターに直接請求します。 ケイパビリティ:get_adcp_capabilitiesを呼び出す —require_operator_auth: trueとauthorization_endpointを確認- 各オペレーターについて:
a. オペレーターのクレデンシャルを取得(
authorization_endpointを使った OAuth、またはアウトオブバンドの API キー) b. オペレーターのクレデンシャルで新しいセッションを開く c.sync_accountsを呼び出してこのオペレーターの各ブランドをセットアップ - アカウントステータスが
activeになるのを待つ(pending_approvalの場合はlist_accountsをポーリング) - オペレーターのセッションと
account参照を使ってget_products/create_media_buyを呼び出す
nova-brands.com/.well-known/brand.json を確認し、authorized_operators に Pinnacle Media を見つけてプロビジョニングを迅速化する:
ダイレクトパブリッシャー
パブリッシャーはエージェントを信頼するが、オペレーターに直接請求します。エージェントはsync_accounts を通じてアカウントをセットアップする — オペレーターごとのログインは不要。アカウントはアクティブになる前に人間の承認(信用調査、法的合意)が必要なことがあります。
多くのパブリッシャーはエージェント請求も受け入れる(supported_billing: ["operator", "agent"])。バイヤーはアカウントごとに選択する — ダイレクト関係のあるオペレーターは billing: "operator" を使用し、それ以外は billing: "agent" を使用します。セラーが特定のアカウントに対して要求された請求をサポートしない場合、リクエストを拒否し、エージェントは別のモデルで再送信します。
ケイパビリティ:
get_adcp_capabilitiesを呼び出す —require_operator_authが欠如(デフォルトはfalse)を確認- 各ブランド/オペレーターペアに対して
sync_accountsを呼び出す - アカウントステータスが
activeになるのを待つ — 人間がsetup.urlで信用/法的手続きを完了する必要がある場合があります account参照を使ってget_productsを呼び出すaccount参照を使ってcreate_media_buyを呼び出す
(brand: "acme-corp.com", operator: "acme-corp.com", billing: "operator") を認めたが、アカウントはアクティブになる前にレビューが保留中です。Acme Corp の担当者が URL でセットアップを完了します。進捗を確認するため、エージェントは次のいずれかを行う:
- 同じ自然キーで
sync_accountsを再呼び出す — セラーが更新されたステータスを返す - リクエストに
push_notification_configが提供されていた場合はウェブフック通知を受け取ります
pending_approval は通常のパスです。すべてのバイヤーはセラーとダイレクト関係が必要です。
請求拒否 — オペレーター請求が利用不可:
セラーは一般的にオペレーター請求をサポートするが、すべてのオペレーターに対してサポートしない場合があります。ここで、エージェントはダイレクト関係のないオペレーターに対してオペレーター請求をリクエストする:
billing: "agent" で再送信するか、このセラーではオペレーター請求が利用できないことをバイヤーに伝える。請求はサイレントに再マッピングされることはない。
DSP / プログラマティック
すべての請求はエージェントを通じて流れる。エージェントはプラットフォームとの継続的な関係を持ち、すべてのブランドとオペレーターにわたって請求を統合します。アカウントは即座に作成される — 人間の承認は不要です。 ケイパビリティ:get_adcp_capabilitiesを呼び出す —supported_billing: ["agent"]を確認billing: "agent"で各ブランド/オペレーターペアにsync_accountsを呼び出す- アカウントは即座にアクティブ — 人間の承認は不要
account参照を使ってget_products/create_media_buyを呼び出す
認可オペレーター
ブランドは/.well-known/brand.json の authorized_operators フィールドを通じて誰が代表できるかを宣言します。セラーは sync_accounts を処理する際にこれに対してオペレーターを検証すべきです。
| フィールド | 必須 | 説明 |
|---|---|---|
domain | はい | オペレーターのドメイン |
brands | はい | このオペレーターが代表できるブランド ID。["*"] はすべてのブランドを意味します。 |
countries | いいえ | ISO 3166-1 alpha-2 国コード。グローバル認可の場合は省略します。 |
検証フロー
{brand.domain}/.well-known/brand.jsonを解決しますauthorized_operatorsでマッチするdomainとbrands内のブランドを確認- 見つかった場合 → 進む(アカウントはまだ信用/法的承認が必要なことがあります)
- 見つからない場合 → アカウントを拒否(
action: "failed")または手動レビュー用にpending_approvalを返す
brand.json でオペレーターを見つけることでプロビジョニングを迅速化できます。オペレーターがリストにない場合でも、セラーは独自のレビュープロセスを通じて承認できます。
自己認可は暗黙的です。 operator ドメインがブランドのドメインと一致する場合、ブランドが直接操作している — authorized_operators へのリストは不要です。
authorized_operators はブランドとその代わりに操作する人との間のインターフェースをモデル化します。内部のエージェンシー階層はモデル化しません。
アカウント参照
すべてのアカウントスコープの操作は、フラットなaccount_id 文字列の代わりに account オブジェクトを受け入れる。セラーの require_operator_auth ケイパビリティが適用されるモデルを決定し、そのモデルがバイヤーの統合パス全体を決定します。
明示的アカウント(require_operator_auth: true)
アカウントは AdCP の外部で管理されます。広告主はセラーのプラットフォーム上でアカウントを作成し、オペレーターにそれを管理する権限を付与し、エージェントは list_accounts を通じてアカウントを発見します。エージェントは認証や請求には関与しない — それらは広告主とセラーの間で直接処理されます。
典型的なセラー: ソーシャルプラットフォーム、セルフサービス広告プラットフォーム — 広告主がすでにアカウントを持っているどこでも。
ワークフロー:
- 広告主がセラーのプラットフォームにアカウントを作成(アウトオブバンド)
- 広告主がオペレーターにアカウントを管理する権限を付与(アウトオブバンド)
- エージェントが
list_accountsを呼び出して利用可能なアカウントを発見 - 人間がリストから正しいアカウントを選択
- エージェントがすべてのリクエスト(
get_products、create_media_buyなど)で{ "account_id": "acc_acme_001" }を渡します
暗黙的アカウント(require_operator_auth: false)
エージェントが購入関係を管理します。sync_accounts を呼び出して誰が広告するか、誰がブランドの代わりに操作するか、誰が支払うかをセラーに伝える。セラーはアカウントをプロビジョニングしてステータスで応答する — アカウント ID は宣言の副産物であり、バイヤーが事前に知る必要があるものではありません。
典型的なセラー: 従来のパブリッシャー、リテールメディアネットワーク、DSP — 購入関係がプログラム的に確立されるどこでも。
sync_accounts は宣言ツールです。各エントリはセラーにバイヤーが必要とするものを伝えるフラグのセットだ:
| フラグ | セラーに伝えること |
|---|---|
brand(domain + オプションの brand_id) | どのブランドが広告するか |
operator | 誰がブランドの代わりに操作するか(エージェンシー、トレーディングデスク、またはブランド自身) |
billing | 誰が請求書を受け取るか — operator または agent |
payment_terms | このアカウントの支払条件(net_15、net_30、net_45、net_60、net_90、prepay)。セラーはこれらの条件を受け入れるかアカウントを拒否しなければなりません — 条件はサイレントに再マッピングされることはない。 |
sandbox | これがサンドボックス(テスト)アカウントかどうか — 実際の支出なし。暗黙的アカウントのみで使用。明示的なサンドボックスアカウントは既存のものを使います。 |
- エージェントが1つ以上の宣言で
sync_accountsを呼び出す - セラーがそれぞれのアカウントをプロビジョニングまたはリンクし、ステータスで応答:
active— 使用準備完了pending_approval— セラーがレビュー中(人間がsetup.urlを訪れる必要があるかもしれない)rejected— セラーがリクエストを拒否
- 後続リクエストでアカウント参照を渡す:
- 暗黙的アカウント(
require_operator_auth: false): 自然キー{ "brand": { "domain": "acme-corp.com" }, "operator": "pinnacle-media.com" }を渡します - 明示的アカウント(
require_operator_auth: true):{ "account_id": "acc_acme_001" }を渡す(list_accountsを通じて発見) - サンドボックス(暗黙的):
sandbox: trueを含む自然キーを渡す(sync_accountsを通じて宣言) - サンドボックス(明示的):
{ "account_id": "test_acc_001" }を渡す(既存のテストアカウント、list_accountsを通じて発見)
- 暗黙的アカウント(
- 何かが変わった場合(請求モデル、新しいブランド、新しいオペレーター)、再度
sync_accountsを呼び出す
billing が "agent" または "operator" の場合)。セラーはアカウントをアクティブにする前に人間の承認を必要とすることがあります。
自然キーセマンティクス
タプル(brand, operator, sandbox) はアカウント関係を一意に識別します。brand は domain とオプションの brand_id を持つネストされたオブジェクトです。operator は常に必要 — ブランドが直接操作する場合は operator をブランドのドメインに設定します。sandbox は省略時のデフォルトは false。例えば、{brand: {domain: "acme-corp.com"}, operator: "acme-corp.com"}(ブランドが直接購入)は {brand: {domain: "acme-corp.com"}, operator: "pinnacle-media.com"}(エージェンシー経由のブランド)とは異なるアカウントです。sandbox: true を追加すると同じペアのサンドボックスアカウントを参照します。
完全なリクエスト/レスポンススキーマについてはsync_accounts タスクリファレンスを参照。
アカウントステータス
| ステータス | 意味 | 次のステップ |
|---|---|---|
active | 使用準備完了 | このアカウントで購入を配置 |
pending_approval | セラーがレビュー中 | 人間が setup.url を訪れる必要があるかもしれない。更新のため list_accounts をポーリング。 |
rejected | セラーがリクエストを拒否 | 拒否理由を確認し、調整して再同期するか、セラーに連絡 |
payment_required | 信用限度に達した | 資金を追加するか他のアカウントに支出をルーティング |
suspended | アクティブだったが現在は一時停止 | セラーに連絡 |
closed | アクティブだったが現在は終了 | — |
アカウントスコープ
エージェントは自然キー —(brand, operator) でアカウントをリクエストします。セラーが割り当てる粒度を決定します。レスポンスの account_scope フィールドはセラーがリクエストをどのように解決したかをエージェントに伝える:
| スコープ | 意味 | 例 |
|---|---|---|
operator | このオペレーター下のすべてのブランドに対して1つのアカウント | エージェントが(Pinnacle Media, Acme)と(Pinnacle Media, Nova)を送信 — セラーは両方を Pinnacle Media アカウントにマッピング |
brand | オペレーターに関わらずこのブランドに対して1つのアカウント | エージェントが(Acme, Pinnacle Media)と(Acme, Summit Agency)を送信 — セラーは両方を Acme アカウントにマッピング |
operator_brand | このオペレーター+ブランドペアに専用アカウント | エージェントが(Pinnacle Media, Acme)を送信 — セラーが特定の Acme-via-Pinnacle アカウントを作成 |
agent | エージェントのデフォルトアカウント | エージェントがどんなブランドを送信しても — セラーが継続的なエージェントアカウントにルーティング |
(brand: {domain: "acme-corp.com"}, operator: "pinnacle-media.com") をリクエストするエージェントは、セラーに応じてオペレータースコープ、ブランドスコープ、または専用の operator_brand アカウントを受け取ることがあります。
複数の自然キーが同じスコープに解決する場合、account_scope がその理由を説明します。
sync_accounts は account_id を返さない — セラーがアカウント識別子を内部で管理します。明示的アカウント(require_operator_auth: true)では、サンドボックスのテストアカウントを含め、list_accounts を通じてアカウント ID を発見します。暗黙的アカウント(require_operator_auth: false)では、後続リクエストで自然キー(brand + operator)を使用する — サンドボックスアカウントには sandbox: true を追加します。
エラーコード
| コード | 返されるタイミング | 解決策 |
|---|---|---|
ACCOUNT_REQUIRED | 複数のアカウント; セラーがどれか判断できない | アカウント参照に account_id を渡す |
ACCOUNT_NOT_FOUND | account_id が存在しないかエージェントがアクセス権を持たない | アカウント参照を確認し、sync_accounts を再実行 |
ACCOUNT_SETUP_REQUIRED | 自然キーが解決されたがアカウントのセットアップが必要 | URL/メッセージの details.setup を確認 |
ACCOUNT_AMBIGUOUS | 自然キーが複数のアカウントに解決する | account_id またはより具体的な自然キーを渡す |
PAYMENT_REQUIRED | 信用限度に達したか資金が枯渇した | 資金を追加するか別のアカウントにルーティング |
ACCOUNT_SUSPENDED | アカウントが正常な状態でない | セラーに連絡 |
BRAND_REQUIRED | ブランド参照なしの請求可能な操作 | リクエストに brand を含める |
ACCOUNT_REQUIRED を返す場合、利用可能なアカウントを含める:
設計ノート
sync_accounts とセラーのレコードシステム
エージェントが(brand: {domain: "acme-corp.com"}, operator: "pinnacle-media.com") を宣言すると、セラーは独自のシステム — CRM、OMS、広告サーバー、または請求プラットフォーム — でレコードを検索または作成します。
sync_accounts はセラーのレコードシステムへのバイヤーサイドインターフェースです。セラーは:
- 自然キーを既存のアカウントにマッピングして
status: "active"を返すことがあります - 新しいレコードを作成して即座に返すことがある(
status: "active") - 人間のレビューを保留するプレースホルダーを作成することがある(
status: "pending_approval") - リクエストを完全に拒否することがある(
status: "rejected")
list_accounts はセラーがこのエージェントにマッピングしたすべてのレコードを返す — 保留中と拒否されたエントリを含みます。エージェントは list_accounts を使用して、アクティブなアカウントだけでなく、このセラーとのポートフォリオの完全な状態を確認します。
アカウントとインサーションオーダー
アカウントは継続的な関係を表す — 誰が請求されるか、どのレートが適用されるか、どのくらいの信用が利用可能か。キャンペーンやインサーションオーダーではありません。 インサーションオーダーとキャンペーンフライトはcreate_media_buy を通じたメディアバイとしてモデル化されます。アカウントは請求条件を決定し、メディアバイは何がいつ実行されるかを決定します。単一のアカウントはそのライフタイムにわたって多くのメディアバイを持つことができます。
オペレーターの取り消しとキャッシング
ブランドがauthorized_operators からオペレーターを削除した場合、既存のアクティブなアカウントは自動的に非アクティブ化されない。取り消しは即時ではなく最終的なものだ — ads.txt の変更がサプライサイドで伝播する方法に似ています。
セラーは brand.json の標準 HTTP キャッシングヘッダーを尊重して定期的に再検証すべきです。合理的なキャッシュ TTL は 24 時間です。
SMB のブランドアイデンティティ
/.well-known/brand.json を通じたドメインベースのアイデンティティはあらゆる規模の組織に機能する — どのウェブサーバーにでもホストできる静的な JSON ファイルです。
ドメインにファイルをホストできない組織の場合、brand.json の authoritative_location フィールドにより、ハウスドメインがホストされた場所にリダイレクトできる: