搜索视频
您可以使用本接口获取某一广告账号的素材库中可用于创建广告的视频素材。
最多只按照素材修改时间返回前 10,000 条数据。
v1.2与v1.3版本对比
以下表格概括了 v1.2与v1.3接口的变化。
``xtable
|变化内容{30%}|v1.2{35%}|v1.3{35%}|
|---|---|---|
|接口路径|/v1.2/file/video/ad/search/|/v1.3/file/video/ad/search/|
|请求参数类型 |advertiser_id: number|advertiser_id: string|
|废弃请求参数|/|height<br>ratio<br>width<br>displayable|
|返回参数名称|poster_url<br>url|video_cover_url<br>preview_url|
|废弃返回参数|/|id|
|新增请求参数|/|video_name<br>video_material_sources<br>sort_field|
|新增返回参数|/|preview_url_expire_time`|
## 请求
**地址** https://business-api.tiktok.com/open_api/v1.3/file/video/ad/search/
**方法** GET
**Header**
``` xtable
|字段|类型|描述|
|---|---|---|
|Access-Token {必填}|string|授权访问令牌。可以通过[获取访问令牌](https://ads.tiktok.com/marketing_api/docs?id=1738373164380162)接口获取。|
参数
|字段|类型|描述|
|---|---|---|
|advertiser_id {必填}|string|广告主账户。|
|filtering |object|筛选条件。本字段是筛选对象的数组。|
#|video_ids |string[]|视频 ID 列表。<br><br>最大数量:100。<br><br><p><span style="color:darkred"><b>注意</b></span>:<ul><li>若视频不可用于创建广告,视频 ID 将被忽略。</li><li>若未传入本筛选字段,且由于多次上传,同一视频生成了多个视频 ID,则仅会为该视频返回一个有效的视频 ID。</li></ul>|
#|material_ids|string[]|素材 ID 列表。<br><br>最大数量:20。|
#|video_name|string|视频名称。您可以输入视频名称进行模糊搜索。|
#|video_material_sources | string[] | 视频素材来源列表。您可以通过选择视频素材来源列表来进行模糊搜索。<br><br>枚举值:<ul><li>`UPLOADED_TO_TIKTOK_ADS_MANAGER`:上传至 TikTok 广告管理平台的视频。 </li><li> `UPLOADED_TO_CATALOG`:上传至商品库的视频。</li><li> `CREATIVE_TOOL_SMART_VIDEO`:创意工具 - 微电影。</li><li> `CREATIVE_TOOL_QUICK_OPTIMIZATION`:创意工具 - 一键优化。</li><li> `CREATIVE_TOOL_VIDEO_TEMPLATE`:创意工具 - 模版视频。</li><li> `CREATIVE_TOOL_SMART_VIDEO_SOUNDTRACK`:创意工具 - 智能配乐。</li><li>`CREATIVE_TOOL_TIKTOK_VIDEO_EDITOR`:创意工具 - 视频编辑器。</li><li> `TIKTOK_CREATIVE_EXCHANGE`:TikTok Creative Exchange。</li><li>`CATALOG_VIDEO_TEMPLATE`:商品库视频模版。 </li><li> `DYNAMIC_VIDEO_EDITOR`:动态视频编辑器。</li><li> `CREATIVE_CHALLENGE`:创意挑战。</li><li>`AUTOMATED_CREATIVE_OPTIMIZATION`:程序化创意。</li><li>`OTHER`:其他。</li><li>`QUICK_GENERATION`:快速生成。</li><li> `CREATIVE_CENTER_VIDEO_UPLOAD`:创意中心 - 视频上传。</li><li>`CREATIVE_CENTER_TIKTOK_VIDEO_EDITOR`:创意中心 - TikTok 视频编辑器。</li><li> `CREATIVE_CENTER_VIDEO_TEMPLATE`:创意中心 - 视频模板。</li><li>`DYNAMIC_SCENE`:动态场景。</li><li>`SMART_OPTIMIZATION_TOOL`:智能优化工具。</li></ul> |
|sort_field|string|视频列表的排序方式。<br><br> 枚举值:<ul><li>`CREATE_TIME`:按视频创建时间降序排列,视频列表最先返回最新创建的视频。</li><li>`MODIFY_TIME`:按视频最近更新时间降序排列,视频列表最先返回最近更新的视频。 </li></ul>默认值:`CREATE_TIME`。|
|page |number|当前页数。<br><br>默认值: 1。取值范围: ≥ 1。|
|page_size |number|分页大小。<br><br>默认值: 20。取值范围: 1-100。|
示例
(code Java java)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import org.apache.http.client.utils.URIBuilder;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Map;
public class Demo {
private static final String ACCESS_TOKEN = "xxx";
private static final String PATH = "/open_api/v1.3/file/video/ad/search/";
/**
* Build request URL
*
* @param path Request path
* @return Request URL
*/
private static String buildUrl(String path) throws URISyntaxException {
URI uri = new URI("https", "business-api.tiktok.com", path, "", "");
return uri.toString();
}
/**
* Send GET request
*
* @param jsonStr:Args in JSON format
* @return Response in JSON format
*/
private static String get(String jsonStr) throws IOException, URISyntaxException {
OkHttpClient client = new OkHttpClient().newBuilder().build();
URIBuilder ub = new URIBuilder(buildUrl(PATH));
ObjectMapper mapper = new ObjectMapper();
Map < String > map = mapper.readValue(jsonStr, Map.class);
map.forEach((k, v) -> {
try {
ub.addParameter(k, v instanceof String ? (String) v : mapper.writeValueAsString(v));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
});
URL url = ub.build().toURL();
Request request = new Request.Builder()
.url(url)
.method("GET", null)
.addHeader("Access-Token", ACCESS_TOKEN)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
public static void main(String[] args) throws IOException, URISyntaxException {
long advertiser_id = {advertiser_id};
long width = {width};
String video_ids = {video_ids};
String ratio = {ratio};
long height = {height};
long page = {page};
long page_size = {page_size};
// Args in JSON format
String myArgs = String.format("{\"advertiser_id\": \"%s\", \"filtering\": {\"width\": \"%s\", \"video_ids\": [\"%s\"], \"ratio\": [\"%s\"], \"height\": \"%s\"}, \"page\": \"%s\", \"page_size\": \"%s\"}",advertiser_id, width, video_ids, ratio, height, page, page_size);
System.out.println(get(myArgs));
}
}
(/code)
(code Python python)
# coding=utf-8
import json
from six import string_types
from six.moves.urllib.parse import urlencode, urlunparse # noqa
import requests
ACCESS_TOKEN = "xxx"
PATH = "/open_api/v1.3/file/video/ad/search/"
def build_url(path, query=""):
# type: (str, str) -> str
"""
Build request URL
:param path: Request path
:param query: Querystring
:return: Request URL
"""
scheme, netloc = "https", "business-api.tiktok.com"
return urlunparse((scheme, netloc, path, "", query, ""))
def get(json_str):
# type: (str) -> dict
"""
Send GET request
:param json_str: Args in JSON format
:return: Response in JSON format
"""
args = json.loads(json_str)
query_string = urlencode({k: v if isinstance(v, string_types) else json.dumps(v) for k, v in args.items()})
url = build_url(PATH, query_string)
headers = {
"Access-Token": ACCESS_TOKEN,
}
rsp = requests.get(url, headers=headers)
return rsp.json()
if __name__ == '__main__':
advertiser_id = {advertiser_id}
width = {width}
video_ids = {video_ids}
ratio = {ratio}
height = {height}
page = {page}
page_size = {page_size}
# Args in JSON format
my_args = "{\"advertiser_id\": \"%s\", \"filtering\": {\"width\": \"%s\", \"video_ids\": [\"%s\"], \"ratio\": [\"%s\"], \"height\": \"%s\"}, \"page\": \"%s\", \"page_size\": \"%s\"}" % (advertiser_id, width, video_ids, ratio, height, page, page_size)
print(get(my_args))
(/code)
(code PHP php)
$ACCESS_TOKEN = "xxx";
$PATH = "/open_api/v1.3/file/video/ad/search/";
/**
* Build request URL
* @param $path : Request path
* @return string
*/
function build_url($path)
{
return "https://business-api.tiktok.com" . $path;
}
/**
* Send GET request
* @param $json_str : Args in JSON format
* @return bool|string : Response in JSON format
*/
function get($json_str)
{
global $ACCESS_TOKEN, $PATH;
$curl = curl_init();
$args = json_decode($json_str, true);
/* Values of querystring is also in JSON format */
foreach ($args as $key => $value) {
$args[$key] = is_string($value) ? $value : json_encode($value);
}
$url = build_url($PATH) . "?" . http_build_query(
$args
);
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"Access-Token: " . $ACCESS_TOKEN,
),
));
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
$advertiser_id = {advertiser_id};
$width = {width};
$video_ids = {video_ids};
$ratio = {ratio};
$height = {height};
$page = {page};
$page_size = {page_size};
/* Args in JSON format */
$my_args = sprintf("{\"advertiser_id\": \"%s\", \"filtering\": {\"width\": \"%s\", \"video_ids\": [\"%s\"], \"ratio\": [\"%s\"], \"height\": \"%s\"}, \"page\": \"%s\", \"page_size\": \"%s\"}", $advertiser_id, $width, $video_ids, $ratio, $height, $page, $page_size);
echo get($my_args);
(/code)
(code curl http)
curl --get -H "Access-Token:xxx" \
--data-urlencode "advertiser_id={advertiser_id}" \
--data-urlencode "filtering={\"width\": \"{width}\", \"video_ids\": [\"{video_ids}\"], \"ratio\": [\"{ratio}\"], \"height\": \"{height}\"}" \
--data-urlencode "page={page}" \
--data-urlencode "page_size={page_size}" \
https://business-api.tiktok.com/open_api/v1.3/file/video/ad/search/
(/code)
返回
|字段|类型|描述|
|---|---|---|
|code |number|返回码。完整返回码列表及描述,可查看[附录-返回码](https://ads.tiktok.com/marketing_api/docs?id=1737172488964097)。 |
|message |string|返回信息。更多信息可查看[附录-返回码](https://ads.tiktok.com/marketing_api/docs?id=1737172488964097)。 |
|data |object|返回数据。 |
#|list |object[]|视频信息。 |
##|video_id |string|视频 ID,可用于创建广告。<br><br><p><span style="color:darkred"><b>注意</b></span>:若未传入筛选字段`video_ids`,且由于多次上传,同一视频生成了多个视频 ID,则仅会为该视频返回一个有效的视频 ID。|
##|video_cover_url |string|视频封面临时URL。 有效期6小时,过期需重新获取。<br><br>URL中的`x-expires`参数后会包含过期时间,格式为Epoch/Unix时间戳,单位为秒。<br>示例:`http://p16-sign-sg.tiktokcdn.com/v0201/b99a388e3709470be5c~tplv-noop.image?x-expires=<strong>1671742348</strong>&x-signature=FziJhvED9NDTDmPofv3I%3D`。 |
##|format |string|视频格式。 |
##|preview_url |string|视频预览链接。有效期6小时,过期需重新获取。<br><br>若想了解本预览链接的过期时间,请查看`preview_url_expire_time`。 |
##|preview_url_expire_time|string|视频预览链接过期时间,格式为`YYYY-MM-DD HH:MM:SS`(UTC+0)。|
##|duration |float|视频时长,单位秒。 |
##|bit_rate |number|码率,单位bps。 |
##|width |number|视频宽度。 |
##|height |number|视频高度。 |
##|signature |string|视频文件MD5。 |
##|size |number|视频大小,单位Byte。 |
##|material_id|string|素材ID。|
##|allowed_placements |string[] |视频可投放版位。受音乐版权限制,创意工具工具生成的部分素材只能投放到 TikTok 版位。投放到其他版位时将会导致审核不通过。枚举值详见[枚举值-广告管理-版位](https://ads.tiktok.com/marketing_api/docs?id=1737174886619138)。|
##|allow_download |boolean |视频是否允许下载。受音乐版权限制,创意工具生成的部分素材只允许预览,禁止下载和传播。 |
##|file_name |string |视频名称。|
##|create_time |string |创建时间。UTC 时间,格式:2020-06-10T07:39:14Z。 |
##|modify_time |string |修改时间。UTC 时间,格式:2020-06-10T07:39:14Z。|
##|displayable|boolean|视频能否在平台中展示|
#|page_info |object|分页信息。|
##|page |number|当前页数。|
##|page_size |number|分页大小。|
##|total_number |number|总结果数。|
##|total_page |number|总页数。|
|request_id |string|请求的日志id,唯一标识一个请求。 |
示例
(code Success-Response http)
HTTPS/1.1 200 OK
{
"message": "OK",
"code": 0,
"data": {
"page_info": {
"total_number": 1,
"page": 1,
"page_size": 20,
"total_page": 1
},
"list": [
{
"video_cover_url": "http://p16-sign-sg.tiktokcdn.com/v0201/94ebe1a3e6734559a16f3e81c43787ec~tplv-noop.image?x-expires=1607260002&x-signature=falvnSNOT94w4gjeB8PGGFyAdys%3D",
"format": "mp4",
"preview_url": "http://v16m-default.akamaized.net/64d28cac783ab57b70c2d91c30fb1b5d/5fccd762/video/tos/alisg/tos-alisg-v-0000/9a0033884eab42248ad6b46f7b11e44c/?a=0&br=3114&bt=1557&cd=0%7C0%7C0&cr=0&cs=0&dr=0&ds=3&er=&l=2020120607063701011517615517A19974&lr=ad&mime_type=video_mp4&qs=0&rc=anNlbnRuOWU2eDMzZjYzM0Apdjh3ZHJuOWZzZTMzNDY6eWdwMnFebGgzYG1fLS0uMDRzc2RtX2huaDNfMHItLWAwLS06Yw%3D%3D&vl=&vr=",
"file_name": "wanfadong_test.mp4",
"displayable": true,
"height": 720,
"width": 1280,
"bit_rate": 1594584,
"create_time": "2020-11-16T08:19:57Z",
"modify_time": "2020-11-16T08:19:57Z",
"signature": "b24f08f569b73a33eec93edb8f4423e2",
"duration": 5.312,
"video_id": "v070331c0000bup3cb66kkoqaktb5psg",
"material_id": "6895633277416374000",
"allowed_placements": [
"PLACEMENT_TOPBUZZ",
"PLACEMENT_TIKTOK",
"PLACEMENT_HELO",
"PLACEMENT_PANGLE"
],
"allow_download": true,
"size": 1058804
}
]
},
"request_id": "2020120607063701011517615517A19974"
}
(/code);