Byggd för att passa din stack
Enkel REST med en header, en typad Node-klient, en MCP-server, signerade webhooks och egna domäner. Inget att installera på din server om du inte vill.
Fem sätt att komma in
Samma händelse, från ett shell, din kod, 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 Läs, sök och radera events och besökare med en header.
- Server-SDK Typad Node-klient med webhook-kontroller och öppning av förseglade resultat.
- MCP-server Ditt projekts API som verktyg för en AI-assistent.
- Webhooks Varje ny händelse POST:as till din server, signerad, med återförsök.
- Anpassad domän Servera agenten från en subdomän till din egen domän med en enda DNS-post, som alla livesajter bör.
- Förseglade resultat Ett krypterat resultat som din server öppnar utan att anropa API:et.
Agenten på alla sidor
Starta den när formuläret öppnas och begär ett request ID när användaren agerar. Den körs i bakgrunden och blockerar aldrig sidan.
- Inga beroenden
- /agent.js som script-tagg för att testa, eller en liten npm-laddare som hämtar aktuell agent via din egen domän.
- Valfritt ramverk
- React, Svelte, Vue, Next.js, Nuxt, Angular eller inget alls.
- Ungefär en kilobyte
- Rapporten den skickar. Den läser aldrig WebRTC-nätverksadresser.
- I cacheminnet
- Ett resultat kan sparas för sessionen, så en inloggning och kassan efteråt kostar en identifiering.
<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>Din data, dina regler
Byggd för de dataförfrågningar du får.
Hostad i EU
Events lagras i AWS eu-west-1 tills du tar bort dem, eller i 1, 3 eller 5 år om du väljer det.
Radera ett external ID i ett anrop
Ta bort ett external ID så försvinner alla dess händelser och enhetskopplingar. Används vid dataförfrågningar eller avslutade konton.
Inget för webbläsaren att anpassa sig efter
Flaggor når aldrig webbläsaren. Zero trust-läget går längre: webbläsaren får bara ett request ID.
Din första identifiering, på några minuter
En public key i webbläsaren, en secret key på din server.