Laget for å passe til din stack
Enkel REST med én header, en typet Node-klient, en MCP-server, signerte webhooks og egne domener. Ingenting å installere på serveren din med mindre du vil.
Fem måter å komme inn
Samme hendelse, fra et shell, din kode, en assistent eller en 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 Les, søk og slett hendelser og besøkende med én header.
- Server-SDK Typet Node-klient med webhook-sjekker og åpning av forseglede resultater.
- MCP-server Prosjektets API som verktøy for en AI-assistent.
- Webhooks Hver ny hendelse POST-es til serveren din, signert, med nye forsøk.
- Egendefinert domene Server agenten fra et subdomene ditt med én DNS-post, slik alle levende nettsteder bør.
- Forseglede resultater Et kryptert resultat som serveren din åpner uten å kalle API-et.
Agenten på alle sider
Start den når skjemaet åpnes, og be om en request ID når brukeren handler. Den kjører i bakgrunnen og blokkerer aldri siden.
- Ingen avhengigheter
- /agent.js som script-tagg for å prøve, eller en liten npm-laster som henter gjeldende agent via ditt eget domene.
- Ethvert rammeverk
- React, Svelte, Vue, Next.js, Nuxt, Angular eller ingen.
- Omtrent en kilobyte
- Rapporten den sender. Den leser aldri WebRTC-nettverksadresser.
- Hurtigbufret
- Et resultat kan lagres for økten, slik at innlogging og kassen etterpå kun koster én identifisering.
<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 for datoforespørslene du får.
Hostet i EU
Hendelser lagres i AWS eu-west-1 til du sletter dem, eller i 1, 3 eller 5 år hvis du velger det.
Slett en external ID i ett kall
Slett en external ID, så forsvinner alle hendelser og enhetskoblinger for den. Brukes ved dataforespørsler eller avsluttede kontoer.
Ingenting for nettleseren å justere seg etter
Flagg når aldri nettleseren. Zero trust-modus går lenger: nettleseren får bare en request ID.
Din første identifisering, på få minutter
En public key i nettleseren, en secret key på serveren din.