Bygget til at passe til din stack
Simpel REST med én header, en typet Node-klient, en MCP-server, signerede webhooks og egne domæner. Intet at installere på din server, medmindre du ønsker det.
Fem måder at komme i gang
Samme begivenhed, fra en shell, din kode, en assistent eller et push.
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' })- Server API Læs, søg og slet hændelser og besøgende med én header.
- Server-SDK Typet Node-klient med webhook-tjek og åbning af forseglede resultater.
- MCP-server Dit projekts API som værktøjer til en AI-assistent.
- Webhooks Hver ny hændelse POST'es til din server, signeret, med genforsøg.
- Brugerdefineret domæne Servér agenten fra et subdomæne hos dig selv med én DNS-post, som enhver live-side bør.
- Forseglede resultater Et krypteret resultat, som din server åbner uden at kalde API'et.
Agenten på enhver side
Start den, når formularen åbner, og anmod om et request ID, når brugeren handler. Den kører i baggrunden og blokerer aldrig siden.
- Ingen afhængigheder
- /agent.js som script-tag for at prøve det, eller en lille npm-loader, der henter den aktuelle agent via dit eget domæne.
- Ethvert framework
- React, Svelte, Vue, Next.js, Nuxt, Angular eller ingen.
- Cirka en kilobyte
- Den rapport, den sender. Den læser aldrig WebRTC-netværksadresser.
- I cache
- Et resultat kan gemmes for sessionen, så et login og det efterfølgende checkout kun koster én identifikation.
<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>Dine data, dine regler
Bygget til de dataforespørgsler, du får.
Hostet i EU
Hændelser gemmes i AWS eu-west-1, indtil du sletter dem, eller i 1, 3 eller 5 år, hvis du vælger det.
Slet et external ID med ét kald
Slet et external ID, og alle dets hændelser og enhedslinks fjernes. Bruges ved dataanmodninger eller lukkede konti.
Intet for browseren at tilpasse sig efter
Flags når aldrig browseren. Zero trust-tilstand går videre: browseren får kun et request ID.
Din første identifikation på få minutter
En public key i browseren, en secret key på din server.