FLEDGE API デベロッパー ガイド

この記事の対象者

この記事は、試験運用版の Protected Audience API の現在のイテレーションを技術的に説明するものです。

Protected Audience とは

Protected Audience API は、リマーケティングとカスタム オーディエンスのユースケースをサポートするプライバシー サンドボックスの提案です。サードパーティがサイト間でユーザーのブラウジング行動をトラッキングできないように設計されています。この API により、ブラウザによるデバイス上のオークションが可能になり、ユーザーが以前にアクセスしたウェブサイトに関連性の高い広告を選択できます。

Protected Audience は、TURTLEDOVE ファミリーの提案のうち、Chromium で実装された最初の試験運用版です。

次の図は、FLEDGE のライフサイクルの概要を示しています。

FLEDGE ライフサイクルの各ステージの概要を示すイラスト
FLEDGE ライフサイクル。

Protected Audience を試すにはどうすればよいですか?

Protected Audience のデモ

広告主様とパブリッシャー様のサイトにまたがる Protected Audience の基本的なデプロイのチュートリアルについては、protected-audience-demo.web.app をご覧ください。

デモ動画では、デモコードの仕組みと、Chrome DevTools を使用して Protected Audience のデバッグを行う方法について説明しています。

Protected Audience オリジン トライアルに参加する

プライバシー サンドボックスの関連性と測定に関する オリジン トライアルが、Protected Audience、TopicsAttribution Reporting API について、パソコン版 Chrome ベータ版 101.0.4951.26 以降で利用可能になりました。

参加するには、オリジン トライアル トークンに登録してください。

トライアルに登録が完了したら、有効なトライアル トークンを提供するページで Protected Audience JavaScript API を試すことができます。たとえば、ブラウザに1 つ以上のインタレスト グループに参加し、広告オークションを実行して広告を選択して表示するよう指示できます。

Protected Audience のデモでは、Protected Audience のエンドツーエンド デプロイの基本的な例を確認できます。

Protected Audience API コードを実行するすべてのページにトライアル トークンを指定します。

  • <head> 内のメタタグとして:

    <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">

  • HTTP ヘッダーの場合:

    Origin-Trial: TOKEN_GOES_HERE

  • プログラムでトークンを指定する:

    const otMeta = document.createElement('meta');
    otMeta.httpEquiv = 'origin-trial';
    otMeta.content = 'TOKEN_GOES_HERE';
    document.head.append(otMeta);
    

Protected Audience コードを実行する iframe(インタレスト グループ オーナーによる navigator.joinAdInterestGroup() 呼び出しなど)は、オリジンに一致するトークンを指定する必要があります。

Protected Audience の最初のオリジン トライアルの詳細では、最初のトライアルの目標とサポートされている機能について詳しく説明しています。

この API をテストする

デスクトップ版 Chrome ベータ版 101.0.4951.26 以降では、1 人のユーザーに対して Protected Audience をテストできます。

  • chrome://settings/adPrivacy ですべての広告プライバシー API を有効にします。
  • コマンドラインからフラグを設定する。

iframe またはフェンス付きフレームで広告をレンダリングする

広告は、設定されているフラグに応じて、<iframe> または <fencedframe> でレンダリングされます。

<fencedframe> を使用して広告をレンダリングするには:

--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,FencedFrames

<iframe> を使用して広告をレンダリングするには:

--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,AllowURNsInIframes --disable-features=FencedFrames

BiddingAndScoringDebugReportingAPI フラグを追加して、一時的なデバッグ損失/勝利レポート方法を有効にします。

フラグを使用して Chromium を実行するでは、Chrome や他の Chromium ベースのブラウザをコマンドラインから実行するときにフラグを設定する方法について説明します。Protected Audience フラグの一覧については、Chromium のコード検索をご覧ください。

最新バージョンの Chrome でサポートされている機能

Protected Audience は、Protected Audience プロポーザルの次の機能をテストする最初の試験運用版として、Chromium の機能フラグの背後で利用可能になっています。

  • インタレスト グループ: 広告の入札とレンダリングを構成するメタデータとともにブラウザによって保存されます。
  • 購入者(DSP または広告主)によるデバイス上の入札: 保存されたインタレスト グループと販売者からのシグナルに基づきます。
  • 販売者(SSP またはパブリッシャー)によるデバイス上の広告選択: オークションの入札単価と購入者からのメタデータに基づきます。
  • 一時的に緩和されたバージョンのフェンスド フレームでの広告レンダリング: 広告レンダリングにネットワーク アクセスとロギングが許可されます。

API の解説では、機能のサポートと制約について詳しく説明しています。

インタレスト グループの権限

Protected Audience の現在の実装では、デフォルトで、ページ内の任意の場所(クロスドメイン iframe からでも)から joinAdInterestGroup() を呼び出すことができます。今後、サイト所有者がクロスドメイン iframe の権限ポリシーを調整する時間ができたら、説明で説明されているように、クロスドメイン iframe からの呼び出しを禁止する予定です。

Key-Value サービス

Protected Audience 広告オークションの一環として、ブラウザは Key-Value サービスにアクセスできます。このサービスは、キャンペーンの残りの予算などの情報を広告購入者に提供するために、単純な Key-Value ペアを返します。Protected Audience の提案では、このサーバーが「イベントレベルのロギングを行わず、これらのリクエストに基づくその他の副作用がない」ことが義務付けられています

Protected Audience の Key/Value サービス コードが、プライバシー サンドボックスの GitHub リポジトリで公開されました。このサービスは、Chrome デベロッパーと Android デベロッパーが使用できます。ステータスの最新情報については、お知らせのブログ投稿をご覧ください。Protected Audience Key-Value サービスの詳細については、API の説明信頼モデルの説明をご覧ください。

最初のテストでは、「BYOS(Bring Your Own Server)」モデルが使用されます。長期的には、広告テクノロジーは、高信頼実行環境で実行されるオープンソースの Protected Audience Key-Value サービスを使用して、リアルタイム データを取得する必要があります。

エコシステムが十分なテスト時間を確保できるように、サードパーティ Cookie のサポート終了後しばらくは、オープンソースの Key-Value サービスや TEE の使用は必須となりません。この移行が行われる前に、デベロッパーがテストと導入を開始できるよう、十分な通知をいたします。

機能のサポートを検出する

API を使用する前に、ブラウザでサポートされていること、ドキュメントで使用できることを確認してください。

'joinAdInterestGroup' in navigator &&
  document.featurePolicy.allowsFeature('join-ad-interest-group') &&
  document.featurePolicy.allowsFeature('run-ad-auction') ?
  console.log('navigator.joinAdInterestGroup() is supported on this page') :
  console.log('navigator.joinAdInterestGroup() is not supported on this page');

Protected Audience をオプトアウトするにはどうすればよいですか?

Protected Audience API へのアクセスは、サイト所有者または個々のユーザーとしてブロックできます。

サイトによるアクセス制御の仕組み

Protected Audience では、Protected Audience 機能を利用できるように、サイトに権限ポリシーの設定が求められるようになります。これにより、サイトの管理者が認識していないサードパーティが API を使用できないようにします。ただし、最初のオリジン トライアル中のテストを容易にするため、この要件はデフォルトで免除されます。テスト期間中に Protected Audience 機能を明示的に無効にするサイトは、関連する権限ポリシーを使用してアクセスをブロックできます。

Protected Audience の権限ポリシーは 2 つあり、それぞれ独立して設定できます。

  • join-ad-interest-group ブラウザをインタレスト グループに追加する機能を有効または無効にします
  • run-ad-auction は、オンデバイス オークションを実行する機能を有効または無効にします。

Protected Audience API へのアクセスは、HTTP レスポンス ヘッダーで次の権限ポリシーを指定することによって、ファーストパーティ コンテキストで完全に無効にできます。

Permissions-Policy: join-ad-interest-group=(), run-ad-auction=()

iframe で API の使用を無効にするには、iframe 要素に次の allow 属性を追加します。

<iframe src="https://example.com" allow="join-ad-interest-group 'none'; run-ad-auction 'none'"></iframe>

詳しくは、Protected Audience の最初のオリジン トライアルの権限に関する提案されたポリシーをご覧ください。

ユーザー オプトアウト

ユーザーは、次のいずれかのメカニズムを使用して、Protected Audience API やその他のプライバシー サンドボックス機能へのアクセスをブロックできます。

  • Chrome の設定でプライバシー サンドボックスのトライアルを無効にします。[設定] > [セキュリティとプライバシー] > [プライバシー サンドボックス] に移動します。これは chrome://settings/adPrivacy でもアクセスできます。
  • Chrome 設定でサードパーティ Cookie を無効にする: [設定] > [プライバシーとセキュリティ]。
  • chrome://settings/cookies で [Cookie と他のサイトデータ] を [サードパーティの Cookie をブロックする] または [すべての Cookie をブロックする] に設定します。
  • シークレット モードを使用する。

Protected Audience の解説では、API 設計要素の詳細と、API がプライバシー目標を達成する方法について説明しています。

Protected Audience ワークレットをデバッグする

Chrome Canary 98.0.4718.0 以降では、Chrome DevTools 内で Protected Audience ワークレットをデバッグできます。

まず、[ソース] パネルの [イベント リスナーのブレークポイント] ペインで新しいカテゴリを使用してブレークポイントを設定します。

Chrome Canary のデベロッパー ツールのスクリーンショット。ソースパネルの [イベント リスナー ブレークポイント] ペインがハイライト表示されています。[広告オークションのワークレット] で [ビッダーの入札フェーズの開始] が選択されている。

ブレークポイントがトリガーされると、ワークレット スクリプトの最上位レベルの最初のステートメントの前に実行が一時停止します。通常のブレークポイントまたはステップ コマンドを使用して、入札/スコアリング/レポート機能自体に移動できます。

ライブ ワークレット スクリプトも [スレッド] パネルに表示されます。

Chrome Canary のデベロッパー ツールのスクリーンショット。[ソース] パネルの [スレッド] ペインがハイライト表示されており、一時停止されている現在のワークレット スクリプトが表示されています。

一部のワークレットは並列で実行されるため、複数のスレッドが「一時停止」状態になることがあります。スレッドリストを使用してスレッドを切り替え、必要に応じてスレッドを再開または詳細に検査できます。

Protected Audience イベントをモニタリングする

Chrome DevTools の [Application] パネルでは、Protected Audience のインタレスト グループとオークション イベントをモニタリングできます。

Protected Audience が有効になっているブラウザで Protected Audience のデモ ショッピング サイトにアクセスすると、DevTools に join イベントに関する情報が表示されます。

Chrome Canary の DevTools の [Application] パネル。Protected Audience インタレスト グループの参加イベントに関する情報が表示されています。

Protected Audience が有効になっているブラウザで Protected Audience デモ パブリッシャー サイトにアクセスすると、DevTools に bid イベントと win イベントに関する情報が表示されます。

Chrome Canary の DevTools の [Application] パネル。Protected Audience オークションの入札と落札イベントに関する情報が表示されています。

Protected Audience API の仕組み

この例では、ユーザーがカスタム自転車メーカーのウェブサイトを閲覧した後、ニュース ウェブサイトにアクセスすると、その自転車メーカーの新しい自転車の広告が表示されます。

1. ユーザーが広告主のサイトにアクセスする

ノートパソコンのブラウザでカスタム自転車メーカーのサイトにアクセスしている人物を示すイラスト。

ユーザーがカスタム自転車メーカー(この例では広告主)のウェブサイトにアクセスし、手作りのスチール製自転車の商品ページで一定の時間を過ごしたとします。これにより、自転車メーカーはリマーケティングの機会を得ることができます。

2. ユーザーのブラウザにインタレスト グループを追加するよう求められる

ノートパソコンのブラウザでサイトを閲覧している人物のイラスト。JavaScript コード joinAdInterestGroup() がブラウザで実行されています。

説明セクション: ブラウザがインタレスト グループを記録する

広告主様のデマンドサイド プラットフォーム(DSP)(または広告主様自身)が navigator.joinAdInterestGroup() を呼び出して、ブラウザがメンバーであるグループのリストにインタレスト グループを追加するようブラウザにリクエストします。この例では、グループの名前は custom-bikes、オーナーは dsp.example です。ステップ 4 で説明する広告オークションでは、インタレスト グループのオーナー(この場合は DSP)が購入者になります。インタレスト グループのメンバーシップは、ブラウザによってユーザーのデバイスに保存され、ブラウザ ベンダーや他のユーザーと共有されることはありません。

joinAdInterestGroup() には次の権限が必要です。

  • アクセス先のサイト
  • インタレスト グループのオーナー

たとえば、dsp.example の権限なしで、dsp.example をオーナーとして joinAdInterestGroup() を呼び出すことはできません。malicious.example

アクセス先のサイトの許可

同じオリジン: デフォルトでは、アクセス先のサイトと同じオリジン(つまり、現在のページの最上位フレームと同じオリジン)からの joinAdInterestGroup() 呼び出しに対して、暗黙的に権限が付与されます。サイトは、Protected Audience の権限ポリシー ヘッダーjoin-ad-interest-group ディレクティブを使用して、joinAdInterestGroup() 呼び出しを無効にできます。

クロスオリジン: 現在のページとは異なるオリジンから joinAdInterestGroup() を呼び出すには、訪問先のサイトで、クロスオリジン iframe からの joinAdInterestGroup() の呼び出しを許可する権限ポリシーが設定されている必要があります。

興味 / 関心グループのオーナーの許可

興味 / 関心グループのオーナー権限は、興味 / 関心グループのオーナーと同じオリジンを持つ iframe から joinAdInterestGroup() を呼び出すことで暗黙的に付与されます。たとえば、dsp.example iframe は、dsp.example が所有するインタレスト グループの joinAdInterestGroup() を呼び出すことができます。

joinAdInterestGroup() は、オーナーのドメイン内のページまたは iframe で実行することも、.well-known URL のリストを使用して提供される他のドメインに委任することもできます。

navigator.joinAdInterestGroup() を使用する

API の使用例を次に示します。

const interestGroup = {
  owner: 'https://dsp.example',
  name: 'custom-bikes',
  biddingLogicUrl: ...,
  biddingWasmHelperUrl: ...,
  dailyUpdateUrl: ...,
  trustedBiddingSignalsUrl: ...,
  trustedBiddingSignalsKeys: ['key1', 'key2'],
  userBiddingSignals: {...},
  ads: [bikeAd1, bikeAd2, bikeAd3],
  adComponents: [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2],
};

navigator.joinAdInterestGroup(interestGroup, 7 * kSecsPerDay);

関数に渡される interestGroup オブジェクトのサイズは 50 KiB 以下にする必要があります。それ以外の場合、呼び出しは失敗します。2 番目のパラメータには、インタレスト グループの期間を指定します。期間は 30 日以内にする必要があります。連続して呼び出すと、以前に保存された値が上書きされます。

インタレスト グループのプロパティ

プロパティ 必須 ロール
owner 必須 'https://dsp.example' インタレスト グループのオーナーのオリジン。
name 必須 'custom-bikes' インタレスト グループの名前。
biddingLogicUrl** 省略可* 'https://dsp.example/bid/custom-bikes/bid.js' ワークレットで実行される入札 JavaScript の URL。
biddingWasmHelperUrl** 省略可* 'https://dsp.example/bid/custom-bikes/bid.wasm' biddingLogicUrl から駆動される WebAssembly コードの URL。
dailyUpdateUrl** 省略可 'https://dsp.example/bid/custom-bikes/update' 興味 / 関心グループの属性を更新する JSON を返す URL。(インタレスト グループを更新するをご覧ください)。
trustedBiddingSignalsUrl** 省略可 'https://dsp.example/trusted/bidding-signals' ビッダーの信頼できるサーバーの Key-Value リクエストのベース URL。
trustedBiddingSignalsKeys 省略可 ['key1', 'key2' ...] Key-Value 信頼できるサーバーのリクエスト用のキー。
userBiddingSignals 省略可 {...} 所有者が入札時に使用できる追加のメタデータ。
ads 省略可* [bikeAd1, bikeAd2, bikeAd3] このインタレスト グループに表示される可能性がある広告。
adComponents 省略可 [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2] 複数の要素で構成される広告のコンポーネント。

* ownername を除くすべてのプロパティは省略可能です。biddingLogicUrl プロパティと ads プロパティは省略可能ですが、オークションに参加するには必須です。ただし、これらのプロパティのないインタレスト グループを作成するユースケースもあります。たとえば、インタレスト グループのオーナーが、まだ配信されていないキャンペーンや将来の使用のために、インタレスト グループにブラウザを追加する場合や、広告予算が一時的に不足している場合などです。

** biddingLogicUrlbiddingWasmHelperUrldailyUpdateUrltrustedBiddingSignalsUrl の URL は、所有者と同一のオリジンを持つ必要があります。adsadComponents の URL にはこのような制約はありません。

インタレスト グループの属性を更新する

dailyUpdateUrl には、navigator.joinAdInterestGroup() に渡されるインタレスト グループ オブジェクトに対応する、インタレスト グループのプロパティを定義する JSON を返すウェブサーバーを指定します。これにより、グループのオーナーが興味 / 関心グループの属性を定期的に更新できるメカニズムが提供されます。現在の実装では、次の属性を変更できます。

  • biddingLogicUrl
  • biddingWasmHelperUrl
  • trustedBiddingSignalsUrl
  • trustedBiddingSignalsKeys
  • ads
  • priority

JSON で指定されていないフィールドは上書きされません(JSON で指定されたフィールドのみが更新されます)。一方、navigator.joinAdInterestGroup() を呼び出すと、既存のインタレスト グループが上書きされます。

更新はベスト エフォートであり、次の条件で失敗する可能性があります。

  • ネットワーク リクエストのタイムアウト(現在は 30 秒)。
  • その他のネットワーク障害。
  • JSON 解析エラー。

更新に連続して費やされた時間が長すぎる場合も、更新がキャンセルされることがあります。ただし、キャンセルされた(残りの)更新にはレート制限は適用されません。更新は 1 日あたり 1 回までに制限されています。ネットワーク エラーが原因で失敗した更新は 1 時間後に再試行され、インターネットの切断が原因で失敗した更新は、再接続時にすぐに再試行されます。

手動アップデート

現在のフレームのオリジンが所有するインタレスト グループの更新は、navigator.updateAdInterestGroups() を使用して手動でトリガーできます。レート制限により、更新が頻繁に行われないようにします。navigator.updateAdInterestGroups() の呼び出しを繰り返しても、レート制限期間(現在は 1 日)が経過するまで何も実行されません。同じインタレスト グループ ownername に対して navigator.joinAdInterestGroup() が再度呼び出されると、レート制限がリセットされます。

自動更新

オークション用に読み込まれたすべてのインタレスト グループは、オークションの完了後に自動的に更新されます。手動更新と同じレート制限が適用されます。オークションに参加しているインタレスト グループが 1 つ以上あるオーナーごとに、navigator.updateAdInterestGroups() がそのオーナーと一致するオリジンの iframe から呼び出されたように見えます。

インタレスト グループの広告を指定する

ads オブジェクトと adComponents オブジェクトには、広告クリエイティブの URL が含まれます。また、入札時に使用できる任意のメタデータも含まれます。次に例を示します。

{
  renderUrl: 'https://cdn.example/.../bikeAd1.html',
  metadata: bikeAd1metadata // optional
}

購入者はどのように入札しますか?

インタレスト グループのオーナーが提供する biddingLogicUrl のスクリプトには、generateBid() 関数を含める必要があります。広告スペースの販売者が navigator.runAdAuction() を呼び出すと、ブラウザがメンバーであるインタレスト グループごとに generatedBid() 関数が 1 回呼び出されます(インタレスト グループのオーナーが入札に招待されている場合)。つまり、generateBid() は候補広告ごとに 1 回呼び出されます。販売者は、navigator.runAdAuction() に渡されるオークション構成パラメータに decisionLogicUrl プロパティを提供します。この URL のコードには、generateBid() によって返された各入札単価にスコアを付けるために、オークションの各ビッダーに対して実行される scoreAd() 関数を含める必要があります。

広告枠購入者が提供する biddingLogicUrl のスクリプトには、generateBid() 関数を含める必要があります。この関数は、候補広告ごとに 1 回呼び出されます。runAdAuction() は、各広告と関連する入札単価とメタデータを個別にチェックし、広告に数値的な優先度スコアを割り当てます。

generateBid(interestGroup, auctionSignals, perBuyerSignals,
    trustedBiddingSignals, browserSignals) {
  ...
  return {
    ad: adObject,
    bid: bidValue,
    render: renderUrl,
    adComponents: [adComponentRenderUrl1, ...]
   };
}

generateBid() は次の引数を取ります。

  • interestGroup
    広告購入者から joinAdInterestGroup() に渡されるオブジェクト。(インタレスト グループは dailyUpdateUrl で更新できます)。

  • auctionSignals
    広告枠の販売者から navigator.runAdAuction() に渡されるオークション構成引数のプロパティ。これにより、ページのコンテキスト(広告サイズやパブリッシャー ID など)、オークションのタイプ(ファーストプライスまたはセカンドプライス)、その他のメタデータに関する情報を取得できます。

  • perBuyerSignals
    auctionSignals と同様に、販売者が navigator.runAdAuction() に渡すオークション構成引数のプロパティ。販売者が購入者のサーバーにリアルタイム ビッダー呼び出しを実行し、レスポンスをパイプバックする SSP である場合、またはパブリッシャー ページが購入者のサーバーに直接接続する場合、購入者のサーバーからページに関するコンテキスト シグナルを取得できます。その場合は、改ざんを防ぐために、generateBid() 内でこれらのシグナルの暗号署名を確認することをおすすめします。

  • trustedBiddingSignals
    興味 / 関心グループの trustedBiddingSignalsKeys がキーで、値が trustedBiddingSignals リクエストで返されるオブジェクト。

  • browserSignals
    ブラウザによって作成されたオブジェクト。ページ コンテキストに関する情報(販売者が偽造できる現在のページの hostname など)や、インタレスト グループ自体のデータ(デバイス上のフリークエンシー キャップを許可するために、グループがオークションで落札した過去の記録など)が含まれている場合があります。

browserSignals オブジェクトには次のプロパティがあります。

{
  topWindowHostname: 'publisher.example',
  seller: 'https://ssp.example',
  joinCount: 3,
  bidCount: 17,
  prevWins: [[time1,ad1],[time2,ad2],...],
  wasmHelper: ... /* WebAssembly.Module object based on interest group's biddingWasmHelperUrl. */
  dataVersion: 1, /* Data-Version value from the buyer's Key/Value service response(s). */
}

bid 値を計算するには、generateBid() のコードで関数のパラメータのプロパティを使用します。次に例を示します。

function generateBid(interestGroup, auctionSignals, perBuyerSignals,
    trustedBiddingSignals, browserSignals) {
  return {
    ...
    bid: auctionSignals.is_above_the_fold ? perBuyerSignals.atf_value : perBuyerSignals.btf_value,
    ...
  }
}

generateBid() は、次の 4 つのプロパティを持つオブジェクトを返します。

  • ad
    広告に関する任意のメタデータ(この入札または広告クリエイティブについて販売者が把握することを期待する情報など)。販売者](/resources/glossary#ssp) は、この情報をオークションと広告クリエイティブの決定に使用します。販売者は、この情報をオークションと意思決定ロジックで使用します。

  • bid
    オークションに入力される数値の入札単価。販売者は、さまざまな購入者の入札を比較できる必要があります。そのため、入札単位は販売者が選択した単位(「1, 000 件あたりの米ドル」など)にする必要があります。入札単価がゼロまたは負の場合、このインタレスト グループは販売者のオークションにはまったく参加しません。このメカニズムにより、購入者は広告の表示と非表示の場所について、広告主ルールを適用できます。

  • render
    この入札単価がオークションで落札した場合にクリエイティブのレンダリングに使用される URL または URL のリスト。(API の説明の複数の部分で構成される広告をご覧ください)。この値は、インタレスト グループに定義された広告のいずれかの renderUrl と一致している必要があります。

  • adComponents
    複数の要素で構成される広告のコンポーネントを最大 20 個指定できます。コンポーネントは、navigator.joinAdInterestGroup() に渡されたインタレスト グループ引数の adComponents プロパティから取得されます。

ブラウザにインタレスト グループからの離脱をリクエストする

興味 / 関心グループのオーナーは、興味 / 関心グループからブラウザを削除するようリクエストできます。つまり、ブラウザは、その興味 / 関心グループがメンバーであるリストからそのグループを削除するよう求められます。

navigator.leaveAdInterestGroup({
  owner: 'https://dsp.example',
  name: 'custom-bikes'
});

ユーザーが、インタレスト グループの追加をブラウザに求めたサイトに戻ってきた場合、インタレスト グループのオーナーは navigator.leaveAdInterestGroup() 関数を呼び出して、ブラウザにインタレスト グループの削除をリクエストできます。広告のコードで、インタレスト グループに対してこの関数を呼び出すこともできます。

3. ユーザーが広告スペースを販売するサイトにアクセスする

ノートパソコンのブラウザでニュース ウェブサイトにアクセスしている人物のイラスト。サイトに空の広告スロットがある。

その後、ユーザーが広告スペースを販売しているサイト(この例ではニュース ウェブサイト)にアクセスします。サイトに広告枠があり、リアルタイム ビッダーを使用してプログラムで販売している。

4. 広告オークションがブラウザで実行される

ノートパソコンのブラウザでニュース ウェブサイトを閲覧している人物のイラスト。Protected Audience API を使用した広告オークションが行われています。

説明セクション: 販売者がオンデバイス オークションを実施する

広告オークションは、パブリッシャーの SSP またはパブリッシャー自体によって実施される可能性があります。オークションの目的は、現在のページで利用可能な単一の広告スロットに最も適した広告を選択することです。オークションでは、ブラウザがメンバーである興味/関心グループと、広告スペースの購入者と Key-Value サービスの販売者のデータが考慮されます。

広告枠の販売者navigator.runAdAuction() を呼び出して、広告オークションを開始するようユーザーのブラウザにリクエストします。

次に例を示します。

const auctionConfig = {
  seller: 'https://ssp.example',
  decisionLogicUrl: ...,
  trustedScoringSignalsUrl: ...,
  interestGroupBuyers: ['https://dsp.example', 'https://buyer2.example', ...],
  auctionSignals: {...},
  sellerSignals: {...},
  sellerTimeout: 100,
  perBuyerSignals: {
    'https://dsp.example': {...},
    'https://another-buyer.example': {...},
    ...
  },
  perBuyerTimeouts: {
    'https://dsp.example': 50,
    'https://another-buyer.example': 200,
    '*': 150,
    ...
  },
  componentAuctions: [
    {
      'seller': 'https://some-other-ssp.example',
      'decisionLogicUrl': ...,
      ...
    },
    ...
  ]
};

const auctionResultPromise = navigator.runAdAuction(auctionConfig);

runAdAuction() は、広告オークションの結果を表す URNurn:uuid:<something>)に解決される Promise を返します。これは、レンダリングのためにフェンスド フレームに渡された場合にのみ、ブラウザによってデコードできます。パブリッシャー ページは落札した広告を検査できません。

decisionLogicUrl スクリプトは、個々の広告と、それに関連付けられた入札単価とメタデータを 1 つずつ考慮し、数値的な優先度スコアを割り当てます。

auctionConfig 件の宿泊施設

プロパティ 必須 ロール
seller 必須 'https://ssp.example' 販売者の所在地。
decisionLogicUrl 必須 'https://ssp.example/auction-decision-logic.js' オークション ワークレットの JavaScript の URL。
trustedScoringSignalsUrl 省略可 'https://ssp.example/scoring-signals' 販売者の信頼できるサーバーの URL。
interestGroupBuyers* 必須 ['https://dsp.example', 'https://buyer2.example', ...] オークションへの入札をリクエストされたすべてのインタレスト グループ オーナーのオリジン。
auctionSignals 省略可 {...} ページのコンテキスト、オークションの種類などに関する販売者情報
sellerSignals 省略可 {...} パブリッシャーの設定に基づく情報。コンテキスト広告リクエストなどの作成
sellerTimeout 省略可 100 販売者の scoreAd() スクリプトの最大実行時間(ミリ秒)。
perBuyerSignals 省略可 {'https://dsp.example': {...},
  'https://another-buyer.example': {...},
...}
特定の購入者のサーバーから取得した、その購入者のページに関するコンテキスト シグナル。
perBuyerTimeouts 省略可 50 特定の購入者の generateBid() スクリプトの最大実行時間(ミリ秒)。
componentAuctions 省略可 [{'seller': 'https://www.some-other-ssp.com',
  'decisionLogicUrl': ..., ...},
  ...]
コンポーネント オークションの追加構成。

* 販売者は interestGroupBuyers: '*' を指定して、すべてのインタレスト グループに入札を許可できます。その後、インタレスト グループのオーナーが含まれているかどうか以外の条件に基づいて、広告が承認または拒否されます。たとえば、販売者は広告クリエイティブを審査して、ポリシーに準拠していることを確認する場合があります。

** additionalBids は、Protected Audience の現在の実装ではサポートされていません。詳しくは、Protected Audience の説明のオークション参加者のセクションをご覧ください。

広告はどのように選択されますか?

decisionLogicUrl のコード(runAdAuction() に渡されるオークション構成オブジェクトのプロパティ)には、scoreAd() 関数を含める必要があります。これは、広告ごとに 1 回実行され、広告の魅力を判断します。

scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals, browserSignals) {
  ...
  return desirabilityScoreForThisAd;
}

scoreAd() は次の引数を取ります。

  • adMetadata
    買主が指定した任意のメタデータ。
  • bid
    数値の入札単価。
  • auctionConfig
    navigator.runAdAuction() に渡されるオークション構成オブジェクト。
  • trustedScoringSignals
    オークション時に販売者の信頼できるサーバーから取得される値。広告に対する販売者の意見を表します。
  • browserSignals
    ブラウザによって作成されたオブジェクト。ブラウザが認識し、販売者のオークション スクリプトで検証する必要がある情報が含まれます。
{
  topWindowHostname: 'publisher.example',
  interestGroupOwner: 'https://dsp.example',
  renderUrl: 'https://cdn.example/render',
  adComponents: ['https://cdn.com/ad-component-1', ...],
  biddingDurationMsec: 12,
  dataVersion: 1 /* Data-Version value from the seller's Key/Value service response. */
}

オークションの開始前に、販売者は利用可能な広告スロットに最適なコンテキスト広告を探します。scoreAd() ロジックの一部として、コンテキスト ターゲット広告の落札価格に勝てない広告はすべて拒否されます。

5. 販売者と参加する購入者は、Key/Value サービスからリアルタイム データを受け取ります。

ノートパソコンのブラウザでニュース ウェブサイトを閲覧している人物のイラスト。Protected Audience API を使用した広告オークションが行われており、参加者が Key-Value サービスからデータを取得しています。

説明セクション: Protected Audience Key/Value サービスからリアルタイム データを取得する

広告オークション中に、広告枠の販売者は、navigator.runAdAuction() に渡されたオークション構成引数の trustedScoringSignalsUrl プロパティと、オークション内のすべてのインタレスト グループの ads フィールドと adComponents フィールド内のすべてのエントリの renderUrl プロパティのキーを使用して、Key-Value サービスにリクエストを送信することで、特定の広告クリエイティブに関するリアルタイム データを取得できます。

同様に、広告枠の購入者は、navigator.joinAdInterestGroup() に渡されたインタレスト グループ引数の trustedBiddingSignalsUrl プロパティと trustedBiddingSignalsKeys プロパティを使用して、Key/Value サービスからリアルタイム データをリクエストできます。

runAdAuction() が呼び出されると、ブラウザは各広告購入者の信頼できるサーバーにリクエストを送信します。リクエストの URL は次のようになります。

https://kv-service.example/getvalues?hostname=publisher.example&keys=key1,key2
  • ベース URL は trustedBiddingSignalsUrl から取得されます。
  • hostname はブラウザによって提供されます。
  • keys 値は trustedBiddingSignalsKeys から取得されます。

このリクエストに対するレスポンスは、各キーの値を提供する JSON オブジェクトです。

6. 落札広告が表示される

ノートパソコンのブラウザでニュース ウェブサイトを閲覧している人物のイラスト。自転車の広告(20% オフ)が表示されています。広告がフェンス付きのフレーム内に表示されていることを示すロックが上に表示されています。

説明セクション: ブラウザが落札広告をレンダリングする

前述のように、runAdAuction() によって返された Promise は URN に解決され、レンダリングのためにフェンスド フレームに渡され、サイトに落札広告が表示されます。

7. オークションの結果が報告される

説明セクション: イベントレベルのレポート(現時点では)

販売者の報告結果

説明セクション: レンダリングに関する販売者レポート

decisionLogicUrl で指定された販売者の JavaScript(scoreAd() も指定)には、オークションの結果を報告する reportResult() 関数を含めることができます。

reportResult(auctionConfig, browserSignals) {
  ...
  return signalsForWinner;
}

この関数に渡される引数は次のとおりです。

  • auctionConfig
    navigator.runAdAuction() に渡されるオークション構成オブジェクト。

  • browserSignals
    オークションに関する情報を提供する、ブラウザによって作成されたオブジェクト。例:

    {
      'topWindowHostname': 'publisher.example',
      'interestGroupOwner': 'https://dsp.example',
      'renderUrl': 'https://cdn.example/url-of-winning-creative.wbn',
      'bid:' <bidValue>,
      'desirability': <winningAdScore>
    }
    

この関数の戻り値は、落札者の reportWin() 関数の sellerSignals 引数として使用されます。

落札した入札者の報告結果

説明セクション: レンダリング イベントと広告イベントに関する購入者レポート

落札者の JavaScript(generateBid() も提供)には、オークションの結果を報告する reportWin() 関数を含めることができます。

reportWin(auctionSignals, perBuyerSignals, sellerSignals, browserSignals) {
  ...
}

この関数に渡される引数は次のとおりです。

  • auctionSignalsperBuyerSignals
    落札した入札者の generateBid() に渡された値と同じです。
  • sellerSignals
    reportResult() の戻り値。販売者が購入者に情報を渡すことができます。
  • browserSignals
    オークションに関する情報を提供する、ブラウザによって作成されたオブジェクト。例:

    {
      'topWindowHostname': 'publisher.example',
      'seller': 'https://ssp.example',
      'interestGroupOwner': 'https://dsp.example',
      'interestGroupName': 'custom-bikes',
      'renderUrl': 'https://cdn.example/winning-creative.wbn',
      'bid:' <bidValue>
    }
    

一時的な損失/獲得レポートの実装

Chrome では、オークション レポートを取得する方法として、次の 2 つが暫定的に利用できます。

  • forDebuggingOnly.reportAdAuctionLoss()
  • forDebuggingOnly.reportAdAuctionWin()

これらのメソッドはそれぞれ、オークションの完了後に取得する URL という単一の引数を受け取ります。scoreAd()generateBid() の両方で、異なる URL 引数を使用して複数回呼び出すことができます。

Chrome は、オークションが完了したときにのみ、デバッグ敗北/勝利レポートを送信します。オークションがキャンセルされた場合(新しいナビゲーションによる場合など)、レポートは生成されません。

これらの方法は、Chrome でデフォルトで使用できます。メソッドをテストするには、chrome://settings/adPrivacy ですべての広告プライバシー API を有効にします。Protected Audience を有効にするためにコマンドライン フラグを使用して Chrome を実行している場合は、BiddingAndScoringDebugReportingAPI フラグを指定してメソッドを明示的に有効にする必要があります。フラグが有効になっていない場合でも、メソッドは使用できますが、何もしません。

8. 広告クリックが報告される

ニュース ウェブサイトのフェンスで囲まれたフレーム内の自転車の広告をクリックしている人物のイラスト。販売者と購入者にレポート データが送信されています。

フェンス付きフレームにレンダリングされた広告のクリックが報告されます。詳しくは、フェンスド フレーム広告レポートをご覧ください。



以下の図は、Protected Audience の広告オークションの各段階を示しています。

Protected Audience 広告オークションの各段階の概要を示すイラスト


Protected Audience と TURTLEDOVE の違いは何ですか?

Protected Audience は、TURTLEDOVE ファミリーの提案のうち、Chromium で実装された最初の試験運用版です。

Protected Audience は、TURTLEDOVE の基本原則に準拠しています。一部のオンライン広告は、広告主または広告ネットワークに以前に接触したユーザーに、関心がある可能性のある広告を表示することをベースとしています。これまでは、ウェブサイトをブラウジングしている特定のユーザーを広告主が認識することで実現していましたが、これは今日のウェブにおけるプライバシーに関する主な懸念事項です。

TURTLEDOVE は、このユースケースに対応する新しい API を提供すると同時に、プライバシー保護の重要な進歩を実現することを目的としています。

  • ユーザーが興味を持っていると思われる情報は、広告主ではなくブラウザに保存されます。
  • 広告主はユーザーの興味 / 関心に基づいて広告を配信できますが、その興味 / 関心をユーザーに関する他の情報(特にユーザーの属性やアクセスしているページ)と組み合わせることはできません。

Protected Audience は、TURTLEDOVE と、API を使用するデベロッパーにより適切に機能するよう変更するための関連する提案の集合から生まれました。

  • SPARROW: Criteo は、Trusted Execution Environment(TEE)で実行されるサービスモデル(「ゲートキーパー」)の追加を提案しました。Protected Audience では、リアルタイムのデータ検索と集計レポート用に TEE の使用が制限されています。
  • NextRoll の TERN と Magnite の PARRROT の提案では、オンデバイス オークションにおける購入者と販売者の役割の違いが説明されています。Protected Audience の広告入札/スコアリング フローは、この研究に基づいています。
  • RTB House の TURTLEDOVE の成果ベースプロダクト単位の変更により、オンデバイス オークションの匿名モデルとパーソナライズ機能が改善されました
  • PARAKEET は、ブラウザとアドテック プロバイダ間の TEE で実行されるプロキシ サーバーに依存し、広告リクエストを匿名化してプライバシー プロパティを適用する、TURTLEDOVE のような広告サービスに関する Microsoft の提案です。Protected Audience では、このプロキシ モデルは採用されていません。Google は、PARAKEET と Protected Audience の JavaScript API を統合し、両方の提案の優れた機能をさらに組み合わせるための今後の作業をサポートしています。

Protected Audience では、ユーザーが閲覧した広告をウェブサイトの広告ネットワークが把握できないようにはなっていません。今後、API を変更してよりプライベートなものにしていく予定です。

使用できるブラウザの設定

ユーザーは、chrome://settings/adPrivacy の最上位の設定を有効または無効にすることで、Chrome でのプライバシー サンドボックス(試用版)への参加を調整できます。初期テストでは、このプライバシー サンドボックスの設定を使用して Protected Audience をオプトアウトできます。Chrome では、ユーザーがアクセスしたウェブサイト全体で、ユーザーが追加されたインタレスト グループのリストを表示、管理できるようにする予定です。プライバシー サンドボックス技術自体と同様に、ユーザー設定はユーザーや規制機関からのフィードバックに応じて進化する可能性があります。

Protected Audience の提案が進展するにつれて、テストとフィードバックに基づいて、Chrome で利用可能な設定は引き続き更新されます。今後、Protected Audience と関連データを管理するためのより詳細な設定を提供する予定です。

ユーザーがシークレット モードでブラウジングしている場合、API 呼び出し元はグループ メンバーシップにアクセスできません。また、ユーザーがサイトデータを消去すると、メンバーシップは削除されます。



意見交換とフィードバックの提供

サポートを受ける

実装デモドキュメントについて質問がある場合:

Chrome での Protected Audience API の実装に関してバグや問題がある場合: * API について報告されている既存の問題を確認します。* crbug.com/new で新しい問題を報告してください。

最新情報を入手

補足説明


写真: Ray HennessyUnsplash