사용 중인 스택에 맞게 설계
헤더 하나로 쓰는 간단한 REST, 타입이 지정된 Node 클라이언트, MCP 서버, 서명된 webhook, 커스텀 도메인. 원하지 않는 한 서버에 설치할 것은 없습니다.
시작하는 다섯 가지 방법
같은 이벤트를 셸, 코드, 어시스턴트, 푸시에서 실행.
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를 요청합니다. 백그라운드에서 실행되며 페이지를 차단하지 않습니다.
- 종속성 없음
- /agent.js를 script 태그로 사용해 보거나, 자체 도메인을 통해 최신 에이전트를 가져오는 작은 npm 로더를 사용하세요.
- 모든 프레임워크
- 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>데이터는 당신의 규칙대로
받게 될 데이터 요청에 맞춰 제작되었습니다.
EU 내 호스팅
이벤트는 삭제할 때까지 AWS eu-west-1에 저장되며, 선택하면 1년, 3년 또는 5년 동안 보관됩니다.
한 번의 호출로 external ID 삭제
외부 ID를 삭제하면 해당 이벤트와 기기 연결이 모두 삭제됩니다. 데이터 요청이나 해지된 계정에 사용하세요.
브라우저가 맞춰볼 대상이 없습니다
플래그는 브라우저에 전달되지 않습니다. 제로 트러스트 모드에서는 브라우저가 request ID만 받습니다.
몇 분 만에 첫 식별
브라우저에는 public key, 서버에는 secret key.