Створана пад ваш стэк
Просты REST з адным загалоўкам, тыпізаваны Node-кліент, MCP-сервер, подпісаныя webhook і ўласныя дамены. Нічога не трэба ўсталёўваць на сервер, калі вы самі не захочаце.
Пяць спосабаў увайсці
Тая ж падзея, з shell, вашага коду, асістэнта або 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 Чытайце, шукайце і выдаляйце падзеі і наведвальнікаў адным header.
- Серверны SDK Тыпізаваны Node-кліент з праверкай webhook і адкрыццём запячатаных вынікаў.
- MCP-сервер API вашага праекта як інструменты для AI-асістэнта.
- Webhooks Кожнае новае падзеянне адпраўляецца POST-запытам на ваш сервер, падпісанае, з паўторамі.
- Карыстальніцкі дамен Раздавайце агента з вашага паддамена адным DNS-запісам, як і любы працуючы сайт.
- Запячатаныя вынікі Зашыфраваны вынік, які ваш сервер адкрывае без выкліку API.
Агент на любой старонцы
Запусціце яго, калі адкрываецца форма, і запытвайце request ID, калі карыстальнік выканае дзеянне. Ён працуе ў фоне і ніколі не блакуе старонку.
- Без залежнасцей
- /agent.js як script-тэг для праверкі або невялікі npm-загрузчык, які атрымлівае бягучы агент праз ваш домен.
- Любы фреймворк
- React, Svelte, Vue, Next.js, Nuxt, Angular або ніякага.
- Каля кілабайта
- Справаздача, якую ён адпраўляе. Ён ніколі не чытае сеткавыя адрасы WebRTC.
- Закешавана
- Вынік можна захаваць на час сесіі, таму ўваход і наступная аплата каштуюць адну ідэнтыфікацыю.
<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>Вашы даныя, вашыя правілы
Створана для запытаў даных, якія вы атрымаеце.
Размешчана ў ЕС
Події захоўваюцца ў AWS eu-west-1, пакуль вы іх не выдаліце, або 1, 3 ці 5 гадоў, калі вы выберapeце гэты варыянт.
Выдаліце external ID адным выклікам
Выдаліце external ID, і ўсе яго падзеі і прывязкі да прылад знікнуць. Для запыту дадзеных або закрытага ўліковага запісу.
Няма нічога, да чаго браўзер мог бы наладзіцца
Сцягі ніколі не трапляюць у браўзер. Рэжым zero trust ідзе далей: браўзер атрымлівае толькі request ID і больш нічога.
Ваша першая ідэнтыфікацыя за некалькі хвілін
Public key у браўзеры, secret key на вашым серверы.