ActionKey / 接入方式 03
开发自己的广告投放系统
用自己的网页、后台和业务规则调用 ActionKey。你负责界面、审批、数据与调度,ActionKey 提供已授权资产的操作接口。系统可以完全由代码和规则运行,也可以在后续加入 AI 分析。
播放自建投放系统六步流程演示 ↗。可以随时暂停、逐步查看,或切换到另外两种方式比较;演示使用示意数据。
01 / 先分清三种使用方式
三种方式都能访问已授权资产,区别是谁发起任务、谁安排执行、操作入口在哪里。它们不是三个不同的权限等级。
| 使用方式 | 你怎么操作 | 谁安排执行 | 需要准备什么 |
|---|---|---|---|
| 聊天调用 | 在 ChatGPT、Claude 等助手中说“查询这个账户”。 | 助手在当前对话中调用工具,修改前由你确认。 | 兼容的助手、Plugin / MCP 连接和凭证。 |
| AI Agent 调用 | 给 Agent 一个目标,例如分析账户并生成调整方案。 | Agent 理解目标、选择工具并执行多个步骤;持续运行还需要任务环境。 | Agent、工具配置、任务范围、执行授权和运行环境。 |
| 开发自己的系统 | 在自己的投放后台看报表、点按钮,或让服务器执行规则。 | 你的代码、审批流程和调度器决定何时调用接口。 | 自己的后端、接口客户端、数据存储和部署环境。 |
本页讲第三种:先用 Python 接通查询,再把它放进自己的业务后台。即使没有 AI 模型,也可以开发报表、广告管理和规则执行功能。
02 / 第一版系统可以从这几个模块开始
你的网页 / 定时任务 → 你的后端(登录、权限、规则、审批)→ 接口客户端 → ActionKey REST / Graph 接口 → 已授权的 Facebook 资产。
| 模块 | 第一版做什么 |
|---|---|
| 账户与资产目录 | 保存可访问的广告户、主页和计划;同时记录内部 ID 与 Facebook 原生 ID。 |
| 只读报表 | 查询投放指标,保存查询时间、币种、统计范围、分页与失败项。 |
| 操作审批 | 先生成变更方案,展示具体资产、金额与影响范围,确认后再进入执行队列。 |
| 执行队列与记录 | 同一广告户的修改按顺序执行;保存请求结果和实际回读结果。 |
| 调度与通知 | 部署后安排固定周期查询,对失败、权限变化和异常指标发出通知。 |
- 先接通查询。完成下面的只读示例,核对账户 ID 与报表返回。
- 再做自己的报表页。由后端请求接口,前端展示数据;Token 保存在服务端私密配置中。
- 再接入单次修改。增加审批、账户范围和执行后回读,先验证一个明确的操作。
- 最后加入规则或 AI。规则和模型产生建议,经过同一套权限与执行流程后操作资产。
前端页面不应直接携带服务 Token 请求接口。由你的后端验证登录用户能操作哪些资产,再调用对应接口。
03 / 选择一种接口路线,再配置对应凭证
先向开通团队确认拿到哪种凭证。下面三类凭证的签发方、用途和请求域名不同。
| 接口路线 | 请求地址 | 需要的凭证 | 适合什么系统 |
|---|---|---|---|
| ActionKey REST | https://baiz.ai/api/mcp | ActionKey 服务 Token;请求头 Authorization: Bearer …。 | 新建业务系统,使用已封装的资产、计划、素材与报表操作。本页示例走这条路线。 |
| Graph 中转 | facebook-graph.baiz.ai | 尤里改内部中转 access_token。 | 已有 Graph 调用代码;同时替换 Token 与原请求域名,逐项验证支持的版本和接口。 |
| Meta 原生 Graph | graph.facebook.com | BM 内通过尤里改授权 App 生成的 Meta System User Token。 | 需要原生 Marketing API 对象与端点,由自己的代码直接调用 Meta。 |
Graph 两条路线使用 Facebook 原生资产 ID。Meta System User 路线需要把广告户和投放主页分别分配给生成 Token 的同一个 System User,再核对 App、Token scopes 和具体操作权限。只有 Token 字符串或只授权广告户,还不足以支持主页相关广告操作。
详细的域名替换、BM 授权和两类资产验证见凭证与接口参考。Meta 原生 Token 不填入 ActionKey REST 的 Bearer 配置,内部中转 Token 不发往 graph.facebook.com。
GET https://baiz.ai/api/mcp/ad-accounts?per_page=20
Authorization: Bearer {ActionKey服务Token}
Accept: application/json所有方法、路径和字段以ActionKey 公开接口说明 ↗及你的实际开通范围为准。本教程根据该说明编写,不代表每个 Token 都具备全部操作权限。
04 / 运行一个可以改造成后台模块的 Python 示例
准备 Python 3.9 或更新版本。示例使用标准库,无需安装依赖;只提供账户查询、计划列表和效果查询,不包含创建、暂停或预算修改。
下载 Python 客户端 · 下载示意数据。将两个文件放在同一文件夹中,再打开该文件夹的终端。
先跑示意数据,不需要 Token
python3 actionkey_client.py --demo accounts
python3 actionkey_client.py --demo campaigns --ad-account-id 7
python3 actionkey_client.py --demo report --campaign-id 42输出中 demo: true 表示示意数据。示例里的账户内部 ID 7、计划内部 ID 42 和 Facebook ID 都是占位值,不对应你的资产。
用实际服务 Token 验证账户查询
python3 actionkey_client.py accounts --per-page 20程序会提示输入 ActionKey 服务 Token,输入不回显。已经由运行环境设置 ACTIONKEY_TOKEN 时,程序直接读取它;这个变量名只是本示例的本地约定。只在你的终端或后端私密配置中设置凭证。
核对返回账户的 id、ad_account_id、currency 和 timezone_name。示例读取本次返回的一页账户,不会假设已经获取全部账户。
按广告户内部 ID 找到计划
从上一步返回的账户中读取 id,将下面的 7 替换成这个内部 ID。这里不用 Facebook 广告户 ID。
python3 actionkey_client.py campaigns --ad-account-id 7 --per-page 20程序调用 GET /campaigns 并传入 ad_account_id 和 per_page。在返回的 campaigns 列表中核对计划名称、状态及 id;这个 id 就是下一步的计划内部 ID。本次只读取一页计划;公开说明未列出该端点的 page 参数,示例不会自行加入它。
查询指定计划的广告效果
从上一步选定一个计划,将下面的 42 替换成它的 ActionKey 内部 id。不要把 Facebook Campaign ID 填入命令。
python3 actionkey_client.py report --campaign-id 42 --page 1 --per-page 50 > report.json程序调用 GET /campaigns/{id}/ads,输出 campaign、metrics、分页和 errors。读取报告时同时检查程序退出码:0 为本次查询成功,1 为请求或解析失败,2 表示接口返回了部分资产错误。不能仅因生成了文件就认为报表完整。
读取多页广告时,先确认 metrics 是全计划汇总还是单页汇总;不要直接叠加每一页的汇总指标,以免把重复的汇总计算多次。示例只输出本次响应,不跨页累加。
该效果端点公开了 page、per_page 和状态过滤,未公开日期过滤参数。示例不会把查询时间当成报表统计时段,也不会把返回汇总直接标记为“今日”。做日报、跨时区汇总或 ROI 前,向团队确认统计范围与指标含义;ROI 还需要你的销售收入数据。
账户与计划列表解析兼容直接数组和含 data 数组的对象;公开说明未固定这两种列表的包装结构,若实际结构不同会明确报错。接入自己的数据库和页面时,先依据真实响应确定字段结构、分页方式与缺失值,不把缺失指标填成零。
把客户端放进你的后端
import os
from actionkey_client import ActionKeyClient, format_report
client = ActionKeyClient(os.environ["ACTIONKEY_TOKEN"])
data = client.get("/campaigns/42/ads", {"page": 1, "per_page": 50})
report, partial_failure = format_report(data)
# 将 42 替换为已核对的计划内部 ID。
# 在你的后端校验登录用户与计划的访问权限,再返回或保存报告。接口客户端只是系统的一部分。将查询结果写入你选用的数据库,记录查询时间与范围,再由自己的页面读取;加入调度前先确认一次真实查询与展示完整跑通。
05 / 保存资产映射,避免把两个 ID 混用
| 业务对象 | ActionKey REST 中怎么用 | Graph 中怎么用 |
|---|---|---|
| 广告账户 | /ad-accounts 返回的 id 是内部 ID;创建计划的 ad_account_ids 用内部 ID 数组。 | ad_account_id 是 Facebook 原生 ID;广告户路径通常加 act_ 前缀。 |
| 主页 | /pages 返回的 id 是内部 ID;创建计划的 facebook_page_id 用此内部 ID。 | page_id 是 Facebook 原生主页 ID。 |
| 广告计划 | /campaigns/{id}、效果查询和预算接口的路径 id 是 ActionKey 计划内部 ID。 | Facebook Campaign、AdSet、Ad 各有独立原生 ID;不能用 ActionKey 计划 ID 替代。 |
| 单条广告 / 广告组 | /campaigns/{id}/ads/status 的 ad_id、/adsets/status 的 adset_id 使用 Facebook 原生 ID。 | 同样使用对应广告或广告组的原生 ID。 |
你的资产目录至少保存“对象类型、ActionKey 内部 ID、Facebook 原生 ID、所属广告户、名称、币种、时区、最后核对时间”。ID 可作为字符串保存,调用要求整数的 REST 参数时再检查转换,避免大整数在前端丢失精度。
每次操作前用类型和所属账户重新核对映射;不要仅凭同名对象选中资产。接口里名称含 facebook 的参数也可能要求内部 ID,按该端点的字段说明判断。
06 / 把一次修改做成可确认、可核对的操作
- 读取现状。核对目标内部 ID、关联广告户、当前状态或预算、币种和本次允许操作范围。
- 生成待确认方案。保存目标对象、操作类型、调整前后值、影响范围和有效期;让操作者看到具体变化。
- 保存确认。记录确认人、时间和方案版本。参数变化或现状变化时让方案重新确认。
- 校验并执行一次。后端再次检查用户权限、账户白名单、金额上限和确认状态;同一账户修改放入串行队列。
- 回读并记录。区分“接口已接受”“异步处理中”“回读已确认”和“结果待核对”,保存对应证据。
预算调整:先明确账户级影响
公开接口 POST /campaigns/{id}/budget 用计划内部 ID 定位,但 adjust_budget 实际控制关联广告账户级别预算,可能影响同一广告户中的其他投放。amount 的单位是美元 USD;日预算字段为 limit_daily_amount,总预算字段为 limit_amount。
{
"action": "set",
"amount": 30,
"budget_field": "limit_daily_amount"
}上面的 30 表示目标金额 30 USD,不是加 30,也不是 30 分。正式接入前核对关联账户实际预算、账户币种与 USD 换算 / 同步规则,并在方案中展示对同户其他投放的影响。
公开计划 / 报表返回未保证能回读关联广告户的实际预算。请向团队确认可用的账户查询方式;缺少关联账户、当前实际值或币种信息时停止。执行后即使返回 status: success,也要回读账户实际值;查不到实际值时记录“结果待核对”。
失败与超时怎么处理
查询可以按明确的重试次数与退避规则恢复。修改、创建或发布超时可能已经被服务端接受,先查询对象与操作结果,不要直接再次提交。公开说明未承诺通用幂等键;不要自行添加一个请求头就认为不会重复执行。你自己的操作记录与账户锁用于防止本系统重复提交,不能替代服务端幂等保证。
07 / 创建广告,先准备引用对象再发布
ActionKey 的创建流程使用已保存对象的内部 ID。先把每类资源准备好,再组装广告计划;所有必填字段见公开接口说明。
| 开发顺序 | 公开操作 | 你的系统要检查什么 |
|---|---|---|
| 1. 确认账户与主页 | GET /ad-accounts、GET /pages;按实际模式查询 BM 或 Facebook 账号。 | 目标资产可访问、ID 对应正确;主页相关权限已具备。 |
| 2. 准备落地页、文案、受众、素材 | /offers、/copywritings、/targetings、/files 的查询与创建。 | 保存对应内部 ID,校验链接、素材、广告内容与投放范围。 |
| 3. 保存本地待审批方案 | 由你的数据库保存方案,还不调用创建计划端点。 | 展示目标、账户、主页、素材、日期、时区、预算及币种;记录确认。 |
| 4. 创建广告计划 | POST /campaigns。 | 提交已确认的必填字段与内部 ID;此操作会自动触发广告发布流程。 |
| 5. 查询发布结果 | GET /campaigns/{id}。 | 发布是异步过程;记录计划状态、实际对象和失败原因,审核中不等于已投放。 |
创建计划时,copywriting_ids、targeting_ids、file_ids、offer_ids、facebook_page_id 和 ad_account_ids 引用 ActionKey 内部资源。确认 start_time / end_time 的时间解释、账户时区以及具体预算字段单位后再提交。
不要用创建接口当作前端“保存草稿”按钮;先将方案存在自己的数据库。公开 /publish 只支持草稿(0)或发布失败(10)状态,重试前需核对实际对象与失败原因。删除计划会先停止 Facebook 广告,再执行软删除,同样需要明确确认。
08 / 部署后,再加入定时查询和规则执行
Python 示例是一次查询程序,终端结束就停止。持续运行需要将客户端部署到自己的后端,通过所选平台的任务调度器安排周期,并配置运行记录与通知。
- 凭证与权限:凭证放在后端私密配置;区分团队与操作者的资产范围,记录授权变更,避免在访问日志中写入 Token。
- 任务范围:明确账户、查询周期、时区与统计口径;账户或报表部分失败时标记缺失,不能把缺失花费当成零。
- 执行规则:先只读巡检和建议;需要自动修改时保存具体预授权的账户、动作、金额上限、有效期和停止入口。
- 任务互斥:避免定时任务重叠;同一账户执行修改时加锁,接口限流时按实际限制退避。
- 运行记录:记录操作者 / 任务、对象 ID、方案版本、确认、执行时间、接口结果、回读结果与待核对事项。
加入 AI 时,让模型输出结构化建议,再由后端校验并交给同一执行队列。模型生成的理由不替代资产权限、审批记录或实际回读。若希望 Agent 自己选择并编排工具,转到AI Agent 调用教程。
固定服务费 ¥5,000 / 月,不限制请求数。广告消耗、模型和运行环境费用另行承担,Meta 与相关接口自身的限流仍然适用。接口调用仍受 Facebook 权限、审核和账户风控约束。
常见问题
我需要先开发 AI Agent 吗?
不需要。先开发自己的后端和规则系统就能调用 REST / Graph。Agent 是由模型选择工具、编排步骤的另一种入口;后续可以把你的业务函数开放给 Agent 使用。
ChatGPT Plugin 算自己的系统吗?
Plugin 可以封装自己的后端工具,但用户主要在聊天中发起任务。本教程侧重独立投放后台与服务器任务;如果想从 ChatGPT 发起调用,另看自助创建 Plugin 教程。
已有 Graph 代码能复用吗?
可以按凭证路线适配。尤里改内部中转 access_token 要同时改用 facebook-graph.baiz.ai;Meta System User Token 使用 graph.facebook.com,广告户与主页分别授权给同一系统用户。SDK 地址配置和支持端点需按实际版本验证。
示例已经完成自动投放了吗?
没有。示例只查询账户、计划和效果,帮助你完成第一条接口链路。广告创建、审批、实际预算回读、任务调度和通知需要按本页后续步骤在自己的系统中实现。