通过 Protected Audience 中介支持多卖方竞价

卖方广告平台通常会使广告需求来源多样化,从而以提高广告收入为目标进行优化。借助“广告中介”,广告网络或服务可调用多个广告网络,以确定适合特定广告位的最佳广告。此提案将介绍如何扩展 Protected Audience API on Android,从而以保护隐私的方式实现广告瀑布流中介功能。如今,广告网络为应用开发者提供各式各样的方法对来自多个广告卖方的广告竞价进行中介处理:

  1. 广告瀑布流中介:应用开发者定义一个广告网络的有序列表,其内容通常按特定广告网络的历史有效每千次展示费用 (eCPM) 进行排序。此列表称为“中介链”。应用开发者的中介平台会使用此列表按照所列顺序调用广告网络,以确定相关的广告需求来源。
  2. 程序化中介:应用开发者将多个广告网络配置为参与广告机会出价。这些广告网络可以根据对广告机会的重视程度进行实时出价。
  3. 混合中介:广告瀑布流中介技术和程序化中介技术的组合。

广告瀑布流中介

在广告瀑布流中介中,当广告机会出现时,广告 SDK 会向其后端服务器发送请求。服务器不会使用胜出的广告素材响应此请求,而是会使用包含广告网络列表(按历史 eCPM 排序)的中介链进行响应。

广告瀑布流中介模型示意图
图 1. 广告瀑布流中介模型。

在传统的广告瀑布流模型中,广告 SDK 会按照中介链指定的顺序调用每个广告网络(或它自己的竞价 SDK)。如果某个广告网络可以满足相应广告请求,该广告网络便会呈现相应广告。否则,系统会将请求发送到链中的下一个广告网络。此过程会不断重复,直到请求完成或链中的广告网络用尽为止。

广告瀑布流中介往往通过以下方式进行优化:根据来自第一方广告需求来源对 eCPM 的重新评估,定期对中介链进行重新排序。

程序化中介

程序化中介(也称为“标头出价”)可替代历史 eCPM 用于决定哪个广告网络能够获得在广告请求中投放广告的机会。使用程序化中介时,提供商会改为使用实时出价值来找出胜出的广告。

程序化中介模式示意图
图 2:程序化中介模式

混合中介

某些程序化中介解决方案会以广告瀑布流和出价的混合模式将多个广告网络结合在一起,以便更好地控制广告,同时又能获得使用实时 eCPM 带来的好处,从而最大限度提升参与的广告网络产生的收入。

在混合中介模式下,广告网络和中介服务提供商可以将广告瀑布流和实时出价的元素结合起来,为应用开发者提供更强的灵活性。借助混合模式,应用开发者可以根据历史 eCPM 配置广告网络,从而有机会在通过参与的广告网络运行实时出价之前显示广告以填充广告机会。

Protected Audience 广告瀑布流中介

Protected Audience API on Android 通过设置多个竞价(为中介图中的每个节点分别设置一个竞价)来支持广告瀑布流中介。如果某个竞价中没有胜出者,系统会调用下一个广告联盟竞价节点,直到链中的节点用尽为止。广告瀑布流中介流程如下所示:

  1. 中介 SDK 从内容相关广告服务器端点中提取中介链,这可能会返回内容相关广告或中介链。
  2. 如果广告服务器端点返回中介链,中介 SDK 按顺序迭代链中的每一项,调用参与 广告联盟的 SDK 来运行内容相关广告和再营销广告选择。链中的每项都代表广告网络以特定价格、按特定量的展示次数、点击次数或广告时间购买广告空间的请求。
  3. 如果链中的订单项均未选择胜出的广告,中介 SDK 可能选择展示自己的广告网络中的广告,方法是运行同时考虑再营销广告和内容相关广告的 Protected Audience 广告选择。

Protected Audience 广告瀑布流中介流程示意图
图 3. 利用 Protected Audience API 实现广告瀑布流中介。

上图展示了中介 SDK 可以实现但第一方广告网络无法优化的广告瀑布流中介算法示例。Protected Audience API 允许将广告选择工作流链接在一起并报告胜出的展示次数,从而支持第一方广告网络优化。

广告选择结果

selectAds() 的返回值类型为 AdSelectionOutcome 对象。AdSelectionOutcome 包含胜出广告的呈现 URI 和 AdSelectionId:一个不透明整数,用于标识胜出者 订单项的广告素材。

AdSelectionOutcome {
  Uri renderUri;
  Long AdSelectionId;
}

AdSelectionId 充当指向 AdSelectionOutcome 的指针。如今,AdSelectionId 会作为 ReportImpressionInput 参数传入 reportResult() 方法,以帮助确定作为调用 reportWin()reportResult() 方法的对象的正确广告。

链广告选择提案

我们提议使用 AdSelectionFromOutcomesConfig 使 selectAds() 过载。

val config = AdSelectionFromOutcomesConfig.Builder()
        .setSeller(seller)
        .setAdSelectionIds(listOf(outcome1pAdSelectionId))
        .setSelectionSignals({"bid_floor": bidFloorOfNextNetworkInline})
        .setSelectionLogicUri(selectionLogicUri)
        .build()
adSelectionClient.selectAds(config)

这样,中介 SDK 便可以将其胜出广告的出价与下一个内嵌广告联盟的出价下限进行比较。

示例 1:

示例 2:

报告胜出的展示次数

如果 selectAds(AdSelectionFromOutcomes) 有胜出者,该广告会胜了中介。然后,使用 selectAds(AdSelectionFromOutcomes) 中胜出广告的广告选择 ID 和相应的 AdSelectionConfig 调用 reportImpression

如果从任意广告联盟的 selectAds(AdSelectionConfig) 返回胜出者,系统会使用该调用中的广告选择 ID 和配置调用 reportImpression

运行广告瀑布流中介

以下是运行广告瀑布流中介流程的操作顺序。

  1. 运行第一方广告选择。
  2. 遍历中介链。对于每个第三方广告联盟,请执行以下操作:
    1. 构建 AdSelectionFromOutcomeConfig,包括第一方 outcomeId 和第三方 SDK 的出价下限
    2. 使用上一步中的 config 调用 selectAds()
    3. 如果结果不为空,则返回广告。
    4. 调用当前 SDK 广告联盟适配器的 selectAds() 方法。如果结果不为空,则返回广告。
  3. 如果未能从链中找到胜出的广告,则返回第一方广告。

最佳实践

在进行第一方优化之前运行内容相关广告竞价

再营销需求可产生较高的出价,从而在中介链中产生胜出的结果。截断这一流程通常用于通过优化再营销受众群体名单来启用第一方优化。

Protected Audience API 的再营销需求仅适用于 Protected Audience 竞价。这可能会使在服务器端进行第一方优化变得非常困难。如需缓解第一方优化方面的问题,请先运行内容相关广告竞价,然后根据胜出的广告结果执行第一方优化(如本页前面所述)。

尽量减小设备端中介链

为实现最佳效果,设备端中介链应保持较小的规模。设备端执行的计算成本可能与作为中介链的一部分评估的竞价数量成线性关系。换句话说,更多节点会导致更多的计算周期要求和更长的延迟时间。当您向设备端中介评估传递节点时,请考虑延迟对收入的影响。

其他注意事项

Protected Audience API 目前未为多个广告位的中介提供全面的解决方案。每个广告位都必须单独进行处理。

Protected Audience Mediation API 支持广告瀑布流中介和有限制的程序化中介。我们以后会与您分享有关支持其他程序化中介用例的详细信息。

由于 Protected Audience 广告选择是在提取内容相关广告之后运行的,因此调用 Protected Audience API 可能会影响广告请求的端到端延迟时间。