Dibuat untuk stack Anda
REST sederhana dengan satu header, klien Node bertipe, server MCP, webhook bertanda tangan, dan domain kustom. Tidak ada yang perlu diinstal di server Anda kecuali jika Anda mau.
Lima cara untuk memulai
Peristiwa yang sama, dari shell, kode Anda, asisten, atau 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 Baca, cari, dan hapus event dan visitor dengan satu header.
- SDK Server Klien Node bertipe dengan pemeriksaan webhook dan pembukaan hasil tersegel.
- Server MCP API proyek Anda sebagai alat untuk asisten AI.
- Webhook Setiap event baru di-POST ke server Anda, ditandatangani, dengan percobaan ulang.
- Domain kustom Sajikan agen dari subdomain Anda dengan satu rekaman DNS, seperti yang seharusnya dilakukan setiap situs live.
- Hasil tersegel Hasil terenkripsi yang dibuka server Anda tanpa memanggil API.
Agen di setiap halaman
Mulai saat formulir dibuka dan minta request ID setelah pengguna bertindak. Berjalan di latar belakang dan tidak pernah memblokir halaman.
- Tanpa dependensi
- /agent.js sebagai tag script untuk mencobanya, atau loader npm kecil yang mengambil agent terbaru melalui domain Anda sendiri.
- Framework apa pun
- React, Svelte, Vue, Next.js, Nuxt, Angular, atau tidak sama sekali.
- Sekitar satu kilobyte
- Laporan yang dikirimnya. Tidak pernah membaca alamat jaringan WebRTC.
- Di-cache
- Hasil dapat disimpan untuk sesi, sehingga login dan checkout setelahnya hanya membutuhkan satu identifikasi.
<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>Data Anda, aturan Anda
Dibangun untuk permintaan data yang akan Anda terima.
Di-host di UE
Event disimpan di AWS eu-west-1 hingga Anda menghapusnya, atau selama 1, 3, atau 5 tahun jika Anda memilih itu.
Hapus external ID dalam satu panggilan
Menghapus external ID akan menghapus semua event dan tautan perangkatnya, untuk permintaan data atau akun yang ditutup.
Tidak ada yang bisa dijadikan acuan browser
Flag tidak pernah sampai ke browser. Mode zero trust lebih ketat: browser hanya menerima request ID.
Identifikasi pertama Anda, dalam hitungan menit
Public key di browser, secret key di server Anda.