以買方身分整合 B&A

出價和競價 (B&A) 服務是一組廣告買方和賣方適用的服務,可在受信任的執行環境 (TEE) 中運作,協助進行 Protected Audience (PA) 競價。本開發人員指南說明買方如何整合 Chrome 適用的 B&A PA 競價。

總覽

如要透過 B&A 服務參與 Protected Audience 競價,買方會更新興趣群組 (IG),以最佳化酬載,進而縮短競價延遲時間。

買方必須執行下列酬載最佳化工作:

出價和競價興趣群組

以下是 B&A PA 競價的興趣群組設定範例,其中已套用酬載最佳化:

navigator.joinAdInterestGroup({
  name: 'example-ig',
  owner: 'https://dsp.example',

  // An ID is mapped to each render URL
  ads: [
    {
      renderURL: 'https://dsp.example/ad.html',
      adRenderId: '12345678' // 12 characters max,
      buyerReportingId: 'brid123', // Optional
      buyerAndSellerReportingId: 'bsrid123', // Optional
      selectableBuyerAndSellerReportingId: ['sbsrid123', 'sbsrid456'], // Optional
    },
  ],
  adComponents: [
    {
      renderURL: 'https://dsp.example/ad-component.html',
      adRenderId: 'abcdefgh'
    },
  ],

  // Flags are set to omit data in the B&A auction payload
  auctionServerRequestFlags: ['omit-ads', 'omit-user-bidding-signals'],

  // Data not included in the B&A auction payload can be fetched as trusted signals
  // The following is an example of how the keys could look, but the actual
  // implementation is up to the ad tech
  trustedBiddingSignalsKeys: [
    'exampleUserBiddingSignalsKey',
    'exampleAdRenderIdKey',
    'exampleAdMetadataKey',
    'exampleAdReportingIdKey',
  ],

  // Optionally, interest groups can be prioritized
  priority: 0.0,
});

B&A 和裝置端興趣群組設定的差異如下:

欄位 B&A IG 裝置端 IG 包含在 B&A 競價酬載中
auctionServerRequestFlags 已使用 未使用
userBiddingSignals 不建議採用 已使用 否,如果已設定 omit-user-bidding-signals 旗標
adRenderId (位於 adsadComponents 中) 已使用 未使用 如果設定 omit-ads 旗標,ads 中的 adRenderId 僅適用於酬載的 browserSignals.prevWins。酬載中不包含 adComponents 中定義的 adRenderId

如果未設定 omit-ads 旗標,則適用於 browserSignals.prevWinsinterestGroup.adRenderIdsinterestGroup.adComponentRenderIds

renderURL (位於 adsadComponents 中) 已使用 已使用
metadata (位於 adsadComponents 中) 未使用 已使用
ads中的報表 ID 已使用 已使用
  • auctionServerRequestFlags 欄位可設定旗標,告知瀏覽器在 B&A 競價酬載中省略部分資料。
  • userBiddingSignals 值可以在興趣群組中定義,但建議使用 omit-user-bidding-signals 旗標省略這些值。您可以使用 K/V 服務提供省略的信號。
  • 系統會一併設定 adRenderId 欄位和相關聯的 renderURL,但只有 adRenderId 會成為 B&A 競價酬載的一部分。稍後在競價期間,從 generateBid() 傳回的算繪網址必須與 IG 中定義的算繪網址相符。
  • 報表 ID 定義於 B&A IG,但不會納入 B&A 競價酬載。稍後在競價期間,從 generateBid() 傳回的報表 ID 必須與 IG 中定義的算繪網址相符。
  • ad.metadata 和報表 ID 不會納入 B&A 競價酬載,而是透過「受信任的鍵/值服務」使用情況提供這些資料。

請注意,ads 中的 renderURL 和報表 ID 仍會在興趣群組設定中定義,但不會納入競價要求酬載,因為瀏覽器會檢查競價服務的 generateBid() 函式傳回的算繪網址和報表 ID,是否與興趣群組中定義的值相符。

joinAdInterestGroup() 項工作

您需要為 joinAdInterestGroup() 呼叫執行下列工作。

設定伺服器要求旗標

joinAdInterestGroup() config 的 auctionServerRequestFlags 欄位接受下列標記:

旗標 說明
omit-user-bidding-signals omit-user-bidding-signals 旗標會省略競價酬載中的 userBiddingSignals 物件。

如果未設定這個旗標,興趣群組中定義的 userBiddingSignals 值就會在競價服務的 generateBid() 中提供。

omit-ads omit-ads 旗標會告知瀏覽器在競價酬載中省略 adsadComponents 物件。

adRenderId 會顯示在 browserSignalsprevWins 屬性中。

如未設定這個標記,generateBid()interestGroup 引數中的 adRenderIdsadComponentRenderIds 欄位會包含相應的廣告算繪 ID。

強烈建議買家選擇 omit-ads 旗標。為進一步最佳化酬載,日後可能會淘汰從用戶端傳遞算繪 ID 和廣告元件算繪 ID 的功能。

系統會透過 trustedBiddingSignals 提供相關資訊,處理遭省略的資料。這些標記可單獨使用,不必一起使用。

使用範例:

navigator.joinAdInterestGroup({
  auctionServerRequestFlags: ['omit-user-bidding-signals', 'omit-ads'],
});

設定廣告顯示 ID

為縮減 B&A 競價酬載的大小,系統會省略興趣群組的 adsadComponents 物件,因此這些物件無法在 Bidding Service 中執行的 generateBid() 函式內使用。

為處理廣告資訊遺失的問題,買方會維護與興趣群組設定中每個廣告相關聯的 ID (adRenderIdadComponentRenderId)。這個 ID 必須是長度不超過 12 個位元組的 DOMString。如果 ID 採用 Base64 編碼,長度不得超過 12 個位元組。

含有廣告顯示 ID 的興趣群組範例:

navigator.joinAdInterestGroup({
  ads: [
    {
      renderURL: 'https://dsp.example/ad.html',
      adRenderId: '12345678' // 12 characters max
    },
  ],
  adComponents: [
    {
      renderURL: 'https://dsp.example/ad-component.html',
      adComponentRenderId: 'abcdefgh'
    },
  ],
});

與廣告相關的 adRenderId 會在 generateBid()prevWins.browserSignals 中提供。

雖然要求酬載中未包含 renderURL,但 generateBid() 傳回的算繪網址必須與興趣群組設定中定義的算繪網址相符。廣告技術可以在 trustedBiddingSignals 中傳回廣告中繼資料和其他資訊,以便在 generateBid() 執行期間,為出價產生廣告顯示網址和廣告元件顯示網址。

設定興趣群組優先順序

Chrome 允許買家設定興趣群組的優先順序。如果達到賣家設定的個別買家酬載大小限制,系統會在為賣家產生 B&A 競價酬載時,使用興趣群組優先順序值,捨棄單一買家優先順序較低的興趣群組。如要在不同買家之間選取興趣群組,瀏覽器會根據序列化酬載的大小做出決定。根據預設,每位買家獲得的空間大小相同。請注意,實際優先順序設定是在 B&A 伺服器上進行,而非在產生要求酬載時。

系統會在競價時,使用買方的優先順序向量 (priorityVector) 和賣方的優先順序信號 (prioritySignals) 計算優先順序。買方可以覆寫賣方的優先順序信號。

屬性 說明
優先順序向量 買方會從 K/V 服務提供向量做為 priorityVector 鍵的值
優先信號 賣方會透過設定競價設定的 priority_signals 提供信號
優先信號覆寫 買方會在競價設定的 PerBuyerConfig 中,於 priority_signals_overrides 欄位提供覆寫值。

在競價期間,瀏覽器會計算 priorityVectorprioritySignals 中相符鍵的稀疏點積,以決定優先順序。在下圖中,優先順序是透過 (4 * 2) + (3 * -1) 計算得出,並縮減為 8 + -3,因此這個興趣群組在競價時的優先順序為 5

優先順序向量和優先順序信號物件中的每個鍵都會相乘,然後將結果加總,計算出優先順序。
圖 1:使用買家向量和賣家信號計算優先順序

您也可以使用其他信號,在 B&A 中排定優先順序:

Signal 說明
deviceSignals.one 這個值一律為 1,可用於在點積中加入常數。
deviceSignals.ageInMinutes 這個值會以分鐘為單位,說明興趣群組的年齡 (自最近一次加入興趣群組以來的時間),範圍介於 0 到 43,200 之間的整數。
deviceSignals.ageInMinutesMax60 這個值與 ageInMinutes 信號描述的內容相同,但上限為 60。如果群組存在超過 1 小時,則會傳回 60。
deviceSignals.ageInHoursMax24 這個值會以小時為單位,說明興趣群組的年齡,上限為 24 小時。如果群組存在超過一天,則會傳回 24。
deviceSignals.ageInDaysMax30 這個值會說明興趣群組的年齡 (以天為單位),上限為 30 天。如果群組的建立時間距今超過 30 天,則會傳回 30。

詳情請參閱 GitHub 上的說明

設定受信任的出價信號

由於 B&A 競價酬載會省略部分資料,因此您可以透過鍵/值服務,將省略的資料做為可信任的出價信號提供給 generateBid() 函式。

K/V 服務可提供下列省略的資料:

  • userBiddingSignals (買家使用時)
  • 與每則廣告相關聯的 metadata
  • 與每則廣告相關聯的 adRenderId
  • 報表 ID
系統會將興趣群組中省略的資料傳送至買方的收集伺服器。收集伺服器會將資料推送至鍵/值服務,瀏覽器稍後會從鍵/值服務載入這些資料。
圖 2:可信信號設定範例

其中一種做法是在受信任的出價信號鍵中加入專屬 ID,然後將相關聯的資料傳送至伺服器,以便載入鍵/值服務。不過,實際的實作方式取決於廣告技術,且 API 並未規定。

以下範例說明可實作的方法:

const ad1RenderURL = 'https://dsp.example/ad-1.html';
const ad2RenderURL = 'https://dsp.example/ad-2.html';
const ad1RenderId = 'render-id-1';
const ad2RenderId = 'render-id-2';
const ad1ReportingId = 'reporting-id-1';
const ad2ReportingId = 'reporting-id-2';

// Generate a unique identifier
const id = crypto.randomUUID();

// Define the keys with the unique ID
const trustedSignalsKeyForIG = `interest-group-${id}`

// Set the keys in the interest group
navigator.joinAdInterestGroup({
  // …
  ads: [
    {
      renderURL: ad1RenderURL,
      adRenderId: ad1RenderId,
      buyerReportingId: ad1ReportingId
    },
    {
      renderURL: ad2RenderURL,
      adRenderId: ad2RenderId,
      buyerReportingId: ad2ReportingId
    },
  ],
  trustedBiddingSignalsKeys: [
    trustedSignalsKeyForIG
  ]
});

// Send the associated data to your server to be loaded into the Key/Value Service
fetch('https://dsp.example/kv/load', {
  method: 'POST',
  body: JSON.stringify({
    id,
    [trustedSignalsKeyForIG]: {
      userBiddingSignals: {
        favoriteColor: 'blue'
      },
      ads: [
        {
          renderURL: ad1RenderURL,
          adRenderId: ad1RenderId,
          buyerReportingId: ad1ReportingId,
          metadata: {
            color: 'red'
          }   
        },
        {
          renderURL: ad2RenderURL,
          adRenderId: ad2RenderId,
          buyerReportingId: ad2ReportingId,
          metadata: {
            color: 'blue'
          }   
        },
      ]
    }
  })
});

在範例中,系統會為 IG 定義專屬 ID,並將其納入信任訊號鍵。IG 的金鑰和相關聯的值會傳送到伺服器,載入鍵/值服務。在競價期間的稍後時間,瀏覽器會擷取信任信號,並在買方的 generateBid() 函式中提供這些信號。

視需要從 K/V 傳回興趣群組更新信號

可信信號的 updateIfOlderThanMs 金鑰用於更新興趣群組,更新頻率比一般每日間隔更頻繁。如果興趣群組在超過 updateIfOlderThanMs 鍵傳回的毫秒值時間內未加入或更新,系統會透過 updateURL 機制更新興趣群組。請注意,Chrome 更新興趣群組的頻率不會超過每 10 分鐘一次。

如果 B&A 競價傳回的勝出廣告,與儲存在瀏覽器中興趣群組定義的廣告不符,瀏覽器就會讓競價失敗。updateIfOlderThanMs 機制有助於確保瀏覽器和 B&A 競價對興趣群組中的廣告組合達成共識。

詳情請參閱說明

generateBid() 項工作

您需要為 generateBid() 呼叫執行下列工作。

讀取瀏覽器信號

傳遞至 B&A generateBid() 呼叫的 browserSignals 物件如下所示:

{
  topWindowHostname: 'advertiser.example',
  seller: 'https://ssp.example',
  topLevelSeller: 'https://ssp-top.example',
  joinCount: 5,
  bidCount: 24,
  recency: 1684134092,

  // prevWins is [timeInSeconds, adRenderId]
  prevWins: [
    [9342, 'render-id-1'],
    [1314521, 'render-id-2']
  ],

  // Compiled WebAssembly code
  wasmHelper: WebAssembly.Module

  // Data-Version value from K/V response, if available
  dataVersion: 1,
}

browserSignals 提供下列已修改或新增的屬性:

屬性 說明
prevWins prevWins 是時間和廣告的元組陣列。這個時間代表相關聯廣告在過去 30 天內上次勝出後經過的秒數。

已修改為提供 adRenderId,而非 ad 物件。

wasmHelper biddingWasmHelperURL 提供的程式碼編譯物件。
dataVersion 可信伺服器可以視需要加入數字 Data-Version 回應標頭,該標頭會顯示在 generateBid() 中。

如要瞭解詳情,請參閱 GitHub 上的說明

generateBid() 傳回算繪網址

由於 B&A 競價酬載中省略了 ads 物件,因此必須重新建立從 generateBid() 傳回的算繪網址。系統會根據您的實作方式重新建立顯示網址,且傳回的網址必須與興趣群組中定義的顯示網址相符。

其中一種做法是維護基本網址,並使用 interestGrouptrustedBiddingSignals 中的資訊填入範本。

在本例中,我們會根據顏色和產品定義 4 則廣告:

await navigator.joinAdInterestGroup({
  ads: [
    { renderURL: 'https://dsp.example/red-shirt-ad.html', adRenderId: 'arid1'},
    { renderURL: 'https://dsp.example/blue-shirt-ad.html', adRenderId: 'arid2'},
    { renderURL: 'https://dsp.example/red-pants-ad.html', adRenderId: 'arid3'},
    { renderURL: 'https://dsp.example/blue-pants-ad.html', adRenderId: 'arid4'},
  ],
  trustedBiddingSignalKeys: [
    'userBiddingSignals-someUniqueId',
    // ...and more
  ]
})

接著,我們會傳送使用者的喜好顏色和產品資訊,以便載入鍵/值服務:

fetch('https://dsp.example/kv/load', {
  body: JSON.stringify({
    'userBiddingSignals-someUniqueId': {
      favoriteColor: 'blue',
      favoriteProduct: 'shirt'
    }
  })
})

稍後競價開始時,受信任出價信號會出現在 generateBid() 中,可用於重建網址:

function generateBid(..., trustedBiddingSignals, browserSignals) {
  const { userBiddingSignals } = trustedBiddingSignals
  const { favoriteColor, favoriteProduct } = userBiddingSignals

  return {
    bid: 1,
    render: `https://dsp.example/${favoriteColor}-${favoriteProduct}-ad.html`
  }
}

generateBid() 傳回報表 ID

由於報表 ID 不會納入 B&A 競價酬載,因此 generateBid() 可透過可信的出價信號取得 ID。決定要使用哪個報表 ID 後,所選報表 ID 會從 generateBid() 傳回。傳回的 ID 必須與興趣群組中定義的 ID 相符。

在本範例中,系統選擇了廣告 1,並從 generateBid() 傳回相關聯的算繪 ID:

generateBid(..., trustedBiddingSignals, ) {
  const { ad1ReportingId, ad2reportingId } = trustedBiddingSignals;
  // ...
  return {
    bid: 1,
    render: 'https://dsp.example/ad-1.html'
    buyerReportingId: ad1reportingId
  }
}

傳回的報表 ID 會透過 buyerReportingSignalsreportWin() 中提供:

reportWin(..., buyerReportingSignals) {
  const { buyerReportingId } = buyerReportingSignals;
}

如果 generateBid() 未傳回 buyerReportingId,則 interestGroupName 值會顯示在 buyerReportingSignals 中,而非 buyerReportingId

詳情請參閱報表 ID 指南

後續步驟

以下資源可供您參考

瞭解詳情

有任何問題嗎?