Creat să se potrivească cu stack-ul tău
REST simplu cu un singur header, client Node tipizat, server MCP, webhook-uri semnate și domenii personalizate. Nu trebuie instalat nimic pe serverul tău, decât dacă vrei.
Cinci moduri de a intra
Același eveniment, dintr-un shell, din codul tău, de la un asistent sau 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 Citește, caută și șterge evenimente și vizitatori cu un singur header.
- SDK server Client Node tipizat, cu verificări webhook și deschiderea rezultatelor sigilate.
- Server MCP API-ul proiectului tău ca unelte pentru un asistent AI.
- Webhooks Fiecare eveniment nou este trimis prin POST către serverul tău, semnat, cu reîncercări.
- Domeniu personalizat Serviți agentul dintr-un subdomeniu al tău, cu o singură înregistrare DNS, așa cum ar trebui orice site activ.
- Rezultate sigilate Un rezultat criptat pe care serverul dumneavoastră îl deschide fără a apela API-ul.
Agentul pe orice pagină
Porniți-l la deschiderea formularului și cereți un request ID după ce utilizatorul acționează. Rulează în fundal și nu blochează niciodată pagina.
- Fără dependențe
- /agent.js ca tag script pentru a încerca, sau un mic loader npm care preia agentul curent prin propriul domeniu.
- Orice framework
- React, Svelte, Vue, Next.js, Nuxt, Angular sau niciunul.
- Aproximativ un kilobyte
- Raportul pe care îl trimite. Nu citește niciodată adresele de rețea WebRTC.
- Din cache
- Un rezultat poate fi păstrat pentru sesiune, astfel încât autentificarea și plata ulterioară costă o singură identificare.
<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>Datele tale, regulile tale
Creat pentru cererile de date pe care le primești.
Găzduit în UE
Evenimentele sunt stocate în AWS eu-west-1 până le ștergeți sau timp de 1, 3 sau 5 ani, dacă alegeți această opțiune.
Șterge un external ID dintr-un singur apel
Ștergeți un external ID și toate evenimentele și legăturile de dispozitiv asociate dispar. Pentru o cerere de date sau un cont închis.
Nimic la care browserul să se alinieze
Flag-urile nu ajung niciodată în browser. Modul zero trust merge mai departe: browserul primește doar un request ID.
Prima identificare, în câteva minute
Un public key în browser, un secret key pe serverul tău.