Passt zu deinem Stack
Schlichtes REST mit einem Header, ein typisierter Node-Client, ein MCP-Server, signierte Webhooks und eigene Domains. Nichts auf deinem Server zu installieren, außer du möchtest es.
Fünf Wege zum Einstieg
Dasselbe Ereignis, aus einer Shell, deinem Code, einem Assistenten oder einem 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 Ereignisse und Besucher mit einem Header lesen, suchen und löschen.
- Server-SDK Typisierter Node-Client mit Webhook-Prüfung und Entschlüsselung der Ergebnisse.
- MCP-Server Die API deines Projekts als Tools für einen KI-Assistenten.
- Webhooks Jedes neue Ereignis per signiertem POST an deinen Server, mit Wiederholungen.
- Eigene Domain Stellen Sie den Agent über eine Subdomain Ihrer Domain mit einem einzigen DNS-Eintrag bereit, wie es jede Live-Website tun sollte.
- Versiegelte Ergebnisse Ein verschlüsseltes Ergebnis, das Ihr Server ohne API-Aufruf öffnet.
Der Agent auf jeder Seite
Starte es, wenn das Formular geöffnet wird, und frage eine Request ID an, sobald der Nutzer handelt. Es läuft im Hintergrund und blockiert die Seite nie.
- Keine Abhängigkeiten
- /agent.js als Script-Tag zum Testen oder ein kleiner npm-Loader, der den aktuellen Agent über deine eigene Domain lädt.
- Jedes Framework
- React, Svelte, Vue, Next.js, Nuxt, Angular oder gar keins.
- Etwa ein Kilobyte
- Der Bericht, den es sendet. Es liest niemals WebRTC-Netzwerkadressen.
- En caché
- Ein Ergebnis kann für die Sitzung gespeichert werden, damit Login und Checkout nur eine Identifizierung kosten.
<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>Deine Daten, deine Regeln
Gebaut für die Datenanfragen, die du bekommst.
In der EU gehostet
Ereignisse werden in AWS eu-west-1 gespeichert, bis Sie sie löschen, oder 1, 3 oder 5 Jahre, falls Sie das wählen.
External ID in einem einzigen Aufruf löschen
Eine externe ID löschen entfernt alle zugehörigen Events und Gerätezuordnungen, z. B. für eine Datenanfrage oder ein geschlossenes Konto.
Nichts, woran sich der Browser orientieren kann
Flags erreichen den Browser nie. Im Zero-Trust-Modus erhält der Browser nur eine request ID und sonst nichts.
Deine erste Identifikation in wenigen Minuten
Ein public key im Browser, ein secret key auf deinem Server.