版本 | 作者 | 时间 | 备注 |
---|
v2.0.0 | 崔英杰 | 2019.08.16 | 创建 DSP API 2.0 接口文档 |
v2.0.1 | 崔英杰 | 2019.10.17 | 增加 OAID 支持 |
v2.0.2 | 崔英杰 | 2019.12.11 | 增加 DeepLink tranckers |
v2.0.3 | 崔英杰,马秉尧 | 2020.04.02 | 增加 request id 和 response id |
v2.0.4 | 马秉尧 | 2020.07.01 | 增加 rom_version,sys_compiling_time,ssid 和 wifi_mac |
v2.0.5 | 崔英杰 | 2020.09.03 | 支持 oaid_md5 |
v2.0.6 | 马秉尧 | 2021.03.08 | 支持 caid |
v2.0.7 | 马秉尧 | 2021.10.26 | 增加 boot_mark、update_mark 字段 |
v2.0.8 | 马秉尧 | 2021.04.22 | 增加 caid_version 字段 |
v2.0.9 | 马秉尧 | 2021.04.22 | 增加 win_notice_trackers 字段 |
v2.0.10 | 马秉尧 | 2021.05.11 | 增加 {XY_PRICE_SECURE} 宏 |
v2.0.11 | 马秉尧 | 2023.04.12 | 增加了价格解密测试用例,request 增加了 ad.type 字段 |
v2.0.12 | 马秉尧 | 2023.04.17 | 增加了逻辑像素点击宏 |
v2.0.13 | 马秉尧 | 2023.08.31 | 增加了 privacy_url、permission_url、mini_program_id、mini_program_path 响应字段 |
v2.0.14 | 马秉尧 | 2023.11.14 | 增加了 paid 请求字段 |
v2.0.15 | 马秉尧 | 2024.03.19 | 增加了 download_app_desc 响应字段 |
v2.0.16 | 张勇 | 2024.05.31 | 增加了 caid_md5 caid2 caid2_md5 caid2_version 请求字段 |
v2.0.17 | 马秉尧 | 2024.06.24 | 增加了 ipv6 请求字段 |
v2.0.18 | 马秉尧 | 2025.03.06 | 删除了 ratings, likes, downloads 响应字段,修正 download_app_size 描述中的单位 |
v2.0.19 | 马秉尧 | 2025.03.07 | 增加了 device_startup_time、system_update_time、system_init_time 字段 |
v2.0.20 | 马秉尧 | 2025.03.10 | 删除了 install_begin_trackers 上报 |
v2.0.21 | 马秉尧 | 2025.03.11 | 增加了 protobuf 支持,增加压缩支持说明 |
方法 | 格式 | 编码 |
---|
HTTP POST | JSON 或 protobuf | UTF-8 |
请求支持 json 和 protobuf 格式,默认按照 JSON 格式发送请求。如果需要使用 protobuf 格式,可事先沟通。
请求和响应均支持压缩,请求数据默认按照不压缩方式发送,如果请求支持压缩格式,可事先沟通。当请求为压缩格式时,请求的 HTTP header 中会带有 Content-Encoding
头,值为压缩格式,压缩格式为下列之一:zstd
, gzip
, br
, compress
, deflate
。响应默认支持返回压缩格式的数据,请求的 HTTP header 中会带有 AcceptEncoding
头,值为 "zstd, br, gzip, deflate, compress"
,返回响应如果是压缩格式的,实际响应的压缩格式应在响应的 Content-Encoding
头中标明。
syntax = "proto3";
option go_package = "./;xydsp";
package xydsp;
message BidRequest {
string id = 1;
string version = 2;
repeated Ad ads = 3;
App app = 4;
Device device = 5;
User user = 6;
bool need_https = 7;
enum AdType {
BANNER = 0;
INTERSTITIAL = 1;
SPLASH = 2;
NATIVE = 3;
REWARDED_VIDEO = 4;
}
message Ad {
string ad_unit_token = 1;
int64 width = 2;
int64 height = 3;
double floor_price = 4;
bool support_js = 5;
AdType type = 6;
}
message App {
string name = 1;
string bundle = 2;
string version = 3;
int64 deeplink_mode = 4;
}
enum DeviceType {
UNKNOWN = 0;
PHONE = 1;
PAD = 2;
TV = 3;
PC = 4;
}
message Device {
string ip = 1;
string ipv6 = 2;
string user_agent = 3;
string make = 4;
string brand = 5;
string model = 6;
string os = 7;
string os_version = 8;
string connection_type = 9;
string orientation = 10;
string plmn = 11;
string mac = 12;
string mac_md5 = 13;
string language = 14;
int64 screen_width = 15;
int64 screen_height = 16;
int64 screen_dpi = 17;
double screen_pxratio = 18;
double geo_longitude = 19;
double geo_latitude = 20;
string installed_apps = 21;
DeviceType device_type = 22;
string ssid = 23;
string wifi_mac = 24;
string imei = 25;
string imei_md5 = 26;
string android_id = 27;
string android_id_md5 = 28;
string imsi = 29;
string android_advertising_id = 30;
string oaid = 31;
string oaid_md5 = 32;
string rom_version = 33;
int64 sys_compiling_time = 34;
string idfa = 35;
string idfa_md5 = 36;
string idfv = 37;
string caid = 38;
string caid_md5 = 39;
string caid_version = 40;
string caid2 = 41;
string caid2_md5 = 42;
string caid2_version = 43;
string openudid = 44;
string boot_mark = 45;
string update_mark = 46;
string paid = 47;
string device_startup_time = 48;
string system_update_time = 49;
string system_init_time = 50;
}
message User {
int64 age = 1;
string gender = 2;
repeated string keywords = 3;
}
}
message BidResponse {
string id = 1;
repeated Ad ads = 2;
message Ad {
int64 width = 1;
int64 height = 2;
string ad_id = 3;
string creative_id = 4;
double price = 5;
string title = 6;
string subtitle = 7;
string description = 8;
string advertiser_name = 9;
string button_text = 10;
repeated Image images = 11;
Image icon = 12;
Image logo = 13;
Video video = 14;
Image video_cover = 15;
string html_snippet = 16;
string html_url = 17;
int64 action = 18;
string target_url = 19;
string download_app_bundle = 20;
string download_app_name = 21;
string download_app_version = 22;
int64 download_app_size = 23;
string download_app_desc = 24;
string privacy_url = 25;
string permission_url = 26;
string mini_program_id = 27;
string mini_program_path = 28;
string deeplink_url = 29;
repeated string win_notice_trackers = 30;
repeated string impression_trackers = 31;
repeated string click_trackers = 32;
repeated string download_begin_trackers = 33;
repeated string download_ended_trackers = 34;
repeated string install_ended_trackers = 35;
repeated string video_play_begin_trackers = 36;
repeated string video_play_break_trackers = 37;
repeated string video_play_ended_trackers = 38;
repeated string deeplink_app_not_installed_trackers = 39;
repeated string deeplink_app_installed_trackers = 40;
repeated string deeplink_app_invoke_failed_trackers = 41;
repeated string deeplink_app_invoke_success_trackers = 42;
}
message Image {
string url = 1;
int64 width = 2;
int64 height = 3;
}
message Video {
string url = 1;
int64 duration = 2;
}
}
字段名称 | 类型 | 必须 | 描述 |
---|
id | string | 是 | 请求 id, 每个请求唯一 |
version | string | 是 | 协议版本, 当前协议版本 2.0.0 |
ads | []Ad | 是 | Ad 数组 |
app | App | 是 | App |
device | Device | 是 | Device |
user | User | 否 | User |
need_https | bool | 否 | 是否需要 https 链接, 默认不需要 |
字段名称 | 类型 | 必须 | 描述 |
---|
ad_unit_token | string | 是 | 广告位 token |
width | int | 否 | 广告位宽度 |
height | int | 否 | 广告位高度 |
floor_price | float | 否 | 底价, 单位为分 |
support_js | bool | 否 | 是否支持将 html 广告放在 webview 里面展示, 默认不支持 |
type | int | 是 | - 0 : 横幅 |
| | | - 1 : 插屏 |
| | | - 2 : 开屏 |
| | | - 3 : 原生 |
| | | - 4 : 视频 |
字段名称 | 类型 | 必须 | 描述 |
---|
name | string | 否 | 应用名 |
bundle | string | 否 | 应用包名 |
version | string | 否 | 应用版本 |
deeplink_mode | int | 否 | 默认为 0 |
| | | - -1 : 不支持 deeplink |
| | | - 0 : 在浏览器打开的目标页面中触发 deeplink (默认) |
| | | - 1 : 表示可在广告页面触发 deeplink, 失败则打开 target_url |
字段名称 | 类型 | 必须 | 描述 |
---|
ip | string | 是 | ip |
ipv6 | string | 否 | ipv6 |
user_agent | string | 是 | webview user agent |
make | string | 否 | 生产厂商,例如:"Samsung" |
brand | string | 否 | 手机品牌,例如:"MI4" |
model | string | 否 | 型号 |
os | string | 否 | 操作系统 |
| | | - android |
| | | - ios |
os_version | string | 否 | 操作系统版本 |
connection_type | string | 否 | 网络连接类型 |
| | | - wifi |
| | | - 2g |
| | | - 3g |
| | | - 4g |
| | | - 5g |
orientation | string | 否 | 设备方向 |
| | | - landscape : 横屏 |
| | | - portrait : 竖屏 |
plmn | string | 否 | 国家运营商编号 |
| | | - 46000 : 中国移动 |
| | | - 46002 : 中国移动 |
| | | - 46001 : 中国联通 |
| | | - 46003 : 中国电信 |
mac | string | 否 | MAC 地址 |
mac_md5 | string | 否 | MAC 地址的 MD5 值 |
language | string | 否 | 系统语言 |
screen_width | int | 否 | 屏幕宽度, 单位: 像素 |
screen_height | int | 否 | 屏幕高度, 单位: 像素 |
screen_dpi | int | 否 | 屏幕像素密度, 参考 |
screen_pxratio | float | 否 | 屏幕物理像素密度 参考 |
geo_longitude | float | 否 | 经度 |
geo_latitude | float | 否 | 纬度 |
installed_apps | string | 否 | 用户设备安装包名列表 |
| | | 用逗号分隔 |
| | | com.android.calendar,com.android.chrome |
device_type | int | 否 | 用户设备类型 |
| | | - 0 : 未知 |
| | | - 1 : 手机 |
| | | - 2 : 平板 |
| | | - 3 :电视 |
| | | - 4 :PC |
ssid | string | 否 | 无线网 SSID |
wifi_mac | string | 否 | WIFI 路由器 Mac 地址 |
| | | 以下字段仅在 Android 系统上可获取到 |
imei | string | 否 | cdma 手机会传 meid 码 |
imei_md5 | string | 否 | |
android_id | string | 否 | |
android_id_md5 | string | 否 | |
imsi | string | 否 | |
android_advertising_id | string | 否 | |
oaid | string | 否 | 匿名设备标识符 |
| | | 对于 Android 设备, |
| | | 当 oaid 不填时, |
| | | imei(或 imei_md5) 和, |
| | | android_id(或 android_id_md5) 必填 |
oaid_md5 | string | 否 | oaid md5 |
rom_version | string | 否 | 手机 ROM 的版本号 |
| | | (例如 MIUI 11.0.6, EMUI 10.1 等) |
sys_compiling_time | long | 否 | 系统编译时间(时间戳) |
| | | 以下字段仅在 iOS 系统上可获取到 |
idfa | string | 否 | |
idfa_md5 | string | 否 | |
idfv | string | 否 | |
caid | string | 否 | 中广协推出的iOS设备ID,同时支持传两个版本,详情 http://www.china-caa.org/digital/caid/intro |
caid_md5 | string | 否 | 中广协推出的iOS设备ID MD5,详情 http://www.china-caa.org/digital/caid/intro |
caid_version | string | 否 | 中广协推出的iOS设备ID 的版本号,详情 http://www.china-caa.org/digital/caid/intro |
caid2 | string | 否 | 中广协推出的iOS设备ID,详情 http://www.china-caa.org/digital/caid/intro |
caid2_md5 | string | 否 | 中广协推出的iOS设备ID MD5,详情 http://www.china-caa.org/digital/caid/intro |
caid2_version | string | 否 | 中广协推出的iOS设备ID 的版本号,详情 http://www.china-caa.org/digital/caid/intro |
openudid | string | 否 | |
boot_mark | string | 否 | 取原值回传 例如:iOS:1623815045.970028;Android:ec7f4f33-411a-47bc-8067-744a4e7e0723 |
update_mark | string | 否 | 取原值回传 例如:iOS:1581141691.570419583 Android:1004697.709999999 |
paid | string | 否 | 拼多多设备指纹 |
device_startup_time | string | 否 | iOS 设备启动时间,10位整数时间戳,例如:1657043138 |
system_update_time | string | 否 | iOS 系统更新时间,10位整数加6位小数时间戳,例如:1647545826.588793 |
system_init_time | string | 否 | iOS 系统初始化时间,10位整数加9位小数时间戳,例如:1647545718.125795458 |
字段名称 | 类型 | 必须 | 描述 |
---|
age | int | 否 | 年龄 |
gender | string | 否 | 性别 男 女 未知 |
keywords | []string | 否 | 用户感兴趣关键字 |
http status code | 描述 |
---|
200 | 正常, 有广告返回 |
204 | 正常, 无广告返回 |
4xx | 我方请求参数错误 |
5xx | dsp 方服务端错误 |
字段名称 | 类型 | 必须 | 描述 |
---|
id | string | 否 | 回填 Request 中的 id |
ads | []Ad | 是 | Ad 对象数组 |
字段名称 | 类型 | 必须 | 描述 |
---|
width | int | 是 | 广告宽度 |
height | int | 是 | 广告高度 |
ad_id | string | 是 | 广告 id |
creative_id | string | 是 | 素材 id |
price | float | 否 | 广告价格, 单位 分 |
| | | 用于广告展示的素材 |
title | string | 否 | 标题 |
subtitle | string | 否 | 副标题 |
description | string | 否 | 描述 |
advertiser_name | string | 否 | 广告主名称 |
button_text | string | 否 | 按钮文字 |
images | []image | 否 | 图片数组 |
icon | image | 否 | 图标 |
logo | image | 否 | logo |
video | video | 否 | 视频 |
video_cover | image | 否 | 视频封面图 |
html_snippet | string | 否 | html 代码片段, 在 webview 中加载 |
html_url | string | 否 | html 代码地址, 在 webview 中加载 |
| | | 用于广告点击处理 |
action | int | 是 | 广告动作类型 |
| | | - 1 : 在应用内用 webview 打开 target_url |
| | | - 2 : 在系统浏览器打开 target_url |
| | | - 6 : 下载应用 |
| | | - 7 : 打开 deeplink_url |
| | | - 8 : 打开小程序 |
| | | 如果失败则打开 target_url |
target_url | string | 是 | 目标地址, 里面的宏会被替换 |
download_app_bundle | string | 否 | 下载应用包名 |
download_app_name | string | 否 | 下载应用名称 |
download_app_version | string | 否 | 下载应用版本 |
download_app_size | int | 否 | 下载应用大小, 单位 Bytes |
download_app_desc | string | 否 | 下载应用描述 |
privacy_url | string | 否 | 下载应用隐私协议地址 |
permission_url | string | 否 | 下载应用权限列表地址 |
mini_program_id | string | 否 | 小程序原始id |
mini_program_path | string | 否 | 小程序页面路径 |
deeplink_url | string | 否 | 深度链接地址, 里面的宏会被替换 |
| | | 上报地址 |
win_notice_trackers | []string | 否 | 竞价获胜通知地址 |
impression_trackers | []string | 是 | 曝光, 里面的宏会被替换 |
click_trackers | []string | 是 | 点击, 里面的宏会被替换 |
download_begin_trackers | []string | 否 | 应用下载开始, 里面的宏会被替换 |
download_ended_trackers | []string | 否 | 应用下载完成, 里面的宏会被替换 |
install_ended_trackers | []string | 否 | 应用安装完成, 里面的宏会被替换 |
video_play_begin_trackers | []string | 否 | 视频播放开始, 里面的宏会被替换 |
video_play_break_trackers | []string | 否 | 视频播放中止, 里面的宏会被替换 |
video_play_ended_trackers | []string | 否 | 视频播放结束, 里面的宏会被替换 |
deeplink_app_not_installed_trackers | []string | 否 | deeplink 唤醒时,发现应用没有安装 |
deeplink_app_installed_trackers | []string | 否 | deeplink 唤醒时,发现应用有安装 |
deeplink_app_invoke_failed_trackers | []string | 否 | deeplink 唤醒时,应用有安装 |
| | | 但唤起失败 |
deeplink_app_invoke_success_trackers | []string | 否 | deeplink 唤醒时,应用唤起成功 |
字段名称 | 类型 | 必须 | 描述 |
---|
url | string | 是 | 图片地址 |
width | int | 否 | 图片宽度 |
height | int | 否 | 图片高度 |
字段名称 | 类型 | 必须 | 描述 |
---|
url | string | 是 | 视频地址 |
duration | int | 否 | 视频时长, 单位 秒 |
字段 | 含义 |
---|
{XY_CLICK_DOWN_X} | ⼿指点击时相对于素材的 X 坐标, 能替换则替换, 不能替换则替换为-999 |
{XY_CLICK_DOWN_Y} | ⼿指点击时相对于素材的 Y 坐标, 能替换则替换, 不能替换则替换为-999 |
{XY_CLICK_UP_X} | ⼿指抬起时相对于素材的 X 坐标, 能替换则替换, 不能替换则替换为-999 |
{XY_CLICK_UP_Y} | ⼿指抬起时相对于素材的 Y 坐标, 能替换则替换, 不能替换则替换为-999 |
{XY_CLICK_DOWN_LX} | ⼿指点击时相对于素材的 X 坐标(逻辑像素), 能替换则替换, 不能替换请全部替换为-999 |
{XY_CLICK_DOWN_LY} | ⼿指点击时相对于素材的 Y 坐标(逻辑像素), 能替换则替换, 不能替换请全部替换为-999 |
{XY_CLICK_UP_LX} | ⼿指抬起时相对于素材的 X 坐标(逻辑像素), 能替换则替换, 不能替换请全部替换为-999 |
{XY_CLICK_UP_LY} | ⼿指抬起时相对于素材的 Y 坐标(逻辑像素), 能替换则替换, 不能替换请全部替换为-999 |
{XY_PRICE} | 价格, 单位 分 (明文) |
{XY_PRICE_SECURE} | 价格, 单位 分 (加密) |
备注:逻辑像素(dp) = 物理像素(px) / 屏幕密度(dpi),使用逻辑像素作为单位可消除 Android 端不同分辨率手机屏幕导致的坐标差异,逻辑像素 Android 端使用 dp 作为单位,iOS 端需使用 pt 作为单位。
价格宏的加密是可选的,如果希望传递明文价格,请使用 {XY_PRICE}
宏,如果希望传递加密后的价格,请使用 {XY_PRICE_SECURE}
宏。
加密算法默认采用 AES/ECB/PKCS5 算法,加密后的结果以 RawURLEncoding (unpadded alternate base64) 编码传递。所需秘钥在对接时由我方单独提供。
密钥 | 加密前数据 | 加密后数据 |
---|
123456789abcdefghijklmnopqrstuvw | 100 | agFVCc6ZpMRQGW8-mUtzRA |
123456789abcdefghijklmnopqrstuvw | 500 | 8RNzQbVj6VvMOa_hRuzy3w |
123456789abcdefghijklmnopqrstuvw | 1001 | Kiiv5UTOxlVha19mPlKT6g |
加密算法也可以采取 Google 的 Double Click 加密算法,加密方式链接:https://developers.google.com/authorized-buyers/rtb/response-guide/decrypt-price#encryption-scheme ,所需秘钥 e_key, i_key 在对接时由我方单独提供。
e_key | i_key | 加密前数据 | 加密后数据 |
---|
8f1dd415a672c54c1dd295201cb6334a | 0a4b74ad404e5c8ba961ec009af01c5d | 100 | AAABh3NrNQsW6ra4kzTreGXOUjS-qtQVwK7w-w |
8f1dd415a672c54c1dd295201cb6334a | 0a4b74ad404e5c8ba961ec009af01c5d | 500 | AAABh3NrNQtTzyTNN1G42Wbwpreesy63ZPSUOQ |
8f1dd415a672c54c1dd295201cb6334a | 0a4b74ad404e5c8ba961ec009af01c5d | 1001 | AAABh3NrNQtJm4-5rwyTYPED8M4B_TIERhj7Jw |
注意:因为 Google 的 Double Click 加密算法中包含一个由时间戳和随机数的 iv,所以每次加密后的数据都是不一样的,验证算法实现是否正确时,只需要能够将加密后的数据解密成加密前的数据即可。
{
"id": "bptcvhm8cv6t0nsoh6eg",
"version": "2.0.0",
"ads": [
{
"ad_unit_token": "209A03F87BA3B4EB82BEC9E5F8B41383",
"width": 640,
"height": 100,
"support_js": true
}
],
"app": {
"name": "今日头条",
"version": "3.0.1",
"bundle": "com.xinyi.toutiao",
"deeplink_mode": 1
},
"device": {
"ip": "114.251.228.90",
"user_agent": "Mozilla/5.0 (Linux; Android 8.0.0; MIX 2 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36 News/195 Android/8.0.0 NewsApp/195 SDK/26 VERSION/7.1.5dongqiudiClientApp",
"make": "Xiaomi",
"brand": "Xiaomi",
"model": "MIX 2",
"os": "android",
"os_version": "7.0.1",
"connection_type": "wifi",
"orientation": "portrait",
"plmn": "46000",
"imei": "865736038728823",
"android_id": "1f45138911dba981"
}
}
{
"id": "bptcvhm8cv6t0nsoh6eg",
"ads": [
{
"width": 640,
"height": 100,
"ad_id": "unique-ad-id",
"creative_id": "unique-creative-id",
"images": [
{
"url": "https://cdn.mobrtb.com/images/back_ad/banner/640_100/640-100-5.png"
}
],
"action": 7,
"target_url": "https://m.cudaojia.com?appKey-d7950cd55bb34a1a89e1e09ab776a3bf&appType-h5&appEntrance-7&business-money",
"deeplink_url": "tbopen://m.taobao.com/tbopen/index.html?source-auto&action-ali.open.nav&module-h5&bootImage-0&h5Url-https%3A%2F%2Fh5.m.taobao.com%2Fbcec%2Fdahanghai-jump.html%3Fspm%3D2014.ugdhh.3915747229.1208-293%26bc_fl_srcgrowth_dhh_3915747229_1208-293&spm-2014.ugdhh.3915747229.1208-293&bc_fl_src-growth_dhh_3915747229_1208-293&materialid-1208",
"impression_trackers": [
"https://api.mobrtb.com/tracker?request_id-bq3fm5aghlvo0f9abrd0&log_event_type-7"
],
"click_trackers": [
"https://api.mobrtb.com/tracker?request_id-bq3fm5aghlvo0f9abrd0&log_event_type-8"
]
}
]
}