API REFERENCE · V1

浏览器指纹 API 文档

以下描述当前本站同源接口。服务器不会替你采集 Canvas、WebGL 或其他只能在浏览器中读取的信号。

端点与参数

方法路径约定
GET/api/fingerprint/schema版本、基础与深度采集字段、保留时间。
POST/api/fingerprint/session请求 { tier: "basic" | "advanced" };返回 sessionId、nonce、expiresAt 和版本。
POST/api/fingerprint/collect提交 sessionId、nonce、相同 tier 和 components 数组;返回 FingerprintReport。
GET/api/fingerprint/report/{id}获取未过期的报告。报告 ID 是访问凭据。
DELETE/api/fingerprint/report/{id}删除报告;返回 { deleted: true }。
POST/api/fingerprint/compare请求 { leftId, rightId };返回各组件 stable、changed、added 或 missing 的比较。

采集流程示例

仅在用户了解并同意提交内容后执行上传。此示例只提交一个 UA 字段,用于演示协议,不等同于完整检测。

// Run from a page on the same origin as BrowserCheak.
const schema = await fetch('/api/fingerprint/schema').then(r => r.json());

// This minimal example uploads only a User Agent observation.
const sessionResponse = await fetch('/api/fingerprint/session', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ tier: 'basic' })
});
if (!sessionResponse.ok) throw new Error('Session request failed');
const session = await sessionResponse.json();

const response = await fetch('/api/fingerprint/collect', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    sessionId: session.sessionId,
    nonce: session.nonce,
    tier: 'basic',
    components: [{
      key: 'navigator', label: 'Browser', version: 1,
      tier: 'basic', status: 'ok', confidence: 'medium',
      durationMs: 0, value: { userAgent: navigator.userAgent }
    }]
  })
});
if (!response.ok) throw new Error('Report request failed');
const report = await response.json();
// report.id, createdAt, expiresAt, components, scores, findings, transport
// Missing signals in this minimal example limit report interpretation.

组件与返回值

组件包含 key、label、version、tier、status、value、durationMs 和 confidence。status 可以是 ok、protected、unsupported、blocked、timeout 或 error。confidence 为 high、medium、low 或 unknown。使用 schema 端点获取允许的组件键。

报告包含 id、createdAt、expiresAt、tier、schemaVersion、ruleVersion、scores、automationLevel、confidence、summary、findings、components 与 transport。scores 是当前规则的启发式指标,不是代表性人群唯一性或真实追踪概率。

保留、限额与访问

默认每个来源的全部 API 合计每分钟 60 次、每 24 小时 1,000 次,最多同时执行 4 个请求。创建会话与提交报告各限每分钟 6 次、每 24 小时 60 次;每个来源最多保留 3 个未提交会话。会话 10 分钟后过期,成功提交后 nonce 失效。IPv6 按 /64 网段共用配额。

提交报告的整个请求体默认最多 512 KiB,其他写入请求最多 4 KiB;只接受未压缩的 JSON,上传限时 10 秒。最多提交 20 个组件,不接受重复或未知组件键;Canvas PNG data URL 仍限 250,000 个字符。报告全站最多 500 份,序列化内容合计最多 32 MiB;容量不足时拒绝新增报告,删除或过期后释放空间。

网络概览默认每来源每分钟 12 次、每 24 小时 300 次;DNS 会话为 10 次和 120 次,结果轮询为 40 次和 480 次;报告读写为 30 次和 500 次,对比为 10 次和 100 次。配额按固定时间窗口计数,以上为默认值,可由部署方调整;以响应头与当前服务配置为准。收到 429 后请遵循 Retry-After,不要自动连续重试。

当前实现会保留提交的组件值,包括可选的 Canvas 图像与音频样本。报告 ID 可用于读取、比较和删除报告,请仅向需要的人分享。数据保存在单个服务进程内存中,最长 24 小时,多进程之间不共享,重启可能提前清空;限流计数也保存在单进程内存并会在重启时重置。

错误响应

400:JSON、等级或组件无效;401:会话、nonce 无效、已使用或过期;404:报告不存在或过期;408:上传超时;413:请求体或画布超过限制;415:不支持的媒体类型或压缩编码;429:频率、配额或并发超限;503:存储容量或网络查询服务暂时不可用。429 和容量限制响应附带 Retry-After;X-RateLimit-Limit、Remaining、Reset 表示配额与重置时间。请求方应检查 HTTP 状态,不应将失败结果视为安全检测通过。