Recommended Approach: For the best user experience, use our native SDKs instead of WebView integration. Native SDKs handle all the complexity of camera permissions, NFC reading, and liveness detection out of the box.
SDK Availability
| Platform | Distribution | Latest | NFC | Minimum Version | Documentation |
|---|---|---|---|---|---|
| iOS | Swift Package Manager, CocoaPods | 3.6.0 | ✅ (iOS 15+) | iOS 13.0+ (core), iOS 15.0+ (NFC) | iOS SDK Guide |
| Android | Maven (custom repo, me.didit:didit-sdk) | 3.5.8 | ✅ | API 21+ (Android 5.0) | Android SDK Guide |
| React Native | npm / yarn (@didit-protocol/sdk-react-native) | 3.3.2 | ✅ | RN 0.76+ (New Architecture), iOS 13.0+ / Android API 24+ | React Native SDK Guide |
| Flutter | pub.dev (didit_sdk) | 3.7.1 | ✅ | Flutter 3.3+, Dart 3.11+, iOS 13.0+ / Android API 23+ | Flutter SDK Guide |
| Web (JS) | npm (@didit-protocol/sdk-web) | 0.2.0 | — | Any modern browser | Web SDK Guide |
Alternative: If a native SDK isn’t available for your platform yet, you can use WebView Integration as a fallback.
How a verification session flows
Every native SDK consumes the same Didit verification session. The flow is:- Your backend calls
POST /v3/session/withworkflow_idplus any optional context (vendor_data,contact_details,expected_details,metadata,callback). - Didit returns a
session_id, a short-livedsession_token, and a hostedurl. - Your mobile app receives the
session_tokenfrom your backend and passes it to the SDK (startVerification(token: …)). - The native SDK opens the verification UI, the user completes the steps, and the SDK returns a result with the session’s terminal
status(Approved,Declined,In Review, etc.). - Your backend receives the full decision via a webhook (
webhook_type: "status.updated") and persists it.
The SDK result tells you the workflow outcome (status). The complete decision — document fields, face match scores, AML hits, NFC data, warnings — is delivered to your server via webhook and can also be fetched from the Retrieve Session Decision endpoint. Never trust the client-side result alone for authorisation decisions.
iOS SDK
When to use: native Swift / SwiftUI / UIKit apps targeting iOS 13+. A lightweight, server-driven iOS SDK for identity verification with minimal configuration required.GitHub Repository
View source code and examples on GitHub
- SwiftUI and UIKit support
- NFC passport/ID reading (iOS 15+; opt-in
DiditSDK/Coresubspec orDiditSDKCoreSPM product strips NFC) - 53 languages supported
- Customizable UI theming
- Session token or workflow ID integration
Android SDK
When to use: native Kotlin / Jetpack Compose / Java apps targeting Android 5.0 (API 21) or higher. A lightweight, server-driven Android SDK for identity verification with minimal configuration required.GitHub Repository
View source code and examples on GitHub
- Kotlin and Jetpack Compose support
- NFC passport/ID reading (opt-in
me.didit:didit-sdk-coreartifact strips NFC dependencies) - ML-based document and face auto-detection on API 24+ (graceful manual-capture fallback on API 21–23)
- 53 languages supported
- Customizable UI theming
- Session token or workflow ID integration
React Native SDK
When to use: cross-platform React Native or Expo apps that need a single TypeScript API across iOS and Android (RN 0.76+, New Architecture). A cross-platform React Native SDK that wraps the native iOS and Android SDKs with a unified TypeScript API.GitHub Repository
View source code and examples on GitHub
- Single TypeScript API for both iOS and Android
- Expo support with zero-config config plugin (development build required — no Expo Go)
- React Native CLI support
- NFC passport/ID reading (toggle off with
DIDIT_SDK_IOS_NFC_ENABLED=false/diditSdkAndroidNfcEnabled=false) - 53 languages supported (inherited from native SDKs)
- Session token or workflow ID integration
Flutter SDK
When to use: cross-platform Flutter apps that need a single Dart API across iOS and Android (Flutter 3.3+, Dart 3.11+). A cross-platform Flutter SDK that wraps the native iOS and Android SDKs with a unified Dart API.pub.dev Package
View package on pub.dev
- Single Dart API for both iOS and Android
- Platform channel integration with native SDKs
- NFC passport/ID reading (toggle off with
DIDIT_SDK_IOS_NFC_ENABLED=false/diditSdkAndroidNfcEnabled=false) - 53 languages supported (inherited from native SDKs)
- Session token or workflow ID integration
Web SDK (JavaScript)
When to use: browser-based apps and web frameworks (React, Vue, Angular, Next.js, Nuxt, Svelte, vanilla JS). The Web SDK opens the hosted verification flow in a modal or inline iframe — for mobile apps, prefer the native SDKs above. A JavaScript SDK for web applications with React, Vue, Angular, Next.js, Nuxt, Svelte, and vanilla JS support.NPM Package
View package on npm
- Programmatic session management and event callbacks
- React, Vue, Angular, Next.js, Nuxt, Svelte, and vanilla JS support
- Full TypeScript support
- Modal & inline (embedded) modes
- State management for custom UI
Choosing an integration
Native SDKs are the best fit when you need NFC e-passport reading, the lowest-latency camera capture, and an in-app experience indistinguishable from your other native screens. Use WebView Integration as a fallback when you cannot ship a native SDK update (for example, brownfield apps you cannot rebuild, or platforms without a Didit native SDK).| Feature | Native SDKs | WebView |
|---|---|---|
| User experience | Native screens, full gesture support | Hosted web flow in a system browser/WebView |
| Camera capture | On-device, SDK-tuned for ID and selfie | Browser-dependent |
| NFC e-passport reading | ✅ Supported (iOS 15+, NFC-capable Android) | ❌ Not available |
| Liveness performance | Native ML pipeline | Browser ML pipeline |
| White-label theming | ✅ Console-driven | ✅ Console-driven |
| App Store / Play Store review impact | Adds NFC entitlement and binary size | None — just opens a URL |
| When to use | Production apps, NFC workflows, best UX | Quick integration, web-only stack, fallback |