OpenRTB是程序化广告领域关键的技术接口规范,是IAB制定的RTB竞价广告协议的标准。内容主要涉及业务流程及主要的对象模型、数据模型、示例等。是负责流量技术对接的产品技术人员必须掌握的宝典。在实际工作中,这个规范是行业中各方广告流量技术对接时会遵循的标准规范。强烈建议媒体流量方都遵循该规范,这样才能做到事半功倍,所以我们有必要对该规范中的内容做一些介绍,最起码让大家对该规范感性上有一个基本的认识。当然因为是技术规范,内容可能有些偏技术,大家不用太过深究。本节截图及部分内容以文档原文为主,若大家没有兴趣且将来不会涉及相关技术对接的工作,只要记住“OpenRTB是程序化广告关键的技术接口规范”即可,可跳过下面的内容,直接继续后续阅读。限于篇幅,详细的规范内容我们将不做展开,如果某些技术人员出于工作需要及好奇想进一步学习,可依据如下提供的文档地址下载原始文档进行研究。
注:截至本书完稿时OpenRTB版本为2.5,下载地址为
http://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf
。
下面我们以《OpenRTB-API-Specification-Version-2-5-FINAL.pdf》为例进行介绍,下图所示为该规范文档的封面,放这个截图是为了让大家对该规范的正本有个感性认识,不至于受到一些“李鬼”的干扰。
OpenRTBv2.5文档封面截图
对于该协议规范,我们首先介绍一些常用词。这些常用词是我们在实际广告流量对接中经常会用到的,具体如下表所列。
OpenRTB常用词
接下来我们介绍协议中的基础RTB处理时序过程,RTB广告大体的时序处理流程如下图所示。
协议描述基础的RTB处理时序图原文截图
由上图可知:
1)如图中的“0.”所示的环节。用户打开媒体页面(媒体页面中有广告位,需展示广告),媒体端向RTB交易服务(ADX)发起广告请求。
2)ADX向竞价服务方(DSP,广告主可在DSP中添加广告投放订单)发起竞价(邀约)请求(传送竞价邀约请求,携带广告位、媒体网站、用户设备、用户相关行为数据等),如图中“1.”所示的环节;竞价服务方返回竞价信息(出价、广告素材或广告片段),如图中“1.下的←”所示的环节。
3)ADX结果反馈,即win-notice返回成交结果,如图中“2a.”所示的环节;若竞价返回包中未含广告片段需要再次提供,如图中“2a.下的←”所示的环节。
4)有些ADX会发失败原因(这个不是必须发的),如图中“2b.”所示的环节;有些ADX会发成交账单信息(这个也不是必须发的),如图中“3a.”所示的环节。
5)广告通过ADX返回给媒体并通过媒体展示给用户。
上图中的虚线流程是媒体方及DSP方流量过滤及投放设置的环节:
1)媒体方可在ADX中设定媒体的相关属性(分类、底价、禁投行业等)。
2)DSP方可在ADX中设置接受竞价邀约流量的响应能力参数及所需流量过滤、创意审核等。
下面我们来看一下协议中约定的广告请求对象及其内部的数据对象。如下图所示,从图中我们会发现BidRequest对象同Impression对象是一对多的包含关系,通俗地说就是一个BidRequest可包含一个或多个Impression。这个不难理解,有的时候为了节省网络开销,一个竞价请求可能包含多个广告位的竞价邀约信息,出现的场景很可能是用户一次打开内容页面,同时产生多个广告位的曝光机会。
广告请求对象内实体间关系示意图
对于广告请求BidRequest对象中的各数据段(对象)的简单描述可参见下表,通过这些内容我们亦可十分清晰地看出,在OpenRTB的规范中,对广告请求中该携带的数据内容已做了十分完善及丰富的定义。这对我们在实践中去推动媒体及流量卖方开放相关数据具有十分重要的价值。
很多同学,尤其是一些从事非技术工作的同学,对广告竞价请求如何携带用户及广告位信息特别好奇,下面我们给出了一段BidRequest包数据片段的简单示例。一般BidRequest常见格式为Json格式(具体技术上的格式类型为Content-Type:application/json),从下面的代码清单示例中也能看到,上表中的各种数据段的影子。这也就是我们常说的在广告竞价请求中携带的用户以及广告位的相关信息数据。
广告请求对象各数据段(对象)的简单描述表
{ "id": "80ce30c53c16e6ede735f123ef6e32361bfc7b22", "at": 1, "cur": [ "USD" ], "imp": [//广告位信息 { "id": "1", "bidfloor": 0.03, "banner": { "h": 250, "w": 300, "pos": 0 } } ], "site": {//媒体网站信息 "id": "102855", "cat": [ "IAB3-1" ], "domain": "www.foobar.com", "page": "http://www.foobar.com/1234.html ", "publisher": { "id": "8953", "name": "foobar.com", "cat": [ "IAB3-1" ], "domain": "foobar.com" } }, "device": {//用户设备信息 "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/ 537.13(KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "ip": "123.145.167.10" }, "user": {//用户ID "id": "55816b39711f9b5acf3b90e313ed29e51665623f" } }
最后我们看一下协议中约定的广告竞价响应对象及其内部的数据对象。如下图所示,从图中我们会发现一个BidResponse对象可能会包含多个Bid对象。这个也好理解,当一个BidRequest包含多个Impression时,BidResponse就可能包含多个Bid对象,从而实现竞价出价。
竞价响应对象内实体间关系示意图
对于广告竞价响应BidResponse对象中的各数据段(对象)的简单描述可参见下表。
竞价响应对象各数据段(对象)的简单描述表
同样很多同学,尤其是一些从事非技术工作的同学,对广告竞价响应对象返回的出价等长啥样子特别好奇,下面我们给出了一段BidResponse包数据片段的简单示例。从下面的代码中也能看到,上表中的各种数据段的影子。这也就是我们常常说的在广告竞价响应中携带的出价等相关信息数据。
{ "id": "1234567890", "bidid": "abc1123", "cur": "USD", "seatbid": [ { "seat": "512",//席位ID "bid": [ { "id": "1", "impid": "102", "price": 9.43, "nurl": "http://adserver.com/winnotice?impid=102", //DSP方竞价成功信息接收地址 "iurl": "http://adserver.com/pathtosampleimage", "adomain": [ "advertiserdomain.com" ], "cid": "campaign111",//广告投放campaign ID "crid": "creative112",//广告投放创意素材 ID "attr": [ 1, 2, 3, 4, 5, 6, 7, 12 ] } ] } ] }