构建响应

应用处理完 Google 发送的出价请求后,必须构建并发送响应。本指南介绍了如何对应用进行编码以构建响应。

创建 BidResponse 消息

若要提交出价,您的出价应用必须以配置的格式响应包含 BidBidResponse 出价请求。如果您使用 JSON 格式,则响应必须将 Content-Type 标头设置为 application/json; charset=utf-8,并在正文中包含 JSON BidResponse。如果您使用的是 Protobuf 格式,则应用必须将 Content-Type 标头设置为 application/octet-stream,并在正文中包含序列化的 BidResponse

如需构建和序列化 Protobuf 格式的 BidResponse,您必须根据 openrtb.protoopenrtb-adx.proto 生成并使用 Protobuf 库,这两个库分别以 Protobuf 格式实现标准 OpenRTB BidResponse 字段和 Google 扩展程序。您可以在 Proto 和参考数据中找到这些信息。

如果您不想针对展示出价,则必须返回空的 HTTP 204 响应。您的应用必须针对每个 BidRequest 返回响应。超时和无法解析的响应会被视为错误,Google 会限制错误率较高的出价工具。

广告素材 ID

您的 BidResponse 通过 BidResponse.seatbid.bid.crid 字段(128 字节限制)指定广告素材。即使是类似的广告素材,如果它们在任何显著特征(包括但不限于尺寸、声明的网址、广告素材属性和供应商类型)方面有所不同,也必须为此字段设置唯一值。换句话说,如果两个广告满足以下任一条件,您必须为其指定不同的广告素材 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(对于 JSON 格式)或 13 来指明这一点。

如需了解如何获取有关检测到的广告素材属性的反馈,请参阅广告素材资源

公开出价字段

参与公开出价的广告交易平台和广告联盟出价方发送的出价响应与参与标准实时出价的 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 连接(也称为“keep-alive”或“连接重用”)。将超时时间至少设置为 10 秒 - 在许多情况下,更高的值会带来好处。Google 会在应用的初始延迟时间测试期间验证这一点,因为 Authorized Buyers 会以高速率发送请求,并且需要避免为每个请求建立单独的 TCP 连接所产生的延迟时间开销。
  • 添加可选的展示跟踪网址,以便在展示内容渲染时(而非出价方胜出时)进行跟踪。由于胜出与呈现之间存在差异,因此这种方法可以生成更准确的跟踪统计信息。

  • 确保出价方代码不依赖于已弃用的字段,否则可能会导致出价因错误而失败。
  • BidResponse 中包含 BidResponse.seatbid.bid.wBidResponse.seatbid.bid.h。包含多个广告尺寸的请求的 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 IDFA 或 Android 的广告 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

编码格式的展示费用(即 CPI,而不是每千次展示费用),以账号币种的百万分之一表示。例如,以 5 美元赢得的每千次展示费用出价相当于 5 百万个每千次展示费用出价宏,或者 5000 个 CPI 宏。在这种情况下,WINNING_PRICE 的解码值将为 5,000。 胜出价格是以 CPI 指定的。

如需解析此宏,您需要实现一个可解密价格确认信息的应用。如需了解详情,请参阅解密价格确认页面。

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 protocol buffer 定义中这些字段的注释。

如果 BidResponse 中返回了广告,您必须在 BidResponse 中准确设置 BidResponse.seatbid.bid.attrBidResponse.seatbid.bid.cat 以及 BidResponse.seatbid.bid.adomainBidResponse.seatbid.bid.adm_native.link.url 字段。如果广告的这些字段有多个适用值,则您必须添加每个值。如需了解详情,请参阅 BidResponse 协议缓冲区定义中这些字段的注释。 如果响应未设置这些字段,则会被舍弃。

开放式衡量

借助 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