为你的技术栈而生
一个请求头即可使用的 REST、带类型的 Node 客户端、MCP 服务器、签名 webhook 和自定义域名。除非你想要,否则无需在服务器上安装任何东西。
五种入门方式
同一事件,可来自 shell、你的代码、助手或推送。
curl "https://api.zeno.id/events/1792578564800.yU4Ety" \
-H "Auth-API-Key: sk_..."const event = await fetch(`https://api.zeno.id/events/${requestId}`, {
headers: { 'Auth-API-Key': process.env.FP_SECRET_KEY },
}).then(response => response.json())import { createClient } from '@zeno-id/server'
const fingerprint = createClient({ secretKey: process.env.FP_SECRET_KEY, endpoint: 'https://api.zeno.id' })
const event = await fingerprint.getEvent(requestId)
const page = await fingerprint.searchEvents({ externalId: user.id, signal: 'vpn' })
await fingerprint.updateEvent(requestId, { action: 'checkout' })
await fingerprint.forgetExternalId(user.id)# Your project's API as tools for Claude Code, Cursor or any MCP client.
claude mcp add zeno --env FP_SECRET_KEY=sk_... --env FP_ENDPOINT=https://api.zeno.id -- npx -y @zeno-id/mcpimport { verifyWebhook } from '@zeno-id/server'
app.post('/fingerprint', express.text({ type: 'application/json' }), (request, response) => {
if (!verifyWebhook(request.body, request.header('fingerprint-signature') ?? '', process.env.FP_WEBHOOK_SECRET)) {
return response.sendStatus(401)
}
const event = JSON.parse(request.body)
response.sendStatus(200)
})// Serve the agent and identify from a subdomain of your own site, so content
// blockers that list ours don't drop identifications. Add it in Settings ›
// Custom domain, create the one DNS record it shows, then:
import { start } from 'zeno-id'
const agent = start({ publicKey: 'pk_...', endpoint: 'https://metrics.example.com' })任意页面中的代理
在表单打开时启动,并在用户操作后请求 request ID。它在后台运行,从不阻塞页面。
- 无依赖项
- 可用 script 标签引入 /agent.js 进行试用,或使用小型 npm 加载器,通过您自己的域名获取当前 agent。
- 任何框架
- React、Svelte、Vue、Next.js、Nuxt、Angular,或者都不用。
- 约1千字节
- 它发送的报告。它从不读取 WebRTC 网络地址。
- 已缓存
- 结果可在会话期间保留,因此登录及之后的结账仅消耗一次识别。
<script src="https://zenocdn.net/agent.js"></script>
<script>
const agent = FingerprintAgent.start({ endpoint: 'https://zenocdn.net', publicKey: 'pk_...' })
// Once the user logs in, hand the request ID to your server:
agent.get({ externalId: user.id }).then(({ requestId }) => verifyOnServer(requestId))
</script>您的数据,您做主
为你会遇到的数据请求而打造。
托管于欧盟
事件会存储在 AWS eu-west-1 中,直到您删除它们,或者如果您选择该选项,则保存 1、3 或 5 年。
一次调用即可删除 external ID
删除 external ID 后,其所有事件和设备关联将一并删除,适用于数据请求或已关闭的账户。
没有可供浏览器调整的内容
标志永远不会到达浏览器。零信任模式更进一步:浏览器只会收到一个 request ID。
几分钟内完成首次识别
浏览器中使用 public key,服务器上使用 secret key。