出價和競價 (B&A) 服務是一組廣告買方和賣方適用的服務,可在受信任的執行環境 (TEE) 中運作,協助進行 Protected Audience (PA) 競價。本開發人員指南說明買方如何整合 Chrome 適用的 B&A PA 競價。
總覽
如要透過 B&A 服務參與 Protected Audience 競價,買方會更新興趣群組 (IG),以最佳化酬載,進而縮短競價延遲時間。
買方必須執行下列酬載最佳化工作:
joinAdInterestGroup()工作generateBid()工作
出價和競價興趣群組
以下是 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 (位於 ads 和 adComponents 中) |
已使用 | 未使用 | 如果設定 omit-ads 旗標,ads 中的 adRenderId 僅適用於酬載的 browserSignals.prevWins。酬載中不包含 adComponents 中定義的 adRenderId。如果未設定 |
renderURL (位於 ads 和 adComponents 中) |
已使用 | 已使用 | 否 |
metadata (位於 ads 和 adComponents 中) |
未使用 | 已使用 | 否 |
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 物件。
如果未設定這個旗標,興趣群組中定義的 |
omit-ads |
omit-ads 旗標會告知瀏覽器在競價酬載中省略 ads 和 adComponents 物件。
如未設定這個標記, 強烈建議買家選擇 |
系統會透過 trustedBiddingSignals 提供相關資訊,處理遭省略的資料。這些標記可單獨使用,不必一起使用。
使用範例:
navigator.joinAdInterestGroup({
auctionServerRequestFlags: ['omit-user-bidding-signals', 'omit-ads'],
});
設定廣告顯示 ID
為縮減 B&A 競價酬載的大小,系統會省略興趣群組的 ads 和 adComponents 物件,因此這些物件無法在 Bidding Service 中執行的 generateBid() 函式內使用。
為處理廣告資訊遺失的問題,買方會維護與興趣群組設定中每個廣告相關聯的 ID (adRenderId 和 adComponentRenderId)。這個 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 欄位提供覆寫值。 |
在競價期間,瀏覽器會計算 priorityVector 和 prioritySignals 中相符鍵的稀疏點積,以決定優先順序。在下圖中,優先順序是透過 (4 * 2) + (3 * -1) 計算得出,並縮減為 8 + -3,因此這個興趣群組在競價時的優先順序為 5。
您也可以使用其他信號,在 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
其中一種做法是在受信任的出價信號鍵中加入專屬 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 天內上次勝出後經過的秒數。已修改為提供 |
wasmHelper |
從 biddingWasmHelperURL 提供的程式碼編譯物件。 |
dataVersion |
可信伺服器可以視需要加入數字 Data-Version 回應標頭,該標頭會顯示在 generateBid() 中。如要瞭解詳情,請參閱 GitHub 上的說明。 |
從 generateBid() 傳回算繪網址
由於 B&A 競價酬載中省略了 ads 物件,因此必須重新建立從 generateBid() 傳回的算繪網址。系統會根據您的實作方式重新建立顯示網址,且傳回的網址必須與興趣群組中定義的顯示網址相符。
其中一種做法是維護基本網址,並使用 interestGroup 和 trustedBiddingSignals 中的資訊填入範本。
在本例中,我們會根據顏色和產品定義 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 會透過 buyerReportingSignals 在 reportWin() 中提供:
reportWin(..., buyerReportingSignals) {
const { buyerReportingId } = buyerReportingSignals;
}
如果 generateBid() 未傳回 buyerReportingId,則 interestGroupName 值會顯示在 buyerReportingSignals 中,而非 buyerReportingId。
詳情請參閱報表 ID 指南。
後續步驟
以下資源可供您參考
瞭解詳情
- 進一步瞭解 Chrome 中的 B&A 競價設定
- 請按照端對端本機測試程式碼研究室的說明,透過 B&A 實驗 Protected Audience。
有任何問題嗎?
- 如果您對出價與競價服務有疑問,請在出價與競價服務存放區中開啟問題。