—# 启明ADX 广告 API接入文档 (v1.1.0)
更新日志
| 版本号 | 更新日期 | 更新内容 |
|---|---|---|
| V1.1.0 | 2024年05月02日 | - 新版本发布 |
::: tip
RTB对接请务必留意 5. RTB对接重点和5.1 价格加密。
:::
1. 请求协议说明
媒体广告平台和启明ADX之间的基础通信协议采用HTTP协议, 使用POST方法发送BidRequest消息, 消息格式为json;
启明ADX支持对请求和响应进行压缩, 压缩算法仅支持gzip; 如果媒体广告平台需要使用压缩, 请根据请求头和响应头进行标识;
编码: utf-8
1.1 请求地址
| 环境 | 地址 | 备注 |
|---|---|---|
| 正式环境 | http://ads-api.yourongsj.com/ad |
1.2 请求头
| 请求头 | 值 | 备注 |
|---|---|---|
| Content-Encoding | gzip | 如果媒体广告平台需要对请求体进行压缩, 请添加该请求头, 目前值支持gzip压缩请求体 如果不需要对请求体进行压缩, 则不需要添加该请求头 |
| Content-Type | application/json | |
| Accept-Encoding | gzip | 如果媒体广告平台需要支持响应压缩, 请添加该请求头, 启明ADX在识别到该请求头后, 会在下发响应时, 对响应进行相对应的压缩 如果不需要对响应进行压缩, 则不需要添加该请求头 |
1.3 响应头
| 字段 | 描述 |
|---|---|
| x-tm-traceid | 每次广告请求, 生成的唯一id, 如果发现问题, 无法排查具体错误时, 可以提供该响应头, 由启明ADX技术人员排查 |
| Content-Encoding | gzip |
2. 请求参数说明(Request)
请求Json结构
| 字段 | 格式 | 必填 | 描述 | 备注 |
|---|---|---|---|---|
| app | App | 是 | app对象 | |
| adPosition | AdPosition | 是 | AdPosition对象 | |
| device | Device | 是 | Device对象 | |
| bidFloor | Integer | 否 | 底价, 大于等于1, 单位:分, RTB广告位需要携带,例:100 | |
| deals | Deal[] | 否 | Preferred Deal 相关参数 | |
| httpsRequired | Boolean | 否 | 填充是否必须https; 若为 true,则返回 HTTPS 形式的素材、监测和点击等地址; 默认为 false | https物料较少, 如果都支持的话, 尽量不要限制 |
2.1 App对象
| 字段 | 格式 | 必填 | 描述 | 备注 |
|---|---|---|---|---|
| appId | Long | 是 | 启明ADX的应用id | |
| packageName | String | 是 | 应用包名 | |
| appVersion | String | 是 | 应用版本号 | |
| category | String | 否 | 启明ADX的二级应用分类, eg. 100302 | 更多见启明ADX广告应用分类 |
2.2 AdPosition对象
| 字段 | 格式 | 必填 | 描述 | 备注 |
|---|---|---|---|---|
| adPositionId | String | 是 | 启明ADX的广告位id | |
| adWidth | Integer | 是 | 媒体广告位实际宽度 | |
| adHeight | Integer | 是 | 媒体广告位实际高度 |
2.3 Device对象
| 字段 | 格式 | 必填 | 描述 |
|---|---|---|---|
| os | Integer | 是 | 手机系统:1:安卓; 2:iOS; |
| ip | String | 是 | 客户端的真实ipv4 |
| ip_v6 | String | 是 | 客户端的真实ipv6 。 可获取时必填 |
| userAgent | String | 是 | 浏览器的系统UA |
| osVersion | String | 是 | 设备系统版本号 |
| network | String | 否 | 设备网络类型 : UNKNOWN => 未知; NET_2G => 2G网; NET_3G => 3G网; NET_4G => 4G网; NET_5G => 5G网; WIFI => 无线网 |
| vendor | String | 是 | 手机生产厂商(品牌) |
| longitude | Float | 否 | 经度 |
| latitude | Float | 否 | 维度 |
| screenWidth | Integer | 否 | 屏幕像素宽度, 以竖屏为准 |
| screenHeight | Integer | 否 | 屏幕像素高度, 以竖屏为准 |
| ppi | Integer | 否 | 屏幕每英寸像素数目, eg:300, 256 |
| inch | Float | 否 | 屏幕尺寸, eg:6.1, 6.2 |
| deviceType | String | 否 | 设备类型。 PHONE:手机 PAD:平板 OTHER:其他 |
| orientation | String | 否 | 屏幕方向 PORTRAIT:竖屏 LANDSCAPE:横屏 |
| androidApiLevel | Integer | 否 | 安卓api版本 |
| mac | String | 否 | mac地址,可获取时建议填写 |
| md5Mac | String | 否 | 原始mac(不做大小写转换)的md5值, MD5后的小写形式 |
| androidId | String | 是、安卓设备可获取时必填 | android id 原值 , 16个字符,仅限安卓设备 |
| md5AndroidId | String | 否 | 原始androidId(不做大小写转换)的md5值, MD5后的小写形式 |
| oaid | String | 安卓设备 Android Q 级以上版本的可获取时必填 | android oaid 原值,部分厂商部分安卓系统版本提供,MSA官方链接为:http://msa-alliance.cn/ ; 仅限安卓设备 |
| md5Oaid | String | 否 | 原始oaid(不做大小写转换)的md5值, MD5后的小写形式 |
| imei | String | 否 | imei号, 可获取时建议填写 |
| md5Imei | String | 否 | 原始imei(不做大小写转换)的md5值, MD5后的小写形式 |
| caid | String | iOS设备可获取时必填 | caid标识符, 仅限iOS设备 |
| caidVer | String | iOS设备可获取时必填 | caid版本号, 仅限iOS设备 |
| idfa | String | iOS设备可获取时必填 | iOS idfa 原值 ; 仅限iOS设备 |
| md5Idfa | String | 否 | 原始idfa(不做大小写转换)的md5值, MD5后的小写形式 |
| idfv | String | iOS设备可获取时必填 | iOS idfv 原值 ; 仅限iOS设备 |
| modelNo | String | 是 | 手机型号,示例 iOS:”iPhone10,3” 安卓:”PCNM00” |
| osBootTime | Long | 是 | 系统最近一次开机时间, 秒级时间戳,(保留整数) 示例:”1595214620” ; 仅限iOS设备 |
| osUpdateTime | String | 是 | 系统最近一次更新时间 示例: “1598353562.192429”; 仅限iOS设备 |
| phoneName | String | 是 | 设备名称 |
| diskSize | Long | 是 | 手机容量大小, 单位byte |
| memorySize | Long | 是 | 手机内存大小, 单位byte |
| hardwareModel | String | 是 | 设备model值 示例:”D22AP”; 仅限iOS设备 |
| imsi | String | 否 | 国际移动用户识别码, eg. 46001 |
| country | String | 是 | 国家 示例:”CN”;仅限iOS设备 |
| language | String | 是 | 语言, eg. ‘zh-Hans-CN’ ; 仅限iOS设备 |
| timeZone | String | 是 | 时区, eg. GMT+8, GMT+08:00; 仅限iOS设备 |
| storeVersion | String | 否 | 官方商店版本号(oppo, vivo, 华为), 仅限安卓设备 |
| hmsVersion | String | 否 | 华为hms core 版本 |
| harmonyOsVer | String | 否 | 鸿蒙系统内核版本 |
| osUiVersion | String | 否 | 小米MIUI版本, 或者华为UI版本号 |
| installApps | String[] | 否 | 客户端已经安装的应用包名列表 |
| supportWechat | Boolean | 否 | 是否支持微信小程序广告下发 |
| vaid | String | 否 | 开发者匿名设备标识符, 安卓 |
| batteryPower | Integer | 否 | 剩余电量, eg. 60 |
| batteryStatus | String | 否 | 电池状态; UNKNOWN:未知 UNPLUGGED:不充电 CHARGING:充电中 |
| cpuNumber | Integer | 否 | CPU个数 |
| cpuFrequency | Float | 否 | CPU频率, 单位GHz |
| osBootMark | String | 否 | 系统启动标识 安卓示例: “ec7f4f33-411a-47bc-8067-744a4e7e0723” iOS示例: “1623815045.970028” |
| osUpdateMark | String | 否 | 系统更新标识 安卓示例: “1004697.709999999” iOS示例: “1581141691.570419583” |
| osElapseTime | Long | 否 | Android系统开机使用时间, 秒级时间戳 |
| deviceBirthTime | String | 否 | ios, 设备初始化时间, 案例:1647545718.125795458 ; 仅限iOS设备 |
| paId | String | 否 | 拼多多广告ID; 生成规则:MD5(osBootTime + “:” + osUpdateTime), eg. de1611ebbe675ba71731c71ff7bf13ad |
2.4 Deal对象
| 字段 | 格式 | 必填 | 描述 | 备注 |
|---|---|---|---|---|
| id | String | 否 | Deal Id | |
| price | Integer | 否 | Deal对应的结算价格, 单位: 分 例:100 |
::: tip
(1)对安卓设备请求,imei、android_id、oaid至少要填写其中一个
(2)对于iOS设备请求,idfa、10个设备信息字段( modelNo~timeZone)三者至少填写一个,如果无idfa则10个设备信息字段都必填
(3)部分设备参数获取方法示例
:::
3. 响应参数说明(Response)
响应Json结构
| 字段 | 类型 | 必填 | 示例值 | 描述 |
|---|---|---|---|---|
| code | Integer | 是 | 200 | 状态码, 具体状态码介绍见定义 |
| message | String | 是 | success | 状态码的描述 |
| data | Ad | 否 | Ad对象 |
3.1 Ad Object
| 字段 | 类型 | 必填 | 示例值 | 描述 |
|---|---|---|---|---|
| adType | String | 是 | splash | 广告类型, 具体见定义 |
| materialType | Integer | 是 | 0 | 物料类型, 具体见定义 |
| action | Integer | 是 | 0 | 用户点击后的, 广告交互方式, 具体见定义 |
| title | String | 否 | 广告标题文案,短文案 | |
| desc | String | 否 | 广告描述文案,长文案 | |
| imageUrl | String | 否 | 图片链接 | |
| imageUrlList | String[] | 否 | 多图链接 | |
| video | Video | 否 | 视频物料 | |
| deeplinkUrl | String | 否 | deeplink地址 | |
| deeplinkType | Integer | 否 | deeplink类型, 具体见下方定义 | |
| landingPageUrl | String | 否 | 落地页地址 | |
| appPromotion | AppPromotion | 否 | 应用推广信息, 下载类广告可能会有 | |
| tracker | Tracker | 是 | 监测上报 | |
| bidPrice | Integer | 否 | 出价, 单位:分, RTB对接方式必传 | |
| dealId | String | 否 | Deal Id, Preferred Deal交易时候, 会返回该值 | |
| winNoticeUrl | String | 否 | 竞赢通知回调接口, RTB对接方式必传 | |
| lossNoticeUrl | String | 否 | 竞败通知回调接口, RTB对接方式可能会传, 需要根据下面的描述进行部分宏的替换 | |
| adSource | String | 否 | 广告来源标识, eg. 百度 | |
| interactStyle | Integer | 否 | 互动广告样式, 具体见定义 | |
| interactSubStyle | Integer | 否 | 互动广告玩法, 具体见定义 | |
| dropEffectIcons | String[] | 否 | 撒花掉落效果icon集合 | |
| wechatId | String | 否 | 微信小程序id, 当action为小程序时有值 | |
| wechatPath | String | 否 | 微信小程序唤起路径 | |
| downloadType | Integer | 否 | 安卓下载广告, 采用的下载类型, 具体见定义 |
3.2 Video Object
| 字段 | 类型 | 必填 | 示例值 | 描述 |
|---|---|---|---|---|
| url | String | 是 | 视频播放链接 | |
| duration | Integer | 否 | 视频总时长, 单位秒, 只有在>0的时候才有效 | |
| forceDuration | Integer | 否 | 强制播放时间, 单位:秒; 一般在激励视频中会有, 代表播放到这个时间后, 才会有激励成功 |
3.3 AppPromotion Object
| 字段 | 类型 | 必填 | 示例值 | 描述 |
|---|---|---|---|---|
| appName | String | 否 | 应用名称 | |
| appVersion | String | 否 | 应用版本 | |
| appBundle | String | 否 | 应用包名 | |
| appIconUrl | String | 否 | 应用图标链接 | |
| appUpdateTime | String | 否 | 应用更新时间 | |
| advertiserName | String | 否 | 广告主名称(开发者名称) | |
| privacyPolicyUrl | String | 否 | 隐私协议地址 | |
| privacyPolicyInfo | String | 否 | 隐私权限信息 | |
| privacyAuthUrl | String | 否 | 隐私权限地址Url |
3.4 Tracker Object
| 字段 | 类型 | 必填 | 示例值 | 描述 |
|---|---|---|---|---|
| display | String[] | 是 | 展示上报 | |
| click | String[] | 是 | 点击上报 | |
| tryDeeplink | String[] | 否 | 尝试deeplink时上报,规则参见7.普通广告点击说明 | |
| deeplink | String[] | 否 | deeplink唤起app时上报 规则参见7.普通广告点击说明 | |
| wechatOpen | String[] | 否 | 唤起微信小程序时上报 | |
| appStoreOpen | String[] | 否 | 安卓下载, 下载类型为优先应用市场时, 跳转到应用市场上报 | |
| downloadStart | String[] | 否 | 下载开始时上报 | |
| downloadEnd | String[] | 否 | 下载结束时上报 | |
| installStart | String[] | 否 | 安装开始时上报 | |
| installEnd | String[] | 否 | 安装结束时上报 | |
| open | String[] | 否 | 打开应用时上报 | |
| videoLoaded | String[] | 否 | 视频加载完成时上报 | |
| videoError | String[] | 否 | 视频播放出错, 或者加载失败时上报 | |
| videoStart | String[] | 否 | 视频播放开始时上报 | |
| videoQuarter | String[] | 否 | 视频播放四分之一时上报 | |
| videoMiddle | String[] | 否 | 视频播放一半时上报 | |
| videoThirdQuarter | String[] | 否 | 视频播放四分之三时上报 | |
| videoEnd | String[] | 否 | 视频播放结束时上报 | |
| videoPause | String[] | 否 | 视频播放暂停时上报 | |
| videoResume | String[] | 否 | 视频播放暂停后, 恢复播放时上报 | |
| videoSkip | String[] | 否 | 用户点击视频跳过按钮跳过播放时上报 | |
| videoMute | String[] | 否 | 用户主动关闭视频广告声音时上报 | |
| videoUnmute | String[] | 否 | 用户主动开启视频广告声音时上报 | |
| videoReplay | String[] | 否 | 重复播放视频时上报 | |
| videoClose | String[] | 否 | 关闭视频时上报 | |
| videoFullScreen | String[] | 否 | 视频打开全屏时上报 | |
| videoExitFullScreen | String[] | 否 | 视频退出全屏时上报 | |
| rewardSuccess | String[] | 否 | 激励成功回调 |
4. 广告上报宏替换
用户在曝光, 或者点击等其他广告上报事件中, 需要将上报 URL 中的宏定义替换成真实的值, 否则会影响收益, 甚至无收益, 如因异常情况获取不到.
| 宏 | 描述 |
|---|---|
__ADS_DOWN_X__ |
⽤户⼿指按下时相对广告位的坐标 |
__ADS_DOWN_Y__ |
⽤户⼿指按下时相对广告位的坐标 |
__ADS_UP_X__ |
⽤户⼿指抬起时相对广告位的坐标 |
__ADS_UP_Y__ |
⽤户⼿指抬起时相对广告位的坐标 |
__ADS_ABS_DOWN_X__ |
⽤户⼿指按下时相对屏幕的坐标 |
__ADS_ABS_DOWN_Y__ |
⽤户⼿指按下时相对屏幕的坐标 |
__ADS_ABS_UP_X__ |
⽤户⼿指抬起时相对屏幕的坐标 |
__ADS_ABS_UP_Y__ |
⽤户⼿指抬起时相对屏幕的坐标 |
__ADS_WIDTH__ |
实际广告位的宽 |
__ADS_HEIGHT__ |
实际广告位的高 |
__ADS_EVENT_TIME__ |
事件的时间宏, 单位:秒 |
__ADS_EVENT_MILLI_TIME__ |
事件的时间宏, 单位:毫秒 |
__ADS_PLAY_DURATION__ |
视频播放的进度宏, 单位:秒 |
__ADS_PLAY_MILLI_DURATION__ |
视频播放的进度宏, 单位:毫秒 |
__ADS_PLAY_FINISH__ |
视频播放到最后一帧的宏; 1:是, 0:否 |
__ADS_BID_PRICE__ |
价格宏 |
__ADS_LOSS_REASON__ |
竞败上报原因替换 |
5. RTB对接重点
- 接入RTB流量可返回价格, 参与媒体 ADX 的实时竞价. 媒体需返回结算价格(一般为 GSP 二价结算)
- Ad物料结构中的winNoticeUrl为启明ADX的竞价成功监测地址, 当启明ADX在媒体ADX竞价成功时, 媒体服务端立即通过此地址通知启明ADX, 注意不能在客户端发送, 媒体通知启明ADX前, 需要替换url中的价格宏占位; 当竞价不成功时, 不需要通知
- 结算价格为CPM价格, 单位:分, 整数形式, 不应高于启明ADX物料中bidPrice竞价价格. 在启明ADX的竞价成功通知和其他监测上报中(如展示上报, 点击上报等), 可能会包含价格宏占位, 媒体对启明ADX的结算价格加密后替换整个宏占位, 若URL中包含多个价格宏, 需支持多次替换.
5.1 价格加密
- winNoticeUrl和tracker中的监测上报如果包含宏
__ADS_BID_PRICE__, RTB接入方需要把自己的出价经过加密后, 与这个宏进行替换 - 加密库选择
AES/ECB/PKCS5Padding, AES密钥:联系启明ADX对接人获取 - 加密出的结果, 需要经过UrlEncode, 不支持带小数点价格
加密案例
价格: 99
加密后结果: SMbvQwvZoyzKu6nh//Rb2w==
UrlEncode后结果:SMbvQwvZoyzKu6nh%2F%2FRb2w%3D%3D5.2 竞败上报
lossNoticeUrl中需要替换的宏:
| 宏名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| __ADS_BID_PRICE__ | int | 否 | 采用上面的价格加密策略, 这里的价格代表三方平台竞胜的原始报价, 注意: 单位:分, 整数形式 |
| __ADS_LOSS_REASON__ | int | 否 | 竞败的原因: 0:其他原因 1:价格低, 没有其他平台高, 这种情况, 需要上传三方平台的原始报价, 以供分析 |
6 常量定义
6.1 广告样式
| 值 | 描述 |
|---|---|
| splash | 开屏广告 |
| banner | 横幅广告 |
| flow | 信息流广告 |
| interstitial | 插屏广告 |
| rewardvod | 激励视频广告 |
6.2 物料类型
| 值 | 描述 |
|---|---|
| 0 | 未知 |
| 1 | 开屏 |
| 2 | 插屏 |
| 3 | 横幅 |
| 4 | 单图信息流 |
| 5 | 多图信息流 |
| 6 | 视频 |
6.3 交互类型
| 值 | 描述 |
|---|---|
| 0 | 应用内WebView打开落地页地址 |
| 1 | 使用系统浏览器打开落地页地址 |
| 2 | 打开deeplink |
| 3 | 点击后下载, 仅出现在安卓设备 |
| 4 | 优量汇下载 |
| 5 | 打开微信小程序 |
6.3.1 下载类 (action=3)
跳转url优先级:deeplink > wechatId / wechatPath > landingPageUrl
- 媒体根据支持的跳转类型及返回的相关字段,按上述优先级进行跳转处理
- 针对应用直达广告(deeplink存在),调用deeplink字段调起应用,调起失败调用landingPageUrl进行兜底
- 针对非应用直达广告, 支持优先应用市场下载时(downloadType=1)可选择跳转应用市场, 开发者调用下载应用前,配合使用appPromotion等字段,通过弹窗等形式向用户展示应用名称、版本等应用相关信息,提示用户是否确认进行下载
6.3.2 其他
跳转url优先级:deeplink > wechatId / wechatPath > landingPageUrl
- 媒体根据支持的跳转类型及返回的相关字段,按上述优先级进行跳转处理
- 针对应用直达广告(deeplink存在),调用deeplink字段调起应用,调起失败调用landingPageUrl进行兜底
- 针对非应用直达广告,属于微信小程序/小游戏广告时(wechatId/wechatPath存在),优先调用微信 openSDK 处理 wechatId/wechatPath 字段,跳转至微信小程序/小游戏页面
- 针对非应用直达和非微信小程序/小游戏广告,调用landingPageUrl跳转落地页
6.4 互动样式
| 值 | 描述 |
|---|---|
| 0 | 默认 |
| 1 | 摇一摇 |
| 2 | 滑一滑 |
| 3 | 开屏无热区 |
| 4 | 擦一擦 |
| 5 | 转动手机 |
| 6 | 混合互动 |
6.5 互动玩法
| 值 | 描述 |
|---|---|
| 0 | 默认 |
| 21 | 向上滑动 |
| 22 | 向左滑动 |
| 23 | 弧形滑动 |
| 51 | 转动手机 |
| 52 | 扭动手机 |
6.6 下载类型
| 值 | 描述 |
|---|---|
| 0 | 默认 |
| 1 | 优先跳转应用市场下载, 安卓系统有效 |
6.7 deeplink类型
| 值 | 描述 |
|---|---|
| 0 | 普通scheme |
| 1 | iOS Universal link |
7. 普通广告点击说明
如果有deeplinkUrl链接, 优先使用deeplinkUrl唤醒应用, 可能有deeplink事件需要上报;
| 字段 | 事件类型 | 上报时机 |
| :—- | :—– | :—— |
| tryDeeplink | 尝试调起deeplink | 用户点击应用直达广告后,尝试调用deeplinkUrl 或 iOS Universal link (deeplinkType =1 时) 或 时 |
| deeplink | deeplink调起成功 | Android端:调用 deeplinkUrl10秒后,检测开发者的app(即发起deeplink调起的宿主app)是否在后台,当在后台时上报唤起成功;
iOS端:调用 iOS Universal link (deeplinkType =1 时) 或 deeplinkUrl 后,iOS系统接口返回结果显示应用直达未被系统弹窗取消时,上报唤起成功 |
8. 腾讯广告广告点击说明 (仅安卓需要处理)
当交互类型为腾讯广告下载时, 即action是4, 需按如下步骤获取实际落地页地址及相关操作
8.1 第一步:
客户端获取广告后请求landingPageURL地址(如果包含宏替换, 需要客户端先替换相应的宏参数再请求)
8.2 第二步:
根据替换后的landingPageUrl, 发起GET请求获取真正的落地页信息, 返回为json格式, 然后从json串中获得真实的落地页地址
响应Json示例如下:
{
"ret" : 0, // 返回码; 0:成功, 1:失败
"data" : { // APP下载和转化上报信息
"dstlink" : "http://xx.apk", // 当前广告对应的下载链接
"clickid" : "ad45af45adf" // 需要缓存下来, 用于后续转化上报
}
}参数说明:
| 参数名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| ret | Integer | 是 | 返回码, 非0表示失败 |
| dstlink | String | 是 | App的下载地址 |
| clickid | String | 是 | 点击ID, 需临时缓存在客户端, 用于后续下载和安装等上报监控时替换__CLICK_ID__ |
8.3 第三步:
根据获取的目标地址dstlink进行相应的操作;
后续操作(下载开始, 下载完成, 安装开始, 安装完成等)执行事件上报前, 需要将上报URL进行宏替换, 需要替换的宏如下(如果存在的话):
| 宏 | 介绍 |
|---|---|
__CLICK_ID__ |
上面接口拿到的clickid字段 |
9. 状态码
这里的状态码不是http状态码, 是返回Json结构中, code的定义码
| 状态码 | 描述 |
|---|---|
| 200 | 成功 |
| 204 | 无填充 |
10. Q&A
Q1. 出现问题如何快速排查?
A. 首先根据文档中的’code’和’message’; 如果自查查看是什么原因后无法解决, 请提供请求的响应头x-tm-traceid, 寻求启明ADX技术支持;
最后编辑:钟鹏涛 更新时间:2024-06-03 11:41