01 · 面向反欺诈的设备智能 由您打标签的业务环节

面向 Web 的设备智能与欺诈风险 API 评估每一次访问。 用证据做决策。

您选择的每个页面,一个标签

在您的网站上部署一段脚本,桌面端约十分之一秒即可读取浏览器与设备信息。您的后端发起一次带签名的调用,附上您命名的标签,即刻获得结果:信任分、证据覆盖率和 13 项指标,覆盖机器人与自动化、浏览器伪装与模拟器,以及 VPN、代理和 Tor,每条建议都附带理由。用证据而非猜测识别账户盗用(账户接管)、虚假注册和提现欺诈。我们给出建议,由您决策并执行。

在您打标签的任意页面同步返回 · 先以影子模式运行,再影响任何决策 · 规则、名单和决定都由您掌握

如何解读这条响应 · v1.1/login_completed 示例

  1. 为什么给出这条建议

    ALLOWreason_codes · NO_ADVERSE_INDICATOR_MATCH

    策略所计入的指标均未检测到。合同示例:FingerTrackID 的托管策略在任何分数下都建议 MONITOR;ALLOW 来自贵公司在自有风控规则中设定的分数区间。依据 policy-login-v1 作出。

  2. 分数是什么,不是什么

    trust_score 1000–100 · 越高越好

    表示在该策略版本下对本次访问的信任度,而非欺诈概率。在 COMPLETED 之外它为 null,绝不使用默认值。

  3. 能看到多少

    evidence_coverage 100limitation_codes · 无

    预期检查中实际完成的比例。缺失的证据会在这里列明:它会降低覆盖率,但绝不会成为风险理由。

  4. 接下来交给您

    customer_action然后是结果

    您的后端决策并执行,再回传它做了什么以及真实结果。我们从不拦截,也从不冻结资金。

POST /v1/assessments → 201

event-assessment.v1.1 · 合同示例

assessment_status已完成评估已完成
trust_score1000–100 · 越高越好
device_match_confidence0.980–1 · 匹配强度
evidence_coverage1000–100 · 充分程度
ALLOWrecommendation_basis · EVALUATION是建议,不是动作
reason_codes NO_ADVERSE_INDICATOR_MATCH  ·  limitation_codes none
{  "schema_version": "event-assessment.v1.1",  "tag": "login",  "assessment_status": "COMPLETED",  "trust_score": 100,  "device_match_confidence": 0.98,  "evidence_coverage": 100,  "signals": [ … 13 objects ],  "limitation_codes": [],  "reason_codes": ["NO_ADVERSE_INDICATOR_MATCH"],  "recommended_action": "ALLOW",  "recommendation_basis": "EVALUATION",  "policy_version": "policy-login-v1"  // … 21 more fields in the full response: ids, snapshot, versions, timestamps}
完整响应 · 54 行 · 13 个信号,未检测到的已折叠
1{2  "schema_version": "event-assessment.v1.1",3  "assessment_id": "01996f2a-0000-7000-8000-000000000101",4  "assessment_version": 1,5  "supersedes_assessment_id": null,6  "business_event_id": "01996f2a-0000-7000-8000-000000000102",7  "external_event_id": "login_20260904_000001",8  "tag": "login",9  "assessment_status": "COMPLETED",10  "retryable": false,11  "trust_score": 100,12  "device_intelligence_snapshot_id": "01996f2a-0000-7000-8000-000000000103",13  "device_intelligence_snapshot_version": 1,14  "device_id": "dev_0123456789abcdefghij",15  "device_match_confidence": 0.98,16  "evidence_coverage": 100,17  "data_freshness": {18    "evidence_cutoff_at": "2026-09-04T12:00:00Z",19    "oldest_required_observed_at": "2026-09-04T11:59:59Z",20    "maximum_required_age_ms": 300000,21    "all_required_fresh": true22  },23  "signals": [24    { "signal_code": "ANTI_FINGERPRINTING", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },25    { "signal_code": "BOT_AUTOMATION", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },26    { "signal_code": "BROWSER_SPOOFING", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },27    { "signal_code": "EMULATED_ENVIRONMENT", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },28    { "signal_code": "PRIVATE_BROWSING", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },29    { "signal_code": "BROWSER_PRIVACY_BRAVE", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },30    { "signal_code": "BROWSER_PRIVACY_SAFARI", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },31    { "signal_code": "BROWSER_PRIVACY_SAMSUNG_INTERNET", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },32    { "signal_code": "NETWORK_PROXY", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },33    { "signal_code": "NETWORK_VPN", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },34    { "signal_code": "NETWORK_HOSTING", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },35    { "signal_code": "NETWORK_TOR", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … },36    { "signal_code": "DEVICE_MULTI_USER", "signal_state": "NOT_DETECTED", "source": "DERIVED", "detector_version": "detector-web-v1", … }37  ],38  "limitation_codes": [],39  "reason_codes": ["NO_ADVERSE_INDICATOR_MATCH"],40  "recommended_action": "ALLOW",41  "recommendation_basis": "EVALUATION",42  "policy_version": "policy-login-v1",43  "fallback_policy_version": "production-observation-fallback-v2",44  "ruleset_version": "ruleset-web-v1",45  "signal_catalog_version": "signals-web-v1",46  "feature_schema_version": "features-v1",47  "resolver_version": "resolver-v1",48  "sdk_version": "web-sdk-1.0.0",49  "provider_versions": ["network-provider-2026-09-04"],50  "evidence_cutoff_at": "2026-09-04T12:00:00Z",51  "evaluated_at": "2026-09-04T12:00:01Z",52  "expires_at": "2026-09-04T12:05:00Z",53  "correlation_id": "corr-assessment-login-0001"54}

决定它的版本 · policy-login-v1 · production-observation-fallback-v2 · ruleset-web-v1 · signals-web-v1 · features-v1 · resolver-v1 · web-sdk-1.0.0 · network-provider-2026-09-04

完整响应中的 13 个信号 · 指标矩阵 ↓

数字里的产品

响应

13

每次响应都包含的 Web 指标

3

每项指标的状态:已检测到、未检测到、未评估

14

“未评估”都有明确理由,绝不静默返回 false

5

可能的建议

3

相互独立的度量:信任度、设备匹配、证据覆盖率

1

每个被评估事件一次签名调用

采集

17

每次采集包含的浏览器与设备证据分区

48

与浏览器自称版本进行核对的浏览器 API

125

毫秒以内:Chrome、Firefox 和 Safari 桌面端采集耗时中位数

0

向您的用户弹出的权限请求

您的规则与您的调查

54

每次评估中计算的上下文洞察

67

贵公司可计入自有评分的规则:13 项指标和 54 项洞察

6

网络指标所依据的公开参考名单

6

控制台语言:英语、葡萄牙语(巴西和葡萄牙)、西班牙语、法语、德语

绝不 —— 且不因套餐而改变

  • 指针移动和按键:SDK 一概不采集
  • 像素、音频采样、GPU 厂商与渲染器名称或字体名称:canvas、WebGL、WebGPU、音频和字体离开浏览器时只是哈希值、GPU 系列和基于固定字体列表的存在掩码
  • WebRTC、本地端口、电池、运动传感器:从不读取
  • 不弹权限请求,不在浏览器中做决策,我们也不会对您的账户采取任何动作

—— 除采集耗时(在我们的测试机上冷缓存测得)外,每个数值都是对某个版本化合同、目录或名单的计数。它们都不随套餐或用量变化。

03 · 应用场景

在决策攸关的页面上做反欺诈。

在您的后端放行操作之前,设备智能回答一个问题:这个页面的另一端到底是什么?同一个调用服务于每个业务环节;您发送的标签只用于归档。

login · password_recovery · profile_change

账户盗用(账户接管)防护

已知账户出现在从未用过的设备上,浏览器谎报自身信息,反检测浏览器,时间上不可能完成的出行。每一项都以证据形式返回,让您只在必要时才要求第二因素验证。

signup · login · checkout

机器人与自动化检测

无头浏览器、自动化框架、按签名识别的 AI 代理,以及来自数据中心的流量。BOT_AUTOMATION 和 NETWORK_HOSTING 说明看到了什么;覆盖率说明能看到多少。

signup · deposit · promotions

虚假账户与多账户

每台设备、每个 IP 上的账户数和人数,设备画像在您用户群中的稀有程度,同一次采集在另一台设备上重复出现。这些是您的规则可以计入的上下文,绝不是自动裁定:一个人可以拥有多个合法账户。

withdrawal · pix_transfer · trade

提现、Pix 与转账欺诈

新设备出现后一小时内的提现、多个账户共用的收款人、被您标记为确认欺诈的关联账户。资金的暂缓或审核由您的后端处理;我们从不经手。

任意业务环节

模拟器与伪装浏览器

Android 模拟器与虚拟化、与声明系统不可能匹配的 GPU、被自身 API 揭穿的浏览器版本。设备指纹信号以哈希值和系列形式读取,绝不读取原始像素。

任意业务环节

VPN、代理与 Tor 检测

已知 VPN 服务商、公共代理、Tor 出口节点、托管网段和 Apple iCloud Private Relay,均来自我们自行更新的公开名单。匿名化只是上下文,不是罪证:权重多少由您的策略决定。

04 · 度量

相互独立的度量。不用平均值伪装确定性。

把信任度、覆盖率和设备匹配合并成一个数字,恰恰掩盖了分析师最需要看到的东西:问题出在访问本身,还是出在证据上。

trust_score

访问信任度

72

0100 · 越高越好

回答在该策略版本下本次访问有多可信;您发送的标签不会改变它。取值为 0 到 100 的整数。仅在 assessment_status = COMPLETED 时存在;其他任何状态下都为 null,绝不使用默认值。

不是欺诈概率、个人信誉,也不是缺失数据时的默认值。我们展示 72/100,绝不说“72% 可信”。

device_match_confidence

设备匹配

0.94

01 · 上限 0.98

表示本次访问来自同一台已见设备的证据强度,取值 0 到 1。随附 device_id,即该概率聚类的不透明公开标识符。

不是个人身份,也不是硬件证明。Party 和 Account 是两回事。

evidence_coverage

证据充分度

100

0100 · 13 项中已评估 13 项

预期的检查集合中有多少能够执行,取值 0 到 100。每个适用但处于 NOT_EVALUATED 的指标都会降低覆盖率,并出现在 limitation_codes 中。

不计入分数。覆盖率低既不会拉低分数,也不会抬高分数:它只会让评估结果为不确定。

为什么我们不把它们加总

单一的“可疑度”分数混合了三个不同的问题:这次访问值得信任吗?证据是否充分?是不是同一台设备?答案分开给出时,您的分析师知道该要求第二因素、等待采集,还是查看历史。答案混在一起时,他们只知道“得了 42 分”。

05 · 13 项指标

十三项指标。每一项都说明:看到了、没看到,还是无法评估。

每次 Web 评估都会返回全部 13 个代码。变化的是每一项的状态,列表本身永远不变。每项指标都有自己的版本化检测器,响应会注明评估它的版本。缺失、过期或出错的检测器绝不会变成 false。

signal_catalog web · 13 个代码 · withdrawal_completed 示例

  • 已检测到
  • Not_detected
  • — 未评估

环境完整性

浏览器隐私 · 中性上下文

网络 · 中性上下文

设备

reason_codes · NETWORK_TOR_DETECTED REVIEW

在我们的托管策略中,仅凭 Tor 绝不足以给出 BLOCK_RECOMMENDED;贵公司配置的规则则遵循其自行选择的权重和阈值。在这个 v1 合同示例中,policy-withdrawal-v1 要求对提现进行审核,而非拦截,唯一的原因代码说的正是这一点。目前生产环境中的托管策略在任何分数下都建议 MONITOR。

同一项指标,三种状态

  • 已检测到 · NETWORK_TOR PROVIDER · ftid-network-tor.v1 · 0.9 · withdrawal_completed 示例
  • 未检测到 · NETWORK_TOR PROVIDER · ftid-network-tor.v1 · 0.9 · login_completed 示例
  • — 未评估 · NETWORK_TOR not_evaluated_reason_code PROVIDER_UNAVAILABLE · limitation_codes ["PROVIDER_UNAVAILABLE"] · evidence_coverage 69 · provider_unavailable 示例

缺失、过期或出错的检测器绝不会变成 false。NOT_APPLICABLE 只来自目录中按渠道、引擎和平台划分的不可变矩阵;您的标签永远不会改变它,策略关闭、超时或服务中断也绝不会走这条捷径。

默认为中性上下文

PRIVATE_BROWSINGBROWSER_PRIVACY_BRAVEBROWSER_PRIVACY_SAFARIBROWSER_PRIVACY_SAMSUNG_INTERNETNETWORK_PROXYNETWORK_VPNNETWORK_TOR

它们可能限制我们能观测到的内容。只有在证据未被评估的地方,覆盖率才会下降。它们不是欺诈。它们描述的是环境,而不是指控个人。在我们的托管策略中,它们单独出现时绝不足以给出 BLOCK_RECOMMENDED;贵公司配置的规则则遵循其自行选择的权重和阈值。当网络类型无法区分时(例如在 Apple 的 iCloud Private Relay 之后),托管、VPN 和代理都保持 NOT_EVALUATED,并附 NETWORK_TYPE_AMBIGUOUS:我们绝不会凭一个布尔值标出三项检测结果。

网络证据来自我们在自有基础设施上更新的公开参考名单:Tor 出口地址、云服务商网段、托管网络名单、VPN 服务商网段以及公共代理数据库。您用户的地址绝不会发送给名单发布方。超过最长有效期的名单会使对应指标保持 NOT_EVALUATED,绝不会变成 NOT_DETECTED。

06 · 上下文洞察

13 项指标之外:54 项上下文洞察。用于调查,也可按您的选择计入评分。

在每次评估中、返回响应之前,我们会根据采集到的数据和贵公司自身的历史计算 54 项上下文洞察:还有谁在用这台设备,账户的动作有多快,来自哪个网络,与哪些账户相邻。FingerTrackID 的托管策略不把它们计入分数。在您自己的风控规则中,每一项都可以设为关闭、幽灵或启用,并为“异常”和“非常异常”分别设定扣分:启用的洞察一旦触发,就会从信任分中扣分,并在 reason_codes 中注明自身。

context-insight.v1 · 六大主题共 54 项洞察 · 与控制台和您的规则中的分组一致

  • 账户与设备 · 10

    账户的新设备和新操作系统 · 30 天内该设备上的不同账户数和人数 · 同一人在该设备上的账户 · 24 小时内每个账户和每个人的设备数 · 高活跃设备 · 设备画像在贵公司中是常见、少见还是罕见 · 设备 cookie 丢失

  • 提现与订单 · 7

    新设备出现后一小时内的提现 · 30 天内每台设备的收款人数和每个收款人对应的账户数 · 每个账户的提现次数和金额 · 每个账户的订单数及订单间隔中位数

  • 网络与位置 · 12

    账户的新国家和新网络服务商(ASN) · 每个账户的不同国家、服务商和 IP 数 · 每个 IP 的账户数和人数 · 不可能的出行 · 浏览器时区与 IP 所在国家不符 · VPN 出口国家 · 服务商在公开滥用名单上 · Apple iCloud Private Relay

  • 浏览器与 SDK 完整性 · 16

    开发者工具已打开 · 自动化痕迹 · 反检测浏览器标记 · 与声明浏览器不符的 TLS 签名及其 30 天内的稳定性 · 软件渲染器和 GPU 系列 · 两次读取之间发生变化的 canvas 或音频 · 应用内浏览器 · 可能的访客模式 · 按签名识别的 AI 代理 · 机器人类别 · 与批准包不同的 SDK · 一个 SDK 会话出现在多台设备上 · 同一次采集在另一台设备上重复出现 · 设备 cookie 在相距过远的地点被使用

  • 速度 · 5

    每台设备和每个账户在 5 分钟、1 小时和 24 小时内的访问次数;每个 IP 在 5 分钟和 1 小时内的访问次数 · 每个账户和每台设备在 1 分钟、5 分钟和 1 小时内使用同一标签的评估次数

  • 账户关联,一跳 · 4

    使用过相同设备的其他账户 · 检测到自动化或浏览器伪装的相邻账户 · 被您标记为确认欺诈的相邻账户 · 与其他账户共用的提现收款人

三种状态 · 给出理由,绝不填零

  • 已观测到 · 条件存在,或计数、度量偏离其中性值。
  • 未观测到 · 已评估,且不存在或为中性。
  • 未评估 · 始终附带理由,绝不显示为零。

部分洞察取决于您发送的内容。没有账户或个人引用、没有标签或没有结果回传时,该项会如实说明:未发送账户、评估无标签、未发送结果。带标签的请求不包含金额或收款人,因此提现金额和收款人相关项也会如此说明。首次访问、匿名化网络,或某项检查一小时窗口之外的 IP,同样是理由。

它们不是什么

  • 不属于 13 项指标,也绝不是限制代码。只有通过贵公司启用的规则,它们才会进入 reason_codes。
  • 绝不计入 FingerTrackID 托管策略的分数。没有数据的启用洞察不扣任何分:缺失的证据绝不会变成风险。
  • 不是隐藏模型:每项洞察都对照贵公司可调整的标尺(从公开的默认值起步),读作正常、异常或非常异常。
  • 不是指控:一台设备上账户或人数多,并不是欺诈证据,也不存在“每台设备 N 个账户 = 欺诈”的规则。

分析师在哪里查看它们

访问详情。“访问上下文”卡片按主题对洞察分组,显示各自的时间窗口、所依据历史的截止时间、在您的标尺上的异常程度,以及每个无值项的理由。超出评估时间预算的洞察会在后台完成并注明;它绝不会拖延响应或导致响应失败。

指标目录。一个页面说明 13 项指标各自检测什么、什么情况下会未评估、能否影响分数,并列出上下文洞察及其可能无值的理由。

Canvas、WebGL、音频和字体在每家公司的托管采集策略下读取,仅以派生值形式存在,并为其中少数洞察提供数据,例如 GPU 系列、软件渲染器或两次读取之间变化的渲染结果。浏览器不允许某项检查时,该项保持未评估,并附理由。

07 · 不确定也是一种结果

无法评估时,我们会直说,并说明原因。

缺失的证据不会产生 100 的信任度,也不会变成欺诈信号。没有分数时,建议来自冻结在策略版本中、并受其哈希覆盖的回退方案,而且所有无分数状态都只有一个答案,与标签无关:MONITOR。绝不会是 ALLOW。

合同示例中的无分数情形

标签从不选择回退方案。在托管策略中,任何标签下的每个无分数状态都建议 MONITOR:继续放行并记录。下面三个合同示例也是如此。

  • INCONCLUSIVE标签 login · SDK 未加载

    MONITOR

    无采集:trust_score: null、evidence_coverage: 0、COLLECTOR_NOT_LOADED,依据 INSUFFICIENT_EVIDENCE。绝不会以 ALLOW 放行。

  • INCONCLUSIVE网络证据不可用

    MONITOR

    四项网络指标 NOT_EVALUATED、evidence_coverage: 69、PROVIDER_UNAVAILABLE。无论是什么操作,都留在您的系统中,由您决定;我们从不冻结资金。

  • FAILED标签 pix_transfer · 策略不可用

    MONITOR

    技术故障:POLICY_UNAVAILABLE、policy_version: null,依据 TECHNICAL_FAILURE。绝不解读为“无风险”。

没有分数时我们绝不建议 ALLOW · 示例中的 fallback_policy_version 为 production-observation-fallback-v2 · 每次读取策略时都会一并校验回退方案

四种评估状态

已完成 72 依据 EVALUATION · reason_codes 解释分数
不确定 null 依据 INSUFFICIENT_EVIDENCE · limitation_codes 说明缺了什么
无法评分 null 依据 OUT_OF_POLICY_SCOPE · 事件有效,但策略不覆盖
失败 null 依据 TECHNICAL_FAILURE · POLICY_UNAVAILABLE,policy_version 为 null · 绝不等于“无风险”

目录中的 14 个限制代码 · 说明缺了什么,绝不说明为何有风险

NO_FIRST_PARTY_COOKIEINSTALLATION_COOKIE_REJECTEDNO_EDGE_SIGNALSSTALE_DEVICE_PROFILEPROVIDER_UNAVAILABLEPROVIDER_BUDGET_EXCEEDEDCOLLECTOR_NOT_LOADEDUNSUPPORTED_RUNTIMEREQUIRED_EVIDENCE_MISSINGDETECTOR_TIMEOUTDETECTOR_ERRORNETWORK_TYPE_AMBIGUOUSCLIENT_CLOCK_SKEWPOLICY_UNAVAILABLE

限制代码解释的是采集与质量;原因代码解释的是策略。每个 NOT_EVALUATED 的指标都指向自己的限制代码;评估会把它们全部汇总到 limitation_codes。采集限制绝不是风险理由。

08 · 由您决定

五种建议。我们采取的动作:零。

recommended_action 说明策略的建议。customer_action 说明您做了什么。两个字段,因为是两件事实。

谁建议,谁决定,谁执行

FingerTrackID 给出建议

  • ALLOW
  • MONITOR
  • STEP_UP
  • REVIEW
  • BLOCK_RECOMMENDED

绝不仅凭隐私因素 · Tor、VPN、代理、无痕模式、共用设备

您的流程做决定

您的后端决策并执行。我们返回建议;目前托管策略的回答是 MONITOR,仅作观察。访问如何处理,由您这边决定并执行。您了解账户、额度、历史和摩擦成本。我们不了解。

您执行并回传

  • ALLOWED
  • CHALLENGED
  • HELD
  • REVIEWED
  • BLOCKED
  • CANCELLED

customer_action · 您回传的字段

  • 我们从不认证个人身份。
  • 我们从不拦截您的界面。
  • 我们从不动用资金。

每种建议不意味着什么

  • ALLOW

    策略未发现需要对本次访问增加摩擦的理由。不意味着此人合法或此次访问已获认证。只有在有分数且必需证据已评估时才会给出。

  • MONITOR

    继续放行,但要记录。这是所有标签下的无分数回退方案,也是目前托管策略在任何分数下的回答。不意味着嫌疑已确认,也不要求用户采取任何动作。

  • STEP_UP

    要求第二因素或确认。不意味着我们会去质询任何人:展示验证的是您。

  • REVIEW

    转人工审核。不意味着我们冻结资金:操作留在您的系统中,由您决定。

  • BLOCK_RECOMMENDED

    策略建议拒绝。不意味着已执行拦截、已确认欺诈或已封禁。当您拦截时,这会成为 customer_action: BLOCKED,即您自己的事件,并用于衡量准确率。

09 · 集成

三步,一份合同。浏览器采集;您的后端发问;我们回答。

网站上一段脚本,后端一个服务器到服务器的端点,再加两个调用回传动作和结果。客户端不做任何决策。

网站上的 SDK

SDK 采集并返回一个令牌。仅此而已。

从您自己的子域名提供。在您发送需要评估的请求之前,无论哪个页面,它都会采集浏览器和环境信号并收到 202 PROCESSING:这只确认已接收,不是结果。网络信号由您采集域名上的边缘节点补充,绝不由脚本采集。分数、信号或决策都不会返回浏览器。

import { initializeSdk } from '@ftid/sdk-web'

// publicKey is a public locator, not a secret.
// collectionOrigin is YOUR collection domain (https).
const sdk = initializeSdk({
  publicKey: 'pub_app_0123456789abcdef',
  collectionOrigin: 'https://collect.yourcompany.com',
})

// ACCEPTED (202 PROCESSING on the wire): confirms receipt, not a result.
const collection = await sdk.collect()
if (collection.status !== 'ACCEPTED') {
  // Without collection the journey continues; the backend will get
  // INCONCLUSIVE / COLLECTOR_NOT_LOADED: no fake score.
  return continueWithoutToken()
}

// Create the event before sending the request to be assessed.
const event = sdk.createEvent(collection.observation)

// Only a COMPLETED collection yields a token. The token goes in the POST
// that YOUR backend makes; the decision never comes back here.
const ctx = await sdk.getEventContext(event)
const token =
  ctx.status === 'COMPLETED'
    ? ctx.eventContextToken
    : null

您的后端发起调用

一次带签名的同步调用,按您设定的时限。

对十行规范文本做 HMAC-SHA-256 —— 标记、key_id、方法、路径、时间戳、事件与请求 ID、内容元数据,最后一行是请求体原始字节的 SHA-256。计算哈希前绝不重新序列化 JSON;合同附带规范向量。key_id 是唯一的公开定位符。密钥从不传输。v1.1 合同中的规范向量 requests.both_refs_deadline_750:与 v1 相同的路由和相同的签名,用 tag 取代 journey、action 和 journey_context。

POST /v1/assessments HTTP/1.1
Host: api.fingertrackid.com
Content-Type: application/json
X-FTID-Signature: v1=<key_id>:<mac-hex>
X-FTID-Timestamp: 1791720000
X-FTID-Request-Id: <uuidv7 of the attempt>
X-FTID-External-Event-Id: evt:tag-0003

{
  "schema_version": "event-assessment-request.v1.1",
  "external_event_id": "evt:tag-0003",
  "idempotency_key": "idem-tag-0003",
  "occurred_at": "2026-10-11T12:00:00.000Z",
  "subject_ref": "subject:synthetic",
  "account_ref": "account:synthetic",
  "event_context_token": "ctx.synthetic-token_0003",
  "tag": "pix_transfer_a1b2c3d4e5f6g7h8i9j0abcdeabcdeabcdeabcdeabcdeabcdez",
  "deadline_ms": 750
}

tag 是最长 64 个字符的小写 slug(字母、数字和下划线,最多十个数字),绝不包含个人数据;此向量正好处于该上限 · subject_ref 和 account_ref 可以为 null,且 account_ref 必须搭配 subject_ref · refs 是您自己的不透明代码,绝不是身份证号、邮箱或顺序 ID · deadline_ms 是 250 到 5000 之间的整数,或为 null 表示 5000;超时将返回可重试的 503 Problem,而不是部分分数

同步响应

读取、决策,回传您做了什么。

status
COMPLETED
trust_score
72
device_match
0.94
coverage
100
reason_codes
NETWORK_TOR_DETECTED
limitations
none
policy
policy-withdrawal-v1
expires_at
+5 min
REVIEW

然后是两个反馈调用:customer_action 回传您做了什么,得知结果后再用 truth_status 回传真实结果(结局:合法、确认欺诈或证据不足)。合同对二者的要求与评估调用相同:持久提交之前不算接受,完全相同的重试不会产生第二次效果。结果可以事后更正 —— 更正以后继记录追加,之前的记录仍可读取。

POST /v1/assessments/{assessment_id}/customer-actions
POST /v1/assessments/{assessment_id}/outcomes

↑ 返回完整示例

  • Web SDK
  • 同步 S2S API
  • Node.js 服务端 SDK
  • 面向编程代理的 MCP 服务器
  • 动作与结果 API
  • 控制台

Web,任何现代浏览器均可 · 无需安装应用 · SDK、评估和反馈在同一份版本化合同中

npm install @fingertrackid/server 替您为调用签名,@fingertrackid/mcp 让 Claude Code、Cursor 或任何支持 MCP 的编程代理依据公开合同完成集成。分步说明见快速入门、Web SDK 指南和 API 参考。

10 · 对浏览器零信任

浏览器只负责采集。决策和标识符从不经过它。

来自浏览器的任何内容都不被视为权威。评估是服务器到服务器的签名调用,每次尝试只计一次:重复调用不会产生新效果。

谁与谁通信

Browser Your backend FingerTrackID event_context_token (that is all) HMAC · request_id assessment no decision no device_id

浏览器只收到不透明的会话 ID 和事件 ID。分数、信号和建议在服务器上产生,也只留在服务器上。第一方 cookie 经过签名,HttpOnly、Secure,并限定于您的租户和应用。

调用剖析

POST /v1/assessments合同中的 security ftidHmacV1
X-FTID-Signature: v1=<key_id>:<mac-hex>key_id UUIDv7 是唯一的定位符;租户、应用、环境和能力只有在恒定时间比较验证 MAC 有效后才具有权威。X-Client-Id、旧版 nonce 和多重签名一律拒绝。
X-FTID-Timestamp: 1791720000以秒为单位的 Epoch 时间。容差 ±300 秒。未来时间戳绝不会延长保留期。
X-FTID-Request-Id: <uuidv7>每次尝试使用一次,在 MAC 有效后预留。逻辑重试需签发新的 request_id;无效的 MAC 不会产生预留。
X-FTID-External-Event-Id: evt:tag-0003与请求体和签名字符串中的值逐字节一致。
body.idempotency_key同一个键,同一个操作:完全相同的重试返回同一条已持久化的评估,不会重新计算。
body.deadline_ms您的时间预算。评估前即超时:返回 Problem assessment-unavailable(503、retryable: true),而不是部分分数。
  • 401统一响应:key_id 不存在、已吊销或签名错误,都返回同样的 authentication-failed。
  • 403凭证已认证,但不具备该路由的评估能力。
  • 503密钥依赖不可用:全局闩锁让响应保持统一,不透露 key_id 是否存在。请签发新的 request_id。

11 · 版本化策略

每个决策都有版本。版本冻结了决定它的一切。

调整任一指标的灵敏度都会生成新版本,附带作者、生效期、模拟和回滚。历史不会改变。缺少真实版本将阻止使用。

作出决策的版本 · withdrawal_completed 示例

policy-withdrawal-v1

fallback_policy_version
production-observation-fallback-v2
ruleset_version
ruleset-web-v1
signal_catalog_version
web-detectors-v3
feature_schema_version
configured-assessment-features.v1
resolver_version
first-party-installation-v1
sdk_version
0.1.0
provider_versions
asn-reputation.v1 · cloud-ranges.v1 · icloud-private-relay.v1 · ip2proxy-lite-px2.v1 · tor-exit.v1 · x4b-vpn.v1
evidence_cutoff_at
2026-09-04T12:00:00Z
evaluated_at
2026-09-04T12:00:01Z
expires_at
2026-09-04T12:05:00Z
correlation_id
corr-assessment-withdrawal-0001

correlation_id 用于支持排查,不暴露个人标识符。对外暴露的版本是不透明的公开标签;数据库内部 ID 从不出现在 API、webhook 或控制台中。

策略版本冻结了什么

  • 信号目录
  • 标准化
  • 特征
  • 设备解析器
  • 规则
  • 关联策略
  • 每项指标的级别
  • 上限与阈值

可复现,绝不改写

login_completed 示例

assessment_version1

supersedes_assessment_idnull

login_completed_revision_2 示例

assessment_version2

supersedes_assessment_id…0000000101

运营修订会保留事件 received_at 时生效的策略及其他所有版本。用新策略重算旧事件是单独的模拟;它绝不会改写当初指导该历史决策的建议。

12 · 影子模式

先并行运行。之后响应才会影响动作。

影子模式就是让 FingerTrackID 与您现有的方案并行运行,响应不触及任何决策。您进行对比、回传真实结果,然后才开始采用建议。我们建议从这里起步。

完整闭环

  1. 01

    SDK 采集

    202 PROCESSING · event_context_token

  2. 02

    您的后端请求评估

    POST /v1/assessments · 同步

  3. 03

    您通过自己的流程决策

    影子模式下,不使用响应

  4. 04

    您回传动作

    customer_action · POST …/customer-actions

  5. 05

    您回传结果

    truth_status · POST …/outcomes

recommendation_alignment · 由服务器根据“建议 × 动作”组合推导;绝不由客户端声明。两者一致既不能证明因果,也不能证明准确或欺诈。

逐字段对比

recommended_actioncustomer_actionrecommendation_alignment
REVIEWREVIEWED 或 HELDALIGNED
STEP_UPALLOWEDNOT_ALIGNED
ALLOW 或 MONITORALLOWEDALIGNED
BLOCK_RECOMMENDEDBLOCKEDALIGNED
任意CANCELLEDNOT_COMPARABLE

拦截不能证明欺诈。确认欺诈需要独立证据:truth_status 从 PENDING 变为 LEGITIMATE、FRAUD_CONFIRMED 或 INSUFFICIENT_EVIDENCE,成熟度为 PROVISIONAL 或 MATURE。只有成熟的标签才会成为质量指标。

闭环为哪些环节提供数据

  • 误报与漏报作为由成熟标签推导出的指标,而不是手工填写的字段。
  • 重新校准规则与阈值,始终以新策略版本的形式。
  • 检测器质量在您的影子模式中衡量,早于响应影响您的任何动作。
  • 它不会做的:变成自动执行。customer_action 和 truth_status 是两件独立的事实,每次更正都会生成后继记录。

13 · 合同保障的隐私

由合同划定边界,而不是靠某个设置。

明文 PII 不是产品所需。您发送不透明的个人和账户引用;评估一次访问,我们不要求身份证号、邮箱或电话号码。

packages/contracts/src/sdk-handshake-v1.ts · 采集策略

canvas: z.boolean(),
audio: z.boolean(),
fonts: z.boolean(),
behavioral: z.literal(false),

packages/contracts/src/sdk-signals/rendering-v1.ts · 节选

const Hash128 = z.string().regex(/^[0-9a-f]{32}$/)
canvas_hash: Hash128.optional(),
webgl_gpu_family: z.enum(SDK_RENDERING_GPU_FAMILY_V1).optional(),
audio_hash: Hash128.optional(),
fonts_count: z.number().int().min(0).max(SDK_RENDERING_FONT_COUNT_V1).optional(),

行为采集(即指针移动和按键)只接受关闭值:要开启它必须修改合同,而不是改某个设置。Canvas、WebGL、离线音频和字体存在性在托管采集策略下读取,该策略为每家公司开启,且它们离开浏览器时只是派生值:定长哈希、封闭的 GPU 系列、一个计数和基于固定字体列表的存在掩码。合同中没有像素、音频采样、GPU 厂商或渲染器名称、字体名称的字段。这些派生值组合起来能够再次识别同一浏览器,因此被视为设备数据,而非匿名数据。作为绝对规则,从不采集:密码、输入的文本、聊天或文档内容、剪贴板、截屏、麦克风、摄像头。每项证据都有隐私等级,而等级不是风险权重。

不依赖善意的保证

  • PII 不进入日志。原始数据不会在控制台中随意显示:每次访问都会被记录。标识符或个人值绝不出现在 URL 中。
  • 跨租户关联处于关闭状态。每张业务表都带有 tenant_id,并在数据库层强制隔离。客户之间不共享任何信誉或标签。
  • 第一方 cookie 由您的域名提供:经过签名,HttpOnly、Secure,限定于您的租户和应用。其值绝不进入数据库、队列或日志;缺失或被拒绝时,连续性会作为限制项降级,评估不会中断。
  • 每次设备合并都可逆,并记录执行合并的解析器版本。IP 从不单独合并设备。
  • 每类证据在我们的数据清单中都有声明的用途、隐私等级、访问规则和保留期。法律依据、数据驻留和 DPA 在签约时与您的法务团队处理;本页内容不构成法律意见。

Party 不是 Account

Party Account Account Account

关联来自您的后端 · 绝不从指纹推断

一个人,多个合法账户。账户绝不会悄悄更换所属个人;会话只会从匿名推进到个人,再推进到同一个人的某个账户。矛盾即冲突,不是新的关联,也不是临时拼凑的负面证据。

数据存放在哪里

cloud
Google Cloud, us-central1 region
source of truth
PostgreSQL, single
isolation
RLS forced per tenant, with a negative test
secrets
Secret Manager; never in code or in infrastructure state
logs
no PII; raw data never displayed freely

14 · 控制台

一个用于集成、调查和闭环的控制台。

控制台首先回答“我们是否在高质量地接收、评估和解释?”,然后才谈合法性。每个百分比都注明分母。

示意图,非截图 · 框内为控制台配色

访问详情。三项度量作为三个独立组件;建议及其 recommendation_basis、生效的策略以及您的团队回传的动作;证据新鲜度;13 项指标的状态、适用性、来源、检测器置信度、新鲜度以及任何未评估项的理由;限制代码与原因代码;会话、设备及其关联;设备上的多重性;基于网络的大致位置;访问上下文;以及技术数据标签页,包含 SDK 和边缘节点采集的全部内容,其中有从浏览器所暴露 API 读出的真实版本,与其声明的版本并列。

调查筛选。访问列表可按网络服务商(ASN)、网络所在国家、设备安装、指标未评估的理由筛选,并可同时按最多两项指标的指定状态筛选,还能通过您自己的账户或个人引用查找访问。不提供按 IP 地址筛选:它属于个人数据。每条访问详情还附有其上下文洞察 ↑。

深入调查。从任意访问出发,关联图谱会逐跳展开其周边的设备和账户,覆盖您自己最长 92 天的历史。每次展开都是一次被记录的读取;IP 地址永远不会成为节点。

黑名单与白名单。在访问详情中,您的团队可以把设备、账户引用或单个 IP 加入贵公司的黑名单(拦截或审核)或白名单,附带备注和添加人姓名。在有分数的生产访问上,名单条目会覆盖建议,并在 reason_codes 中注明自身。不会删除任何内容:移除条目会记录是谁、在何时移除的。

AI 助手。侧边面板解释每个页面,并在贵公司和您的角色范围内,回答有关您自己的集成和访问的问题。

风控配置。贵公司自己的风控规则,按应用配置:13 项指标中的每一项都可以设为关闭、幽灵或启用,权重为 1 到 100 分,并由您设定分数区间及每个区间的动作。幽灵规则会被计算和记录,但从不改变响应。发布之前,影响卡片会用过去 1、7 或 30 天的评估回放您的草稿。54 项上下文洞察 ↑中的每一项都可以按各自的分值加入。您的管理员或风控主管可直接发布;每次发布都是一个经过审计的新版本,全部切换为幽灵可一次停用您的所有规则。FingerTrackID 从不替您启用规则:其支持团队只能把某个应用的全部规则切换为幽灵,并附上您控制台中可见的理由。在没有启用任何规则时,由托管策略作答,该策略由 FingerTrackID 团队在有记录的审批下发布。

四组共十六个页面 · 主页、检测、运营、管理

  • 01首页
  • 09集成与健康状况
  • 02概览
  • 10用量
  • 03访问
  • 11导出
  • 04审核队列
  • 12报表
  • 05风控配置
  • 13用户与权限
  • 06策略模拟
  • 14审计
  • 07名单
  • 15客户生命周期
  • 08指标目录
  • 16账户与安全

审核队列即提现审核模块:一个构建在同一核心之上的运营队列,把每笔被建议 REVIEW 的 v1 提现连同证据一起交给人工处理。带标签的评估从不进入该队列;当策略建议 MONITOR 时(正如目前的托管策略),队列保持为空。

支持英语、葡萄牙语(巴西和葡萄牙)、西班牙语、法语和德语。使用通行密钥或第二因素登录;按角色授权;审计记录谁查看了敏感数据、谁修改了什么。原始数据不会随意显示:每次访问都会被记录。

15 · 我们如何计费

一个计费单位。其他一律不计。

按已完成采集的量计价,在报价方案中确定。影子模式消耗同样的单位,并在控制台中显示为预估用量;该阶段的发票内容由报价方案约定。

计费单位

一次由您的集成请求并已完成的生产环境设备智能快照。

它既是计量单位,也是候选计费单位。每个 device_intelligence_snapshot_id 最多产生一个单位,无论有多少评估、标签、服务商或重处理使用了这次采集。

  • 分数、建议、动作和结果都不决定计费。高风险结果不会更贵;合法结果也不会更便宜。
  • 商业额度绝不会变成拦截、限流或服务的自动降级。
  • 每个被请求的快照都会产生一条不可变的用量记录,即使它不计费。排除项由该记录证明,而不是从日志中重建。

事件 · 是否产生计费单位?

  • 非生产应用(开发、预发布)否
  • 使用相同 idempotency_key 的重试否
  • 任何标签下复用新鲜快照的任何评估否
  • 重处理、历史回放、策略变更否
  • 由我们发起的异步增强和刷新否
  • 服务商调用或重试否
  • Webhook 投递否
  • customer_action 和结果否
  • 查询、仪表盘、报表、导出否
  • 因认证、授权或合同无效返回的 4xx否
  • 5xx、我方超时、采集 INCONCLUSIVE 或 FAILED否
  • 由集成请求并已完成的生产快照是 · 1

按量报价,影子模式用量一并摆上桌面。

获取报价

16 · 常见问题

风控负责人和 CTO 会问的问题。

Q01集成如何起步?
从影子模式开始。您在网站上安装 SDK,开启服务器到服务器调用,响应便会与您的真实流程并行运行,不触及任何决策。您回传 customer_action 和结果,并在控制台中逐条访问对比建议与您的团队回传的动作,同时跟踪证据覆盖率。当数据说得通时,由您的团队决定建议是否以及在何处开始影响决策,而执行始终由您的后端完成。
Q02你们评估哪些业务环节?
您选择的任何页面。您的后端在每次评估时发送一个您自己的 tag,即小写 slug,例如 login、withdrawal 或 pix_transfer:无需注册,没有封闭列表,也没有数量限制。控制台可按标签筛选、分组和导出,而模板(注册、登录、找回密码、第二因素、资料修改、充值、提现、Pix 转账、交易、结账)只是集成指南。标签从不选择策略、检测器、回退方案或时限:所有带标签的评估都在同一策略和同样的 13 项指标下运行。标签绝不能包含个人数据。请求不包含金额、币种或收款人。
Q03你们为什么不拦截?
因为事件不是欺诈,分数不是决策,拦截也证明不了什么。了解账户、额度、历史和摩擦成本的是您。我们提供证据、覆盖率和有解释的建议。BLOCK_RECOMMENDED 是最强的建议,但它仍然只是建议。当您拦截时,您记录 customer_action: BLOCKED,它会成为衡量建议是否正确的数据。
Q04VPN、Tor 或无痕标签页会拉低分数吗?
在我们的托管策略中,它们都不会单独导致 BLOCK_RECOMMENDED;贵公司配置的规则则遵循其自行选择的权重和阈值。无痕模式和浏览器防护是中性上下文:可能降低覆盖率并显示在详情中,但不附带不利的原因代码。Tor、代理、VPN 和托管网络是匿名化上下文:策略可以结合其他观测结果对其加权,但绝不按标签加权。目前托管策略中只有自动化和浏览器伪装会影响分数,建议为 MONITOR。在本页的 v1 提现合同示例中,检测到 Tor 导致了 REVIEW,原因代码也如此说明。它本身绝不等于欺诈。
Q05如果 SDK 没有加载,或用户屏蔽了脚本怎么办?
业务流程照常继续。您的后端在没有 event_context_token 的情况下调用 API,收到 INCONCLUSIVE、trust_score: null、evidence_coverage: 0、limitation_codes: ["COLLECTOR_NOT_LOADED"] 以及回退建议 MONITOR。绝不会编造分数。绝不会因缺乏证据而给出 ALLOW。
Q06延迟是多少?有 SLA 吗?
时限由您决定。合同默认值为 5000 ms,deadline_ms 可设为 250 到 5000 之间的任意值(使用默认值时,请将 HTTP 超时设在约 6 秒以上);超时将返回 Problem assessment-unavailable(503、retryable: true,附 Retry-After),而不是部分响应。请用新的 request_id 重复同一逻辑操作。延迟和 SLA 写入报价方案,并在任何决策依赖响应之前,于您的影子模式中实测。
Q07我怎么知道响应没有被伪造?
它从不经过浏览器。您的后端对每次调用用 HMAC-SHA-256 签名,签名覆盖十行规范文本,最后一行是请求体原始字节的 SHA-256;key_id UUIDv7 是唯一的公开定位符;request_id 被预留以防重放;认证失败统一返回 401,不透露密钥是否存在。密钥从不传输。协议的规范测试向量是合同的一部分;借助它,您可以逐字节复现签名。
Q08我需要发送身份证号、邮箱或电话号码吗?
不需要。评估使用只有您的系统才能解析的不透明个人和账户引用。明文 PII 不是产品所需。指针与按键行为在合同中已关闭。Canvas、WebGL、音频和字体检查在每家公司的托管采集策略下运行,离开浏览器时只是哈希值、GPU 系列和基于固定字体列表的存在掩码,绝不是像素、声音、GPU 名称或字体名称。密码、输入的文本、剪贴板、截屏、麦克风和摄像头一律禁止。每类证据都有声明的用途、隐私等级和保留期;法律依据会在开通生产环境前与您的法务团队审查,本页任何内容都不能替代该审查。
Q09费用多少?我的团队需要做什么?
按已完成采集的量计价,写在报价方案中。候选计费单位是在生产环境中完成的快照;生产环境之外的一律不计。您这边需要:网站上一段脚本,后端一个用于请求评估的服务器到服务器端点,以及两个 API 调用,用于回传采取的动作和真实结果(结局)。SDK 面向 Web,可在任何现代浏览器中运行;无需安装应用。
Q10什么是设备智能?它与设备指纹有何不同?
设备指纹读取浏览器的稳定特征,以便再次识别它。设备智能从这里出发并更进一步:检查这些特征彼此之间以及与网络是否一致,是否有自动化、模拟器或反检测浏览器在运作,以及这台设备在您的各个账户之间表现如何。FingerTrackID 将其返回为信任分、带独立置信度的设备匹配、证据覆盖率和 13 项指标,每项指标都附有读取它的检测器版本。
Q11我们能设置自己的规则、分数和名单吗?
可以。在控制台中,贵公司可以为 13 项指标和 54 项上下文洞察中的任何一项赋分,选择分数区间及每个区间的建议,还可以先以幽灵模式运行任何规则:计算并记录,但不改变响应。黑名单和白名单可添加设备、账户引用或单个 IP,每次一条,附带备注和添加人姓名。每次发布都是一个经过审计的新版本。FingerTrackID 从不替您启用规则或添加名单条目。
Q12AI 编程代理能完成集成吗?
可以。服务端 SDK @fingertrackid/server 为调用签名,MCP 服务器 @fingertrackid/mcp 为 Claude Code、Cursor 或任何支持 MCP 的代理提供合同、签名向量、每个标签现成的服务端模块以及对您采集域名的检查,全部只读;文档还发布了 llms.txt 和一段可直接用于您的 AGENTS.md 的规则。密钥留在您的环境中;代理永远不需要看到它。
Q13SDK 有多大?会拖慢页面吗?
SDK 只采集一次,并行进行,通过单个请求发送到您自己的采集子域名。在桌面端,Chrome、Firefox 和 Safari 中完整采集的中位耗时约为 80 到 125 ms,硬性预算为 250 ms;每项检查最多占用主线程 2 ms,需要等待的检查(如帧计时或 Worker)并行等待。它从不弹出权限请求,也从不阻塞您的界面。

17 · 联系我们

以影子模式评估您选择的业务环节。

从影子模式开始:响应与您的真实流程并行运行,不触及任何决策;您进行对比、回传结果,然后才开始采用建议。如果您有决策攸关的页面,并希望在信任响应之前先看到它的解释,欢迎联系我们。

预约演示

请输入带域名的邮箱。
请输入公司名称。
您想评估什么

业务环节可以是您选择的任何页面,名称由您来定。勾选您已经想好的;其余的在沟通中再细化。

不发送营销邮件 · 我们通过邮件一对一回复 · 也可直接写信至 contato@fingertrackid.com

如何开始

  1. 一次 30 分钟的沟通,聊聊您想评估的业务环节和您的决策流程。
  2. 为您的应用提供服务端凭证、可执行合同和 HMAC 向量。没有沙箱:您在生产环境中以影子模式测试。
  3. 在您的真实流程上运行影子模式:在响应影响任何决策之前,您进行对比并回传结果。
  4. 在您打标签的页面上投产,策略版本化;每个决策都留在您的后端。

包含的内容

  • 带证据覆盖率的控制台,逐条访问并列展示建议与您回传的动作
  • 可执行的 event-assessment.v1 合同,附 HMAC 测试向量
  • 从第一天起就在生产环境运行影子模式:响应与您的流程并行,从不触及决策
  • 与编写策略的人直接沟通