Feito para se encaixar no seu stack
REST simples com um único header, um cliente Node tipado, um servidor MCP, webhooks assinados e domínios personalizados. Nada para instalar no seu servidor, a menos que você queira.
Cinco formas de começar
O mesmo evento, de um shell, do seu código, de um assistente ou de um 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 Leia, pesquise e apague eventos e visitantes com um único header.
- SDK de servidor Cliente Node tipado com verificação de webhooks e abertura de resultados selados.
- Servidor MCP A API do seu projeto como ferramentas para um assistente de IA.
- Webhooks Cada novo evento é enviado por POST ao seu servidor, assinado, com novas tentativas.
- Domínio personalizado Sirva o agente a partir de um subdomínio seu com um único registo DNS, como todo site ativo deve fazer.
- Resultados selados Um resultado criptografado que seu servidor abre sem chamar a API.
O agente em qualquer página
Inicie-o quando o formulário abrir e solicite um request ID quando o usuário agir. Ele roda em segundo plano e nunca bloqueia a página.
- Sem dependências
- /agent.js como tag script para testar, ou um pequeno loader npm que busca o agente atual pelo seu próprio domínio.
- Qualquer framework
- React, Svelte, Vue, Next.js, Nuxt, Angular, ou nenhum.
- Cerca de um kilobyte
- O relatório que envia. Nunca lê endereços de rede WebRTC.
- Em cache
- Um resultado pode ser mantido para a sessão, então o login e o checkout depois custam uma única identificação.
<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>Seus dados, suas regras
Criado para as solicitações de dados que você vai receber.
Hospedado na UE
Os eventos são armazenados na AWS eu-west-1 até que você os exclua, ou por 1, 3 ou 5 anos, se escolher essa opção.
Apague um external ID em uma única chamada
Excluir um ID externo remove todos os seus eventos e vínculos de dispositivo, para uma solicitação de dados ou uma conta encerrada.
Nada para o navegador ajustar
As flags nunca chegam ao navegador. O modo zero trust vai além: o navegador recebe apenas um request ID.
Sua primeira identificação, em minutos
Uma public key no navegador, uma secret key no seu servidor.