服务端 API
查询设备指纹:用客户端 SDK 拿到的 device_token,换取设备标识、设备信息与风险信号。客户端上报失败时,可通过同一接口提交 SDK 原始 geetoken 进行降级分析,详见「fp_query 降级模式」。
接口
| Method | Path | 用途 |
|---|---|---|
POST | /api/v2/fp_query/{public_key} | 查询设备指纹 |
输入从哪里获取
| 字段 | 用在 | 从哪里获取 |
|---|---|---|
public_key | 路径 /api/v2/fp_query/{public_key} | 后台。应用公开标识,用于定位应用和地区。不是认证密钥。 |
secret | Authorization: Bearer <secret> | 后台。服务端查询认证。 |
device_token | 请求体 | 客户端 SDK 接口。 |
支持的客户端
iOS、Android、Web/H5。
地区限制
每个应用只属于一个地区,由后台配置。请求必须发到该应用所属地区的节点。
| 地区 | 说明 | 服务节点(HTTPS) |
|---|---|---|
GLB | 全球 | https://riskct-global.geelabapi.com |
NA | 北美 | https://riskct-na.geelabapi.com |
EU | 欧洲 | https://riskct-eu.geelabapi.com |
发到其他地区的节点时,返回 404,message 为 integration not found。
响应信封
Content-Type: application/json。HTTP 状态码与 JSON code 相同。
成功:
{ "code": 200, "data": {}, "message": "Success" }失败:
{ "code": 400, "data": {}, "message": "Invalid request" }校验失败时 data 为:
{
"errors": [
{ "field": "device_token", "reason": "Field required", "type": "missing" }
]
}错误码
HTTP / code | message | 含义 |
|---|---|---|
| 400 | Invalid request | 请求体不合法,或 device_token 无效 |
| 401 | Invalid bearer token | 认证失败,到后台核对 secret |
| 403 | Forbidden | 应用不可用、未通过白名单,或降级模式未开启 |
| 403 | deactivate / quota_exceeded / manual_deactivate | 客户产品开关 switch=off;message 为 CustomerProductVersion.status |
| 404 | integration not found | public_key 无效,或请求未打到应用所属地区的节点 |
| 429 | Too many requests | 降级分析超过应用限流配额 |
| 500 | Internal server error | 服务端错误 |
POST /api/v2/fp_query/{public_key}
查询设备指纹。传入客户端 SDK 返回的 device_token,得到设备标识、设备信息与风险信号。
| Method | POST |
| Path | /api/v2/fp_query/{public_key} |
| Auth | Authorization: Bearer <secret> |
| Content-Type | application/json |
| Success | HTTP 200,code=200,message=Success |
请求
POST /api/v2/fp_query/{public_key}
Authorization: Bearer <secret>
Content-Type: application/jsonPath
| 字段 | 类型 | 必填 | 含义 | 从哪里获取 |
|---|---|---|---|---|
public_key | string | 是 | 应用公开标识 | 后台 |
Headers
| 字段 | 必填 | 含义 | 从哪里获取 |
|---|---|---|---|
Authorization | 是 | Bearer <secret>,服务端查询认证 | secret 从后台获取 |
Content-Type | 是 | application/json | — |
Body
{
"device_token": "<from-client-sdk>",
"event_type": "login",
"event_time": "2026-08-20T10:30:00+08:00"
}| 字段 | 类型 | 必填 | 含义 | 从哪里获取 |
|---|---|---|---|---|
device_token | string | 是 | 普通查询传结果 token;降级分析传 SDK 原始 geetoken,均使用此字段 | 客户端 SDK 接口 |
event_type | string | 否 | 业务事件类型,如 login | 调用方自行填写 |
event_time | string | 否 | 事件时间,RFC 3339(需带时区或 Z) | 调用方自行填写 |
最小请求体:
{ "device_token": "<from-client-sdk>" }fp_query 降级模式
客户端 SDK 上报数据失败、未取得结果 token 时,可将 SDK 生成的原始 geetoken 交给业务服务端,通过同一个 POST /api/v2/fp_query/{public_key} 获取设备指纹与风险信号。
请求方式
- 请求体仍使用
device_token字段,将 SDK 原始geetoken原样填入,无需新增字段或指定模式。 - 请求地址、Bearer 认证和其他可选参数与普通查询一致,请使用应用所属地区的服务节点。
secret仅保留在业务服务端,不应交给客户端。
全球节点示例(北美、欧洲应用需替换为对应节点):
curl -sS -X POST "https://riskct-global.geelabapi.com/api/v2/fp_query/{public_key}" \
-H "Authorization: Bearer {secret}" \
-H "Content-Type: application/json" \
-d '{"device_token":"{sdk_raw_geetoken}"}'响应结构与普通查询一致,见下文「响应 200」。降级模式下,fp_query 成功请求也会计费。
响应 200
{
"code": 200,
"data": {
"request_id": "req_0198c7a1-5b2e-7c10-8d44-1234567890ab",
"event_id": "evt_0198c7a1-5b2e-7c10-8d44-1234567890ab",
"fp_detail": {
"device_id": "GEE4-xxxxxx",
"version": "1.0"
},
"signals": [
{
"signal": "CLOUD_PHONE",
"level": "HIGH",
"confidence": 0.8
}
],
"detail": {
"client_type": "Android",
"device_basic": {
"os": "Android",
"pla": "arm64-v8a",
"mod": "Pixel 8",
"osv": "14"
},
"ip_info": {
"ip": "1.1.1.1"
}
}
},
"message": "Success"
}data
| 字段 | 类型 | 含义 |
|---|---|---|
request_id | string | 分析 ID。格式 req_ + UUID v7。普通查询同一结果 token 时相同;降级分析每次请求重新生成。 |
event_id | string | 本次查询 ID。格式 evt_ + UUID v7。每次查询值不同。 |
fp_detail | object | 设备指纹 |
signals | array | 命中的信号列表,未命中时为 [] |
detail | object | 客户端类型、设备信息、IP |
fp_detail
| 字段 | 类型 | 含义 |
|---|---|---|
device_id | string | 设备指纹 |
version | string | 指纹版本,当前为 "1.0" |
signals[]
| 字段 | 类型 | 含义 |
|---|---|---|
signal | string | 信号标识,例如 CLOUD_PHONE |
level | string | LOW / MEDIUM / HIGH |
confidence | number | 0.0–1.0 |
以下为服务端 API 当前支持的信号取值与说明。
信号一览(40+)
signal | level | 说明 | 支持的端 |
|---|---|---|---|
BEING_DEBUGGED | HIGH | 设备存在被调试风险,可进行逆向分析、破解、群控自动化 | Android, iOS, Web |
DEBUG_MODE_OR_TEST_APP | LOW | 设备开启了调试模式或使用 debug/ 破解版本非商店下载的应用包 | Android, iOS |
EMULATOR | HIGH | 检测到传统模拟器风险 | Android, iOS, Web |
CLOUD_PHONE | HIGH | 检测到云手机(或 ARM 服务器)风险 | Android |
RUNNING_ON_MACOS | MEDIUM | 检测到 Mac 运行 App 风险 | iOS |
VPN_ENABLED | LOW | 设备开启 VPN 中 | Android, iOS |
NETWORK_PROXY | MEDIUM | 设备开启网络代理中 | Android, iOS |
INVALID_PACKAGE | LOW | 检测到包名篡改或重打包 | Android, iOS |
TOKEN_EXPIRED | MEDIUM | device_token 过期或重复使用 | Android, iOS, Web |
LIMIT_EXCEED | MEDIUM | 超过限制 | Android, iOS, Web |
SCREEN_SHARING | LOW | 设备正在进行屏幕分享 | Android, iOS |
VOICE_CONNECTED | LOW | 设备正在语音通话中 | Android, iOS |
IP_CRAWLER_OR_BOT | MEDIUM | IP 存在恶意破解或爬虫行为 | Android, iOS, Web |
IP_MALICIOUS_ATTACK | HIGH | IP 存在恶意攻击行为 | Android, iOS, Web |
IP_SUSPICIOUS_PROXY | MEDIUM | IP 疑似代理IP | Android, iOS, Web |
IDC_IP | MEDIUM | IDC/数据中心 IP | Android, iOS, Web |
DEVICE_JAILBREAK | HIGH | iOS 设备存在越狱行为 | iOS |
DEVICE_ROOTED | HIGH | Android 设备存在 Root 行为 | Android |
SUSPICIOUS_CUSTOM_ROM | HIGH | Android 设备使用可疑定制 ROM | Android |
SUSPICIOUS_OPEN_SOURCE_ROM | HIGH | Android 设备 ROM 为安卓开源项目 | Android |
BROWSER_COOKIE_FEATURE_DISABLED | MEDIUM | 浏览器cookie不可用 | Web |
PSEUDO_BROWSER_ENV | HIGH | 伪造的浏览器环境 | Web |
BROWSER_INCOGNITO_MODE | LOW | 浏览器处于隐私模式 | Web |
DEVICE_BOOTLOADER_UNLOCKED | HIGH | 检测到设备 Bootloader 已解锁 | Android |
SUSPICIOUS_DEVICE_RESET | HIGH | 疑似设备重置 | Android, iOS |
SYSTEM_VERSION_TOO_LOW | MEDIUM | 设备系统版本过低 | Android, iOS |
DEVICE_WITHOUT_SIM | LOW | 检测到设备未插 SIM 卡 | Android, iOS |
HOOK_TAMPERING_LOW | MEDIUM | 检测到代码篡改的低风险迹象;评估该信号时请排除应用自身的调试或开发行为 | iOS, Web |
HOOK_TAMPERING_MEDIUM | HIGH | 设备有代码篡改中风险,可篡改代码逻辑 | Android, iOS, Web |
HOOK_TAMPERING_HIGH | HIGH | 设备有代码篡改高风险 | Android, iOS |
SUSPICIOUS_DEVICE_INFO_TAMPERED | HIGH | 设备存在信息伪造风险,设备属性或指纹不匹配 | Android, iOS |
ANTIDETECT_BROWSER | HIGH | 设备运行在反检测浏览器中 | Web |
APP_CLONE_TOOL_INSTALLED | LOW | 设备存在安装多开工具风险 | Android, Web |
TAMPER_TOOL_INSTALLED | LOW | 检测到设备安装了改机工具风险 | Android, iOS |
AUTOMATION_TOOL_INSTALLED | LOW | 检测到设备安装了群控/自动化工具风险,可规模化黑产操作 | Android, iOS |
REVERSE_ENGINEERING_TOOL_INSTALLED | LOW | 检测到设备安装逆向工具风险 | Android, iOS, Web |
NETWORK_TAMPER_TOOL_INSTALLED | LOW | 设备存在使用网络篡改工具风险 | Android, iOS |
GAME_TAMPER_TOOL_INSTALLED | LOW | 设备存在使用游戏修改器工具风险 | Android, iOS |
VIRTUAL_LOCATION_TOOL_INSTALLED | LOW | 检测到设备安装了虚拟定位风险 | Android, iOS |
RUNNING_IN_VIRTUAL_MACHINE | HIGH | 当前设备处于虚拟机环境中 | Android, iOS, Web |
RUNNING_IN_CLONED_APP | HIGH | 当前处于多开环境中 | Android, iOS |
USING_DEVICE_TAMPERING_TOOL | HIGH | 当前正使用改机或风险工具 | Android |
USING_AUTOMATION_TOOL | HIGH | 当前正使用群控或自动化工具 | Android, iOS |
USING_REVERSE_ENGINEERING_TOOL | HIGH | 当前正使用逆向篡改工具 | Android |
USING_VIRTUAL_LOCATION | HIGH | 当前正使用虚拟定位工具 | Android, iOS |
RUNNING_IN_SYSTEM_CLONED | LOW | 设备系统多开风险 | Android |
detail
| 字段 | 类型 | 含义 |
|---|---|---|
client_type | string | Android / iOS / Web/H5 |
device_basic | object | 设备基础信息,结构随 client_type 变化 |
ip_info | object | { "ip": "<string>" } |
Android / iOS 的 device_basic:
{
"os": "Android",
"pla": "arm64-v8a",
"mod": "Pixel 8",
"osv": "14"
}| 字段 | 含义 |
|---|---|
os | 操作系统 |
pla | 架构 |
mod | 型号 |
osv | 系统版本 |
Web/H5 的 device_basic:
{
"browser": { "name": "Chrome", "version": "145.0.0.0", "major": "145" },
"device": { "model": "Macintosh", "vendor": "Apple" },
"os": { "name": "macOS", "version": "10.15.7" }
}错误
HTTP 状态码等于 code。message 为下表中的精确字符串。
| HTTP | message | data | 含义 |
|---|---|---|---|
| 400 | Invalid request | { "errors": [ { "field", "reason", "type" } ] } | 缺字段、类型错误或 event_time 非法 |
| 400 | Invalid request | { "errors": [{ "field": "device_token", "reason": "Invalid token", "type": "value_error" }] } | device_token 无效 |
| 401 | Invalid bearer token | {} | 认证失败 |
| 403 | Forbidden | {} | 应用不可用、未通过白名单,或降级模式未开启 |
| 403 | deactivate / quota_exceeded / manual_deactivate | {} | 客户产品开关 switch=off;message 为当时的 CustomerProductVersion.status,不是 Forbidden |
| 404 | integration not found | {} | public_key 无效,或请求未打到应用所属地区的节点 |
| 429 | Too many requests | {} | 降级分析超过应用分钟或小时限流配额 |
| 500 | Internal server error | {} | 服务端错误 |
{
"code": 400,
"data": {
"errors": [
{ "field": "device_token", "reason": "Field required", "type": "missing" }
]
},
"message": "Invalid request"
}{
"code": 401,
"data": {},
"message": "Invalid bearer token"
}示例
{public_key}、{secret} 从后台复制;{device_token} 用客户端 SDK 返回值;请求发到应用所属地区的节点。
curl -sS -X POST "https://{host}/api/v2/fp_query/{public_key}" \
-H "Authorization: Bearer {secret}" \
-H "Content-Type: application/json" \
-d '{
"device_token": "{device_token}",
"event_type": "login",
"event_time": "2026-08-20T10:30:00+08:00"
}'