Skip to content
DEVELOPERS / SDKS & API

Verification, live in an afternoon.

Drop in one SDK — Web, iOS or Android — and launch a fully managed document, face and liveness flow. The same configure → launch → result contract on every platform.

Web · iOS · AndroidREST + WebhooksSandbox keys
install
# Web
npm i @alialjundi/web-sdk

# iOS — Swift Package Manager
github.com/Othento/ios-sdk

# Android — Gradle
com.othento:othento-core:0.1.0
ONE CONTRACT

One API, three platforms

Web, iOS and Android share the same model: configure a session, launch a flow, receive one terminal result. Learn it once.

LIGHTWEIGHT

~3.6 KB, zero dependencies

The web SDK is a tiny, framework-agnostic module with first-class TypeScript types and no runtime dependencies.

KEYS SAFE

Create or Token mode

Start fast with a public key, or mint a session token on your server (Token mode) to keep credentials off the client entirely.

DROP-IN UI

Hosted modal or inline

Launch a polished modal flow, or embed the verification UI inline in your own container. The capture experience is fully managed.

SDKs

Pick your platform.

Web

npm · v0.6.0
npm i @alialjundi/web-sdk
  • ESM & CommonJS
  • TypeScript types included
  • Framework-agnostic
View on npm →

iOS

SPM · iOS 15+
github.com/Othento/ios-sdk
  • Swift Package Manager
  • SwiftUI & UIKit
  • Swift 5.9+
View on GitHub →

Android

Gradle · minSdk 24
com.othento:othento-core:0.1.0
  • Jetpack Compose
  • Kotlin 2.0
  • Java 17
View on GitHub →
Quickstart

Three required fields, one call.

Configure a session with your workflow, key and a user identifier — then start the flow and handle one terminal result.

index.html
import { OthentoSDK } from '@alialjundi/web-sdk';

const sdk = new OthentoSDK({
  mode: 'create',
  apiKey: 'pk_sandbox_•••',
  workflowExternalId: 'wf_onboarding',
  clientData: 'user-123',

  onCompleted: ({ decision, externalId }) => {
    // 'Approved' | 'Declined' | 'InReview'
    console.log(decision, externalId);
  },
  onCancelled: ({ reason }) => console.log('cancelled', reason),
  onError: (err, message) => console.error(err.code, message),
});

sdk.start();
Integration model

Two ways to start a session.

CREATE MODE

Fastest to integrate

Configure the SDK with a public key, your workflowExternalId and a clientData identifier. The SDK mints the session for you. Ideal for prototypes and trusted environments.

TOKEN MODE

Recommended for production

Mint a session access token (sat) on your server and pass it to the SDK. No API keys ever reach the client — your backend stays the single source of trust.

On web you can launch the flow as a hosted modal or render it inline by passing a container. The iOS and Android SDKs present the flow natively (SwiftUI / UIKit and Jetpack Compose).

Configuration

The session config.

The same options across every SDK. Three fields are required to create a session; the rest are optional.

OptionTypeRequiredDescription
mode'create' | 'token'RequiredStart a new session (create) or resume a server-minted one (token).
apiKeystringOptionalPublic key. pk_sandbox_… for testing, pk_live_… for production.
workflowExternalIdstringOptionalThe verification workflow to run for this session.
clientDatastringOptionalYour end-user identifier — echoed back on events and webhooks.
satstringOptionalServer-minted session access token; keeps API keys off the client.
expectedDetailsobjectOptionalPre-filled identity hints (name, DOB, nationality, document number…).
callbackUrlstringOptionalWebhook / redirect URL for terminal session notifications.
metadatastringOptionalFree-form string round-tripped on session events and webhooks.

Web presentation options

containerHTMLElement | stringRender inline in your element instead of a modal (CSS selector or node).
showCloseButtonbooleanModal only. Hide the × button when your UI provides dismissal.
closeOnBackdropClickbooleanModal only. Treat a backdrop click as a cancellation.
Lifecycle

One terminal result, always.

Exactly one of onCompleted, onCancelled or onError fires per session — so your handling stays simple.

onReady()

The flow has loaded and the handshake is complete. Fires once, first.

Progress
onSessionCreated()

A session was minted — persist the externalId against your user record.

Progress
onStatusChange()

The session moved through Created → InProgress → Processing.

Progress
onCompleted()

Verification reached a decision: Approved, Declined or InReview.

Terminal
onCancelled()

The user dismissed or cancelled the flow before a decision.

Terminal
onError()

A non-decision terminal error (e.g. network, camera permission).

Terminal
DECISION

Returned by onCompleted.

ApprovedDeclinedInReview
SESSION STATUS

Streamed via onStatusChange.

CreatedInProgressProcessingCompletedExpiredFailed
Security model

Safe by construction.

PII ISOLATION

Biometrics never touch your servers

Document images and selfies are captured and uploaded directly to Othento — they never cross the host page or your backend, shrinking your compliance scope.

VERIFIED BRIDGE

Origin-checked messaging

The web SDK talks to a fixed, hard-coded origin and verifies the sender on every message; a protocol mismatch surfaces as a clear error.

SCOPED KEYS

Least-privilege public keys

Public keys can only mint sessions and read their own data. Use Token mode to keep even those off the client and mint sessions server-side.

SANDBOX

Test end to end with pk_sandbox_… keys and sample documents to exercise the Approved, Declined and InReview paths — then swap to pk_live_… for production. No environment flag to flip; the key prefix decides.

Get started

Ready to build?

Get sandbox keys and a workflow ID, and ship a verification flow this week.