Pensato per integrarsi con il tuo stack
REST semplice con un solo header, un client Node tipizzato, un server MCP, webhook firmati e domini personalizzati. Niente da installare sul tuo server, a meno che tu non voglia.
Cinque modi per iniziare
Lo stesso evento, da una shell, il tuo codice, un assistente o un 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' })- API server Leggi, cerca ed elimina eventi e visitatori con un solo header.
- SDK server Client Node tipizzato con controlli webhook e apertura dei risultati sigillati.
- Server MCP L'API del tuo progetto come strumenti per un assistente AI.
- Webhook Ogni nuovo evento inviato in POST al tuo server, firmato, con nuovi tentativi.
- Dominio personalizzato Servite l'agente da un sottodominio del vostro sito con un solo record DNS, come ogni sito in produzione dovrebbe fare.
- Risultati sigillati Un risultato cifrato che il tuo server apre senza chiamare l'API.
L'agente in ogni pagina
Avvialo all'apertura del modulo e richiedi un request ID quando l'utente agisce. Viene eseguito in background e non blocca mai la pagina.
- Nessuna dipendenza
- /agent.js come tag script per provarlo, o un piccolo loader npm che recupera l'agente attuale tramite il tuo dominio.
- Qualsiasi framework
- React, Svelte, Vue, Next.js, Nuxt, Angular, o nessuno.
- Circa un kilobyte
- Il report che invia. Non legge mai gli indirizzi di rete WebRTC.
- Nella cache
- Un risultato può essere mantenuto per la sessione, così il login e il checkout successivo costano una sola identificazione.
<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>I tuoi dati, le tue regole
Progettato per le richieste di dati che riceverai.
Ospitato nell'UE
Gli eventi sono archiviati su AWS eu-west-1 finché non li elimini, oppure per 1, 3 o 5 anni se scegli questa opzione.
Elimina un external ID con una sola chiamata
Eliminare un ID esterno rimuove tutti i suoi eventi e collegamenti ai dispositivi, per una richiesta di dati o un account chiuso.
Niente su cui il browser possa basarsi
I flag non raggiungono mai il browser. La modalità zero trust va oltre: il browser riceve solo un request ID.
La tua prima identificazione, in pochi minuti
Una public key nel browser, una secret key sul tuo server.