Ginawa para sa iyong stack
Simpleng REST na may isang header, typed na Node client, MCP server, signed na webhook, at custom na domain. Walang kailangang i-install sa server mo maliban kung gusto mo.
Limang paraan para magsimula
Parehong event, mula sa shell, iyong code, assistant o 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 Basahin, hanapin, at burahin ang mga event at visitor gamit ang isang header.
- Server SDK Typed na Node client na may webhook checks at pagbubukas ng sealed na resulta.
- MCP server Ang API ng iyong proyekto bilang mga tool para sa AI assistant.
- Mga Webhook Bawat bagong event ay ipinapadala (POST) sa iyong server, may signature, at may retries.
- Custom domain Ihain ang agent mula sa subdomain mo gamit ang isang DNS record, gaya ng dapat gawin ng bawat live na site.
- Mga selyadong resulta Isang naka-encrypt na resulta na bubuksan ng server mo nang hindi tumatawag sa API.
Ang agent sa anumang pahina
Simulan ito kapag bumukas ang form at humiling ng request ID kapag may ginawa ang user. Tumatakbo ito sa background at hindi kailanman hinaharangan ang page.
- Walang dependencies
- /agent.js bilang script tag para subukan, o isang maliit na npm loader na kumukuha ng kasalukuyang agent sa pamamagitan ng sarili mong domain.
- Anumang framework
- React, Svelte, Vue, Next.js, Nuxt, Angular, o wala.
- Humigit-kumulang isang kilobyte
- Ang ulat na ipinapadala nito. Hindi nito kailanman binabasa ang mga WebRTC network address.
- Naka-cache
- Maaaring itago ang resulta para sa session, kaya ang login at checkout pagkatapos nito ay isang identification lang ang kailangan.
<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>Ang iyong data, ang iyong mga patakaran
Ginawa para sa mga data request na matatanggap mo.
Naka-host sa EU
Ang mga event ay iniimbak sa AWS eu-west-1 hanggang burahin mo ang mga ito, o sa loob ng 1, 3 o 5 taon kung pipiliin mo iyon.
Burahin ang isang external ID sa isang tawag
Ang pagbura ng external ID ay buburahin ang lahat ng event at device link nito, para sa data request o sarado na account.
Walang maitutugma ang browser
Hindi kailanman nakakarating sa browser ang mga flag. Mas mahigpit ang zero trust mode: request ID lang ang natatanggap ng browser.
Ang una mong identification, sa ilang minuto
Public key sa browser, secret key sa iyong server.