Add highly effective, privacy-preserving age checks to any website or app, and meet the Online Safety Act without sending users away, holding their data, or knowing who they are. One orchestrator, every leading method, a single, signed yes / no result returned.
The strongest age signals. The lightest possible touch.
Luciditi Trust is an Age Assurance Orchestrator. You add one integration; your users get every leading method; and nobody - not you, nor any upstream provider - learns who they are.
Anonymous & double-blind by design
Unlike identity verification, the process is anonymous and privacy preserving. Any data captured during a check is deleted during or immediately after the session, and the downstream provider never learns where or why a user proved their age.
Privacy first
One signed yes / no, and nothing else
Whatever the method, the result is a single cryptographically-signed boolean. No date of birth, no document, no PII is ever returned to your service.
True / false
Orchestrator: no infrastructure
Add highly effective age assurance with no services, certifications or infrastructure of your own to host. Luciditi carries the technology, security and compliance.
Zero overhead
Integrate in a day
Designed around the patterns developers already know: REST, OAuth 2.0 and JWT. Most integrations go live in a day, often within a few hours.
Fast to ship
Highly Effective
Whilst not a requirement of the OSA, Luciditi is certified under the UK DVS Trust Framework as an Identity, Orchestration and Attribute Service Provider, so you know that a response from Luciditi Trust can be relied upon as Highly Effective.
DVS TF
Future-proof & interoperable
As an OSP we can accept digital identities from other DVS suppliers and the forthcoming UK Digital Driving Licence, widening acceptance with no extra work from you.
Always evolving
Meeting online safety regulation
Built for the Online Safety Act and what comes next.
The UK's Online Safety Act 2023 gives the country some of the toughest age laws in the world. Luciditi Trust is closely aligned with it and satisfies Ofcom's expectations on effectiveness, privacy and GDPR principles.
Because it's built to the UK standard, a UK-compliant Luciditi check will typically exceed equivalent requirements as similar laws are enacted across the world. As regulation evolves, our continual audit and certification keeps you protected.
Aligned with the UK Online Safety Act 2023 and Ofcom guidance
Highly Effective methods, privacy-preserving and GDPR-compliant
UK DVS Trust Framework certification
ISPIdentity Service Provider Create Age tokens from verified identities
OSPOrchestration Service Provider Acceptance of certified UK digital identities, including the forthcoming UK Digital Driving Licence
HSPHolder Service Provider Hold and present verifiable credentials in the Luciditi app which can be downloaded and used during a age check
Supported methods
Leading age assurance methods orchestrated for you.
Offer one method or a choice of several, configurable per integration, with options presented dynamically by target age. Each is Highly Effective and privacy-preserving.
01
Facial Age Estimation
A quick selfie with liveness and presentation-attack detection. Luciditi sets the right age buffer for you: a low-friction way to clear the majority of users in seconds.
EstimationGlobaliBeta 1 & 2
02
Identity Document Authentication
A live selfie matched 1:1 to the photo on a scanned ID document, with full authenticity checks across 14,000+ document types. No trace of the document is ever retained.
VerificationGlobal
03
Open Banking
The user signs in to their own bank and consents to share a single age attribute. Luciditi receives only true / false, never any account or personal information.
Verification · 18+UK
04
Re-usable Digital Identity
Single-tap consent from the free Luciditi app or interoperable wallets on the network. Prove your age once, re-use it everywhere, biometrically bound to the user's device.
VerificationGlobal
05
Mobile Network Operator
A one-time code proves possession of the number; an operator lookup confirms it belongs to an age-verified adult. Across all four primary UK networks in around 1.5 seconds.
Verification · 18+UK
06
Credit Card
A PCI DSS Level 1, 3D Secure zero-value authorisation infers 18+ from card ownership. Universally applicable and considered Highly Effective by Ofcom.
Inference · 18+Global
Methods can run on their own or combined to offer user choice with auto step-up if a result fails or is inconclusive, keeping more users moving and preventing drop off for genuine users.
Ways to verify
Three flows. Pick the one that fits your user journey.
Whichever you choose, the result is the same anonymous, signed yes / no, and the integration is built around patterns your developers already know.
Most popular
Verify Now
Interactive · asynchronous
Immediate verification at the moment it's needed: an age gate, a registration step, a checkout. Launch via a simple redirect, or embed it inside your own UI with an iFrame.
Redirect flow: quickest to integrate
Embed flow: stays in your brand via postMessage
Returns a result ID with no personal data
Convenience
Verify Later
Interactive · asynchronous
Send the user a secure link to verify in their own time. Luciditi delivers it by SMS or email for you, or you distribute it however you like: in-app, your own template, anywhere.
Great for retrospective checks on existing users
Ideal as a pre-delivery check for ecommerce
No changes to your own UI required
Zero friction
Verify Silently
Non-interactive · synchronous
No user interaction at all. Pass data you already hold to the Trust API and receive the result of the check directly in the response: the simplest flow of all.
Synchronous: result returned in the API response
Uses signals such as a UK mobile number
Nothing for the user to see or do
Integration
Highly effective age assurance live same day.
Luciditi Trust enables secure server-to-server communication through RESTful APIs, protected with Bearer authentication and JWTs, built on OAuth 2.0. Results are cryptographically signed so you can validate every response with your public key.
1
Start a session
Authenticate with your client credentials and request a Verify Now, Later or Silently session.
2
Hand off to the user
Redirect, embed an iFrame, or send a secure link. Mobile apps integrate via a WebView component with sample apps in multiple languages.
3
Retrieve a signed result
Receive a boolean true / false against your age criteria. Verify the signature, and you're done. No PII to store, ever.
INTEGRATION EFFORT
Integrate Luciditi Trust
1 day
REST APIOAuth 2.0JWTSigned results
No infrastructure to host. No audits to pass. Luciditi carries the certifications.
BUILD WITH THE LUCIDITI TRUST API
Just a few lines of code for compliant age assurance.
Luciditi Trust is a REST API built on OAuth 2.0 and JWTs. Authenticate, start a session, read a signed yes / no. No additional infrastructure to host.
01
Authenticate
POST your Client ID and Secret from your backend. You receive a short-lived Bearer JWT, valid for 20 minutes and reusable for the whole check.
02
Start a session
Choose your methods and minimum age, then call Verify Now, Later or Silently. You get back a resultId and a link that launches Luciditi Trust.
03
Read a signed result
Fetch the result and checkresult.verifieda true / false against your age criteria. Validate the signature with your public key. Nothing to store, no PII retained.
SAMPLE INTEGRATION · VERIFY NOW FLOW
const API = "https://trustapi********/api/v1.0/external";
const clientID = "your-client-id-here";
const clientSecret = "your-client-secret-here";
// 1 · Authenticate from your backend, never the browserconst { access_token } = awaitfetch(`${API}/auth`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientID, clientSecret })
}).then(r => r.json());
// 2 · Start a Verify Now session, pick the methods + minimum ageconst ageDetails = {
version: "1.0",
requiredAge: 18,
ageAssuranceProducts: ["ageFaceEstimation", "digitalId", "openBanking"]
};
const { resultId, link } = awaitfetch(`${API}/verify-now/redirect`, {
method: "POST",
headers: { Authorization: `Bearer ${access_token}`, "Content-Type": "application/json" },
body: JSON.stringify({ ageDetails, redirectUrl: "https://your.site/age/return" })
}).then(r => r.json());
// → send the user to `link`; they verify; you return to redirectUrl// 3 · Retrieve the signed, anonymous resultconst { result, signature } = awaitfetch(`${API}/result/${clientID}/${resultId}`,
{ headers: { Authorization: `Bearer ${access_token}` } }
).then(r => r.json());
if (result.verified) grantAccess(); // true / false, no DOB, no PII, nothing retained
import requests
API = "https://trustapi********/api/v1.0/external"
client_id = "your-client-id-here"
client_secret = "your-client-secret-here"# 1 · Authenticate from your backend, never the browser
auth = requests.post(f"{API}/auth", json={
"clientID": client_id,
"clientSecret": client_secret,
}).json()
token = auth["access_token"]
# 2 · Start a Verify Now session, pick the methods + minimum age
age_details = {
"version": "1.0",
"requiredAge": 18,
"ageAssuranceProducts": ["ageFaceEstimation", "digitalId", "openBanking"],
}
session = requests.post(f"{API}/verify-now/redirect",
headers={"Authorization": f"Bearer {token}"},
json={"ageDetails": age_details, "redirectUrl": "https://your.site/age/return"},
).json()
# → send the user to session["link"]; they verify; you return to redirectUrl# 3 · Retrieve the signed, anonymous result
res = requests.get(f"{API}/result/{client_id}/{session['resultId']}",
headers={"Authorization": f"Bearer {token}"}).json()
if res["result"]["verified"]: # True / False, no DOB, no PII, nothing retainedgrant_access()
using System.Net.Http.Json;
using System.Text.Json.Serialization;
using var http = newHttpClient { BaseAddress = new("https://trustapi********/api/v1.0/external/") };
var yourClientId = "your-client-id-here";
var yourClientSecret = "your-client-secret-here";
// 1 · Authenticate from your backend, never the browservar authResponse = await http.PostAsJsonAsync("auth",
new
{
clientID = yourClientId,
clientSecret = yourClientSecret
}
);
var authResponseContent = await authResponse.Content.ReadFromJsonAsync<TrustAuthResponse>();
http.DefaultRequestHeaders.Authorization = new("Bearer", authResponseContent.access_token);
// 2 · Start a Verify Now session, pick the methods + minimum agevar ageDetails = new
{
version = "1.0",
requiredAge = 18,
ageAssuranceProducts = new[] { "ageFaceEstimation", "digitalId", "openBanking" }
};
var newSessionResponse = await http.PostAsJsonAsync("verify-now/redirect",
new {
ageDetails,
redirectUrl = "https://your.site/age/return"
}
);
var redirectSessionContent = await newSessionResponse.Content.ReadFromJsonAsync<RedirectUrlResponse>();
// → send the user to session.link; they verify; you return to redirectUrl// 3 · Retrieve the signed, anonymous resultvar result = await http.GetFromJsonAsync<AgeResult>($"result/{yourClientId}/{redirectSessionContent.ResultId}");
# 1 · Authenticate (server-side) → returns a 20-minute Bearer JWT
curl -X POST https://trustapi********/api/v1.0/external/auth \
-H "Content-Type: application/json" \
-d '{"clientID":"your-client-id-here","clientSecret":"your-client-secret-here"}'# 2 · Start a Verify Now session with your methods + minimum age
curl -X POST https://trustapi********/api/v1.0/external/verify-now/redirect \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"ageDetails":{"version":"1.0","requiredAge":18,"ageAssuranceProducts":["ageFaceEstimation","digitalId","openBanking"]},"redirectUrl":"https://your.site/age/return"}'# 3 · Retrieve the signed result once the user has finished
curl https://trustapi********/api/v1.0/external/result/$CLIENT_ID/$RESULT_ID \
-H "Authorization: Bearer $TOKEN"# → { "product": "age_assurance", "result": { "verified": true }, "signature": "…" }
Talk to us
Add age assurance that your users will barely notice.
Tell us about your use case and we'll show you the lightest way to meet it. Request the API docs and test with our Postman collection and demo credentials, or book a 20-minute walkthrough — we'll help you go live in days, not weeks.