domain + オプションの brand_id を含む brand オブジェクトで識別され、/.well-known/brand.json 経由で解決されます。
sync_accounts はすべてのセラープロトコルで使用されます: メディアバイエージェント、シグナルエージェント、ガバナンスエージェント、クリエイティブエージェント。プロビジョニングモードでは、バイヤーの意図を宣言し、セラーが内部でアカウントをプロビジョニングまたはリンクします。バイヤー宣言アカウント(require_operator_auth: false)にはプロビジョニングモードを使い、後続のリクエストには自然キー(brand + operator)を使用します。セラーは内部ハンドルとして account_id をエコーしてもよい(MAY)が、この方法でプロビジョニングされたアカウントについて自然キーの AccountRef を受け入れ続けなければなりません(MUST)。アカウント ID 名前空間では、セラーが割り当てたアカウント ID を list_accounts またはアウトオブバンドのオンボーディングで探索します。アカウント ID 名前空間の sync_accounts プロビジョニングは、将来の明示的なケイパビリティがそのモードを宣言しない限りスコープ外です。そのようなセラーが今日 sync_accounts を公開する場合、account_id でキーされる設定更新モードにのみ使用します。
応答時間: 約1秒。アカウントプロビジョニングは同期的; 与信審査や法的レビューには人間の対応が必要な場合がある(setup.url 付きの status: "pending_approval" で示されます)。
リクエストスキーマ: /schemas/v3/account/sync-accounts-request.json
レスポンススキーマ: /schemas/v3/account/sync-accounts-response.json
クイックスタート
単一の広告主アカウントを同期して結果のステータスを確認します。リクエストパラメーター
アカウントエントリのフィールド:
自然キー: タプル
(brand, operator, sandbox) がアカウント関係を一意に識別します。{brand: {domain: "acme-corp.com"}, operator: "acme-corp.com"}(直接)は {brand: {domain: "acme-corp.com"}, operator: "pinnacle-media.com"}(代理店経由)とは異なるアカウント。sandbox: true を追加すると、同じブランド/オペレーターのペアに対してサンドボックスアカウントがプロビジョニングされる — 実際のプラットフォーム呼び出しや請求なし。
レスポンス
成功レスポンス: アカウントごとの結果を含むaccounts 配列を返します。操作が成功しても、個々のアカウントが保留中、拒否、または失敗することがあります。
エラーレスポンス:
errors— 操作レベルのエラーの配列(認証失敗、サービス利用不可)。accounts配列は含まれない。
accounts または errors のいずれか一方のみ、両方は含まれない。
アカウントごとのフィールド:
アカウントステータス
非同期通知
push_notification_config が提供され、セラーが pending_approval を返した場合、アカウントステータスが変更されると(例: 承認 → active、拒否 → rejected)、セラーはWebhook通知を送信します。
プロビジョニングリクエストでは、通知ペイロードに (brand, operator) の自然キーが含まれるため、バイヤーは元の同期リクエストと関連付けられます。セラーがセラー割り当ての account_id も返す場合、通知は便宜ハンドルとしてそれを含みます。バイヤーは後続の呼び出しについて依然セラーの宣言されたアカウント参照モデルに従います。
push_notification_config を提供しなかった場合、ステータス変更を確認するために list_accounts をポーリングします。
2つのモード: プロビジョニング vs. 設定更新
各アカウントごとのエントリは 2 つのキー形状の 1 つを使い、両方を使うことはありません:- プロビジョニングモード — エントリルートにフラットな
brand+operator+billing。セラーはアカウントをプロビジョニングまたはアップサートします。バイヤー宣言アカウント(require_operator_auth: false)に使用。これは AdCP 3.0 が出荷した形状です。セラーはaccount_idをエコーしてもよい(MAY)が、自然キーのAccountRefは後続の呼び出しで有効なままです。 - 設定更新モード — エントリルートに
account(AccountRef)、brand/operator/billingは不在。セラーはアカウントの設定可能な状態を更新します — プロビジョニングの副作用なし。セラーがこのタスクを通じて設定更新を公開する場合のアカウント ID 名前空間にのみ使用。上流管理のアカウントはlist_accountsで探索し、セラー定義のアカウント ID はアウトオブバンドで供給されます。バイヤー宣言アカウントセラーも、以前にプロビジョニングしたアカウントに対する設定更新にこのモードを受け入れてもよい(MAY)。
oneOf で排他性を強制します — 同じエントリに両方の形状を送ることは検証エラーです。設定更新モードを実装しないセラーは account でキーされたエントリを UNSUPPORTED_PROVISIONING で拒否します。sync_accounts を通じてプロビジョニングしないセラー(アカウント ID 名前空間を含む)は、同じコードで自然キープロビジョニングエントリを拒否します。
アカウントレベルの Webhook サブスクリプション
notification_configs[] は、ライフサイクルが単一のメディアバイより長く続く通知向けのアカウントレベル Webhook サブスクライバーを運びます — creative.status_changed、creative.purged、ホールセールフィード変更 Webhook(product.*、signal.*、wholesale_feed.bulk_change)、および notification-type.json にそれらのイベントタイプが追加された後の将来のアカウントアンカーリソースイベント。
これはアカウントオブジェクトのライフサイクルイベントストリームではありません。今日 account.created、account.updated、account.status_changed、account.closed の通知タイプはありません。アカウントステータスの変更は list_accounts をポーリングするか、sync_accounts プロビジョニングリクエストの非同期結果についてはこのタスクの push_notification_config を通じて観測します。
これらのイベントタイプでは、「ホールセールフィード」はセラーの購入可能なホールセールプロダクトと get_products または get_signals が返すシグナルフィードを意味します。sync_catalogs が管理するバイヤー提供のフィードではありません。
両方のプロビジョニングと設定更新モードで許可されます。宣言的セマンティクス:
notification_configsを省略すると、アカウントの既存のサブスクライバーを変更しません。notification_configs: []を送ると、そのアカウントのすべてのサブスクライバーを削除します。- 非空の配列を送ると、アカウントの現在のセットを提出されたセットで置き換えます。
subscriber_id は安定した論理キーです。既存の (account_id, subscriber_id) を異なる url、event_types、authentication、active 値で再送すると、重複を作るのではなくそのサブスクライバーのアクティブ設定を置き換えます。セラーは提出された配列を永続状態とマージしてはなりません(MUST NOT): subscriber_id が送信配列に現れない永続化されたサブスクライバーは削除されます。一時停止されたエントリ(active: false)は同じ置き換えセマンティクスの対象です。一時停止されたサブスクリプションを保持するには、送信配列に active: false で再度含めます。同じ提出配列内の重複した subscriber_id 値は無効です。置き換えはアカウントスコープです。同じ subscriber_id は別のアカウントで再利用してもよい(MAY)。
提出された置き換えセットの任意のエントリが検証またはアクティベーション証明に失敗した場合、セラーはそのアカウントエントリを action: "failed" で拒否し、アカウントの以前の notification_configs[] セットを変更しないままにします。セラーは置き換えセットを部分適用して失敗したサブスクライバーのみを黙って落としてはなりません(MUST NOT)。
各エントリは次を持ちます:
subscriber_id— バイヤー供給の識別子、アカウント内で一意。マルチサブスクライバーアカウントがエンドポイントでルーティングできるよう、すべての発火でエコーされるurl— HTTPS エンドポイント URL。セラーは、新規または変更されたアクティブサブスクライバーをアクティブとして扱う前に、エンドポイントアクティベーションチャレンジまたは同等の制御証明を完了しなければならない(MUST)。event_types[]— サブスクライバーが望むタイプ。アカウントアンカータイプのみ許可(今日:creative.status_changed、creative.purged、product.created、product.updated、product.priced、product.removed、signal.created、signal.updated、signal.priced、signal.removed、wholesale_feed.bulk_change)。セラーは任意のメディアバイアンカータイプ(scheduled、final、delayed、adjusted、impairment)とaccount.status_changedのような未定義のアカウントライフサイクル名を、accounts[].errors[]のINVALID_REQUESTまたはVALIDATION_ERRORでアカウントごとの検証失敗として拒否しなければならず(MUST)、error.fieldは無効なevent_typesエントリを指さなければならない(MUST)。authentication(オプション)— レガシー Bearer または HMAC-SHA256。デフォルトの RFC 9421 Webhook プロファイルを使うには省略。存在する場合、push_notification_config.authenticationと同じ署名付き登録のダウングレード耐性ルールが適用されます。クレデンシャルは書き込み専用 — セラーは読み取り時に省略します。active(デフォルトtrue)— 登録を削除せずにサブスクライバーを一時停止するにはfalseを設定。セラーはactive: falseの間アウトバウンド証明チャレンジのみスキップしてもよい(MAY)。書き込み時に HTTPS パース、ホスト名正規化、予約範囲拒否を依然強制しなければならない(MUST)。一時停止されたサブスクライバーは再アクティベートされるまで発火を受け取ってはならない(MUST NOT)。再アクティベーションは、現在の有効な証明がない任意のタプルについて、接続ピン留め付きの完全な SSRF 検証と制御証明を繰り返さなければならない(MUST)。
エンドポイントの制御証明
エントリをactive: true として永続化またはエコーする前に、セラーは URL を検証し、Webhook URL validation の SSRF ルールを適用し、レシーバーがエンドポイントを制御することを証明しなければなりません(MUST)。
証明は、タプル (account_id, subscriber_id, normalized url, authentication mode/credential binding, normalized event_types) について現在の有効な証明がないときに必要です。サブスクライバー ID、正規化 URL、認証モード/クレデンシャルバインディング、event_types[] を変更すると、新しいセットがアクティブになる前に新しい証明が必要です。チャレンジ POST 自体は、候補設定がレガシー配信認証を選択しても、セラーの RFC 9421 Webhook プロファイル鍵で署名されなければなりません(MUST)。新しい署名者は adcp_use: "request-signing" を使用。非推奨の webhook-signing 鍵は互換期間中も受け入れられます。レシーバーは RFC 9421 署名を検証しなければならず(MUST)、seller_agent_url、delivery_auth、event_types が保留中の登録に一致しない限りチャレンジを拒否しなければなりません(MUST)。セラーは独自の証明有効期限ポリシーで再チャレンジしてもよい(MAY)。
標準チャレンジは、type、challenge、account_id、subscriber_id、seller_agent_url、delivery_auth、event_types を含む JSON ボディを持つ候補 url への HTTPS POST です。正準スキーマは webhook-challenge.json と webhook-challenge-response.json です。
2xx を返して制御を証明します:
2xx、不正、不一致、タイムアウトのチャレンジは証明失敗を意味します。セラーは SSRF 検証と同じアウトバウンドフェッチ上限(10 秒接続、10 秒読み取り)を使うべきで(SHOULD)、sync_accounts のクリティカルパスで最大 1 回の初回チャレンジ POST を行うべきです(SHOULD)。セラーは、同じチャレンジ値を使いリクエスト予算内で完了する場合、返す前に 1 回の一時的ネットワーク失敗をリトライしてもよい(MAY)。そうでなければバイヤーは sync_accounts を再送してリトライします。
証明失敗時、セラーは action: "failed"、errors[].code: "VALIDATION_ERROR"(不正 URL には INVALID_REQUEST)、accounts[i].notification_configs[j].url を指す error.field を持つアカウントごとの失敗を返します。以前の永続化されたサブスクライバーセットは変更されません。dry_run: true はネットワークチャレンジを送ってはなりません(MUST NOT)。構造検証と何が証明を必要とするかのみを報告できます。
例 — アカウント ID 名前空間アカウントにバイヤー側エンドポイントと監査バスを登録:
sync_governance で登録されたガバナンスエージェントは、これらの Webhook に暗黙的にサブスクライブされません。ガバナンスエージェントもクリエイティブライフサイクルの発火を受け取るべき場合、その URL を別個の notification_configs[] エントリとして登録します — 明示的、監査可能、独自の event_types[] フィルター付き。
適用された状態は list_accounts で検証します — レスポンスはクレデンシャルを秘匿した現在の永続化された notification_configs[] をアカウントごとに運びます。sync_accounts も、リクエストが notification_configs を含んだか、任意の永続化されたサブスクライバーがすでに存在する場合、created、updated、unchanged の結果で現在のサニタイズされたセットをエコーします。
ホールセールフィード通知は、別個のサブスクリプションタスクではなくここで登録されます。Webhook ボディは wholesale-feed-webhook.json です: 変更されたプロダクト、シグナル、またはバルク変更サマリーに加え、変更後の wholesale_feed_version を運びます。セラーは各 Webhook を発行する前に、対応するホールセール読み取りが使うのと同じサブスクライバーごとの認可とスコープ述語を適用しなければなりません(MUST)。レシーバーはペイロードをローカルミラーに適用してもよい(MAY)。逃した/信頼できないプッシュの修復と、支出や権限をバインドする前には if_wholesale_feed_version 付きの get_products / get_signals を使います。ケイパビリティ宣言とイベントセマンティクスは wholesale_feed_webhooks を参照。
一般的なシナリオ
複数のブランドを同期する代理店
ブランドによる直接購入
拒否の処理
セラーがリクエストを拒否した場合、アカウントエントリはstatus: "rejected" を持ちます。
エラーハンドリング
次のステップ
- list_accounts — 保留中のアカウントのステータス変更をポーリング
- sync_governance — ガバナンスエージェントをアカウントに同期
- アカウントとエージェント — 請求モデル、信頼モデル、認可オペレーター
- ブランドプロトコル — セラーエージェントが
brand.domainからブランドアイデンティティを解決する方法 - get_adcp_capabilities — アカウントを同期する前に
supported_billingとrequire_operator_authを確認