广告主回传转化数据接口

广告主通过调用该接口,将匹配到的转化数据发送给百度服务器。

请求方

广告主服务器

处理方

百度服务器

请求协议

Http POST

请求参数
参数名 类型 描述 限制
token String API接口token,每个推广账号对应一个唯一TOKEN 必填
conversionTypes ConversionType[] 回传转化数据数组,每次回传转化数据数组长度需小于100 必填

注意:一个转化一条数据,若一个logidUrl涉及两个转化类型,则需要回传两条

请求地址
https://ocpc.baidu.com/ocpcapi/api/uploadConvertData
示例,若同一个点击有多个转化,请将转化类型分开回传,如下所示
curl   -H "Content-type: application/json" -X POST  -d '{
        "token": "your token",
        "conversionTypes": [
            {
                "logidUrl": "http://www.bb123.com/12345?XX=XXX&bd_vid=1111",
                "newType": 3
            },
            {
                "logidUrl": "http://www.bb123.com/12345?XX=XXX&bd_vid=1111",
                "newType": 27
            },
            {
                "logidUrl": "http://www.bb123.com/12345?XX=XXX&bd_vid=2222",
                "newType": 3
            }
        ]
    }'  https://ocpc.baidu.com/ocpcapi/api/uploadConvertData
conversionType各参数说明
参数名 类型 描述 限制
logidUrl String logidUrl为带有&bd_vid=xxx的落地页url地址,只有在百度搜索广告里点击进入的落地页url,才会带有&bd_vid,如有相关疑问,可参考文档进行排查 必填,不可为空
长度不超过1024个字符
newType Integer 转化类型,每次选择一个类型回传,模型可用的转化类型请以推广后台新建转化追踪披露的转化类型为准 必填,取代原文档中的convertType字段(已对接的无需变动),新对接的请参照最新的转化类型编码回传,不可为空
deviceType Integer 0代表安卓;
1代表IOS;
2代表其他
选填
deviceId String 安卓:IMEI 号取 md5sum 摘要
IOS:IDFA 号原值
选填
isConvert Integer 是否发生转化(0或1)
0:未发生转化
1:发生转化
选填,默认为1
convertTime Long unix时间戳(精确到秒) 选填,转化类型为46时必填
convertValue Integer 转化金额(单位分) 选填,回传具体商品金额有助于提升模型优化准确性
confidence Integer 置信度,0—100数字 选填
newType类型枚举

点击这里查看转化类型编码

返回status状态码说明
status 说明
0 用户回传数据成功
1 用户回传数据部分成功
2 用户回传数据全部失败
3 API接口TOKEN校验失败
4 服务内部错误
返回errors错误码说明
错误码 说明
9018000 上传的conversionTypes数组为空
9018001 conversionTypes数组长度超过100
9018002 logidUrl无效
9018003 isConvert无效
9018004 newType或convertType无效
9018005 convertTime无效或超过有效上报时间
9018006 convertValue无效
返回结果示例

注意:服务端仅返回记录的具体错误原因。

客户可根据返回的错误提示对发送失败的记录进行修改,修改后可以再发送。
返回status字段(状态码)为0,表示用户上传数据成功

{
    "header": {
        "desc": "success",
        "status": 0
    }
}

返回status字段(状态码)为1,表示用户上传数据部分成功

  • 上传的conversionTypes数组中position位置的元素,没有isConvert或者isConvert值无效
    {
      "header": {
          "desc": "partly ok",
          "errors": [{
              "code": 9018003,
              "message": "isConvert is not valid",
              "position": "1"
          }],
          "status": 1
      }
    }
    
  • 上传的conversionTypes数组中position位置的元素,没有logidUrl或者logidUrl是空串
    {
      "header": {
          "desc": "partly ok",
          "errors": [{
              "code": 9018002,
              "message": "logidUrl is not valid",
              "position": "1"
          }],
          "status": 1
      }
    }
    
  • 上传的conversionTypes数组中position位置的元素,没有newType/convertType或者newType/convertType值无效
    {
      "header": {
          "desc": "partly ok",
          "errors": [{
              "code": 9018004,
              "message": "convertType is not valid",
              "position": "1"
          }],
          "status": 1
      }
    }
    

返回status字段(状态码)为2,表示用户上传数据全部失败

  • 例如:上传数据数组元素个数>100
    {
      "header": {
          "desc": "failure",
          "errors": [{
              "code": 9018001,
              "message": "conversionTypes num exceed limit",
              "position": "0"
          }],
          "status": 2
      }
    }
    

其他异常

  • token验证失败
    {
      "header": {
          "desc": "The token in the request is incorrect",
          "status": 3
      }
    }
    
  • 服务端异常情况
    {
      "header": {
          "desc": "system error",
          "status": 4
      }
    }
    
程序调用示例

Python代码调用示例(点击右上角切换语言)

点击这里下载代码Demo

版本:python2

# -*- coding: utf-8 -*-

import urllib2
import json


class ConversionType:
    """
    ConversionType 类
    """

    def __init__(self, logid_url, convert_type):
        """
        初始化函数
        :param logid_url: 落地页url地址
        :param convert_type: 转化类型
        """
        self.logid_url = logid_url
        self.convert_type = convert_type

    def to_dict(self):
        """
        :return:
        """
        return {"logidUrl": self.logid_url, "newType": self.convert_type}


def send_data(token, conversion_type_list):
    """
    回传转化数据接口
    :param token: 用户回传数据api接口token
    :param conversion_type_list: 回传转化数据列表
    :return: 返回True代表成功 False代表失败
    """
    requrl = "https://ocpc.baidu.com/ocpcapi/api/uploadConvertData"
    cv_str_list = [c_cv.to_dict() for c_cv in conversion_type_list]
    data = {
        "token": token,
        "conversionTypes": cv_str_list
    }

    params = json.dumps(data)
    # 发送的完整请求数据
    # do some log
    print params

    header = {"Content-Type": "application/json; charset=UTF-8"}
    request = urllib2.Request(requrl, data=params, headers=header)

    # 发送数据,设置失败重试3次
    retry_times = 3
    for i in range(retry_times):
        try:
            response = urllib2.urlopen(request)
        except Exception as e:
            # do something
            print "retry times: " + str(i) + "exception: " + str(e)
            continue
        if response.getcode() == 200:
            result = response.read().decode("utf-8")
            # 打印返回结果
            # do some log
            print "retry times: " + str(i) + " res: " + result
            json_rep = json.loads(result)
            status = json_rep['header']['status']
            # status为4,代表服务端异常,可添加重试
            if status != 4:
                # status == 0 代表回传数据成功,其余情况回传数据失败
                return status == 0
    return False


if __name__ == '__main__':
    token = "这里替换为您的token"
    # 编辑一条转化数据,请替换实际的落地页url和转化类型
    cv = ConversionType(logid_url="您的落地页url", convert_type=1)
    # 此处仅仅提供demo,支持添加更多的数据
    cv_list = [cv]
    send_data(token=token, conversion_type_list=cv_list)

版本:python3

# -*- coding: utf-8 -*-

import json
import requests
from typing import List


class ConversionType:
    """
    ConversionType 类
    """

    def __init__(self, logid_url: str, convert_type: int):
        """
        初始化函数
        :param logid_url: 落地页url地址
        :param convert_type: 转化类型
        """
        self.logid_url = logid_url
        self.convert_type = convert_type

    def to_dict(self) -> dict:
        """
        :return:
        """
        return {"logidUrl": self.logid_url, "newType": self.convert_type}


def send_data(token: str, conversion_type_list: List[ConversionType]):
    """
    数据回传接口
    :param token: 用户回传数据api接口token
    :param conversion_type_list: 回传转化数据列表
    :return: 返回True代表成功 False代表失败
    """
    requrl = "https://ocpc.baidu.com/ocpcapi/api/uploadConvertData"
    cv_str_list = [c_cv.to_dict() for c_cv in conversion_type_list]
    data = {
        "token": token,
        "conversionTypes": cv_str_list
    }

    req_data = json.dumps(data)
    # 发送的完整请求数据
    # do some log
    print(req_data)

    header = {"Content-Type": "application/json; charset=UTF-8"}

    # 发送数据,设置失败重试3次
    retry_times = 3
    for i in range(retry_times):
        try:
            res = requests.post(requrl, req_data, headers=header)
        except requests.RequestException as e:
            # do something
            print("retry times: {times} e: {e}".format(times=i, e=e))
            continue
        if res.ok:
            # 打印返回结果
            # do some log
            print("retry times: {times} res: {res_content}".format(times=i, res_content=res.content.decode("UTF-8")))
            status = res.json()['header']['status']
            # status为4,代表服务端异常,可添加重试
            if status != 4:
                # status == 0 代表回传数据成功,其余情况回传数据失败
                return status == 0
    return False


if __name__ == '__main__':
    token = "这里替换为您的token"
    # 编辑一条转化数据,请替换实际的落地页url和转化类型
    cv = ConversionType(logid_url="http://www.b123.com/12345?XX=XXX&bd_vid=1111", convert_type=1)
    # 此处仅仅提供demo,支持添加更多的数据
    cv_list = [cv]
    send_data(token=token, conversion_type_list=cv_list)

Java代码调用示例(点击右上角切换语言)

点击这里下载代码Demo

package com.demo;

import com.demo.model.ConversionType;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;


/**
 * API 回传数据Demo
 */
public class APIDemo {

    private static final Integer RETRY_TIMES = 3;
    private static final String BAIDU_OCPC_URL = "https://ocpc.baidu.com/ocpcapi/api/uploadConvertData";

    /**
     * 数据回传接口
     * @param token 用户回传数据api接口token
     * @param conversionTypeList 回传转化数据数组
     * @return 返回true代表成功 false代表失败
     */
    private static Boolean sendConvertData(String token, List<ConversionType> conversionTypeList) {

        JsonObject data = new JsonObject();
        // 设置API接口回传Token
        data.addProperty("token", token);
        // 设置API接口回传conversionTypes
        data.add("conversionTypes",
                new Gson().toJsonTree(conversionTypeList, new TypeToken<List<ConversionType>>() {}.getType()).getAsJsonArray());
        // 发送的完整请求数据
        // do some log
        System.out.println("req data: " + data.toString());
        // 向百度发送数据
        return sendWithRetry(data.toString());

    }

    private static boolean sendWithRetry(String msg) {
        // 发送请求
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost post = new HttpPost(BAIDU_OCPC_URL);
        post.setHeader("Content-type", "application/json; charset=UTF-8");
        StringEntity entity = new StringEntity(msg, Charset.forName("UTF-8"));
        entity.setContentEncoding("UTF-8");
        post.setEntity(entity);
        // 添加失败重试
        int retry = RETRY_TIMES;
        for (int i = 0; i < retry; i++) {
            try {
                HttpResponse response = client.execute(post);
                // 检验状态码,如果成功接收数据
                int code = response.getStatusLine().getStatusCode();
                if (code == HttpStatus.SC_OK) {
                    String res = EntityUtils.toString(response.getEntity());
                    JsonObject returnData = new JsonParser().parse(res).getAsJsonObject();
                    // 打印返回结果
                    // do some log
                    System.out.println("retry times :" + i + ", res data: " + res);

                    int status = returnData.getAsJsonObject("header").get("status").getAsInt();
                    // status为4,代表服务端异常,可添加重试
                    if ( status != 4) {
                        return status == 0; // status == 0 代表回传数据成功,其余情况回传数据失败
                    }
                }
            } catch (IOException e) {
                // do some log
            }
        }
        return false;
    }

    public static void main(String[] args) {
        String token = "这里替换为您的token";
        List<ConversionType> conversionTypes = new ArrayList<>();
        // 编辑一条转化数据
        ConversionType cv = new ConversionType();
        cv.setLogidUrl("http://www.b123.com/12345?XX=XXX&bd_vid=1111"); // 设置落地页url
        cv.setNewType(1); // 设置转化类型
        conversionTypes.add(cv);
        System.out.println(APIDemo.sendConvertData(token, conversionTypes));
    }
}

ConversionType定义

package com.demo.model;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.io.Serializable;

public class ConversionType implements Serializable {

    /*
        落地页Url
     */
    private String logidUrl;
    /*
        转化类型
     */
    private Integer newType;

    public String getLogidUrl() {
        return logidUrl;
    }

    public void setLogidUrl(String logidUrl) {
        this.logidUrl = logidUrl;
    }

    public Integer getNewType() {
        return newType;
    }

    public void setNewType(Integer newType) {
        this.newType = newType;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}

Php代码调用示例(点击右上角切换语言)

点击这里下载代码Demo

<?php

/**
 * Class APIDemo API回传数据Demo
 */
class APIDemo {

    const BAIDU_OCPC_URL = 'https://ocpc.baidu.com/ocpcapi/api/uploadConvertData';
    const RETRY_TIMES = 3;

    /**
     * @param $token
     * @param $conversionTypes
     * @return bool 发送成功返回true,失败返回false
     */
    public function sendConvertData($token, $conversionTypes) {
        $reqData = array('token' => $token, 'conversionTypes' => $conversionTypes);
        $reqData = json_encode($reqData);
        // 发送完整的请求数据
        // do some log
        print_r('req data: ' . $reqData . "\n");
        // 向百度发送数据
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, self::BAIDU_OCPC_URL);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $reqData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json; charset=utf-8',
                'Content-Length: ' . strlen($reqData)
            )
        );
        // 添加重试,重试次数为3
        for ($i = 0; $i < self::RETRY_TIMES; $i++) {
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($httpCode === 200) {
                // 打印返回结果
                // do some log
                print_r('retry times: ' . $i . ' res: ' . $response . "\n");
                $res = json_decode($response, true);
                // status为4,代表服务端异常,可添加重试
                $status = $res['header']['status'];
                if ($status !== 4) {
                    curl_close($ch);
                    return $status === 0;
                }
            }
        }
        curl_close($ch);
        return false;
    }
}


$token = '这里替换为您的token';
// 编辑一条转化数据
$cv = array(
    'logidUrl' => 'http://www.b123.com/12345?XX=XXX&bd_vid=1111', // 您的落地页url
    'newType' => 1 // 转化类型请按实际情况填写
);
// 此处仅为demo, conversionTypes支持添加更多数据
$conversionTypes = array($cv);
$demo = new APIDemo();
$demo->sendConvertData($token, $conversionTypes);
?>

Nodejs代码调用示例(点击右上角切换语言)

const https = require('https');
const url = require('url');

const endpoint = "https://ocpc.baidu.com/ocpcapi/api/uploadConvertData";
const parsedEndpoint = url.parse(endpoint);

const postData = JSON.stringify({
    "token": "这里替换为您的token ",
    "conversionTypes": [
            {
                "logidUrl": "http://www.b123.com/12345?XX=XXX&bd_vid=1111",
                "newType": 1
            }
        ]
});

const options = {
    hostname: parsedEndpoint.hostname,
    port: parsedEndpoint.port,
    path: parsedEndpoint.path,
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': postData.length
    }
};

const req = https.request(options, (res) => {
    //检验状态码,如果成功接收数据
    if (res.statusCode === 200) {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            console.log(`"res data: ${chunk}`);
        });
    }
});

req.on('error', (e) => {
    console.error(`problem with request: ${e.message}`);
});

req.write(postData);
req.end();

results matching ""

    No results matching ""