VeryAI Raises $10M Seed Round
Integration Methods /

Native SDK Integration

Native SDK Integration

The VeryAI Native SDK adds palm biometric enrollment and verification to your mobile app. Available for iOS (Swift/ObjC), Android (Kotlin/Java), and React Native.

Getting an SDK key

Native SDK keys are not yet available via the Developer Portal. Contact support@very.org to get your SDK key and client credentials.

Installation

iOS

Swift Package Manager (recommended):

dependencies: [
    .package(url: "https://github.com/veroslabs/very-sdk-ios.git", from: "1.0.16")
]

CocoaPods:

pod 'VerySDK'

Then run pod install.

Add camera permission to Info.plist:

<key>NSCameraUsageDescription</key>
<string>Camera access is needed for palm biometric verification.</string>

Android

Add the dependency to your app-level build.gradle:

dependencies {
    implementation("org.very:sdk:1.0.16")
}

The SDK is published on Maven Central.

Add permissions to AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />

React Native

npm install @veryai/react-native-sdk

For iOS, install the native dependency:

cd ios && pod install

Add camera permission to Info.plist (same as native iOS above).

Published on npm.

Enroll a new user

Pass nil / null / undefined for userId to register a new user. The SDK opens a consent screen, collects the user's email, then guides them through a palm scan.

Email bypass

If your app already has verified user emails, VeryAI can enable email bypass for your integration. When enabled, the SDK skips the email input and OTP screens and goes directly to consent and palm scan. Contact support@very.org to enable this.

iOS (Swift)

import VerySDK

guard VerySDK.isSupported() else {
    print("Device not supported")
    return
}

let config = VeryConfig(
    sdkKey: "your_sdk_key",
    userId: nil,              // nil = new enrollment
    themeMode: "dark"
)

VerySDK.authenticate(
    from: self,
    config: config,
    presentationStyle: .modal
) { result in
    if result.isSuccess {
        print("Auth code: \(result.code)")
    } else {
        print("Error: \(result.errorType) — \(result.errorMessage ?? "")")
    }
}

Android (Kotlin)

import org.very.sdk.VerySDK
import org.very.sdk.VeryConfig
import org.very.sdk.VeryPresentationStyle

if (!VerySDK.isSupported(context)) {
    Log.w("Very", "Device not supported")
    return
}

val config = VeryConfig(
    sdkKey = "your_sdk_key",
    userId = null,                // null = new enrollment
    themeMode = "dark"
)

VerySDK.authenticate(
    context = this,
    config = config,
    presentationStyle = VeryPresentationStyle.FULL_SCREEN
) { result ->
    if (result.isSuccess) {
        Log.d("Very", "Auth code: ${result.code}")
    } else {
        Log.e("Very", "Error: ${result.errorType} — ${result.errorMessage}")
    }
}

React Native

import { VerySDK } from '@veryai/react-native-sdk';

const supported = await VerySDK.isSupported();
if (!supported) {
  console.warn('Device not supported');
  return;
}

const result = await VerySDK.authenticate({
  sdkKey: 'your_sdk_key',
  userId: undefined,            // undefined = new enrollment
  themeMode: 'dark',
  presentationStyle: 'fullScreen',
});

if (result.isSuccess) {
  console.log('Auth code:', result.code);
  console.log('User ID:', result.userId);
} else {
  console.error('Error:', result.error, result.errorMessage);
}

Verify an existing user

Pass the user's ID from a previous enrollment to verify their identity.

iOS (Swift)

let config = VeryConfig(
    sdkKey: "your_sdk_key",
    userId: "vu-1ed0a927-...",   // from previous enrollment
    themeMode: "dark"
)

VerySDK.authenticate(from: self, config: config) { result in
    if result.isSuccess {
        print("Verified: \(result.code)")
    }
}

Android (Kotlin)

val config = VeryConfig(
    sdkKey = "your_sdk_key",
    userId = "vu-1ed0a927-...",
    themeMode = "dark"
)

VerySDK.authenticate(context = this, config = config) { result ->
    if (result.isSuccess) {
        Log.d("Very", "Verified: ${result.code}")
    }
}

React Native

const result = await VerySDK.authenticate({
  sdkKey: 'your_sdk_key',
  userId: 'vu-1ed0a927-...',   // from previous enrollment
  themeMode: 'dark',
});

if (result.isSuccess) {
  console.log('Verified:', result.code);
}

Exchange the auth code (backend)

When authentication succeeds, the SDK returns an authorization code. Send this to your backend, which exchanges it for an id_token:

POST https://api.very.org/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=your_client_id
&client_secret=your_client_secret
&code=AUTH_CODE_FROM_SDK
&redirect_uri=your_redirect_uri

Response:

{
  "access_token": "eyJhbGciOi...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "id_token": "eyJhbGciOi..."
}

Decode the id_token JWT to get the user's identity:

{
  "iss": "https://connect.very.org",
  "sub": "vu-1ed0a927-a336-45dd-9c73-20092db9ae8d",
  "aud": ["your_client_id"],
  "email": "user@example.com",
  "exp": 1761013475,
  "iat": 1761009875
}
  • For enrollment: store the sub (user ID) — pass it as userId for future verifications
  • For verification: confirm the sub matches the expected user

Important: The client_secret for token exchange must only be stored on your backend. Never embed it in the mobile app.

Configuration reference

VeryConfig

Parameter Type Default Description
sdkKey String required Your SDK API key
userId String? nil Nil for enrollment, user ID for verification
language String? device Locale code (e.g. "en", "es", "ja"). 35 languages supported.
themeMode String "dark" "dark" or "light"
baseUrl String? production Override API endpoint (for staging/testing)
presentationStyle Enum modal / fullScreen iOS: .modal, .push, .embed. Android: FULL_SCREEN, BOTTOM_SHEET. RN: "fullScreen", "bottomSheet".
livenessMode Enum gesture iOS only: .gesture or .touch

VeryResult

Property Type Description
isSuccess Bool Whether authentication completed successfully
code String Authorization code to exchange for id_token on your backend
userId String The user's VeryAI ID
signedToken String? Signed JWT token (when available)
error String? Error code string
errorType VeryErrorType Typed error (see Error Handling)
errorMessage String? Human-readable error message

Requirements

iOS

  • iOS 16.4+
  • Swift 5.0+ / Xcode 16+
  • Camera permission

Android

  • Android 10 (API 29)+
  • 6GB+ RAM
  • Kotlin 1.8+
  • Camera + Internet permissions

React Native

  • React Native 0.73+
  • iOS and Android requirements above
  • Physical device (no simulator)

Use isSupported() to check device compatibility at runtime before showing the verification UI.

Packages

VeryAI

Get the VeryAI app

Scan the QR code to download the app