@bluevs/vhcli 0.5.9 → 0.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -9
- package/skill/SKILL.md +0 -383
- package/skill/docs/agent.md +0 -43
- package/skill/docs/auth.md +0 -47
- package/skill/docs/company.md +0 -47
- package/skill/docs/google.md +0 -34
- package/skill/docs/material-report.md +0 -191
- package/skill/docs/project.md +0 -435
- package/skill/docs/tiktok.md +0 -749
- package/skill/scripts/install-skill.sh +0 -126
- package/skill/scripts/vh-auth-card.cjs +0 -228
package/skill/docs/tiktok.md
DELETED
|
@@ -1,749 +0,0 @@
|
|
|
1
|
-
# TikTok 广告创编模块 (tiktok)
|
|
2
|
-
|
|
3
|
-
项目级 TikTok 广告创编流水线,使用 `--project-id`(`po_xxx`)+ api-key 鉴权,与 `vhcli media tiktok`(基于 `--auth-id`)不是同一条链路。
|
|
4
|
-
|
|
5
|
-
覆盖:创编任务提交/查询、表单下拉元数据、兴趣定向树、优化事件、`dark_post_status` 校验、Spark Ads 帖子批量授权。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. 架构总览
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
13
|
-
│ Agent / 用户 │
|
|
14
|
-
└────────────────────────────┬────────────────────────────────────────┘
|
|
15
|
-
│ vhcli tiktok ...
|
|
16
|
-
▼
|
|
17
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
18
|
-
│ vhcli (本仓 vision_hub_cli) │
|
|
19
|
-
│ - cmd/vhcli/tiktok_creative.go (cobra 子命令) │
|
|
20
|
-
│ - internal/client/tiktok_creative.go(HTTP 客户端) │
|
|
21
|
-
│ - internal/types/tiktok_creative.go (请求/响应类型) │
|
|
22
|
-
└────────────────────────────┬────────────────────────────────────────┘
|
|
23
|
-
│ HTTPS /open_api/v2/tiktok/*
|
|
24
|
-
│ Header: Authorization: Bearer vhk_xxx
|
|
25
|
-
▼
|
|
26
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
27
|
-
│ vision_hub OpenAPI │
|
|
28
|
-
│ - api/open_api/v1/open_api.proto │
|
|
29
|
-
│ - internal/service/http/open_api/open_api_ads_creative.go │
|
|
30
|
-
│ (反查 po_xxx → int32 customer_project_id 后委托给 biz) │
|
|
31
|
-
└────────────────────────────┬────────────────────────────────────────┘
|
|
32
|
-
▼
|
|
33
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
34
|
-
│ vision_hub biz: AdsCreativeCase │
|
|
35
|
-
│ - 元数据查询:直接代理 TikTok Marketing API + Redis 缓存 │
|
|
36
|
-
│ - 提交:幂等(SetNX 10min) + 落 4 张表 + 起 VHM 调度任务 │
|
|
37
|
-
└────────────────────────────┬────────────────────────────────────────┘
|
|
38
|
-
▼
|
|
39
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
40
|
-
│ Docker 镜像 ads-creative-tiktok-dev (独立仓) │
|
|
41
|
-
│ 真正调 TikTok Marketing API 创建 campaign/adgroup/ad、上传素材 │
|
|
42
|
-
│ 执行结果回写 ads_tiktok_creative.task_status / fail_reason │
|
|
43
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
**关键点**:
|
|
47
|
-
|
|
48
|
-
- vhcli 提交 ≠ 立即创建广告。`submit` 只是"落库 + 入队",TikTok 那边是否真的创建成功,需要后续 `task list` 轮询 `task_status`。
|
|
49
|
-
- 元数据查询(语言/地域/账号 等)走 vision_hub 服务端 Redis 缓存(list 30min,token 5min),不会每次都打 TikTok。
|
|
50
|
-
- 同一个 `request_id` **10 分钟**内重复 submit 会被拒。
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## 2. 鉴权与全局参数
|
|
55
|
-
|
|
56
|
-
### 鉴权
|
|
57
|
-
所有 `vhcli tiktok ...` 命令必须先鉴权:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
vhcli auth login # Device Flow
|
|
61
|
-
# 或
|
|
62
|
-
export VHCLI_TOKEN="vhk_xxx" # 直接给 token
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 项目入口
|
|
66
|
-
- **`--project-id`**:必传,格式 `po_xxxxxxxx`(公网项目编号,对应 vision_hub `customer_project.project_id` 字段)。OpenAPI 会反查为内部 int32 ID 后再调 biz。
|
|
67
|
-
- **`--resource-id`**:广告账户 ID(TikTok advertiser_id),多数命令需要。token 通过 `(project_id, resource_id)` 在内部查 `customer_project_resource` + `sys_user_authorization` 解析。
|
|
68
|
-
|
|
69
|
-
### 全局可选 flag
|
|
70
|
-
|
|
71
|
-
| Flag | 说明 |
|
|
72
|
-
|---|---|
|
|
73
|
-
| `--format json\|table\|csv` | 输出格式,默认 json |
|
|
74
|
-
| `--server` | vision_hub 地址,默认线上 |
|
|
75
|
-
| `--dry-run` | 仅打印 payload 不发请求(仅 submit/spark-ads 等写操作有效) |
|
|
76
|
-
| `--yes -y` | 跳过写操作的二次确认 |
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 3. 命令清单
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
vhcli tiktok
|
|
84
|
-
├── task
|
|
85
|
-
│ ├── list 查询创编任务列表(含 status / fail_reason)
|
|
86
|
-
│ └── submit 提交创编任务(10min 幂等)
|
|
87
|
-
├── options 表单下拉(6 type 合一)
|
|
88
|
-
├── dark-post-status dark_post_status 允许取值
|
|
89
|
-
├── optimization-event 优化事件列表(仅 READY)
|
|
90
|
-
├── targeting-search 兴趣定向树
|
|
91
|
-
└── spark-ads
|
|
92
|
-
└── authorize Spark Ads 帖子批量授权
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
每条命令的完整 spec 见 §5。
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 4. 三层配置模型(核心)
|
|
100
|
-
|
|
101
|
-
### 4.1 数据层:4 张表
|
|
102
|
-
|
|
103
|
-
| 表 | 用途 | 主键 |
|
|
104
|
-
|---|---|---|
|
|
105
|
-
| `ads_tiktok_creative` | 任务主表(status/fail_reason 在这) | `id` |
|
|
106
|
-
| `project_tiktok_campaign_config` | Campaign 层级参数 | `task_id` |
|
|
107
|
-
| `project_tiktok_adgroup_config` | Adgroup 层级参数 | `task_id` |
|
|
108
|
-
| `project_tiktok_ad_config` | Ad 层级参数 | `task_id` |
|
|
109
|
-
|
|
110
|
-
submit 是**单事务**写入这 4 张表,全部成功或全部回滚。
|
|
111
|
-
|
|
112
|
-
### 4.2 三个动态对象
|
|
113
|
-
|
|
114
|
-
`vhcli tiktok task submit --config-file <file.json>` 的 JSON 必须长这样:
|
|
115
|
-
|
|
116
|
-
```json
|
|
117
|
-
{
|
|
118
|
-
"campaign_config": { ... },
|
|
119
|
-
"adgroup_config": { ... },
|
|
120
|
-
"ad_config": { ... }
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
每一层都是 `map[string]interface{}` —— **任意字段都可以传**,服务端的处理规则:
|
|
125
|
-
|
|
126
|
-
1. 通过反射看 model struct 的 gorm column tag,判断字段是否是"已知字段"
|
|
127
|
-
2. **已知字段** → 写入对应表的独立列(e.g. `campaign_name` 写入 `project_tiktok_campaign_config.campaign_name`)
|
|
128
|
-
3. **未知字段** → 全部塞进同表的 `extra_params` JSON 列(不会丢,下游 docker 镜像会读出来透传给 TikTok Marketing API)
|
|
129
|
-
|
|
130
|
-
> 这意味着:Agent 可以放心把 TikTok Marketing API 文档里的任何字段(如 `bid_price`、`schedule_type`、`pacing`、`interest_keyword_ids` 等)放到对应层的 config 里,**不需要等待 vhcli/服务端发版**。只要字段名一致,下游会自动透传。
|
|
131
|
-
|
|
132
|
-
### 4.3 已知字段表(哪些字段是"独立列")
|
|
133
|
-
|
|
134
|
-
来源:`internal/data/media_ad/model/project_tiktok_*_config.gen.go`
|
|
135
|
-
|
|
136
|
-
#### campaign_config 已知字段
|
|
137
|
-
|
|
138
|
-
| 字段 | 类型 | 说明 |
|
|
139
|
-
|---|---|---|
|
|
140
|
-
| `campaign_name` | string | 推广系列名(必填) |
|
|
141
|
-
| `budget` | float | 预算(CBO 时在 campaign 层;ABO 时移到 adgroup 层) |
|
|
142
|
-
| `budget_mode` | string | 预算类型 |
|
|
143
|
-
| `objective_type` | string | 推广目标 |
|
|
144
|
-
| `app_promotion_type` | string | `APP_INSTALL` 或 `MINIS` |
|
|
145
|
-
| `campaign_id` | string | 创建成功后回写,submit 时不传 |
|
|
146
|
-
| `campaign_count` | int | 一次提交创建几个 campaign(默认 1) |
|
|
147
|
-
|
|
148
|
-
#### adgroup_config 已知字段
|
|
149
|
-
|
|
150
|
-
| 字段 | 类型 | 说明 |
|
|
151
|
-
|---|---|---|
|
|
152
|
-
| `adgroup_name` | string | 广告组名 |
|
|
153
|
-
| `location_ids` | string | 地域 ID 列表,逗号分隔 |
|
|
154
|
-
| `languages` | string | 语言 code 列表,逗号分隔 |
|
|
155
|
-
| `app_id` | string | 应用 ID(注意:MINIS 推广类型时这里放 minis_id,**前端字段 `minis_id` 会被自动别名为 `app_id`**) |
|
|
156
|
-
| `gender` | string | 性别定向 |
|
|
157
|
-
| `adgroup_id` | string | 创建成功后回写,submit 时不传 |
|
|
158
|
-
|
|
159
|
-
> **字段别名**:仅 `minis_id → app_id` 一条(见 `repo/ads_creative.go:fieldAliases`)。其他字段名如实写入 extra_params,不要自创别名。
|
|
160
|
-
|
|
161
|
-
#### ad_config 已知字段
|
|
162
|
-
|
|
163
|
-
| 字段 | 类型 | 说明 |
|
|
164
|
-
|---|---|---|
|
|
165
|
-
| `ad_name` | string | 广告名 |
|
|
166
|
-
| `user_material` | string | 素材组 ID(注意:CLI/服务端里有时叫 `user_material_id`,**入库列名是 `user_material`**) |
|
|
167
|
-
| `tiktok_item_ids` | string | 视频帖子 ID 列表 |
|
|
168
|
-
| `ad_material_needed` | int | 每个广告所需素材数 |
|
|
169
|
-
| `copywriting` | string | 广告文案 |
|
|
170
|
-
| `selling_points` | string | 卖点文案 |
|
|
171
|
-
| `tiktok_account` | string | TikTok 账号 identity_id(来自 `options --type=identity` 的 `identity_id`) |
|
|
172
|
-
| `identity_type` | string | 身份类型(来自 `options --type=identity` 的 `identity_type`) |
|
|
173
|
-
| `identity_authorized_bc_id` | string | 商务中心 ID(identity_type=BC_AUTH_TT 时必填) |
|
|
174
|
-
| `success_ad_id` | string | 创建成功后回写,submit 时不传 |
|
|
175
|
-
|
|
176
|
-
### 4.4 常见 extra_params(落到 extra_params JSON 列,不是独立列)
|
|
177
|
-
|
|
178
|
-
代码里见到的、确认会走 extra_params 的字段(不一定全,详见 TikTok Marketing API 文档):
|
|
179
|
-
|
|
180
|
-
- adgroup 层:`roas_bid`、`vbo_window`、`spc_audience_age`
|
|
181
|
-
- ad 层:`landing_page_url`
|
|
182
|
-
- campaign 层:`budget_optimize_on` 等
|
|
183
|
-
|
|
184
|
-
> **agent 不需要区分**:任何不在 §4.3 已知字段列表的字段直接传,服务端会自动归到 extra_params。
|
|
185
|
-
|
|
186
|
-
### 4.5 推广类型与字段规范
|
|
187
|
-
|
|
188
|
-
#### 支持矩阵
|
|
189
|
-
|
|
190
|
-
| `objective_type` | `app_promotion_type` | 中文说明 | 状态 |
|
|
191
|
-
|---|---|---|---|
|
|
192
|
-
| APP_PROMOTION | MINIS | TikTok Minis(小游戏/小程序) | ✅ 支持 |
|
|
193
|
-
| APP_PROMOTION | APP_INSTALL | App Install(应用安装) | ✅ 支持 |
|
|
194
|
-
| APP_PROMOTION | APP_RETARGETING | 应用再营销 | ❌ 暂不支持 |
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
#### MINIS 字段规范
|
|
199
|
-
|
|
200
|
-
**必填字段**
|
|
201
|
-
|
|
202
|
-
| 层 | 产品字段 | 参数名 |
|
|
203
|
-
|---|---|---|
|
|
204
|
-
| Campaign | 广告账户 | `resource_id`(顶层 flag) |
|
|
205
|
-
| Campaign | 推广系列名称 | `campaign_config.campaign_name` |
|
|
206
|
-
| Campaign | 预算类型 | `campaign_config.budget_mode` |
|
|
207
|
-
| Campaign | 预算金额 | `campaign_config.budget` |
|
|
208
|
-
| Campaign | 推广系列数量 | `campaign_config.campaign_count` |
|
|
209
|
-
| AdGroup | 广告组名称 | `adgroup_config.adgroup_name` |
|
|
210
|
-
| AdGroup | 目标 ROAS 类型 | `adgroup_config.vbo_window` |
|
|
211
|
-
| AdGroup | 目标 ROAS | `adgroup_config.roas_bid` |
|
|
212
|
-
| AdGroup | 地域 | `adgroup_config.location_ids` |
|
|
213
|
-
| AdGroup | 语言 | `adgroup_config.languages` |
|
|
214
|
-
| AdGroup | 最低年龄 | `adgroup_config.spc_audience_age` |
|
|
215
|
-
| AdGroup | 性别 | `adgroup_config.gender` |
|
|
216
|
-
| AdGroup | 小游戏 | `adgroup_config.minis_id`(自动别名为 `app_id`) |
|
|
217
|
-
| Ad | TikTok 账号 | `ad_config.identity_authorized_bc_id` / `ad_config.identity_type` / `ad_config.tiktok_account` |
|
|
218
|
-
| Ad | 广告名称 | `ad_config.ad_name` |
|
|
219
|
-
| Ad | 小程序 URL | `ad_config.landing_page_url` |
|
|
220
|
-
| Ad | 素材组 | `ad_config.user_material` |
|
|
221
|
-
| Ad | 每个广告所需素材数 | `ad_config.ad_material_needed` |
|
|
222
|
-
| Ad | 仅作为广告展示 | `ad_config.dark_post_status` |
|
|
223
|
-
| Ad | 文案 | `ad_config.copywriting` |
|
|
224
|
-
|
|
225
|
-
**非必填字段**
|
|
226
|
-
|
|
227
|
-
| 层 | 产品字段 | 参数名 |
|
|
228
|
-
|---|---|---|
|
|
229
|
-
| Ad | 卖点文案 | `ad_config.selling_points` |
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
#### APP_INSTALL 字段规范
|
|
234
|
-
|
|
235
|
-
**必填字段**
|
|
236
|
-
|
|
237
|
-
| 层 | 产品字段 | 参数名 |
|
|
238
|
-
|---|---|---|
|
|
239
|
-
| Campaign | 广告账户 | `resource_id`(顶层 flag) |
|
|
240
|
-
| Campaign | 推广系列名称 | `campaign_config.campaign_name` |
|
|
241
|
-
| AdGroup | 广告组名称 | `adgroup_config.adgroup_name` |
|
|
242
|
-
| AdGroup | 预算类型 | `adgroup_config.budget_mode` |
|
|
243
|
-
| AdGroup | 预算金额 | `adgroup_config.budget` |
|
|
244
|
-
| AdGroup | APP ID | `adgroup_config.app_id` |
|
|
245
|
-
| AdGroup | 竞价策略 | `adgroup_config.bid_type` |
|
|
246
|
-
| AdGroup | 优化目标 | `adgroup_config.optimization_goal` |
|
|
247
|
-
| AdGroup | 版位 | `adgroup_config.placements` |
|
|
248
|
-
| AdGroup | 点击归因窗口期 | `adgroup_config.click_attribution_window` |
|
|
249
|
-
| AdGroup | 深度互动观看归因窗口期 | `adgroup_config.engaged_view_attribution_window` |
|
|
250
|
-
| AdGroup | 观看归因窗口期 | `adgroup_config.view_attribution_window` |
|
|
251
|
-
| AdGroup | 地域 | `adgroup_config.location_ids` |
|
|
252
|
-
| AdGroup | 语言 | `adgroup_config.languages` |
|
|
253
|
-
| AdGroup | 年龄组 | `adgroup_config.age_groups` |
|
|
254
|
-
| AdGroup | 性别 | `adgroup_config.gender` |
|
|
255
|
-
| Ad | TikTok 账号 | `ad_config.identity_authorized_bc_id` / `ad_config.identity_type` / `ad_config.tiktok_account` |
|
|
256
|
-
| Ad | 每个广告组所需素材数 | `ad_config.adgroup_material_needed` |
|
|
257
|
-
| Ad | 仅作为广告展示 | `ad_config.dark_post_status` |
|
|
258
|
-
| Ad | 文案 | `ad_config.copywriting` |
|
|
259
|
-
|
|
260
|
-
**条件必填字段**
|
|
261
|
-
|
|
262
|
-
| 条件 | 产品字段 | 参数名 |
|
|
263
|
-
|---|---|---|
|
|
264
|
-
| `bid_type=BID_TYPE_NO_BID`(最大投放量)时 | 平均目标转化成本 | `adgroup_config.conversion_bid_price` |
|
|
265
|
-
| 素材来源二选一(至少填其一) | 素材 ID | `ad_config.user_material` |
|
|
266
|
-
| 素材来源二选一(至少填其一) | 视频帖子 ID | `ad_config.tiktok_item_ids` |
|
|
267
|
-
|
|
268
|
-
**非必填字段**
|
|
269
|
-
|
|
270
|
-
| 层 | 产品字段 | 参数名 |
|
|
271
|
-
|---|---|---|
|
|
272
|
-
| AdGroup | 大众兴趣定向 - 创作者互动 | `adgroup_config.targeting_spec.creator_interaction` |
|
|
273
|
-
| AdGroup | 大众兴趣定向 - 话题互动 | `adgroup_config.targeting_spec.hashtag_interaction` |
|
|
274
|
-
| AdGroup | 大众兴趣定向 - 兴趣分类 | `adgroup_config.targeting_spec.interest_category_ids` |
|
|
275
|
-
| AdGroup | 大众兴趣定向 - 购买意向关键词 | `adgroup_config.targeting_spec.purchase_intention_keyword_ids` |
|
|
276
|
-
| AdGroup | 大众兴趣定向 - 视频互动 | `adgroup_config.targeting_spec.video_interaction` |
|
|
277
|
-
| AdGroup | 排除受众 | `adgroup_config.excluded_audience_ids` |
|
|
278
|
-
| Ad | 点击监测 URL | `ad_config.tracking_info.click_tracking_url` |
|
|
279
|
-
| Ad | 展示监测 URL | `ad_config.tracking_info.impression_tracking_url` |
|
|
280
|
-
|
|
281
|
-
---
|
|
282
|
-
|
|
283
|
-
## 5. 命令完整 spec
|
|
284
|
-
|
|
285
|
-
### 5.1 `vhcli tiktok task list` — 任务列表
|
|
286
|
-
|
|
287
|
-
**HTTP**: `GET /open_api/v2/tiktok/task_list`
|
|
288
|
-
|
|
289
|
-
| Flag | Required | 说明 |
|
|
290
|
-
|---|---|---|
|
|
291
|
-
| `--project-id` | ✅ | `po_xxx` |
|
|
292
|
-
| `--page-size` | | 默认 10 |
|
|
293
|
-
| `--page-number` | | 默认 1 |
|
|
294
|
-
|
|
295
|
-
**响应字段**(`TikTokCreativeTaskItem`):
|
|
296
|
-
|
|
297
|
-
| 字段 | 说明 |
|
|
298
|
-
|---|---|
|
|
299
|
-
| `id` | 任务 ID(int64) |
|
|
300
|
-
| `tiktok_account` | 当前实现里返回的是 `resource_id`(见 `open_api_ads_creative.go:50` 已知偏差) |
|
|
301
|
-
| `campaign_name` | |
|
|
302
|
-
| `creative_app_id` | adgroup 的 app_id |
|
|
303
|
-
| `create_time` | 格式 `MM/DD HH:mm` |
|
|
304
|
-
| `task_status` | `PENDING` / 下游执行中或终态(运行态命名以下游 docker 实际写入为准) |
|
|
305
|
-
| `fail_reason` | 失败原因(成功为空) |
|
|
306
|
-
| `details` | 完整 `campaign_config` / `adgroup_config` / `ad_config`(含 extra) |
|
|
307
|
-
|
|
308
|
-
**典型用途**:submit 后轮询直到 `task_status` 变为非 `PENDING`。
|
|
309
|
-
|
|
310
|
-
### 5.2 `vhcli tiktok task submit` — 提交创编
|
|
311
|
-
|
|
312
|
-
**HTTP**: `POST /open_api/v2/tiktok/submit`
|
|
313
|
-
|
|
314
|
-
| Flag | Required | 说明 |
|
|
315
|
-
|---|---|---|
|
|
316
|
-
| `--project-id` | ✅ | `po_xxx` |
|
|
317
|
-
| `--resource-id` | ✅ | TikTok advertiser_id |
|
|
318
|
-
| `--request-id` | ✅ | **幂等键**,10 分钟内同值会被拒绝(`Redis SetNX` 锁),建议用 UUID |
|
|
319
|
-
| `--creative-app-id` | | 创编应用 ID(可选) |
|
|
320
|
-
| `--config-file` | ✅ | JSON 文件,含 `campaign_config` / `adgroup_config` / `ad_config` |
|
|
321
|
-
| `--follow` | | 提交成功后取最新一条任务,PENDING 则按 5s 间隔轮询直至非 PENDING(5min 超时)。由于 submit 不返回 task_id,本 flag 是拿到 task_id + 终态的最简方式。 |
|
|
322
|
-
|
|
323
|
-
**服务端必要校验**:
|
|
324
|
-
- `budget` 必须为数字且 > 20(`ads_creative.go:469`)
|
|
325
|
-
|
|
326
|
-
**响应**:成功返回 `errId=0`,**不**返回 task_id;要拿 task_id 自己 `task list` 倒序看。
|
|
327
|
-
|
|
328
|
-
**示例 config-file**(最小可跑,APP_PROMOTION + APP_INSTALL):
|
|
329
|
-
|
|
330
|
-
```json
|
|
331
|
-
{
|
|
332
|
-
"campaign_config": {
|
|
333
|
-
"campaign_name": "demo_campaign",
|
|
334
|
-
"objective_type": "APP_PROMOTION",
|
|
335
|
-
"app_promotion_type": "APP_INSTALL",
|
|
336
|
-
"budget_mode": "BUDGET_MODE_DAY",
|
|
337
|
-
"budget": 50,
|
|
338
|
-
"campaign_count": 1
|
|
339
|
-
},
|
|
340
|
-
"adgroup_config": {
|
|
341
|
-
"adgroup_name": "demo_adgroup",
|
|
342
|
-
"app_id": "7234567890123456789",
|
|
343
|
-
"location_ids": "6252001",
|
|
344
|
-
"languages": "en",
|
|
345
|
-
"gender": "GENDER_UNLIMITED"
|
|
346
|
-
},
|
|
347
|
-
"ad_config": {
|
|
348
|
-
"ad_name": "demo_ad",
|
|
349
|
-
"tiktok_account": "7888888888888888888",
|
|
350
|
-
"identity_type": "CUSTOMIZED_USER",
|
|
351
|
-
"ad_material_needed": 1,
|
|
352
|
-
"user_material": "mat_group_001",
|
|
353
|
-
"copywriting": "Try our app today",
|
|
354
|
-
"selling_points": "Free | Easy"
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
> 枚举值完整参考见 §11。
|
|
360
|
-
|
|
361
|
-
### 5.3 `vhcli tiktok options` — 表单下拉(6 合 1)
|
|
362
|
-
|
|
363
|
-
**HTTP**: `GET /open_api/v2/tiktok/options`
|
|
364
|
-
|
|
365
|
-
| Flag | Required | 说明 |
|
|
366
|
-
|---|---|---|
|
|
367
|
-
| `--project-id` | ✅ | |
|
|
368
|
-
| `--resource-id` | ✅ | |
|
|
369
|
-
| `--type` | ✅ | `language` / `region` / `identity` / `minis` / `app` / `audience` |
|
|
370
|
-
| `--objective-type` | 仅 `region` | |
|
|
371
|
-
| `--language` | 仅 `region` | 默认 `zh` |
|
|
372
|
-
|
|
373
|
-
**返回结构因 type 而异**(list 元素是动态 map):
|
|
374
|
-
|
|
375
|
-
| type | list 元素字段 | 用途 |
|
|
376
|
-
|---|---|---|
|
|
377
|
-
| `language` | `code`, `name` | 选 `adgroup_config.languages` 的 code 值;服务端会插入 `code=""`(即 "All")作为首项 |
|
|
378
|
-
| `region` | `location_id`, `name`, `region_code`, `level`, `area_type`, `country_code`, `parent_id`, `next_level_ids`, `support_below_18` | 选 `adgroup_config.location_ids` |
|
|
379
|
-
| `identity` | `display_name`, `identity_id`, `identity_type`, `identity_authorized_bc_id`, `profile_image` | 选 `ad_config.tiktok_account` (用 `identity_id`) + `ad_config.identity_type` + `identity_authorized_bc_id`;**服务端已过滤 `identity_type=AUTH_CODE`** |
|
|
380
|
-
| `minis` | `minis_id`, `minis_name`, `minis_status`, `minis_type`, `minis_icon_url`, `region_codes` | 选 `adgroup_config.minis_id`(自动别名为 app_id),仅当 `app_promotion_type=MINIS`;注意过滤 `minis_status=ACTIVE` |
|
|
381
|
-
| `app` | `app_id`, `app_name`, `advertiser_id`, `icon.web_uri` | 选 `adgroup_config.app_id`(用 `app_id` 字段),同时作为 submit 的 `--creative-app-id`;仅当 `app_promotion_type=APP_INSTALL` |
|
|
382
|
-
| `audience` | `audience_id`, `name`, `audience_type`, `is_valid`, `create_time`, `expired_time`, `cover_num` | 选自定义受众(通常进 extra_params),用 `audience_id` 字段 |
|
|
383
|
-
|
|
384
|
-
### 5.4 `vhcli tiktok dark-post-status` — dark_post_status 校验
|
|
385
|
-
|
|
386
|
-
**HTTP**: `GET /open_api/v2/tiktok/dark_post_status`
|
|
387
|
-
|
|
388
|
-
| Flag | Required | 说明 |
|
|
389
|
-
|---|---|---|
|
|
390
|
-
| `--project-id` | ✅ | |
|
|
391
|
-
| `--resource-id` | ✅ | |
|
|
392
|
-
| `--identity-id` | ✅ | 来自 `options --type=identity` 的 `identity_id` |
|
|
393
|
-
| `--identity-type` | ✅ | |
|
|
394
|
-
| `--identity-authorized-bc-id` | identity_type=BC_AUTH_TT 时必填 | |
|
|
395
|
-
|
|
396
|
-
**响应**:
|
|
397
|
-
|
|
398
|
-
```json
|
|
399
|
-
{ "allowed_values": ["ON", "OFF"], "reason": "" }
|
|
400
|
-
// 或
|
|
401
|
-
{ "allowed_values": ["ON"], "reason": "广告账号已强制开启 ads_only_mode,dark_post_status 只能设为 ON" }
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
**判定逻辑**(`AdsCreativeCase.CheckDarkPostStatus`):
|
|
405
|
-
- 并发查 `advertiser_info.ads_only_mode` + `identity_info.ads_only_mode`
|
|
406
|
-
- 任一为 true → 只允许 `ON`
|
|
407
|
-
- 都为 false → `["ON","OFF"]` 都允许
|
|
408
|
-
|
|
409
|
-
**用途**:agent 在 `ad_config` 里设置 `dark_post_status` 之前应当先调本接口,避免 submit 后被 TikTok 拒。
|
|
410
|
-
|
|
411
|
-
### 5.5 `vhcli tiktok optimization-event` — 优化事件
|
|
412
|
-
|
|
413
|
-
**HTTP**: `GET /open_api/v2/tiktok/optimization_event`
|
|
414
|
-
|
|
415
|
-
| Flag | Required | 说明 |
|
|
416
|
-
|---|---|---|
|
|
417
|
-
| `--project-id` | ✅ | |
|
|
418
|
-
| `--resource-id` | ✅ | |
|
|
419
|
-
| `--app-id` | ✅ | adgroup 的 app_id |
|
|
420
|
-
| `--objective` | ✅ | 同 `objective_type` |
|
|
421
|
-
| `--optimization-goal` | ✅ | 期望的优化目标 |
|
|
422
|
-
| `--placements` | ✅ | 版位列表,逗号分隔(重复 `placements` 参数也行)。**服务端固定 `placement_type=PLACEMENT_TYPE_NORMAL`、`app_promotion_type=APP_INSTALL`**(见 `third_party/tiktok.go:GetOptimizationEvent`) |
|
|
423
|
-
|
|
424
|
-
**响应**:`["EVENT_NAME_1", "EVENT_NAME_2", ...]`,仅返回 `availability_status=READY` 的事件。
|
|
425
|
-
|
|
426
|
-
**用途**:选择 `adgroup_config.optimization_event`(走 extra_params)之前先调这个,确保事件可用。
|
|
427
|
-
|
|
428
|
-
### 5.6 `vhcli tiktok targeting-search` — 兴趣定向树
|
|
429
|
-
|
|
430
|
-
**HTTP**: `GET /open_api/v2/tiktok/targeting_search`
|
|
431
|
-
|
|
432
|
-
| Flag | Required | 说明 |
|
|
433
|
-
|---|---|---|
|
|
434
|
-
| `--project-id` | ✅ | |
|
|
435
|
-
| `--resource-id` | ✅ | |
|
|
436
|
-
|
|
437
|
-
**响应**:树形结构,节点 `{label, label_key, children[]}`。biz 层固定按以下一级分组组装:
|
|
438
|
-
|
|
439
|
-
| 一级 label | label_key |
|
|
440
|
-
|---|---|
|
|
441
|
-
| 视频互动 | `video_interaction` |
|
|
442
|
-
| 兴趣 | `general_interest` |
|
|
443
|
-
| 创作者互动 | `creator_interaction` |
|
|
444
|
-
| 话题互动 | `hashtag_interaction` |
|
|
445
|
-
| 购买意向 | `purchase_intention` |
|
|
446
|
-
| additional_interest | `additional_interest` |
|
|
447
|
-
|
|
448
|
-
**实现**:服务端按 TikTok 返回的 `children_ids` 还原层级(见 `ads_creative.go:buildTargetingTree`)。语言固定 `zh`、`targeting_type=INTEREST_AND_BEHAVIOR`。
|
|
449
|
-
|
|
450
|
-
**用途**:agent 想精准选 `interest_keyword_ids` / `interest_category_v2` 等定向参数(走 extra_params)时用。
|
|
451
|
-
|
|
452
|
-
### 5.7 `vhcli tiktok spark-ads authorize` — Spark Ads 批量授权
|
|
453
|
-
|
|
454
|
-
**HTTP**: `POST /open_api/v2/tiktok/spark_ads/authorize`
|
|
455
|
-
|
|
456
|
-
| Flag | Required | 说明 |
|
|
457
|
-
|---|---|---|
|
|
458
|
-
| `--project-id` | ✅ | |
|
|
459
|
-
| `--resource-id` | ✅ | |
|
|
460
|
-
| `--tiktok-account` | ✅ | TikTok identity_id |
|
|
461
|
-
| `--auth-codes` | ✅ | auth_code 列表,逗号分隔,**最多 50 个并发** |
|
|
462
|
-
|
|
463
|
-
**响应**:`{ "not_authorized_codes": [...] }` —— 返回 `identity_id != tiktok_account` 或授权失败的 auth_code。空数组意味全部成功。
|
|
464
|
-
|
|
465
|
-
---
|
|
466
|
-
|
|
467
|
-
## 6. 端到端工作流(典型 Agent 流程)
|
|
468
|
-
|
|
469
|
-
```
|
|
470
|
-
┌───────────────────┐
|
|
471
|
-
│ 1. 选项发现 │
|
|
472
|
-
│ options × 6 │
|
|
473
|
-
│ + targeting/event│
|
|
474
|
-
└─────────┬─────────┘
|
|
475
|
-
▼
|
|
476
|
-
┌───────────────────┐
|
|
477
|
-
│ 2. 合规预检 │
|
|
478
|
-
│ dark-post-status │
|
|
479
|
-
└─────────┬─────────┘
|
|
480
|
-
▼
|
|
481
|
-
┌───────────────────┐
|
|
482
|
-
│ 3. 拼配置 JSON │
|
|
483
|
-
│ 3 层 config │
|
|
484
|
-
└─────────┬─────────┘
|
|
485
|
-
▼
|
|
486
|
-
┌───────────────────┐
|
|
487
|
-
│ 4. submit (幂等) │
|
|
488
|
-
│ --request-id=UUID│
|
|
489
|
-
└─────────┬─────────┘
|
|
490
|
-
▼
|
|
491
|
-
┌───────────────────┐
|
|
492
|
-
│ 5. 轮询 task list │
|
|
493
|
-
│ status / fail │
|
|
494
|
-
└───────────────────┘
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
### 6.1 详细步骤
|
|
498
|
-
|
|
499
|
-
1. **建立项目上下文** — 用户给定 `project_id` (po_xxx) 和 `resource_id`(advertiser_id)。
|
|
500
|
-
|
|
501
|
-
2. **拉元数据**(按需,可并行):
|
|
502
|
-
```bash
|
|
503
|
-
vhcli tiktok options --project-id $P --resource-id $R --type identity
|
|
504
|
-
vhcli tiktok options --project-id $P --resource-id $R --type app
|
|
505
|
-
vhcli tiktok options --project-id $P --resource-id $R --type region --objective-type APP_PROMOTION
|
|
506
|
-
vhcli tiktok options --project-id $P --resource-id $R --type language
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
3. **如果设 dark_post_status,先校验**:
|
|
510
|
-
```bash
|
|
511
|
-
vhcli tiktok dark-post-status --project-id $P --resource-id $R \
|
|
512
|
-
--identity-id $IID --identity-type $ITYPE \
|
|
513
|
-
[--identity-authorized-bc-id $BC]
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
4. **如果用兴趣定向 / 优化事件**:
|
|
517
|
-
```bash
|
|
518
|
-
vhcli tiktok targeting-search --project-id $P --resource-id $R
|
|
519
|
-
vhcli tiktok optimization-event --project-id $P --resource-id $R \
|
|
520
|
-
--app-id $APP --objective APP_PROMOTION \
|
|
521
|
-
--optimization-goal CONVERT --placements PLACEMENT_TIKTOK
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
5. **生成 config-file**(JSON),见 §5.2 示例。
|
|
525
|
-
- 已知字段直接放对应层
|
|
526
|
-
- 任何 TikTok Marketing API 支持但本表没列的字段也直接放对应层 → 自动 extra_params
|
|
527
|
-
|
|
528
|
-
6. **提交**:
|
|
529
|
-
```bash
|
|
530
|
-
REQ_ID=$(uuidgen)
|
|
531
|
-
vhcli tiktok task submit \
|
|
532
|
-
--project-id $P --resource-id $R --request-id $REQ_ID \
|
|
533
|
-
--config-file ./config.json
|
|
534
|
-
```
|
|
535
|
-
- 用 `--dry-run` 可以先看 payload 不发请求
|
|
536
|
-
- 失败 "请勿重复提交" → request_id 命中幂等锁,换一个
|
|
537
|
-
|
|
538
|
-
7. **轮询**:
|
|
539
|
-
```bash
|
|
540
|
-
vhcli tiktok task list --project-id $P --page-size 5 --page-number 1
|
|
541
|
-
```
|
|
542
|
-
- `task_status=PENDING` 表示下游 docker 还没跑完或还没启动
|
|
543
|
-
- 终态(非 PENDING)后看 `fail_reason` 判断成败
|
|
544
|
-
|
|
545
|
-
---
|
|
546
|
-
|
|
547
|
-
## 7. 错误处理速查
|
|
548
|
-
|
|
549
|
-
所有响应都是统一 envelope:
|
|
550
|
-
|
|
551
|
-
```json
|
|
552
|
-
{ "errId": 0, "errCode": "", "errMsg": "查询成功", "data": ... }
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
`errId != 0` 表示失败。常见错误:
|
|
556
|
-
|
|
557
|
-
| 现象 | 含义 | 处理 |
|
|
558
|
-
|---|---|---|
|
|
559
|
-
| `请勿重复提交` | request_id 命中 10min 幂等锁 | 换 request_id 重提 |
|
|
560
|
-
| `budget必须为数字且大于20` | submit 校验 | 改 `campaign_config.budget` |
|
|
561
|
-
| `获取TikTok access token失败` | resource_id/project_id 没配对应授权,或授权过期 | 联系项目管理员重新授权 |
|
|
562
|
-
| `dark_post_status` 只能 ON | identity 或 advertiser 已开启 `ads_only_mode` | 不要传 OFF |
|
|
563
|
-
| options 里 identity 列表是空 | 该广告账户没有任何非 AUTH_CODE 身份 | 先在 TikTok Ads Manager 授权身份 |
|
|
564
|
-
| optimization_event 返回空 | 当前 app/objective/goal/placement 组合没有 READY 事件 | 换 optimization_goal 或 placement |
|
|
565
|
-
|
|
566
|
-
**调试技巧**:
|
|
567
|
-
- `--format json` 拿原始响应
|
|
568
|
-
- `--dry-run` 看 submit payload
|
|
569
|
-
- `task list` 里的 `details` 字段会回放完整 config(含 extra_params),用于核对实际写入
|
|
570
|
-
|
|
571
|
-
---
|
|
572
|
-
|
|
573
|
-
## 8. 边界与已知差异
|
|
574
|
-
|
|
575
|
-
1. **task list 的 `tiktok_account` 字段实际是 resource_id**(`open_api_ads_creative.go:50`)。如果 agent 要展示账号名,需要再调 `options --type=identity` 自己 join。
|
|
576
|
-
|
|
577
|
-
2. **`submit` 不返回 task_id**。需要立刻拿 task_id 时,submit 后立即 `task list --page-size 1 --page-number 1` 取第一条(自己 create_user 那条),或直接给 submit 加 `--follow` 让 CLI 自动取最新任务并轮询到非 PENDING。
|
|
578
|
-
|
|
579
|
-
3. **整个流水线没有"取消任务"接口**。submit 后只能等下游 docker 跑出结果。
|
|
580
|
-
|
|
581
|
-
4. **`identity_type=AUTH_CODE` 在 options 里被服务端过滤掉**(`ads_creative.go:258`)。如果一定要用 AUTH_CODE 身份(罕见场景),需要走 spark-ads authorize 流程。
|
|
582
|
-
|
|
583
|
-
5. **`creative_app_id` 与 `adgroup_config.app_id` 的关系**:submit 顶层有 `creative_app_id`(VHM/编排层用),adgroup 内部有 `app_id`(TikTok API 用)。**两个都要传**,且通常是同值。
|
|
584
|
-
|
|
585
|
-
6. **token 的来源不需要 agent 关心**。服务端按 `(project_id, resource_id)` 自己解析。
|
|
586
|
-
|
|
587
|
-
---
|
|
588
|
-
|
|
589
|
-
## 9. 字段位置速查(cheat sheet)
|
|
590
|
-
|
|
591
|
-
> 不确定一个字段该放哪一层时,按以下顺序判断:
|
|
592
|
-
|
|
593
|
-
1. 在 §4.3 已知字段表里?→ 放对应层
|
|
594
|
-
2. 是 TikTok Campaign API 字段?→ `campaign_config` extra_params
|
|
595
|
-
3. 是 TikTok Adgroup API 字段(定向、出价、版位、优化目标、预算ABO)?→ `adgroup_config` extra_params
|
|
596
|
-
4. 是 TikTok Ad API 字段(创意、文案、落地页、身份)?→ `ad_config` extra_params
|
|
597
|
-
|
|
598
|
-
常见字段归属:
|
|
599
|
-
|
|
600
|
-
| 字段 | 层 | 已知列 | 推广类型 |
|
|
601
|
-
|---|---|---|---|
|
|
602
|
-
| `campaign_name` / `objective_type` / `app_promotion_type` / `campaign_count` | campaign | ✅ | 通用 |
|
|
603
|
-
| `budget_mode` / `budget`(MINIS 用 campaign 层,即 CBO) | campaign | ✅ | MINIS |
|
|
604
|
-
| `budget_optimize_on` / `bid_strategy` | campaign | extra | 通用 |
|
|
605
|
-
| `adgroup_name` / `location_ids` / `languages` / `gender` / `app_id` | adgroup | ✅ | 通用 |
|
|
606
|
-
| `budget_mode` / `budget`(APP_INSTALL 用 adgroup 层,即 ABO) | adgroup | extra | APP_INSTALL |
|
|
607
|
-
| `roas_bid` / `vbo_window` / `spc_audience_age` | adgroup | extra | MINIS |
|
|
608
|
-
| `bid_type` / `conversion_bid_price` | adgroup | extra | APP_INSTALL |
|
|
609
|
-
| `optimization_goal` / `optimization_event` | adgroup | extra | APP_INSTALL |
|
|
610
|
-
| `placements` / `placement_type` | adgroup | extra | APP_INSTALL |
|
|
611
|
-
| `age_groups` | adgroup | extra | APP_INSTALL |
|
|
612
|
-
| `click_attribution_window` / `engaged_view_attribution_window` / `view_attribution_window` | adgroup | extra | APP_INSTALL |
|
|
613
|
-
| `interest_keyword_ids` / `interest_category_v2` / `targeting_spec.*` | adgroup | extra | APP_INSTALL |
|
|
614
|
-
| `audience_ids` / `excluded_audience_ids` | adgroup | extra | APP_INSTALL |
|
|
615
|
-
| `ad_name` / `copywriting` / `selling_points` / `ad_material_needed` | ad | ✅ | 通用 |
|
|
616
|
-
| `adgroup_material_needed` | ad | extra | APP_INSTALL |
|
|
617
|
-
| `user_material` / `tiktok_item_ids` | ad | ✅ | 通用 |
|
|
618
|
-
| `tiktok_account` / `identity_type` / `identity_authorized_bc_id` | ad | ✅ | 通用 |
|
|
619
|
-
| `landing_page_url` | ad | extra | MINIS |
|
|
620
|
-
| `dark_post_status` | ad | extra | 通用 |
|
|
621
|
-
| `tracking_info.click_tracking_url` / `tracking_info.impression_tracking_url` | ad | extra | APP_INSTALL |
|
|
622
|
-
|
|
623
|
-
---
|
|
624
|
-
|
|
625
|
-
## 10. 外部参考
|
|
626
|
-
|
|
627
|
-
- TikTok Marketing API 文档:https://business-api.tiktok.com/portal/docs
|
|
628
|
-
|
|
629
|
-
---
|
|
630
|
-
|
|
631
|
-
## 11. 枚举值速查
|
|
632
|
-
|
|
633
|
-
### 推广目标(objective_type)
|
|
634
|
-
|
|
635
|
-
| 枚举值 | 中文说明 |
|
|
636
|
-
|---|---|
|
|
637
|
-
| APP_PROMOTION | 应用推广 |
|
|
638
|
-
|
|
639
|
-
### 应用推广类型(app_promotion_type)
|
|
640
|
-
|
|
641
|
-
| 枚举值 | 中文说明 |
|
|
642
|
-
|---|---|
|
|
643
|
-
| MINIS | TikTok Minis(小游戏/小程序) |
|
|
644
|
-
| APP_INSTALL | App Install(应用安装) |
|
|
645
|
-
| APP_RETARGETING | 应用再营销(暂不支持) |
|
|
646
|
-
|
|
647
|
-
### 预算类型(budget_mode)
|
|
648
|
-
|
|
649
|
-
| 枚举值 | 中文说明 |
|
|
650
|
-
|---|---|
|
|
651
|
-
| BUDGET_MODE_DYNAMIC_DAILY_BUDGET | 动态日预算 |
|
|
652
|
-
| BUDGET_MODE_TOTAL | 总预算 |
|
|
653
|
-
|
|
654
|
-
### 性别(gender)
|
|
655
|
-
|
|
656
|
-
| 枚举值 | 中文说明 |
|
|
657
|
-
|---|---|
|
|
658
|
-
| GENDER_FEMALE | 女性 |
|
|
659
|
-
| GENDER_MALE | 男性 |
|
|
660
|
-
| GENDER_UNLIMITED | 不限 |
|
|
661
|
-
|
|
662
|
-
### 最低年龄(spc_audience_age)— MINIS
|
|
663
|
-
|
|
664
|
-
| 枚举值 | 中文说明 |
|
|
665
|
-
|---|---|
|
|
666
|
-
| OVER_EIGHTEEN | 18+ |
|
|
667
|
-
| OVER_TWENTY_FIVE | 25+ |
|
|
668
|
-
|
|
669
|
-
### 年龄组(age_groups)— APP_INSTALL
|
|
670
|
-
|
|
671
|
-
| 枚举值 |
|
|
672
|
-
|---|
|
|
673
|
-
| AGE_18_24 |
|
|
674
|
-
| AGE_25_34 |
|
|
675
|
-
| AGE_35_44 |
|
|
676
|
-
| AGE_45_54 |
|
|
677
|
-
| AGE_55_100 |
|
|
678
|
-
|
|
679
|
-
### 竞价策略(bid_type)— APP_INSTALL
|
|
680
|
-
|
|
681
|
-
| 枚举值 | 中文说明 |
|
|
682
|
-
|---|---|
|
|
683
|
-
| BID_TYPE_NO_BID | 最大投放量 |
|
|
684
|
-
| BID_TYPE_CUSTOM | 目标 CPA |
|
|
685
|
-
|
|
686
|
-
### 优化目标(optimization_goal)— APP_INSTALL
|
|
687
|
-
|
|
688
|
-
| 枚举值 | 中文说明 |
|
|
689
|
-
|---|---|
|
|
690
|
-
| VALUE | 价值 / 总收入 |
|
|
691
|
-
| IN_APP_EVENT | 应用内事件 |
|
|
692
|
-
| INSTALL | 安装 |
|
|
693
|
-
| CLICK | 点击数 |
|
|
694
|
-
|
|
695
|
-
### 版位(placements)— APP_INSTALL
|
|
696
|
-
|
|
697
|
-
| 枚举值 | 中文说明 |
|
|
698
|
-
|---|---|
|
|
699
|
-
| PLACEMENT_TIKTOK | TikTok |
|
|
700
|
-
| PLACEMENT_PANGLE | Pangle |
|
|
701
|
-
| PLACEMENT_GLOBAL_APP_BUNDLE | Global App Bundle |
|
|
702
|
-
|
|
703
|
-
### 目标 ROAS 类型(vbo_window)— MINIS
|
|
704
|
-
|
|
705
|
-
| 枚举值 | 中文说明 |
|
|
706
|
-
|---|---|
|
|
707
|
-
| ZERO_DAY | 第 0 天 |
|
|
708
|
-
| SEVEN_DAYS | 第 7 天 |
|
|
709
|
-
|
|
710
|
-
### 点击归因窗口期(click_attribution_window)— APP_INSTALL
|
|
711
|
-
|
|
712
|
-
| 枚举值 | 中文说明 |
|
|
713
|
-
|---|---|
|
|
714
|
-
| OFF | 关闭 |
|
|
715
|
-
| ONE_DAY | 1 天 |
|
|
716
|
-
| SEVEN_DAYS | 7 天 |
|
|
717
|
-
| FOURTEEN_DAYS | 14 天 |
|
|
718
|
-
| TWENTY_EIGHT_DAYS | 28 天 |
|
|
719
|
-
|
|
720
|
-
### 深度互动观看归因窗口期(engaged_view_attribution_window)— APP_INSTALL
|
|
721
|
-
|
|
722
|
-
| 枚举值 | 中文说明 |
|
|
723
|
-
|---|---|
|
|
724
|
-
| OFF | 关闭 |
|
|
725
|
-
| ONE_DAY | 1 天 |
|
|
726
|
-
| SEVEN_DAYS | 7 天 |
|
|
727
|
-
| FOURTEEN_DAYS | 14 天 |
|
|
728
|
-
| TWENTY_EIGHT_DAYS | 28 天 |
|
|
729
|
-
|
|
730
|
-
### 观看归因窗口期(view_attribution_window)— APP_INSTALL
|
|
731
|
-
|
|
732
|
-
| 枚举值 | 中文说明 |
|
|
733
|
-
|---|---|
|
|
734
|
-
| OFF | 关闭 |
|
|
735
|
-
| ONE_DAY | 1 天 |
|
|
736
|
-
| SEVEN_DAYS | 7 天 |
|
|
737
|
-
|
|
738
|
-
### 任务状态(task_status)
|
|
739
|
-
|
|
740
|
-
| 枚举值 | 中文说明 |
|
|
741
|
-
|---|---|
|
|
742
|
-
| PENDING | 待处理 |
|
|
743
|
-
| PROCESSING | 处理中 |
|
|
744
|
-
| CREATING_AD | 创建广告中 |
|
|
745
|
-
| SUCCESS | 成功 |
|
|
746
|
-
| FAILED | 失败 |
|
|
747
|
-
| CAMPAIGN_CREATE_FAILED | 创建推广系列失败 |
|
|
748
|
-
| ADSET_CREATE_FAILED | 创建广告组失败 |
|
|
749
|
-
| AD_CREATE_FAILED | 创建广告失败 |
|