验证设备归因
使用 Singular Device Assist 应用和 Attribution Details API 端点进行 设备归因验证的完整指南,适用于集成测试 和追踪链接验证。
Singular 提供两种验证设备归因的方法:用于移动端测试的 Device Assist 应用和用于程序化验证的 Attribution Details API 端点。
在测试新的 SDK/S2S 集成以及在活动投放前验证 Singular Links 时, 验证归因是必不可少的环节。
| 目标受众 | UA 经理、开发人员、QA 工程师 |
| 前提条件 |
|
归因验证使用场景
何时需要验证归因
设备归因验证在集成和活动投放生命周期的多个阶段至关重要。
| 使用场景 | 目的 |
|---|---|
| SDK/S2S 集成测试 |
验证 SDK 在集成开发过程中是否正确追踪安装事件并 将其归因到正确的来源。 |
| 追踪链接验证 |
在活动投放前测试新的 Singular Links, 以确保归因正确 且参数传递无误。 |
| 活动问题排查 | 通过检查测试设备的归因状态,诊断正在投放的 活动中的归因问题 |
| 合作伙伴集成验证 | 确认归因数据从广告合作伙伴正确流入 Singular 平台 |
方法对比
选择验证方法
根据测试需求和技术能力,选择合适的 验证方法。
| 方法 | 最适合 | 要求 | 局限性 |
|---|---|---|---|
| Device Assist 应用 |
|
|
手动流程,自动化程度有限 |
| Attribution Details API |
|
|
仅用于测试(测试版),需要技术知识 |
方法一:Device Assist 应用
一款移动应用,可在测试设备上直接快速地对设备归因状态、 安装详情和事件追踪摘要进行可视化验证。
Device Assist 应用概述
应用功能
Device Assist 应用可显示 Singular 为特定设备记录的全面归因信息。
显示的归因数据:
- 安装归因: 安装时间戳、归因网络 和活动名称
- 再互动归因: 再互动时间戳、归因 网络和活动详情
- 事件摘要: Singular 为该设备追踪的 会话和应用内事件
- 设备标识符: 用于追踪的 IDFA、IDFV、GAID 或其他标识符
使用 Device Assist 应用
分步操作流程
| 1 |
下载 Device Assist 应用在测试设备上安装 Singular Device Assist 应用:
|
| 2 |
启动归因检查打开 Device Assist 应用,从主菜单中选择 检查实现 。
其他功能: Device Assist 应用 还提供设备标识符查询 和 SDK 实现验证工具, 均可从主菜单访问。 |
| 3 |
选择设备标识符应用会自动为该平台选择合适的设备标识符。 确认选择后,再次点击 检查实现 继续操作。
标识符选择:
|
| 4 |
查看归因详情应用将显示 Singular 平台记录的该设备完整归因信息。
显示的归因信息
安装归因详情
安装时间戳: 首次启动应用 (安装事件)的日期和时间 归因网络: 归因该安装的广告网络 或来源(例如 Facebook、Google Ads、 自然量) 活动名称: 归因该安装的营销活动 附加参数: 通过追踪链接传递的 活动特定参数 解读安装归因
再互动归因详情
事件追踪摘要
Device Assist 应用显示 Singular 为该设备追踪的 所有应用内事件的摘要。 显示的事件信息:
验证事件追踪使用事件摘要验证:
|
Device Assist 问题排查
常见问题
可能原因
- 超出归因窗口: 安装发生在已配置归因窗口 之外
- 无匹配触点: 未找到与该设备匹配的点击
- 设备指纹不匹配: 点击与安装之间设备指纹发生变化
- 未点击链接: 应用直接从应用商店安装, 未点击追踪链接
解决步骤
- 确认在安装应用前已点击追踪链接
- 检查归因窗口设置,确保留有足够时间完成安装
- 在追踪链接中使用设备 ID(确定性归因),以确保测试可靠
- 确保点击和安装过程中网络连接稳定
- 换用其他设备或重置标识符后重试
方法二:Attribution Details API
程序化 API 端点,可为集成测试和 CI/CD 流水线实现自动化归因验证。
测试版功能说明: Attribution Details API 端点为 测试版功能,仅供测试使用——请勿在生产环境应用 或高流量场景中调用。
API 端点规格
请求格式
端点 URL:
https://api.singular.net/api/attribution/attribution_details
请求方法: GET
完整请求示例:
https://api.singular.net/api/attribution/attribution_details?keyspace=idfa&device_id=12345678-1234-1234-1234-123456789012&api_key=your_api_key_here
查询参数
必填参数
| 参数 | 类型 | 说明 |
|---|---|---|
api_key
|
String |
平台中的 Singular 报告 API 密钥。 位置: Dashboard → Developer Tools → API Keys → Reporting API Key 重要提示: 请使用 Reporting API Key, 而非 SDK Key。不同密钥 用途各异。 |
device_id
|
String |
设备广告标识符的值。
必须与
|
keyspace
|
String (Enum) |
|
API 响应
响应格式
API 返回包含所请求设备归因详情的 JSON 数组。
响应示例
[
{
"app_long_name": "com.example.myapp",
"app_name": "My App",
"install_info": {
"install_time": "2020-06-10 11:58:46",
"network": "Network 1",
"additional_parameters": {
"kw": "my keyword",
"pcid": "1234"
},
"campaign_name": "Campaign Name",
"view_through_attribution": false
},
"re_engagement_info": {
"notes": "Attributions from Self-Attributing networks including: Twitter, Facebook, Google Ads, Snapchat, etc are redacted and always show as 'Unattributed'",
"install_time": "2020-06-15 15:27:12",
"network": "Unattributed"
},
"uninstall_pre_requisites": {
"gcm_token": "enE8iQR10RI:APA91bERgfA_xm8T7zgqH9OW_1s05SFFmKnle1zIm0cMrDfuaSxEmC_3j72dj4qN36vh5V8TAEnrXa3Pq3SmLW-XNOHP7daMwcBrBTibdkv_pKMJbN9SbefV6_9nuEfIeI5Zhtz0nlLY"
},
"events": [
{
"event_name": "Session",
"first_event_time": "2020-04-02 00:09:55",
"last_event_time": "2020-04-07 20:59:55",
"event_count": 2
},
{
"event_name": "Save New Transaction",
"first_event_time": "2020-04-02 00:11:51",
"last_event_time": "2020-04-02 00:11:51",
"event_count": 1
}
]
}
]
响应参数
JSON 响应字段
| 字段 | 说明 |
|---|---|
app_long_name
|
应用 Bundle ID(例如 com.example.myapp) |
app_name
|
在 Singular 平台中配置的应用显示名称 |
install_info
|
包含安装归因详情和决策信息的对象:
|
re_engagement_info
|
与
了解更多: 再互动归因常见问题 隐私说明: 来自自归因媒体(Facebook、Google Ads、Twitter、Snapchat) 的再互动归因因隐私合规要求 将显示为"Unattributed"。 |
events
|
包含 SDK 追踪的应用内事件摘要的对象数组:
|
uninstall_pre_requisites
|
包含卸载追踪配置的对象:
|
API 使用示例
实现示例
iOS 设备(IDFA)
curl -X GET "https://api.singular.net/api/attribution/attribution_details?keyspace=idfa&device_id=12345678-1234-1234-1234-123456789012&api_key=your_api_key_here"
Android 设备(GAID)
curl -X GET "https://api.singular.net/api/attribution/attribution_details?keyspace=aifa&device_id=12345678-1234-1234-1234-123456789012&api_key=your_api_key_here"
网页追踪(SDID)
curl -X GET "https://api.singular.net/api/attribution/attribution_details?keyspace=sdid&device_id=singular_device_id_value&api_key=your_api_key_here"
Python 实现
import requests
import json
def check_attribution(keyspace, device_id, api_key):
"""
Check device attribution using Singular API
Args:
keyspace: Device identifier type (idfa, idfv, aifa, sdid)
device_id: Device identifier value
api_key: Singular Reporting API key
Returns:
Attribution data as JSON or None if error
"""
url = "https://api.singular.net/api/attribution/attribution_details"
params = {
'keyspace': keyspace,
'device_id': device_id,
'api_key': api_key
}
try:
response = requests.get(url, params=params)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"Error checking attribution: {e}")
return None
# Example usage
attribution_data = check_attribution(
keyspace='idfa',
device_id='12345678-1234-1234-1234-123456789012',
api_key='your_api_key_here'
)
if attribution_data:
print(json.dumps(attribution_data, indent=2))
# Extract install info
if attribution_data and len(attribution_data) 0:
install_info = attribution_data[0].get('install_info', {})
print(f"\nInstall Network: {install_info.get('network')}")
print(f"Campaign: {install_info.get('campaign_name')}")
print(f"Install Time: {install_info.get('install_time')}")
JavaScript 实现
/**
* Check device attribution using Singular API
*
* @param {string} keyspace - Device identifier type (idfa, idfv, aifa, sdid)
* @param {string} deviceId - Device identifier value
* @param {string} apiKey - Singular Reporting API key
* @returns {Promise} Attribution data or error
*/
async function checkAttribution(keyspace, deviceId, apiKey) {
const url = 'https://api.singular.net/api/attribution/attribution_details';
const params = new URLSearchParams({
keyspace: keyspace,
device_id: deviceId,
api_key: apiKey
});
try {
const response = await fetch(`${url}?${params.toString()}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Error checking attribution:', error);
throw error;
}
}
// Example usage
checkAttribution(
'idfa',
'12345678-1234-1234-1234-123456789012',
'your_api_key_here'
)
.then(data = {
console.log('Attribution Data:', JSON.stringify(data, null, 2));
// Extract install info
if (data && data.length 0) {
const installInfo = data[0].install_info || {};
console.log('\nInstall Network:', installInfo.network);
console.log('Campaign:', installInfo.campaign_name);
console.log('Install Time:', installInfo.install_time);
}
})
.catch(error = {
console.error('Failed to check attribution:', error);
});
API 问题排查
常见 API 问题
问题描述
API 返回空数组
[]
而非归因数据。
可能原因
- 无归因数据: 设备从未安装应用或 未追踪到会话
- 标识符错误: 设备 ID 或 keyspace 不正确
- 时间问题: 归因数据尚未处理完成 (安装后通常需要 1-5 分钟)
解决步骤
- 确认设备 ID 复制正确,无多余空格
- 确认 keyspace 与标识符类型匹配(iOS 的 idfa vs idfv)
- 应用安装后等待 5-10 分钟,然后重试查询
- 使用 Device Assist 应用检查设备归因,确认应用已安装 并被追踪
问题描述
API 返回认证错误或 401 未授权响应。
可能原因
- API 密钥无效: API 密钥不正确或未提供
- 密钥类型错误: 使用了 SDK Key 而非 Reporting API Key
- 密钥已过期: API 密钥已被撤销或重新生成
解决步骤
- 导航至 Dashboard → Developer Tools → API Keys → Reporting API Key
- 复制 Reporting API Key(非 SDK Key)
- 确认 API 密钥已正确粘贴到请求中
- 如果密钥近期已重新生成,请确保使用新的密钥值
安全警告: 切勿将 API 密钥提交到版本控制系统 或在客户端代码中暴露。请使用环境变量或 安全配置管理方案。
问题描述
API 返回 429 Too Many Requests 或频率限制错误。
可能原因
- 请求过于频繁: 短时间内 API 调用次数过多
- 生产环境使用: API 在生产环境中使用 (非预期用途)
解决步骤
- 在代码中实现指数退避和重试逻辑
- 控制 API 请求间隔(建议每次调用间隔至少 1 秒)
- 尽量缓存归因数据,减少 API 调用次数
- 如果合法测试需要更高的频率限制,请联系 Singular 支持团队
测试版限制: Attribution Details API 仅用于测试目的。 请勿在高请求量的生产应用中使用。
最佳实践
在集成测试和活动验证过程中,有效进行归因验证的建议。
测试工作流程
推荐测试流程
- 使用全新设备: 使用干净的设备或在测试前 重置广告标识符,以避免缓存的归因数据干扰
- 及时验证: 安装后 5-10 分钟内检查归因, 在测试过程中快速获取反馈
- 测试多种场景: 验证不同来源的归因(自然量、付费活动、再互动)
- 记录结果: 记录归因验证结果, 用于集成验证文档
- 尽量实现自动化: 在自动化测试套件中使用 Attribution Details API,实现持续验证
方法选择指南
各方法适用场景
| 场景 | 推荐方法 |
|---|---|
| 快速手动测试 | Device Assist 应用——开发过程中最快速的可视化验证方式 |
| 自动化测试 | Attribution Details API——CI/CD 流水线中的程序化验证 |
| 非技术人员测试 | Device Assist 应用——无需编程或 API 知识 |
| 批量设备验证 | Attribution Details API——通过脚本批量检查多台设备 |
| 事件追踪验证 | 两种方法均可——Device Assist 用于快速检查,API 用于详细事件分析 |
集成验证清单
归因验证清单
完整归因验证:
- 安装已归因到正确的网络/来源
- 活动名称与预期活动一致
- 归因时间戳合理(在预期时间范围内)
- 归因方式适当(点击 vs 展示)
- 自定义参数通过追踪链接正确传递
- 会话事件被正确追踪
- 自定义事件以正确名称显示
- 收入事件正确捕获金额和货币
- 再互动归因正常运行(如适用)
- 卸载追踪已配置(如已实现)
其他资源
归因测试、SDK 集成和追踪链接配置的完整文档。
相关文档
- 使用测试控制台 - SDK 集成测试完整指南
- 如何测试追踪链接 - 追踪链接验证流程
- 了解 Singular 移动应用归因 - 归因方法论与流程
- 追踪链接参数与报告维度 - 完整参数参考
- 再互动归因常见问题 - 再互动归因文档