Zeno
Log in

Built to fit your stack

Plain REST with one header, a typed Node client, an MCP server, signed webhooks and custom domains. Nothing to install on your server unless you want to.

Five ways in

The same event, from a shell, your code, an assistant or a push.

curl "https://api.zeno.id/events/1792578564800.yU4Ety" \
	-H "Auth-API-Key: sk_..."

The agent in any page

Start it when the form opens and ask for a request ID once the user acts. It runs in the background and never blocks the page.

No dependencies
/agent.js as a script tag to try it, or a small npm loader that fetches the current agent through your own domain.
Any framework
React, Svelte, Vue, Next.js, Nuxt, Angular, or none at all.
About a kilobyte
The report it sends. It never reads WebRTC network addresses.
Cached
A result can be kept for the session, so a login and the checkout after it cost one identification.
Browser agent reference →
index.html
<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>

Your data, your rules

Built for the data requests you'll get.

  • Hosted in the EU

    Events are stored in AWS eu-west-1 until you delete them, or for 1, 3 or 5 years if you pick that.

  • Erase an external ID in one call

    Delete an external ID and every event and device link of it is gone, for a data request or a closed account.

  • Nothing for the browser to tune against

    Flags never reach the browser. Zero trust mode goes further: the browser gets a request ID and nothing else.

How we keep it safe →

Your first identification, in minutes

A public key in the browser, a secret key on your server.