---
title: "Flutter SDK Release Notes"
url: "https://developer.incode.com/release-notes/releases-flutter-sdk/"
section: "release-notes"
group: "Releases Flutter SDK"
version: "v1.1"
status: "live"
---
# Flutter SDK Release Notes
## 4.22.0
_7 October 2026_

### Enhancements

- Added the `configError` code to `IncodeSdkFlowError`. `startWorkflow` reports it before the Workflow starts when `sessionConfig` has neither a `configurationId` nor a `token`. Previously Android reported a generic SDK error, and iOS failed only after making network requests.
- Added optional `interviewId` parameter to the `getUserScore` method.
- Added `userScoreFailed` and `userCancelled` error codes to `IncodeSdkFlowError` for the `getUserScore` method.
- Added additional fields to the `UserScoreResult` class and turned its sections into structured objects. See [Migration Guide](/release-notes/flutter-migration-guide/#migration-to-4220) and [Results](/sdk-reference/flutter-results/#getuserscore) for more details.
- Added `approve` method to programmatically initiate approval of the user.
- Added `error` to `ApprovalResult`. It reports the module-level error from the native SDK using `IncodeSdkFlowError` values.
- Added optional `documentSources` parameter to the `DocumentScan` module. It takes a `List<DocumentSource>` (`camera`, `photoUpload`, `fileUpload`) and defines which capture sources are offered to the user. It applies to both the V1 and V2 UI. `fileUpload` is ignored on both Android and iOS for document types that don't support PDF uploads (`medicalDoc`); if it was the only source, the native SDK default applies.
- Added optional `mergeSessionRecordings` to `OnboardingSessionConfiguration`. It is only honoured by `startWorkflow()` and ignored by the other entry points that take an `OnboardingSessionConfiguration`. Omit it to keep current behaviour.

- <Pill type="breaking" /> `startWorkflow`'s `onError` now receives an `IncodeSdkFlowError` code, such as `permissionsDenied`, instead of the native error message. Convert it with `error.toIncodeSdkFlowError()`. See the [Migration Guide](/release-notes/flutter-migration-guide/).
- <Pill type="breaking" /> The `otpVerificationEnabled` parameter on the `Phone` and `Email` modules is now named `otpVerification`, matching the native SDK. It affects `addPhone()`, `addEmail()`, `PhoneModule`, and `EmailModule`. See the [Migration Guide](/release-notes/flutter-migration-guide/).
- <Pill type="breaking" /> `PhoneNumberResult.phone` is now nullable (`String?`). It was non-nullable, but the value is absent when the SDK captured no number, for example when the user cancelled, which would have thrown at runtime. See the [Migration Guide](/release-notes/flutter-migration-guide/).
- <Pill type="breaking" /> On Android: user score values no longer include the `/100` suffix, in both `getUserScore` results and the `onUserScoreFetched` callback. A score whose status was `manual` previously came through as a localized phrase rather than a number.
- <Pill type="breaking" /> On Android: `getUserScore`'s `fetchMode` now defaults to `accurate`, previously `fast`.
- <Pill type="breaking" /> On Android: `getUserScore` now reports `userScoreFailed` when a session produced no score, instead of completing with an empty result.
- <Pill type="breaking" /> On iOS: the plugin now depends on `IncodeBridgeCommon`, which requires a new spec repository source in your Podfile.
- <Pill type="breaking" /> On iOS: `getUserScore`'s `onError` now delivers `IncodeSdkFlowError` codes instead of the native SDK's error strings.
- <Pill type="breaking" /> Renamed `faceMatch()`'s `faceMatchType` parameter to `matchType`. The `FaceMatch` module's flow-config parameter is still `faceMatchType`.
- <Pill type="breaking" /> Renamed `OnboardingSessionConfiguration`'s `userRegion` parameter to `region`, and `onboardingValidationModules` to `validationModules`. Affects every entry point taking an `OnboardingSessionConfiguration`. `region` no longer defaults to `ALL` when omitted; pass it explicitly if you relied on that. `region` remains Android only. See the [Migration Guide](/release-notes/flutter-migration-guide/).
- <Pill type="breaking" /> Changed `faceMatch()`'s `onError` signature from `Function(String error)` to `Function(String code, String message, PlatformException? cause)`, matching `setQuantityStrings`. Codes are `faceMatchError` and, on Android, `userCancelled`, replacing the previous `"UserCancelled"` string. A cancellation reaches `onError` as `userCancelled` when no `onUserCancelled` callback is supplied.
- <Pill type="breaking" /> Changed `faceMatch()`'s `confidence`, `nfcVsIdConfidence` and `nfcVsSelfieConfidence` on Android to return `null` when there was nothing to compare, instead of `-1`. Check for `null` instead of comparing to `-1`.
- `Phone`, `Email`, and `FullName` results now share one shape on both platforms: the captured value, plus `status` and `resultCode` on `PhoneNumberResult`, `AddEmailResult` and `AddFullNameResult`. Both are non-nullable, so every result carries them on both platforms. `status` (`success` / `fail`) is the portable outcome; `resultCode` is the finer detail, reporting `success` and `error` on both platforms and additionally `userCancelled` and `emulatorDetected` on Android, since on iOS a cancellation is reported at the session level rather than through a module callback.
- `ApprovalResult.uuid` and `ApprovalResult.customerToken` are now `null` on iOS when the user was not approved. Previously they were reported as empty strings. See the [Migration Guide](./flutter-migration-guide).
- `PhoneModule.defaultRegionPrefix` is now validated consistently on both platforms. Values outside `1`-`9999` are ignored and the device's own region prefix is used, matching the documented behavior. Previously an out-of-range value was ignored on Android but passed through on iOS.
- Deprecated the `showDocumentProviderOptions` parameter of the `DocumentScan` module. It maps to the deprecated native chooser flags, is not applied in V2, and is ignored when `documentSources` is provided. Use `documentSources` instead. See the [Migration Guide](/release-notes/flutter-migration-guide/).
- Enhanced jailbreak detection on iOS. Add the URL schemes it queries to `LSApplicationQueriesSchemes` in your app's `Info.plist`. See [Installation](/sdk-reference/flutter-installation/).

### Fixes

- <Pill type="breaking" /> A flow configuration naming an unrecognized module now reports `unknownModule` through `onError` instead of being skipped. Previously, Android silently dropped the module with no log at all; iOS logged it with `print`, which does not reach device logs in release. Either way, the flow ran without the step and still reported success, so a stale module name was invisible. See the [Migration Guide](/release-notes/flutter-migration-guide/).
- Fixed a crash on iOS when a user score contained a `warn` status, or a status the SDK left unset.
- Fixed `faceMatch()`'s `FaceMatchResult.isFaceMatched`, `isNameMatched`, `nfcVsIdConfidence`, `nfcVsSelfieConfidence` and `secondIdConfidence` on iOS returning `false`/`0` when there was no data to compare. They now return `null`, so `false`/`0` means a real result. No action needed unless you need to tell the two apart.

Working with Android SDK 5.54.0 and iOS SDK 5.50.0

## 4.21.0 
_16 September 2026_

<Accordion title="4.21.0">

- Added optional `minVideoLengthRequired` parameter to the `VideoSelfie` module.
- Added `locationUnavailable` to `IncodeSdkFlowError`.
- Added `storageUnavailable` to `IncodeSdkFlowError`. Android only. Flow APIs report it when the device cannot provide a writable images directory, so the flow now fails at start instead of losing captures later on.
- On Android, the SDK reports the user-cancel tracking event as `userCanceled` instead of `userCancelled`. The `onUserCancelled` callback is unchanged. See the [Migration Guide](./flutter-migration-guide).
- On Android, the Video Selfie V2 camera steps hide the close (X) button, so `showCloseButton` no longer applies to them. Other screens are unaffected.
- On Android, Signature V2 reads its title and description from the new `onboard_sdk_signature_capture_title` and `onboard_sdk_signature_capture_description` string resources. See the [Migration Guide](./flutter-migration-guide).
- Fixed a bug on iOS where a skipped, denied or unavailable location during the `Geolocation` module ended the `startOnboarding` / `startOnboardingSection` call immediately.

Working with Android SDK 5.53.0 and iOS SDK 5.49.0

</Accordion>

## 4.20.0
_27 August 2026_

<Accordion title="4.20.0">

- Added a `setQuantityStrings` method, used to localize plural texts on Android.
- `setTheme` and `setUXConfig` now take a JSON `String` instead of `Map<String, dynamic>`. Encode maps with `jsonEncode` before calling. See the [Migration Guide](./flutter-migration-guide).
- Added an optional `sdkMode` parameter to `init()`. It accepts the same values as `setSdkMode`, so you can set the mode during initialization.
- Added a `sendDiagnosticsData` parameter to `init()`, for iOS only. Set to `false` to prevent the Incode SDK from sending diagnostic data. If omitted, the native SDK default is used (`true`). Ignored on Android.
- Added `configError` and `invalidInitParams` codes to `IncodeSdkInitError`. Initialize failures now also include a human-readable `message`; `onError` still receives the error **code**.
- Removed unused `waitForTutorials` parameter from `init()`. Tutorial behavior is configured per module with `showTutorials`; see [Modules](./flutter-modules).
- Updated the Android build requirements: `compileSdk` 36, Kotlin Gradle plugin `2.2.21`, Android Gradle Plugin `8.9.1`, and Gradle `8.14.5` are now the minimums. See the [Migration Guide](./flutter-migration-guide).

Working with Android SDK 5.51.0 and iOS SDK 5.47.0

</Accordion>

## 4.19.0
_29 July 2026_

<Accordion title="4.19.0">

- Added support for Dart 3.x. The plugin's SDK constraint was widened to `>=2.12.0 <4.0.0`.
- Added optional `voiceConsentLanguage` parameter to `OnboardingSessionConfiguration` to set the voice consent language in the `VideoSelfie` module. Supported values: 'en', 'es', 'pt', and 'he'. Default is English.
- Added SNA (Silent Network Authentication) to `PhoneModule` (only available via Flows integration and on a new variant `-sna`).
- Replaced `jailbreakDetected` error code with `integrityCompromised` in `IncodeSdkFlowError` to indicate that the device integrity has been compromised (e.g., jail-broken or rooted).
- Removed `disableJailbreakDetection` parameter from `init()` method.

Working with Android SDK 5.50.0 and iOS SDK 5.46.0

</Accordion>

## 4.18.0
_23 June 2026_

<Accordion title="4.18.0">

- Added `isInitialized` method that returns a boolean indicating whether the SDK has been fully initialized.
- Deprecated `FaceAuthMode.server` in `startFaceLogin`. Migrate to the `FaceAuthentication` module instead. `FaceAuthMode.local` and `startFaceLogin()` with local mode remain fully supported.
- Deprecated `IncodeSdkFlowError.badEnvDetected`. It is no longer reported: the native SDK now terminates the process when a compromised device environment is detected, so the error can never be delivered via `onError`. It will be removed in a future release.
- Fixed an Android ANR ("Input dispatching timed out" / `FocusEvent`) that could occur at startup. SDK setup calls (`initialize`, `setSdkMode`, `setTheme`, `setUXConfig`, etc.) now run off the platform main thread, with results marshaled back to it.

Working with Android SDK 5.49.0 and iOS SDK 5.44.0

</Accordion>

## 4.17.0
_28 May 2026_

<Accordion title="4.17.0">

- Updated the default values of the `faceMaskCheck`, `eyesClosedCheck`, `headCoverCheck` and `lensesCheck` parameters to `true` in the `FaceAuthentication` module.
- Updated the default values of the `faceMaskCheck` and `lensesCheck` parameters to `true` in the `SelfieScan` module.
- Fixed a bug on iOS where the `MLConsent` module screen was not shown when `type` was not provided. The `type` parameter of `MLConsent` module is now required.
- Fixed: `showCloseButton(allowUserToCancel: false)` now correctly hides the close button on Android. Previously the button was always shown regardless of the parameter value.

Working with Android SDK 5.48.0 and iOS SDK 5.44.0

</Accordion>

## 4.16.0
_12 May 2026_

<Accordion title="4.16.0">

- Added `isSkippable` flag to the `Geolocation` module. It allows the geolocation step to be skipped. When set to `true`, skipping or denying location permission advances the flow instead of ending the session with a permission error.
- Added `allAttemptsExhausted` flag to `IdScanResult` and `SelfieScanResult` indicating when capture or upload retries are no longer available.
- Added per-attempt `IdScan` callbacks `onIdFrontAttemptCompleted` / `onIdBackAttemptCompleted`. They fire after every individual capture attempt, including intermediate failures. The terminal attempt is signaled when `IdScanResult.allAttemptsExhausted` is `true` or when the attempt succeeds.
- Added per-attempt `SelfieScan` callback `onSelfieScanAttemptCompleted`. It fires after every individual selfie capture attempt, including intermediate failures. The terminal attempt is signaled when `SelfieScanResult.allAttemptsExhausted` is `true` or when the attempt succeeds.

Working with Android SDK 5.47.0 and iOS SDK 5.43.0

</Accordion>

## 4.15.0
_29 April 2026_

<Accordion title="4.15.0">

- Added `deleteLocalUserData` method.
- Added new internal Android dependency com.incode.sdk.hybrid-bridge that is required to have to a successful build. In case you're experiencing issues fetching it during gradle sync phase please contact your Incode representative, as your account access might have to be updated.
- Fixed UIScene lifecycle crash on iOS.

Working with Android SDK 5.46.0 and iOS SDK 5.42.0

</Accordion>

## 4.14.0
_7 April 2026_

<Accordion title="4.14.0">

- Added support for Android SDK initialization without api key and with e2ee url.
- Added parameter `showIdTypeChooser` to `IDScan` module. ID Document Chooser visibility is now controlled solely by the `showIdTypeChooser` parameter in `addIdScan`. Previously, setting `idType` implicitly hid the chooser. The configured `idType` is now only used as a pre-selection when the chooser is disabled `(showIdTypeChooser == false)`
- Added new parameter `e2eeEncryptionEnabled` for `startFaceLogin` method that enables End-to-End Encryption (E2EE) on Android.
- Introduced `startFaceMatch` method to perform a face match without showing UI.
- Fixed a bug caused by `flowTag` having been an optional parameter of `startNewOnboardingSection`. It is now required to provide a `flowTag` to use `startNewOnboardingSection`.
- Removed parameters `disableHookDetection`, `disableEmulatorDetection`, `disableRootDetection`, `disableVirtualEnvironmentDetection` from `init` method.
- Removed `simulatorDetected`, `rootDetected`, `hookDetected`, `virtualEnvDetected` from `IncodeSdkFlowError`.

Working with Android SDK 5.45.1 and iOS SDK 5.41.0

</Accordion>

## 4.13.0
_26 February 2026_

<Accordion title="4.13.0">

- Added `enableFrontShownAsBackCheck` and `enableBackShownAsFrontCheck` optional parameters to the `VideoSelfie` module.
- Deprecated `autocaptureUxMode` parameter from the `IdScan` module.
- Deprecated `enableIdSummaryScreen` parameter from the `ProcessId` module.
- Fixed issue preventing custom V2 theme from applying when configured via JSON.

Working with Android SDK 5.44.0 and iOS SDK 5.40.0

</Accordion>

## 4.12.0
_6 February 2026_

<Accordion title="4.12.0">

- Added new Flutter SDK variant '-l', so now Flutter SDK is delivered in multiple variants:
  4.12.0: Standard variant
  4.12.0-vc: Includes streaming
  4.12.0-nfc: Includes NFC
  4.12.0-l: Includes local face recognition models
- Removed the `enableRotationOnRetakeScreen` parameter from the `IdScan` module. Captured documents are now always displayed in a vertical orientation on the Review Screen.
- Renamed the `showRetakeScreen` parameter to `showRetakeScreenForManualCapture` in the `IdScan` module.
- Renamed the `showAutoCaptureRetakeScreen` parameter to `showRetakeScreenForAutoCapture` in the `IdScan` module.

Working with Android SDK 5.43.0 and iOS SDK 5.39.1

</Accordion>

## 4.11.0
_2 December 2025_

<Accordion title="4.11.0">

- Added optional `sslPinningEnabled` and `forceSSLPinning` parameters to the `init` method to support SSL pinning configuration.
- Added `title` and `description` params to the `Signature` module.
- Fixed error handling on Android.

Working with Android SDK 5.41.1 and iOS SDK 5.38.0

</Accordion>