建立回應

應用程式處理 Google 的出價請求後,必須建構並傳送回應。本指南說明如何編寫應用程式程式碼,以建構回應。

建立 BidResponse 訊息

如要提交出價,出價應用程式必須以 BidResponse 回應出價要求,其中包含您設定格式的 Bid。如果使用 JSON 格式,回應必須將 Content-Type 標頭設為 application/json; charset=utf-8,並在主體中加入 JSON BidResponse。如果您使用 Protobuf 格式,應用程式必須將 Content-Type 標頭設為 application/octet-stream,並在主體中加入序列化的 BidResponse

如要建構及序列化 Protobuf 格式的 BidResponse,您必須根據 openrtb.protoopenrtb-adx.proto 產生並使用 Protobuf 程式庫,這兩者分別會實作標準 OpenRTB BidResponse 欄位和 Protobuf 中的 Google 擴充功能。這些內容位於「Protos & Reference Data」(原型和參考資料)

如不想對曝光出價,請務必傳回空白的 HTTP 204 回應。應用程式必須針對每個 BidRequest 傳回回應。如果發生逾時或無法剖析的回應,系統會視為錯誤,並對錯誤率高的出價工具進行調節。

廣告素材 ID

您的 BidResponse 會透過 BidResponse.seatbid.bid.crid 欄位指定廣告素材 (128 位元組限制)。即使是類似的廣告素材,只要在任何顯著特徵上有所差異,就必須為這個欄位提供不重複的值,包括但不限於:大小、已宣告的網址、廣告素材屬性和供應商類型。換句話說,如果兩個廣告符合下列任一條件,您就必須提供不同的廣告素材 ID:

  • 外觀或行為與平常不同。
  • 算繪成不同圖片。
  • 以不同方式算繪 (例如,一個廣告包含圖片,另一個廣告則是影片)。

設計應用程式時,您應決定產生 ID 的系統化方式,以符合您打算提交的廣告素材類型。

廣告屬性

Google 建議您使用 BidResponse.seatbid.bid.apisBidResponse.seatbid.bid.attr 的組合,或 BidResponse.seatbid.bid.ext.attribute 擴充功能,聲明廣告素材屬性,說明廣告的特徵和指定目標。以下說明如何宣告屬性:

  • VPAID
    BidResponse.seatbid.bid.apis 設為 VPAID_1VPAID_2。如果是 JSON 格式,則可分別設為 12
  • MRAID
    BidResponse.seatbid.bid.apis 設為 MRAID_13,以使用 JSON 格式。
  • SIZELESS
    BidResponse.seatbid.bid.attr 設為 RESPONSIVE18,以使用 JSON 格式。
  • PLAYABLE
    如要指出這點,請將 BidResponse.seatbid.bid.attr 設為 USER_INTERACTIVE,或將 13 設為 JSON 格式。

如要瞭解如何取得廣告素材偵測到的屬性相關意見回饋,請參閱廣告素材資源

公開出價欄位

參與公開出價的廣告交易平台和聯播網出價方傳送的出價回應,與參與標準即時出價的 Authorized Buyers 類似。公開出價客戶可以指定少數額外欄位,部分現有欄位也可能有其他用途。包括:

欄位 詳細資料
BidResponse.imp.pmp.deals.id

與這項出價相關聯,且向發布商回報的交易 ID (來自交易所的命名空間)。

BidResponse.seatbid.bid.ext.exchange_deal_type

向發布商回報的交易類型,會影響系統在競價中處理交易的方式。

BidResponse.seatbid.bid.ext.third_party_buyer_token 如果交易平台是公開出價中介服務,這個權杖可用於識別第三方買方資訊。這項資訊是從第三方買方取得,且必須在出價回應中原封不動地傳遞給 Google。

建議

  • 在伺服器上啟用永久 HTTPS 連線 (也稱為「保持運作」或「連線重複使用」)。將逾時時間設為至少 10 秒,在許多情況下,較高的值會很有幫助。Google 會在應用程式的初始延遲測試期間驗證這項設定,因為 Authorized Buyers 會以高頻率傳送要求,且必須避免為每個要求建立個別 TCP 連線所造成的延遲負擔。
  • 加入選用的曝光追蹤網址,即可追蹤曝光的顯示時間,而非出價者得標時間。由於得標和顯示之間會出現落差,因此這項做法可產生更準確的追蹤統計資料。

  • 請確保出價者程式碼不依附於已淘汰的欄位,否則出價可能會因錯誤而失敗。
  • BidResponse 中加入 BidResponse.seatbid.bid.wBidResponse.seatbid.bid.h。A BidResponse,如果請求包含多個廣告大小,則必須包含這些欄位,否則會從競價中捨棄。
  • 回覆大小不得超過 8K。如果回應內容過大,可能會增加網路延遲時間,導致逾時。
  • 請按照適用於需要 SKAdNetwork 歸因的 iOS 廣告空間出價指南操作。

出價回覆範例

下列範例代表 Protobuf 和 JSON 要求的可讀取範例。

OpenRTB Protobuf

OpenRTB JSON

重要事項:範例中顯示的 Protobuf 訊息會以人類可解讀的文字表示。不過,訊息在網路上傳送時並非如此。使用 OpenRTB Protobuf 格式時,系統只會接受序列化的 BidResponse 訊息。

您可以使用下列 C++ 程式碼建立及序列化 BidResponse 訊息:

BidResponse bid_response;
// fill in bid response with bid information
string post_response;
if (bid_response.SerializeToString(&post_response)) {
  // respond to the POST with post_response as the content
} else {
  // return an error to the POST
}

指定廣告素材

出價回應會指定出價勝出時要放送的廣告素材。出價必須包含其中一種支援的廣告格式 (AMP、影片、原生)。在本範例中,我們使用 html_snippet 欄位指定廣告素材。

或者,您也可以根據廣告格式,使用下列其中一個欄位指定廣告素材:

  • SDK 顯示的廣告
    • BidResponse.seatbid.bid.ext.sdk_rendered_ad
  • AMP
    • BidResponse.seatbid.bid.amp_ad_url
  • 影片
    • BidResponse.seatbid.bid.adm
  • 原生
    • BidResponse.seatbid.bid.adm_native

BidResponse.seatbid.bid.adm 欄位中使用 HTML 程式碼片段,指定託管在自有伺服器上的廣告。程式碼片段會封裝在插入網頁的 iFrame 中,因此網頁載入時,系統會擷取並顯示廣告。您必須製作 HTML 程式碼片段,確保廣告 (橫幅或插頁式) 能在 iFrame 中正確顯示,且大小適合您出價的廣告空間。

此外,在下列情況下,出價回應中宣告的廣告大小必須與出價要求中的其中一個大小組合完全相符:

  • 廣告是一般橫幅 (不是影片、原生或插頁式廣告)。
  • 出價工具已在出價回應中宣告大小。如果要求中有多個大小,就必須聲明大小。
  • 插頁式廣告則不在此限。插頁式廣告的寬度至少須達螢幕寬度的 50%,高度則至少須達螢幕高度的 40%。

您可以使用任何可正確顯示的有效 HTML 程式碼,指定 HTML 片段廣告素材,但請注意「建立 BidResponse 訊息」一節中,指定 crid 欄位的限制。其中一個用途是將額外資訊放入從伺服器擷取的網址引數中,做為廣告的算繪程序。您可以藉此將曝光的任意資料傳回至自己的伺服器。

出價回應中傳回的 HTML 片段,大部分都適用與第三方廣告相同的政策。詳情請參閱「Authorized Buyers 計畫指南」、「第三方廣告放送相關規定」和「在廣告中聲明點擊後到達網址」。

指定巨集

巨集是嵌入部分出價回應欄位的格式化文字,內含網址,會在廣告放送時替換為相關值。舉例來說,如果您的得標出價在 HTML 程式碼片段廣告素材中包含 AUCTION_PRICE 巨集,該巨集就會替換為可解密的數值,方便您判斷在競價中為曝光支付的金額。

您可以在下列欄位中加入巨集:

  • BidResponse.seatbid.bid.adm

    HTML 程式碼片段、原生、影片網址和影片 VAST XML 格式均支援巨集。

  • BidResponse.seatbid.bid.adm_native.eventtrackers.url

  • BidResponse.seatbid.bid.adm_native.imptrackers

  • BidResponse.seatbid.bid.ext.amp_ad_url

    AMP 廣告素材僅支援 Google 專屬的 WINNING_PRICEWINNING_PRICE_ESC 巨集。

  • BidResponse.seatbid.bid.burl

  • BidResponse.seatbid.bid.ext.impression_tracking_url

    如果您需要多個帳單網址,請使用這個選項,而非 BidResponse.seatbid.bid.burl

舉例來說,您可以在用來擷取廣告素材的網址中嵌入 ${MACRO},將巨集納入 HTML 片段,其中 MACROOpenRTB 規格中說明的其中一個支援巨集。

Google 巨集

除了 OpenRTB 規格中的巨集,Google 也支援其他巨集。這些巨集的格式不同,如果嵌入網址,會顯示為 %%MACRO%%。下表說明這些巨集:

巨集 說明
ADVERTISING_IDENTIFIER 允許買方在廣告曝光時接收 iOS 廣告識別碼或 Android 廣告 ID。詳情請參閱「解密廣告主 ID」。
CACHEBUSTER 隨機無正負號四位元組整數的字串表示法。
CLICK_URL_UNESC

廣告的未逸出點擊網址。在程式碼片段中,第三方點擊網址的逸出版本應直接接在巨集後面。

舉例來說,如果第三方點擊網址為 http://my.adserver.com/some/path/handleclick?click=clk, 則下列程式碼可搭配巨集呼叫後方的第三方點擊網址單一逸出版本使用:

<a href="%%CLICK_URL_UNESC%%http%3A%2F%2Fmy.adserver.com%2Fsome%2Fpath%2Fhandleclick%3Fclick%3Dclk"></a>

在廣告放送時,這會展開為:

<a href="http://google-click-url?...&ad_url=http%3A%2F%2Fmy.adserver.com%2Fsome%2Fpath%2Fhandleclick%3Fclick%3Dclk"></a>

網址會先向 Google 登錄點擊,然後重新導向至第三方點擊網址。

CLICK_URL_ESC

廣告的逸出點擊網址。若您需要先將值傳遞到另一部稍後將會傳回重新導向的伺服器,請使用此巨集取代 CLICK_URL_UNESC

舉例來說,您可以在 HTML 片段中使用下列程式碼:

<a href="http://my.adserver.com/click?google_click_url=%%CLICK_URL_ESC%%"></a>

在廣告放送時,這會展開為:

<a href="http://my.adserver.com/click?google_click_url=http://google-click- url%3F...%26ad_url%3D"></a>

這會向 my.adserver.com 註冊點擊,然後由 my.adserver.com 負責重新導向至 google_click_url 參數中傳遞的網址。這項假設的前提是 my.adserver.com 會逸出 google_click_url 參數。

您可以在 %%CLICK_URL_ESC%% 後方附加經過雙重逸出的網址。my.adserver.com 完成逸出字元解除作業後,系統會將網址的單一逸出版本附加至 google_click_url。系統擷取 google_click_url 時,會再次取消逸出,然後重新導向。

CLICK_URL_ESC_ESC

廣告的雙重逸出網址。若您需要先將值傳遞到另一部稍後將會傳回重新導向的伺服器,請使用此巨集取代 CLICK_URL_UNESC

舉例來說,您可以在 HTML 片段中使用下列程式碼:

<a href="http://my.adserver.com/click?google_click_url=%%CLICK_URL_ESC_ESC%%"></a>

在廣告放送時,這會展開為:

<a href="http://my.otheradserver.com/click?google_click_url=http%3A%2F%2Fmy.adserver.com%2Fclick%3Fgoogle_click_url%3Dhttp%3A%2F%2Fgoogle-click-%20url%253F...%2526ad_url%253D"></a>
SCHEME 如果出價要求不需要 SSL,則會展開為 http:;如果出價要求需要 SSL,則會展開為 https:
SITE 內容網址的網址逸出網域,或是匿名廣告空間的匿名 ID。
SITE_URL 已淘汰,已由提供相同功能的 SITE 巨集取代。
TZ_OFFSET 時區偏移。
VERIFICATION

製作時和在驗證管道中掃描廣告素材時,會有不同的值。格式為: %%?VERIFICATION:true-val:false-val%%,其中 true-valfalse-val 可使用巨集以外的任何值,包括空白字串。對於公開出價,我們建議交易平台使用這個巨集;一旦使用,需求端平台就不需要進行變更。

舉例來說,如果廣告素材包含 %%?VERIFICATION:-1:5000%%,則在放送時,文字會替換為 5000,在驗證管道中則會替換為 -1。這樣才能區分這兩組 Ping。

WINNING_PRICE

經過編碼的曝光費用 (單次安裝出價,而非千次曝光出價),以帳戶幣別的百萬分之一表示。舉例來說,以美金 $5 元贏得的千次曝光出價,相當於 5 百萬個百萬分之一的千次曝光出價,或是 5 千個百萬分之一單次安裝出價。在此情況下,WINNING_PRICE 的解碼值為 5,000。單次安裝出價中會指定勝出價格。

如要剖析這個巨集,您必須導入可解密價格確認的應用程式。詳情請參閱「解密價格確認」頁面。

WINNING_PRICE_ESC 經過網址逸出處理的 WINNING_PRICE

Google 規定您必須在第三方放送廣告的廣告素材中,使用 CLICK_URL_UNESCCLICK_URL_ESC 巨集。Google 會使用 CLICK_URL 巨集追蹤點擊。

巨集中的網址逸出採用下列配置:

  • 空格字元會替換為加號 (+)。
  • 英數字元 (0-9、a-z、A-Z) 和 !()*,-./:_~ 字元集中的字元維持不變。
  • 所有其他字元都會替換成 %XX,其中 XX 是代表該字元的十六進位數字。

發布商限制和規定

出價要求包含發布商在競價中對廣告素材設定的限制和規定。

  • BidRequest.bcat
    • 您可以比較這個欄位指定的封鎖類別,與使用 Real-time Bidding API 的 detectedCategories 欄位為您提交的廣告素材偵測到的類別。
  • BidRequest.imp.ext.allowed_vendor_type
  • BidRequest.imp.secure
    • 實際上,這項設定一律為 true,因為 Google 要求所有廣告素材都必須支援 SSL。
  • BidRequest.imp.{audio/banner/native/video}
  • BidRequest.imp.{audio/banner/native/video}.api
  • BidRequest.imp.{audio/banner/native/video}.battr
  • BidRequest.imp.{audio/banner/video}.mimes

請勿使用含有受限制功能的廣告出價。如果是允許的功能 (例如供應商類型),只有在廣告供應商類型出現在 BidRequestallowed_vendor_type 清單中的情況下,您才需要傳回廣告。出價中只能包含出價要求中指定的廣告格式,例如填入 BidRequest.imp.banner 等欄位。詳情請參閱 BidRequest 通訊協定緩衝區定義中這些欄位的註解。

如果 BidResponse 中傳回廣告,您必須在 BidResponse 中準確設定 BidResponse.seatbid.bid.attrBidResponse.seatbid.bid.catBidResponse.seatbid.bid.adomainBidResponse.seatbid.bid.adm_native.link.url 欄位。如果廣告有多個適用的值,則必須包含每個值。如要進一步瞭解這些欄位,請參閱 BidResponse 通訊協定緩衝區定義中的註解。如果回應未設定這些欄位,系統會捨棄該回應。

Open Measurement

Open Measurement 可讓您指定第三方供應商,為在行動應用程式環境中放送的廣告提供獨立的評估和驗證服務。

支援的廣告格式包括影片廣告、橫幅廣告和插頁式廣告。如要進一步瞭解如何在包含這些格式的出價回應中使用 Open Measurement,請參閱 Open Measurement SDK 說明中心文章。

出價回應範例

下列各節顯示不同廣告類型的範例競價回應。

應用程式橫幅廣告

OpenRTB Protobuf

OpenRTB JSON

應用程式插頁式廣告

OpenRTB Protobuf

OpenRTB JSON

應用程式插頁式影片

OpenRTB Protobuf

OpenRTB JSON

應用程式原生

OpenRTB Protobuf

OpenRTB JSON

網路影片

OpenRTB Protobuf

OpenRTB JSON

供交易平台出價者使用的行動版網站橫幅廣告

OpenRTB Protobuf

OpenRTB JSON