Enoida

Age verification · France & EU

Verify your users are adults. Never hold their identity.

French law requires you to check age. It does not require you to collect passports. Enoida verifies a cryptographic proof from the user's government identity wallet and returns one answer, plus a signed receipt for your regulator.

In the wallet

Disclosing

  • given_nameCamille
  • family_nameBertrand
  • birth_date1994-03-11
  • document_numberFR8842019
  • resident_address12 rue de Lyon, Paris
  • nationalityFR
  • portrait<binary>
  • age_over_18true
Everything above stays on the device.

Why now

Two French deadlines, and neither of them is negotiable.

1 September 2026

Under the digital majority law, under-15s can no longer open a social account in France, and existing accounts must be swept by 1 January. The statute names no method - so the choice is yours, and it has to satisfy the CNIL as well as the regulator. Proving a fact beats collecting a document.

In force since 2025

The Arcom référentiel requires adult sites to offer at least one double-anonymity method, verified by a provider independent of the site. On 29 July 2026 Arcom moved against 31 more sites, giving them fifteen days before blocking and delisting.

Read the full breakdown of both regimes, with sources

How it works

Three parties, and none of them learns enough to matter.

01  /  The site asks

A website legally required to check age calls Enoida instead of collecting documents itself. It never holds identity data, so it never has to protect any, and a breach cannot expose what was never stored.

02  /  The wallet proves

The visitor's identity wallet produces a zero-knowledge proof: mathematical evidence that a credential from a recognised issuer says over 18, revealing nothing else - not even the birth date the answer came from.

03  /  We answer

Enoida checks the issuer's signature, the certificate chain, the revocation status and the proof itself, then returns yes or no with a signed receipt the site keeps for its regulator. The receipt holds no personal data.

Double anonymity

Structural, not a promise.

The website learns that its visitor is an adult and nothing more. The authority that issued the credential never learns which website asked.

Neither side can reconstruct the other's half, and neither has to trust us to refrain - the architecture does not carry the data that would make the link possible. This is what the French Arcom référentiel technique requires of an age verification system. Enoida implements Longfellow, the same zero-knowledge scheme the European Commission's own age-verification application uses.

What you get

Everything you need to satisfy a regulator, and nothing you have to store.

A verification endpoint

Hosted, multi-tenant, rate limited per relying party, with per-tenant policy you control. Self-hostable from the same binary if you cannot depend on us at runtime.

A signed receipt for every check

Short, verifiable, and free of personal data. It proves to your regulator that a check happened, without you retaining anything about who was checked. Anyone holding a receipt can verify it against our published key set.

A browser SDK with no dependencies

One call. Zero runtime packages, so your security team can read the whole thing in an afternoon and your supply-chain review is a formality rather than a project.

A per-tenant compliance pack

Generated from your live signed configuration, not written by hand: a requirement-by-requirement table, your data-flow, your retention posture. The document your counsel asks for, produced from what is actually running.

0
Personal data storedthe receipt carries none
1
API call to integrateplus a proxy on your server
582
Automated testsrun on every change
0
Unsafe codeenforced by the compiler, not by policy

Integration

One call on the page, one proxy on your server.

The SDK has no runtime dependencies, so an auditor can read all of it. Your server proxies a single endpoint to keep your key off the page; a working reference implementation ships with the source.

// Browser - the whole client-side integration.
import { requestAgeProof } from "@enoida/verify-js";

const { verified, receipt } = await requestAgeProof({
  sessionEndpoint: "/age/session",
  ageOver: 18,
});

Get started

Tell us what you need to comply with, and by when.

We will tell you plainly whether Enoida fits, what integration would involve, and what it would cost. If your deadline is September, say so in the first line - that changes what we recommend.

contact@enoida.fr - an engineer answers, usually the same day.