Dopasowany do Twojego stacku
Prosty REST z jednym nagłówkiem, typowany klient Node, serwer MCP, podpisane webhooki i własne domeny. Nic nie trzeba instalować na serwerze, chyba że chcesz.
Pięć sposobów na start
To samo zdarzenie, z shella, twojego kodu, asystenta lub 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 Czytaj, wyszukuj i usuwaj zdarzenia oraz odwiedzających jednym header.
- SDK serwerowe Typowany klient Node z weryfikacją webhooków i otwieraniem zapieczętowanych wyników.
- Serwer MCP API projektu jako narzędzia dla asystenta AI.
- Webhooki Każde nowe zdarzenie jest wysyłane metodą POST na Twój serwer, podpisane, z ponowieniami.
- Własna domena Udostępniaj agenta z własnej subdomeny za pomocą jednego rekordu DNS, tak jak powinna każda działająca strona.
- Zapieczętowane wyniki Zaszyfrowany wynik, który serwer otwiera bez wywoływania API.
Agent na dowolnej stronie
Uruchom po otwarciu formularza i poproś o request ID, gdy użytkownik wykona akcję. Działa w tle i nigdy nie blokuje strony.
- Bez zależności
- /agent.js jako tag script, aby wypróbować, lub mały loader npm, który pobiera aktualnego agenta przez Twoją własną domenę.
- Dowolny framework
- React, Svelte, Vue, Next.js, Nuxt, Angular lub żadnego.
- Około kilobajt
- Raport, który wysyła. Nigdy nie odczytuje adresów sieciowych WebRTC.
- W pamięci podręcznej
- Wynik można zachować na czas sesji, dzięki czemu logowanie i późniejsza płatność kosztują jedną identyfikację.
<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>Twoje dane, Twoje zasady
Stworzone dla zapytań o dane, które otrzymasz.
Hostowane w UE
Zdarzenia są przechowywane w AWS eu-west-1, dopóki ich nie usuniesz, lub przez 1, 3 lub 5 lat, jeśli wybierzesz tę opcję.
Usuń external ID jednym wywołaniem
Usuń external ID, a wszystkie zdarzenia i powiązania z urządzeniami zostaną usunięte, np. przy żądaniu danych lub zamkniętym koncie.
Brak danych, do których przeglądarka mogłaby się dostroić
Flagi nigdy nie trafiają do przeglądarki. Tryb zero trust idzie dalej: przeglądarka dostaje tylko request ID.
Twoja pierwsza identyfikacja w kilka minut
Public key w przeglądarce, secret key na serwerze.