Server-to-Server - EVENT 端点 API 参考

EVENT 端点 API 参考

作为 SDK 集成的替代方案,通过服务器对服务器集成使用 Singular 的 REST API 追踪应用内事件和收入,用于归因分析和广告系列优化。


概述

服务器对服务器使用场景

EVENT 端点用于追踪应用内事件和收入,以进行归因分析和广告系列优化。初次接触服务器对服务器集成?请参阅 S2S 基础指南 了解核心概念和通用设置。

支持的功能:

  • 事件归因: 将用户行为与营销广告系列关联起来
  • 收入追踪: 衡量并归因应用内购买和交易
  • 自定义事件: 追踪从注册到关卡完成的任何用户互动
  • 事件属性: 为事件附加上下文数据,以便进行更深入的分析

混合模式使用场景: 在混合集成中,必须使用 Singular SDK,并由其管理会话追踪,因此不使用 SESSION 端点。您的服务器使用 SDK 提供的 Singular Device ID(SDID)向 EVENT V2 端点发送事件。


关键要求

前提条件:

  • 先有会话,后有事件: 在追踪任何事件之前,必须先建立 SESSION
  • 顺序要求: 会话顺序无效会导致数据不一致和归因错误

事件追踪准则

请按照 Singular 关于命名规范和数据结构的最佳实践来实施事件追踪。

事件定义

定义事件

在实施 S2S 集成之前,请先定义贵组织希望追踪以用于广告系列效果分析的完整事件列表。

事件规划指南: 定义应用内事件

事件命名的影响: 传递给 Singular 的事件名称直接决定了事件在报表、数据导出和回传中的呈现方式。


标准事件命名

最佳实践:


字符限制

长度限制:

  • 事件名称: 最多 32 个 ASCII 字符(非 ASCII 字符转换为 UTF-8 后为 32 字节)
  • 事件属性: 每个属性键和值最多 500 个 ASCII 字符

选择端点

EVENT 端点有两个版本。请使用下方的折叠面板查看各版本的端点 URL 和必需的设备标识符。其余所有参数均为通用参数,仅在下方的 必填参数 可选参数 中记录一次。

自 2026 年 7 月 15 日起必须使用 V2。 2026 年 7 月 15 日及之后创建的账户必须使用 Event Endpoint V2(基于 SDID);新账户无法使用 V1。已完成 V1 集成的现有客户不受影响。如需迁移到 V2,请联系您的 Singular 客户成功经理。

V2 端点(推荐)

如果 Singular SDK 使用 Singular Device ID(SDID)追踪会话,且您的服务器使用同一 SDID 发送事件,请在此类混合集成中使用 V2。V2 无需使用特定平台的设备标识符。

POST https://s2s.singular.net/api/v2/evt

必需的标识符:

参数 详情
sdid

平台: iOS、Android、Web、PC、Xbox、PlayStation、Nintendo、MetaQuest、CTV
类型: UUIDv4
从 Singular SDK 获取或在客户端生成的 Singular Device ID。
示例: 40009df0-d618-4d81-9da1-cbb3337b8dec

  • iOS/Android: 自 2026 年 7 月 15 日起,新账户必须使用。对于现有账户,需要为账户启用 SDID 功能。初始化后,SDK 回调方法会提供 SDID。
  • 简化标识符: 无需再使用 AIFA、ASID、IDFA、IDFV 参数
  • Web: 从 Singular Web SDK 获取
  • PC/主机/CTV: 由客户端生成、代表唯一应用安装的 UUIDv4
  • 请参阅 SDK 文档。
V1 端点(旧版)

对于纯服务器端集成,或 Singular SDK 不使用 SDID、依赖特定平台设备标识符(IDFA、IDFV、AIFA、ASID 等)的混合集成,请使用 V1。

POST https://s2s.singular.net/api/v1/evt

必需的标识符(至少一个):

参数 详情
idfa

平台: iOS
类型: UUIDv4
Identifier for Advertisers (IDFA) 可实现广告追踪和广告系列归因。
ATT 要求: iOS 14.5 及以上版本需要用户通过 App Tracking Transparency 框架选择同意。
示例: DFC5A647-9043-4699-B2A5-76F03A97064B

  • 如果无法获取 IDFA(用户拒绝了 ATT 提示),请省略该参数。
  • 切勿传入 NULL 或空字符串。
  • 获取 IDFA
idfv

平台: iOS
类型: UUIDv4
Identifier for Vendors (IDFV) 在同一供应商的所有应用中保持一致。
始终必填: 无论 ATT 状态或 IDFA 是否可用,都必须包含该参数。
示例: 21DB6612-09B3-4ECC-84AC-B353B0AF1334

aifa

平台: Android
类型: UUIDv4
(Google Play)
Google Advertising ID (GAID) 可在 Android 上实现用户可重置的广告追踪。
示例: 8ecd7512-2864-440c-93f3-a3cabe62525b

  • 在 Google Play 设备上为必填。
  • 在非 Google Play 设备上请省略该参数。
  • 如果无法获取请省略;切勿传入 NULL 或空字符串。
  • 获取 AIFA
asid

平台: Android
类型: UUIDv4
(Google Play)
Android App Set ID 可为同一开发者的应用提供注重隐私的跨应用追踪。
始终必填: 无论 GAID 是否可用,在 Google Play 设备上都必须包含该参数。
示例: edee92a2-7b2f-45f4-a509-840f170fc6d9

amid

平台: Android
类型: UUIDv4
(Amazon)
Amazon Advertising ID 适用于没有 Google Play 服务的 Amazon 设备。
示例: df07c7dc-cea7-4a89-b328-810ff5acb15d

  • Amazon Fire 设备必填。
  • 如果无法获取,请省略该参数。
  • 获取 AMID
oaid

平台: Android
类型: UUIDv4
(中国 OEM)
Open Advertising Identifier(OAID)适用于没有 Google Play 服务的中国厂商设备(Huawei、Xiaomi、OPPO 等)。
示例: 01234567-89abc-defe-dcba-987654321012

  • 没有 Google Play 的中国 OEM 设备必填。
  • 如果无法获取,请省略该参数。
  • 获取 OAID
andi

平台: Android
类型: 字符串
(非 Google Play)
Android ID 是由设备生成的 64 位标识符。

使用限制: 禁止在 Google Play 设备上使用,请改用 AIFA 和 ASID。仅当没有任何其他标识符可用且应用并非通过 Google Play 分发时才可发送。

示例: fc8d449516de0dfb


必填参数

所有 EVENT 请求除设备标识符外,还必须包含以下必填参数。

参数格式: 所有参数必须使用 POST 方法,以 application/x-www-form-urlencoded 数据形式放在请求正文中发送。请求必须包含 Content-Type: application/x-www-form-urlencoded 标头。请勿在 JSON 请求正文中发送参数。

API 身份验证

参数 详情
a

类型: 字符串
用于 API 身份验证的 Singular SDK Key。
获取位置: Singular 界面 → 主菜单 → Developer Tools

重要: 请勿使用 Reporting API Key,否则请求将被拒绝。

示例: sdkKey_afdadsf7asf56


设备参数

参数 详情
p

类型: 字符串
应用的平台。
允许的值(区分大小写):
示例: Android

  • Android
  • iOS
  • Web
  • PC
  • Xbox
  • Playstation
  • Nintendo
  • MetaQuest
  • CTV
ip

类型: 字符串
示例: 172.58.29.235

设备的公共 IPv4 地址。支持 IPv6,但为了与广告网络的归因兼容性,推荐使用 IPv4。
ve

类型: 字符串
示例: 9.2

会话时设备的操作系统版本。
ma

平台: iOS、Android
类型: 字符串
设备制造商(厂商名称)。必须与 mo (型号)一起使用。
获取设备制造商
示例: SamsungLGApple

mo

平台: iOS、Android
类型: 字符串
设备型号。必须与 ma (制造商)一起使用。
获取设备型号
示例: iPhone 4SGalaxy SIII

lc

平台: iOS、Android
类型: 字符串
IETF 区域设置标签——由下划线分隔的两位字母语言代码和国家/地区代码。请仅发送基本的 ll_CC 格式。请勿包含 Unicode 扩展关键字,例如 @calendar=japanese_#u-fw-mon
获取设备区域设置
示例: en_US

bd

平台: iOS、Android
类型: 字符串
设备构建标识符,经过 URL 编码。
获取设备构建版本
示例: Build%2F13D15


应用参数

参数 详情
i

类型: 字符串
应用标识符(区分大小写)。
示例: com.singular.app

  • Android:软件包名称(例如 com.singular.app
  • iOS:Bundle ID(例如 com.singular.app
  • PC/主机:您指定的标识符
app_v

类型: 字符串
示例: 1.2.3

应用版本。
att_authorization_status

平台: iOS
类型: 整数
App Tracking Transparency(ATT)状态代码(iOS 14.5 及以上)。
状态值:

  • 0 - 未确定(未显示提示)
  • 1 - 受限(设备层级已禁用追踪)
  • 2 - 已拒绝(用户拒绝授权)
  • 3 - 已授权(用户已授权)

始终必填: 即使未实施 ATT,也请传入 0 (未确定)。

示例: 3


事件参数

参数 详情
n

类型: 字符串
所追踪事件的名称。
示例: sng_add_to_cart


可选参数

可选参数通过附加的上下文和功能增强事件追踪。

时间戳参数

参数 详情
utime

类型: 整数
事件的 10 位 Unix 时间戳。
示例: 1483228800

umilisec

类型: 整数
精确到毫秒的 13 位 Unix 时间戳。
示例: 1483228800000


事件属性

合作伙伴 Conversion API 支持: 若要通过 Singular 的 Conversion API 集成将这些事件转发给广告网络合作伙伴,请包含标准的可选事件属性(经过哈希处理的第一方数据,例如 eventIdehash )。请参阅 用于 Conversion API 集成的标准事件属性

参数 详情
e

类型: JSON
用于指定自定义事件属性的 JSON URL 编码字符串。
JSON 结构:
URL 编码示例:

{
  "sng_attr_content_id": 5581,
  "sng_attr_content": "XBox",
  "sng_attr_content_type": "electronics"
}
%7B%22sng_attr_content_id%22%3A5581%2C%22sng_attr_content%22%3A%22XBox%22%2C%22sng_attr_content_type%22%3A%22electronics%22%7D
global_properties

类型: JSON
包含全局应用于事件的自定义键值对的 JSON URL 编码对象。
限制:
JSON: {"key1":"value1","key2":"value2"}
URL 编码: %7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D

  • 最多 5 组键值对
  • 每个键和值最多 200 个字符

网络参数

参数 详情
use_ip

类型: 布尔值
指示 Singular 从 HTTP 请求中提取 IP 地址,而不是使用 ip 参数。

限制事项:

  • 将无法由 Singular 进行基于 IP 的地理定位。
  • 请通过 country 参数提供两位字母的国家/地区代码。
  • ip 参数互斥,请勿同时使用两者。
  • 必须提供 ipuse_ip 其中之一,以免数据被拒绝。

示例: true

country

类型: 字符串
ISO 3166-1 alpha-2 两位字母国家/地区代码。
以下情况必填: IP 地址不可用,或 use_ip=true
示例: US

ua

类型: 字符串
经过 URL 编码的 User Agent 字符串。
原始值: Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15...
示例: Mozilla%2F5.0%20(iPhone%3B%20CPU%20iPhone%20OS%2014_0...

c

平台: iOS、Android
类型: 字符串
网络连接类型。
允许的值: wificarrier
示例: wifi

cn

平台: iOS、Android
类型: 字符串
示例: Comcast

互联网服务提供商的运营商名称。

数据隐私

参数 详情
data_sharing_options

类型: JSON
以 JSON URL 编码表示的最终用户数据共享同意状态。必须持久保存,并在后续所有 SESSION 和 EVENT 请求中传递。
用户已同意(选择加入):
用户已拒绝(选择退出):
示例: %7B%22limit_data_sharing%22%3Atrue%7D

{"limit_data_sharing":false}
{"limit_data_sharing":true}
dnt

平台: iOS、Android
类型: 整数
Do Not Track 状态。
示例: 0

  • 1 - 已启用 Do Not Track
  • 0 - 已停用 Do Not Track
dntoff

平台: iOS、Android
类型: 整数
指示 Do Not Track 是否处于关闭状态。
示例: 1

  • 0 - 已启用 Do Not Track(OFF=false)
  • 1 - 已停用 Do Not Track(OFF=true)

跨设备支持

参数 详情
custom_user_id

类型: 字符串
用于跨设备追踪的贵方内部用户 ID。

禁止 PII: 请勿传递个人身份信息。请使用经过哈希处理或以其他方式匿名化的内部标识符,而不是原始的电子邮件地址、电话号码或姓名。

示例: 123456789abcd


SKAdNetwork 支持

参数 详情
skan_conversion_value

平台: iOS
类型: 整数
事件发生时最新的 SKAdNetwork 转化值。
了解更多: SKAdNetwork 实施
示例: 7

skan_first_call_timestamp

平台: iOS
类型: 整数
首次调用 SKAdNetwork API 的 Unix 时间戳。
示例: 1483228800

skan_last_call_timestamp

平台: iOS
类型: 整数
事件发生时最近一次调用 SKAdNetwork API 的 Unix 时间戳。
示例: 1483228800


收入追踪

通过适当的验证和货币处理来追踪应用内购买和收入事件。

必填的收入参数

基本收入追踪

当您自行进行收入验证时,追踪收入事件所需的最少参数。

最佳实践: 在向 Singular 发送事件请求之前,请在您的服务器端与应用商店验证收入事件。如果您自行验证,则仅需这些参数。

参数 详情
is_revenue_event

类型: 布尔值
将该事件标记为收入事件,用于 Revenue 指标。
示例: true

  • 可选。当事件名称为 __iap__ / __iapauto__ ,或存在 amt 参数时,事件也会自动被视为收入事件。
  • 即使设置了 is_revenue_event=false ,只要包含 amt ,也无法阻止其被视为收入事件。
amt

类型: 数字
交易的货币金额。
示例: 2.51

  • 需与 cur 参数一起使用
cur

类型: 字符串
ISO 4217 三位大写货币代码。
示例: USD

  • 需与 amt 参数一起使用

注意: 发送 amt 参数会导致该事件被作为收入事件处理,无论 is_revenue_event 的值为何,包括 is_revenue_event=false 。如果您不希望某个事件被视为收入事件,请省略 amt 参数。若要标记没有金额的收入事件,请发送 is_revenue_event=true


收入验证参数

由 Singular 验证的收入

供 Singular 与应用商店执行服务器端收入验证的可选参数。

验证要求:

  • 如果依赖 Singular 与应用商店进行收入验证,则为必填
  • 请确认购买收据和签名值的语法正确
  • 格式不正确会导致 Singular 拦截该笔收入并生成 __iapinvalid__ 事件
参数 详情
purchase_receipt

平台: iOS、Android
类型: JSON
从购买交易中收到的收据。
示例(iOS):
示例(Android,URL 编码):

MIISqwYJKoZI...cNqts0jvcNvPcK7yuj0KhJ9nTTQ54kDKfReihzc6aw==
%7B%22orderId%22%3A%22GPA.1234%22%2C%22packageName%22%3A%22com.example%22%2C%22productId%22%3A%22com.example.product%22...
receipt_signature

平台: Android
类型: 字符串
用于对购买收据签名的签名(仅限 Android)。
示例:

TyVJfHg8OAoW7W4wuJt...5agEDMnNXvhfrw==
purchase_product_id

类型: 字符串
产品 SKU 标识符。
示例: com.example.product

purchase_transaction_id

类型: 字符串
交易标识符。
示例(iOS): 380000123004321
示例(Android): GPA.1234-1234-1234-12345


广告收入追踪

通过发送带有固定事件名称和广告变现属性的标准 EVENT,追踪来自聚合平台(例如 AdMob、AppLovin MAX 或 ironSource)的展示级广告变现收入。广告收入使用与上文相同的 EVENT 端点。

聚合平台数据: 请直接从您的聚合平台 SDK 收集所需的广告收入属性。有关各聚合平台提供的属性,请参阅 广告收入 SDK 指南

广告变现收入

除标准必填参数(身份验证、设备和应用)外,广告收入事件还需要以下参数。

参数 详情
n

类型: 字符串
所追踪事件的名称。
广告收入所需的事件名称:

__ADMON_USER_LEVEL_REVENUE__
  • 事件名称必须全部大写并使用下划线
  • 最多 32 个 ASCII 字符
is_admon_revenue

类型: 布尔值
将该事件标识为广告变现收入事件,用于 Ad Revenue 指标。
示例: true

  • 此事件请传入 true
is_revenue_event

类型: 布尔值
将该事件标识为收入事件,用于 Revenue 指标。
示例: true

  • 此事件请传入 true
amt

类型: 数字
展示收入的货币金额。
示例: 0.00782

  • 需与 cur 参数一起使用
cur

类型: 字符串
ISO 4217 三位大写货币代码。
示例: USD

  • 需与 amt 参数一起使用
e

类型: JSON
用于指定聚合平台广告变现属性的 JSON URL 编码字符串。
必需属性:

  • ad_platform (必填) 广告网络的名称

可选属性:

  • ad_mediation_platform
  • ad_type
  • ad_group_type
  • ad_impression_id
  • ad_placement_name
  • ad_unit_id
  • ad_unit_name
  • ad_group_id
  • ad_group_name
  • ad_group_priority
  • ad_placement_id

JSON 结构:

{
  "ad_platform": "AdMob",
  "ad_mediation_platform": "admob.AdMobAdapter",
  "ad_unit_id": "ca-app-pub-6325336052/44923540"
}

URL 编码示例:

%7B%22ad_platform%22%3A%22AdMob%22%2C%22ad_mediation_platform%22%3A%22admob.AdMobAdapter%22%2C%22ad_unit_id%22%3A%22ca-app-pub-6325336052%5C%2F44923540%22%7D

注意: 没有值的属性请省略。


请求示例

示例代码演示了多种编程语言下的 EVENT 端点集成。

示例免责声明: 代码示例可能未包含所有必填参数。在生产环境中实施之前,请验证完整的参数列表。开发/测试请使用唯一的 i (应用标识符)。

PYTHON CURL HTTP JAVA

Python 示例

import requests

url = 'https://s2s.singular.net/api/v1/evt'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
params = {
    'a': 'sdk_key_here',
    'p': 'Android',
    'i': 'com.singular.app',
    'ip': '10.1.2.3',
    've': '9.2',
    'ma': 'samsung',
    'mo': 'SM-G935F',
    'lc': 'en_US',
    'bd': 'Build/13D15',
    'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
    'asid': 'edee92a2-7b2f-45f4-a509-840f170fc6d9',
    'n': 'sng_add_to_cart'
}

response = requests.post(url, data=params, headers=headers)
print(response.json())

响应代码与错误

EVENT 端点返回 HTTP 状态代码和 JSON 响应,用于指示请求成功或失败。

完整错误文档: S2S 响应代码与错误处理


测试与验证

在部署到生产环境之前,请使用 Singular SDK Console 进行实时数据验证,以确认 S2S 事件集成。

测试步骤

端到端验证

  1. 注册测试设备: 获取设备广告 ID 并添加到 Singular SDK Console
  2. 启用控制台日志: 在 SDK Console 中添加设备标识符以捕获测试数据
  3. 使用开发版 App ID: 用开发版本覆盖应用标识符(例如 com.singular.app.dev ),以将测试数据与生产数据分开
  4. 构建并启动: 从完全关闭状态构建或打开应用
  5. 验证客户端数据: 确认应用向您的服务器发送了所有必需的 Singular 数据点
  6. 验证会话: 确认您的服务器已将 SESSION 请求连同所有必填参数发送至 https://s2s.singular.net/api/v1/launch
  7. 检查 SDK Console(会话): 数秒内,SESSION 事件应出现在 SDK Console 中

SDK Console 会话事件


事件测试

  1. 触发事件: 继续在应用中触发一个事件
  2. 验证事件数据: 确认事件已连同所有必需的 Singular 数据点发送至您的服务器
  3. 验证服务器请求: 确认您的服务器已将 EVENT 请求连同所有必填参数发送至您的端点(V2 https://s2s.singular.net/api/v2/evt 或 V1 https://s2s.singular.net/api/v1/evt )。
  4. 检查 SDK Console(事件): 数秒内,EVENT 应出现在 SDK Console 中
  5. 重复测试: 验证发送的所有事件均具有预期值

SDK Console 事件

关键验证项:

  • 确认在收到 EVENT 之前,应用打开/切换到前台时已发生 SESSION 事件
  • 确认 EVENT 的必需数据点与 SESSION 的数据点一致

成功标志: 如果事件出现在 SDK Console 中,说明您已成功完成端到端事件集成测试!


其他资源

测试文档

完整测试指南: S2S 集成测试指南