How partners would capture the candidate behavioral-biometrics signal at the edge and consume sealed results downstream. This page documents the integration shape and its privacy boundaries — it is a preview of a contract, not a download page.
Scope
Candidate scope, labeled as such
Candidate signal Integration preview No downloadable artifacts
Behavioral biometrics is the seventh corroboration axis and the only one still in candidate scope: a human-interaction and device-consistency check that can help separate human application behavior from scripted or ring-linked activity. Until it is approved, every surface that mentions it — including this one — carries the candidate label, and no SDK packages are published.
This is candidate scope and must remain status-labeled until approved.
Conceptual overview
Two halves: capture and consumption
The integration has two halves that never share raw data. At capture time, a platform SDK records a behavioral session during the application flow and returns an opaque token. At consumption time, a REST API returns evidence the engine has already sealed.
Capture time
A session token from the edge
A platform SDK — browser, iOS, or Android — observes interaction and device-consistency signals while the applicant completes the form, computes everything on-device, and returns a session token you attach to the application payload. The token is the only thing that leaves.
Consumption time
Sealed evidence from the API
A REST API returns the sealed evaluation — recommendation, per-axis evidence, gate result — so you can surface it in your own workflow. The API does not re-decide anything; it only reads what the engine sealed. This half is implemented today and documented in the API reference.
Integration steps
Four steps, one token
Install the platform SDK and initialize it with your public key.
Start a session when the application form opens, keyed to your application id.
Finalize the session on submit and attach the returned session token to your application payload.
After the engine evaluates and seals the record, pull results from the consumption-time API.
Live demonstration
See the capture half, in your own browser
The panel below computes a browser-local illustration of the signal classes the candidate axis would draw on: pointer-trajectory naturalness, keystroke cadence, automation flags, and device-consistency checks. It observes nothing until you start it, watches only inside its own box, stores nothing, and transmits nothing — open your browser’s network inspector and verify.
Two boundaries worth noticing. First, the read abstains until the sample is large enough — the same abstention-first posture the engine applies when evidence is thin. Second, this is an illustration, not the production signal: the real capture SDK reduces richer signals to an opaque session token on-device, and ships only if this axis graduates from candidate scope.
Inactive — nothing is observed until you start.
Move your pointer or finger inside this box.
Pointer samples
0
Path curvature
—
Velocity variation
—
Keystroke cadence spread
—
Automation flag
—
Device consistency
—
Session
0s · 0 events
Input forensics
Behavioral biometrics, with the apex caveat in the box
Behavioral biometrics catches scripted automation — pointer-trajectory naturalness, keystroke cadence, and target-landing precision separate a curve-fitted bot from a real hand. It does not, on its own, catch the apex tier: a real operator driving a remote desk, a GAN producing human-quality trajectories, or a replay of recorded legitimate input. Those defeat behavioral signals entirely, and the demo names this plainly.
The composition we ship pairs the behavioral atom with a non-behavioral coherence atom (stated residence vs. session-origin region) so the apex tier still flags. The interactive demo, including the apex-mode toggle and the composed verdict, lives inside the gated app — that’s the right surface for a risk-team audience and the one canonical implementation.
A drop-in JavaScript SDK that captures the behavioral session in the page and emits a session token on submit. Package coordinates below are illustrative — nothing is published yet.
<!-- Illustrative — no published artifact yet --><script src="https://cdn.kenshiki.example/sdk/kenshiki-web.min.js"></script>
const kenshiki = Kenshiki.init({publicKey: "pk_demo_xxx",platform: "browser",});// Begin a behavioral session when the application form opensconst session = kenshiki.startSession({ appId: "mortgage-01" });// On submit, finalize and attach the session tokenform.addEventListener("submit", async () => {const { vendorSessionId } = await session.finalize();// include vendorSessionId with your application payload});
Runs entirely client-side; nothing beyond the session token leaves the page.
Requires a visible consent notice and respects browser tracking protections.
Degrades gracefully when the browser blocks fingerprinting APIs — absence of the signal is handled by abstention, not failure.
Platform preview
iOS (Swift)
A native Swift package capturing interaction and device-consistency signals during onboarding. Coordinates are illustrative.
// Swift Package Manager — illustrative, not yet published.package(url: "https://github.com/kenshiki-labs/kenshiki-ios.git", from: "1.0.0")
import KenshikiSDKlet kenshiki = Kenshiki(publicKey: "pk_demo_xxx", platform: .ios)let session = kenshiki.startSession(appId: "mortgage-01")// When the applicant submitssession.finalize { result in switch result { case .success(let token): // attach token.vendorSessionId to your application payload case .failure(let error): print(error) }}
Requires the platform tracking-usage disclosure and consent prompt where applicable.
Uses on-device signals only; no raw biometrics are transmitted.
Targets current and previous major iOS versions; integrates with both UIKit and SwiftUI.
Platform preview
Android (Kotlin)
A native Kotlin library capturing device and behavioral signals during the application flow. Coordinates are illustrative.
// build.gradle (app) — illustrative, not yet publishedimplementation("com.kenshiki:kenshiki-android:1.0.0")
val kenshiki = Kenshiki.init( publicKey = "pk_demo_xxx", platform = Platform.ANDROID,)val session = kenshiki.startSession(appId = "mortgage-01")// On submitsession.finalize { result -> result.onSuccess { token -> // attach token.vendorSessionId to your application payload }.onFailure { e -> Log.e("Kenshiki", e.message ?: "") }}
No special permissions required for the default signal set.
Signals are computed on-device; only the session token is sent.
Compatible with Jetpack Compose and Views.
Privacy posture
What never leaves the device
The capture half is designed so there is nothing sensitive to intercept. Signals are computed on-device and reduced to an opaque session token before anything is transmitted. The consumption half only returns evidence the engine has already sealed — the API cannot be used to re-derive raw signals or re-decide an application.
The SDK emits a session token; raw biometric data never leaves the device.
What is real today
Use the API reference; watch this page
The consumption-time API is implemented, generated from the same Zod contracts the server validates against, and runnable against the synthetic demo dataset. The OpenAPI specification documents only implemented endpoints, so capture-time endpoints will appear there — and downloads will appear here — only if the behavioral-biometrics signal graduates from candidate scope.
The boundaries behind the preview — what exists, what does not, and what the data never includes.
Can I download the Kenshiki SDKs today?
No. The browser, iOS, and Android SDKs are an integration preview for a candidate signal. The snippets show the intended contract shape; package coordinates are illustrative and no installable artifacts are published yet.
Does the SDK send raw biometric data to Kenshiki?
No. Signals are computed on-device and reduced to an opaque session token. Only that token leaves the device, and the consumption-time API returns only evidence that has already been sealed by the engine.
Is the live signal demo the production Kenshiki signal?
No. The live panel is a browser-local illustration of the signal classes the candidate axis would draw on. It runs only after you start it, observes only inside its own panel, stores nothing, transmits nothing, and abstains when the sample is too small.
Which half of the integration is real today?
The consumption-time API is implemented and documented in the API reference, running against the synthetic demo dataset. Capture-time endpoints and SDK packages ship only if the behavioral-biometrics signal graduates from candidate scope.