跳到主要内容

Apple Search Ads 集成方案

最近更新 2026/10/05

本文将介绍如何在 AE 后台接入 Apple Search Ads 数据,目前 AE 后台支持接入的是 Apple Search Ads 的 Reporting API。

如果您正在使用 AE 4.2 之前的版本,请参考 Apple Search Ads 数据集成解决方案 进行数据集成

提示

请注意,第三方数据集成产生的数据会被纳入集群的消耗数据量

概要​

接口简介​

接口名类型粒度归因成本收益展示点击转化
Reporting APIAPI聚合数据✅✅✅✅

Apple Search Ads 的 Reporting API 提供了从广告计划(Campaign-Level)至广告(Ad-Level)等多个层级的数据报表,目前 AE 系统支持以下几个层级的数据拉取:

请注意,由于 Apple Search Ads 的功能调整,Creative Set 层级报告(Creative Set-Level Reports)已不再支持,历史配置可能会失效

集成流程​

Apple Search Ads 数据的接入流程如下:

  1. 完成 Apple Search Ads API 的授权
  2. 登录 AE 后台,进入三方集成模块,新增 Apple Search Ads 集成方案,并完成相关配置
  3. 查看 AE 系统是否成功接收数据,并完成报表搭建

一、完成 Apple Search Ads API 的授权​

在接入 ASA 的数据之前,首先需要完成 ASA 的授权工作,整个流程分为以下几个步骤:

  1. 创建一个拥有 API 访问权限的用户
  2. 生成私钥与公钥,并将公钥上传到 ASA 后台
  3. 创建客户端密钥(Client Secret)
  4. 请求获取访问令牌(Access Token)

您可以直接查看 Apple Search Ads 的官方文档,完成授权工作。或者按照本节流程完成授权,以下内容均来自该官网文档。

1.1 创建拥有 API 访问权限的用户​

首先,您需要登录管理员账号,并按照以下流程创建一个带有 API 权限的用户:

  1. 进入 Apple Search Ads UI,登录管理员账号
  2. 进入「Account Settings」-「User Management」(「账号设置」-「用户管理」)
  3. 点击「Invite Users」邀请一个在您的 ASA 组织内的用户
  4. 在「User Details」栏目,输入用户的姓名以及 Apple ID
  5. 在「User Access and Role」栏目,选择具有 API 访问权限的用户角色
  6. 点击「Send Invite」发送邀请邮件,受邀请用户会收到一份带有 secure code 的邮件,用户点击邮件中的 Apple 网址并输入 secure code 即可激活用户的账号

1.2 生成私钥与公钥,并将公钥上传到 ASA 后台​

接下来,您需要通过代码生成私钥与公钥,本节需要一定的技术背景。如果您不是开发人员,请您联系开发人员或者 AE 工作人员完成该步骤

提示

如果您使用的是 Windows 系统,请下载并安装 OpenSSL

  1. 在命令行中输入以下命令,生成私钥文件,文件名为 private-key.pem
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
  1. 接着,在同一目录下,继续执行如下命令,生成公钥文件,文件名为 public-key.pem
openssl ec -in private-key.pem -pubout -out public-key.pem
  1. 进入 Apple Search Ads UI,登录我们在上一步中创建的带有 API 权限的用户。选择「Account Settings」-「API」,将公钥复制到「Public Key」板块。点击保存后,您将可以在「Public Key」板块上方看到clientId、teamId 与 keyId ,以下是数据样例:
clientId SEARCHADS.aeb3ef5f-0c5a-4f2a-99c8-fca83f25a9
teamId SEARCHADS.hgw3ef3p-0w7a-8a2n-77c8-scv83f25a7
keyId a273d0d3-4d9e-458c-a173-0db8619ca7d7

1.3 创建客户端密钥​

接下来,您还需要通过代码生成客户端密钥。本节需要一定的技术背景。如果您不是开发人员,请您联系开发人员或者 AE 工作人员完成该步骤。

Apple Search Ads 的客户端密钥是一个 JSON web token(JWT)。官方提供了 Python 3 的代码样例,请在完成依赖库的安装后,执行以下代码完成客户端密钥的创建:

import os
import datetime as dt
from authlib.jose import jwt
from Crypto.PublicKey import ECC

# 建议您将私钥与公钥文件置于 py 文件的同一目录下
private_key_file = "private-key.pem"
public_key_file = "public-key.pem"

# 此处需要替换成上一步中获取的 clientId、teamId 与 keyId
client_id = "SEARCHADS.9703f56c-10ce-4876-8f59-e78e5e23a152"
team_id = "SEARCHADS.9703f56c-10ce-4876-8f59-e78e5e23a152"
key_id = "d136aa66-0c3b-4bd4-9892-c20e8db024ab"

audience = "https://appleid.apple.com"
alg = "ES256"


# 如果私钥文件不存在,则创建私钥文件
if os.path.isfile(private_key_file):
with open(private_key_file, "rt") as file:
private_key = ECC.import_key(file.read())
else:
private_key = ECC.generate(curve='P-256')
with open(private_key_file, 'wt') as file:
file.write(private_key.export_key(format='PEM'))


# 如果公钥文件不存在,创建公钥文件
public_key = private_key.public_key()
if not os.path.isfile(public_key_file):
with open(public_key_file, 'wt') as file:
file.write(public_key.export_key(format='PEM'))


# 获取当前时间戳
issued_at_timestamp = int(dt.datetime.utcnow().timestamp())
# 定义过期时间,不能超过 180 天,否则 Client Secret 会失效
expiration_timestamp = issued_at_timestamp + 86400*180


# 定义 JWT headers.
headers = dict()
headers['alg'] = alg
headers['kid'] = key_id


# 定义 JWT payload.
payload = dict()
payload['sub'] = client_id
payload['aud'] = audience
payload['iat'] = issued_at_timestamp
payload['exp'] = expiration_timestamp
payload['iss'] = team_id


# 获取私钥内容
with open(private_key_file, 'rt') as file:
private_key = ECC.import_key(file.read())


# 编码 JWT 并用私钥做签名
client_secret = jwt.encode(
header=headers,
payload=payload,
key=private_key.export_key(format='PEM')
).decode('UTF-8')


# 将 Client secret 写入文件中
with open('client_secret.txt', 'w') as output:
output.write(client_secret)

在以上代码中,您需要注意以下几个地方:

  1. 将上一步中生成的私钥与公钥文件,置于 .py 文件的同一目录下,或者修改代码中私钥与公钥文件的路径
  2. 将上一步中获取的 clientId、teamId 与 keyId 替换代码中的相应位置

接下来执行该代码,客户端密钥将记录在该目录下的 client_secret.txt 文件中,请将该信息记录下来,以下是客户端密钥的样例:

eyJraWQiOiJiYWNhZWJkYS1lMjE5LTQxZWUtYTkwNy1lMmMyNWIyNGQxYjIiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJEcmVhbWNvbXBhbnkiLCJhdWQiOiJBdXRoZW50aWNhdG9yIiwiZXhwIjoxNTcxNjcwNjIxLCJuYmYiOjE1NzE2NjcwMjEsInN1YiI6Im11c3RlciIsImNsaWVudF9pZCI6ImFiY2QxMjM0IiwiYWRtaW4iOiJ0cnVlIn0.s4C3p9kVNFeRAB5tChatC3ldQX07v9mG7thL7FeEO6cClfNuiaLSgq8f8ymbfO3OQYW_KuwaA1KYRuoy1JmKk 4DBbYLcz6aoABe0pzI5Z_6wgMzAyqz8pQtwDAcd4Idoi8JdRbtzZce9o-0nZiFA4hVAXqYwpEYC4UU8ZmJO_z8tY4juHPTV3nDugdtqyNnmAiBoLryOfGNngQZccdY1_QvkXS1y0bg1a0k8cVVtnq- _93fYJIt9Z64CTvlH3uOeh7uaEv3nIxpXhvhkTySpUmY8e04TO09oTyZijiloByv3KFQ92OOJ8L 5N5_CeEc5p9LWjT1pcX8ATamOycZz2Q

1.4 获取 Org ID​

最后,您需要获取 Org ID,也就是 ASA 后台的 Campaign Group ID。您可以在 ASA 后台查看到,即下图中红框圈出的 ID:

1.5 您需要的内容​

最后,请确认您在上述授权流程中获取并记录了以下内容:

  • client_id
  • org_id
  • client_secret

二、方案配置​

当您完成了 ASA 的授权工作后,您可以登录 AE 系统,在「三方集成」模块中完成新方案的配置。下图是 ASA 的配置界面,请您按照本章节内容完成方案的创建:

2.1 授权信息配置​

点击「授权信息」下的「配置授权信息」按钮,在弹出框内填写您在授权工作中获取到的信息

其中 Org ID 即 Apple Search Ads 后台中的 Campaign Group ID(获取方法见 1.4)

2.2 定时拉取​

您可以在「定时拉取」模块设置 AE 系统定时拉取 ASA 数据的策略,可以选择在每天的某时或者每小时拉取一段时间的数据。由于拉取的数据也会计入数据量,建议不要定时拉取太长时间的数据。Reporting API 支持拉取的时间范围最多为过去 1000 天,单次最多拉取 31 天。定时拉取下方还有「拉取时区」一项,默认为 ORTZ。

2.3 入库设置​

您可以控制 ASA 数据是否以事件的形式写入,由于 ASA 数据只会写入事件表,因此请不要关闭该配置。

2.4 集成配置​

最后,您可以在集成配置模块对数据拉取的细节配置进行控制。包括数据的时间聚合粒度,拉取的指标字段与维度,以及入库后的事件名等。

集成配置中的内容是一个 JSON,您可以按照以下内容进行自定义配置:

模块名称含义
sink_eventevent_name入库后的事件名,可以自定义
event_mapping按层级指定入库后的事件名,key 为 report_types 中的层级名,value 为入库后的事件名,用法见 2.4.4。新建方案时的默认配置使用的是 event_mapping

source

time_granularity

数据的时间聚合粒度,即拉取的数据以天还是小时进行聚合

可选值: day、hour

report_types

数据拉取的层级,列表类型,建议您只填入一个元素,即一次只拉取一个层级的数据

可选值: campaign、ad_group、keyword

metrics数据中的指标,列表类型,不同层级支持不同的 metrics,填写时需要注意
group_by数据中的分组维度,列表类型,不同层级支持不同的 group_by,填写时需要注意
transferdouble_columns数值类型字段定义,列表类型,写在此处的字段将以数值类型入库。新建方案时的默认配置已列出 impressions、taps、installs 等指标字段

由于不同层级的数据配置有较大区别,建议您直接使用各层级的配置模板,或对模板进行微调。

2.4.1 Campaign 层级模板​

Campaign 层级报告的模板如下:

{
"sink_event": {
"event_name": "asa_campaign_level_data"
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"campaign"
]
}
}
  • 模板中使用的时间粒度为小时,系统将使用数据中的 date 字段,即数据的日期+小时数,作为数据的时间
  • 模板中使用的事件名为 -- asa_campaign_level_data
  • 以下是 Campaign 层级报告的入库字段
------------------------维度字段------------------------
campaignid
campaignname
deleted
campaignstatus
app_adamid
app_appname
servingstatus
servingstatereasons
countriesorregions
modificationtime
totalbudget_amount
totalbudget_currency
dailybudget_amount
dailybudget_currency
displaystatus
supplysources
adchanneltype
orgid
countryorregionservingstatereasons
countryorregion
billingevent
------------------------指标字段------------------------
impressions
taps
installs
newdownloads
redownloads
latoninstalls
latoffinstalls
ttr
avgcpa_amount
avgcpa_currency
avgcpt_amount
avgcpt_currency
avgcpm_amount
avgcpm_currency
localspend_amount
localspend_currency
conversionrate

2.4.2 Ad Group 层级模板​

{
"sink_event": {
"event_name": "asa_adgroup_level_data"
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"ad_group"
]
}
}
  • 模板中使用的时间粒度为小时,系统将使用数据中的 date 字段,即数据的日期+小时数,作为数据的时间
  • 模板中使用的事件名为 -- asa_adgroup_level_data
  • 以下是 Ad Group 层级报告的入库字段
------------------------维度字段------------------------
campaignid
adgroupid
adgroupname
adgroupdisplaystatus
adgroupstatus
adgroupservingstatus
adgroupservingstatereasons
deleted
cpagoal
orgid
modificationtime
pricingmodel
defaultbidamount_amount
defaultbidamount_currency
countryorregion
------------------------指标字段------------------------
impressions
taps
installs
newdownloads
redownloads
latoninstalls
latoffinstalls
ttr
avgcpa_amount
avgcpa_currency
avgcpt_amount
avgcpt_currency
avgcpm_amount
avgcpm_currency
localspend_amount
localspend_currency
conversionrate

2.4.3 Keyword 层级模板​

{
"sink_event": {
"event_name": "asa_keyword_level_data"
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"keyword"
]
}
}
  • 模板中使用的时间粒度为小时,系统将使用数据中的 date 字段,即数据的日期+小时数,作为数据的时间
  • 模板中使用的事件名为 -- asa_keyword_level_data
  • 以下是 Keyword 层级报告的入库字段
------------------------维度字段------------------------
keywordid
keyword
keywordstatus
matchtype
bidamount_amount
bidamount_currency
deleted
keyworddisplaystatus
adgroupid
adgroupname
adgroupdeleted
modificationtime
countryorregion
------------------------指标字段------------------------
impressions
taps
installs
newdownloads
redownloads
latoninstalls
latoffinstalls
ttr
avgcpa_amount
avgcpa_currency
avgcpt_amount
avgcpt_currency
avgcpm_amount
avgcpm_currency
localspend_amount
localspend_currency
conversionrate

2.4.4 多层级模板​

如果您希望一次拉取多个层级的数据,则建议采用以下模板,主要的改动为:

  1. report_types 中写入需要拉取的层级名
  2. 使用 event_mapping 管理多个层级的事件名,event_mapping 中的每个元素的 key 对应 report_types 中的层级名,value 为入库后的事件名
  3. 各层级的数据将按照同一套配置,即同样的 time_granularity、group_by 拉取数据
{
"sink_event": {
"event_mapping":{
"campaign": "asa_campaign_level_data",
"ad_group": "asa_adgroup_level_data",
"keyword": "asa_keyword_level_data"
}
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"campaign",
"ad_group",
"keyword"
]
}
}

2.5 标准化字段​

以下展示的是 Apple Search Ads 的标准化字段:

原字段标准化字段含义
orgidte_ads_object.ad_account_id广告账号 ID
campaignnamete_ads_object.campaign_name广告计划名
campaignidte_ads_object.campaign_id广告计划 ID
adgroupnamete_ads_object.ad_group_name广告组名,变现广告的 Unit 名
adgroupidte_ads_object.ad_group_id广告组 ID,变现广告的 Unit ID
adnamete_ads_object.ad_name广告名
adidte_ads_object.ad_id广告 ID
app_adamidte_ads_object.app_id应用 ID
app_appnamete_ads_object.app_name应用名
【iOS】(定值)te_ads_object.platform平台,即 Android、iOS 等
countryorregionte_ads_object.country国家地区编码
localspend_currencyte_ads_object.currency成本或收益的币种
impressionste_ads_object.impressions曝光量
tapste_ads_object.clicks点击量
installste_ads_object.installs转化量(安装)
localspend_amountte_ads_object.cost买量成本

三、后续使用​

3.1 数据入库检查​

您可以在「数据管理」页面查看回传事件是否入库:

  • asa_campaign_level_data:Campaign 层级数据
  • asa_adgroup_level_data:Ad Group 层级数据
  • asa_keyword_level_data:Keyword 层级数据

3.2 单次拉取数据​

如果您希望接入之前一段时间的数据,比如历史数据或者补上拉取失败的数据。可以在保存方案后再次进入方案页面,点击右上角的单次拉取按钮进行一次确定时间范围的数据拉取。需要注意的是,如果您拉取的数据的时间段与之前有重叠,比如拉取了 2023-08-01 的数据,而这一天的数据在之前已经拉取过,则最新一次拉取的数据将覆盖之前的数据:

这篇文档对你有帮助吗?