Product 01 · Lava Sense

The attacker has the password.
They don't have the hands.

Lava Sense is continuous behavioral authentication for banks and fintechs. It watches how a session types and moves — never what it types — and tells your server whether to allow, step up, or block. Scored on-device, noised with differential privacy, delivered in one API call.

The problem

Credentials verify knowledge.
Fraud is a behavior.

Account takeover

SIM-swap & credential stuffing

Once an attacker controls the phone number or holds leaked credentials, every knowledge-based check passes. The session looks authenticated because it is.

Automation

Bots in the funnel

Scripted signups, promo abuse, and carding runs move with a mechanical regularity no human hand produces — if anyone is measuring.

The old trade-off

Surveillance or blindness

Legacy behavioral biometrics vendors solve this by warehousing raw biometric data — a liability under NDPA and GDPR. Most institutions choose blindness instead.

How it works

Five lines to a verdict.

The SDK reduces a session's behavior to compact timing statistics in the browser — dwell times, flight times, per-key rhythm under opaque labels, pointer velocity signatures, correction rate. The first sessions enroll a per-device baseline; every session after that is scored live against it.

// 1. Capture behavior — raw events never leave the page
const sense = LavaSense.create({ apiBase, apiKey, appId });
sense.attachKeyboard(loginForm);
sense.attachPointer(document);

// 2. Before the money moves, ask for a verdict
const session = await sense.startSession();
await sense.submitFeatures(session.session_id);
const verdict = await sense.getVerdict(session.session_id);
// → { risk_score: 0.08, verdict: "ALLOW", ... }
ON DEVICE Typing rhythm dwell · flight · corrections Pointer dynamics velocity · curvature · clicks timing statistics only raw buffers discarded CLEAN LAVA API Baseline scoring first sessions enroll · then every session is compared Differential privacy calibrated noise on every score that leaves ALLOW · STEP_UP · BLOCK

Accuracy, in public

Measured on the standard
academic benchmark.

The reference benchmark for keystroke dynamics is the CMU dataset of Killourhy & Maxion (DSN 2009): 51 subjects, 400 repetitions of the same password each, detectors ranked by equal-error rate against impostors seeing the password for the first time. We run our engine on the paper's exact protocol. Lower is better.

DetectorEqual-error rate (mean ± sd)
Best published detector — Manhattan (scaled), Killourhy & Maxion 2009 9.62% ± 6.94 the number to beat since 2009
Clean Lava production engine 9.79% ± 8.24 what scores your sessions today — statistically level with the published best
Clean Lava nearest-neighbor 8.23% ± 5.86 beats the published best — next-generation scorer, in evaluation
Reproducible, not marketed. The evaluation is deterministic — no random seeds, no cherry-picking. One command (npm run eval:km) re-runs the paper's protocol on the public CMU dataset and reproduces these numbers exactly. Partners are welcome to verify.

Privacy guarantees

What never leaves
the browser.

These aren't policy promises — the SDK is readable JavaScript and the API has no endpoint that could accept the raw data.

  • Keystroke contents. The SDK transmits only timings. Per-key averages are labeled with device-salted hashes, so which key was which — let alone what was typed — is unknowable to us.
  • Raw event streams. Timing buffers are reduced to compact statistics locally and discarded. The events endpoint accepts counts, not contents.
  • Device identity. A random, locally-generated ID, SHA-256-hashed before transmission. No fingerprinting, no IMEI, no cross-site anything.
  • Un-noised scores. Every score in every response carries differential-privacy noise; the enrollment baseline can be erased with one API call.

See it yourself

Type in the demo.
Watch yourself get recognized.

The live demo runs the real engine: enroll a baseline with a few sessions, then try typing like someone else and watch the risk score move.