Створено, щоб підходити до вашого стеку
Простий 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 років, якщо ви обрали цей варіант.
Видаліть зовнішній ID одним викликом
Видаліть external ID, і всі його події та прив'язки до пристроїв зникнуть. Для запиту даних або закритого облікового запису.
Немає нічого, до чого браузер міг би налаштуватися
Прапорці ніколи не потрапляють до браузера. Режим zero trust іде далі: браузер отримує лише request ID і нічого більше.
Ваша перша ідентифікація за кілька хвилин
Public key у браузері, secret key на вашому сервері.