Release notes, Releases Flutter SDK

Flutter SDK Release Notes

4.23.0

30 October 2026

CurpValidation

  • Added optional validationEnabled parameter to the CURP module (addCurpValidation). When set to to false, a CURP is captured in a valid format without a RENAPO check, valid and data are null, and status is success when a CURP in a valid format was captured. Omit this parameter to keep the native SDK default, which is true.
  • Breaking change Added status and resultCode to CurpValidationResult, as on the Phone, Email, and FullName results. status follows valid: it is success only when RENAPO accepted the CURP. The constructor takes them as required named parameters. See the Migration Guide.
  • Breaking change On Android: onCurpValidationCompleted is now called once per module, with the final result, as on iOS. Previously it was also called for each failed attempt before the last one. See the Migration Guide.
  • CurpValidationResult now has the same shape on both platforms. curp, valid, and data are null when the SDK has no value, and every level of data is a Map<String, dynamic>.
  • Fixed onCurpValidationCompleted failing to parse a result without data, for example after a failed validation request on Android.

Flow methods

  • Breaking change onError of startOnboarding, startOnboardingSection, startFlow, and startFlowFromDeepLink now receives an IncodeSdkFlowError code, such as permissionsDenied, instead of the native error message. Convert it with error.toIncodeSdkFlowError(). startWorkflow already has this functionality. See the Migration Guide.

  • Breaking change When you do not pass onUserCancelled, a cancelled flow now calls onError with userCancelled. Previously, no callback was called.

  • Breaking change A flow that the system interrupted now calls onError with the new interrupted code on Android and iOS. Previously, the flow never finished on Android and reported unknown on iOS.

  • Breaking change IncodeSdkFlowError has eleven new values:

    • iOS: sessionCreationFailed, captchaNotVerified, noActiveSession
    • Android: insufficientDiskSpace, onDeviceProcessingNotCompatible
    • Both: videoSelfieNotCompleted, interrupted, biometricConsentNotGiven, biometricConsentNotReceived, sectionAlreadyRunning, and activityNotPresent.

    A switch over IncodeSdkFlowError without a default no longer compiles until it handles them.

  • Breaking change Some flow errors now report a more specific code where unknown was reported before:

    • videoSelfieNotCompleted, locationUnavailable, permissionsDenied, biometricConsentNotGiven and biometricConsentNotReceived
    • iOS: sessionCreationFailed, captchaNotVerified and noActiveSession
    • Android: insufficientDiskSpace and onDeviceProcessingNotCompatible.

    On Android, an unavailable location now reports locationUnavailable or permissionsDenied instead of onGeolocationUnavailable.

  • Breaking change startFlow now reports start-up failures through onError and ends the flow:

    • activityNotPresent without a host Activity or view controller
    • configError when sessionConfig has neither a configurationId nor a token

    Previously, Android started the flow from the application context, and iOS returned Error: No rootViewController found without ending the flow.

  • Breaking change Renamed startNewOnboardingSection to startOnboardingSection, and its flowTag parameter to sectionTag. onOnboardingSectionCompleted still receives the tag. See the Migration Guide.

  • Breaking change startOnboardingSection now requires a sectionTag that is not blank. An empty or whitespace-only sectionTag calls onError with configError, and the section does not start. Previously, Android never finished the call for an empty tag, and both platforms started a section with a whitespace-only tag.

  • Breaking change A startOnboardingSection call made while another section runs now calls onError with sectionAlreadyRunning on Android and iOS, and the running section continues. Previously, the second call took over the event stream, so the running section stopped reporting results and never finished. Start the next section from onSuccess, not from onOnboardingSectionCompleted.

  • Breaking change startOnboardingSection now reports start-up failures through onError and ends the call the same way on Android and iOS:

    • activityNotPresent without a host Activity or view controller
    • noActiveSession without an onboarding session
    • unknownModule for a module this SDK version does not support
    • configError for an invalid flowConfig or recordSessionConfig.

    Previously, Android started the section from the application context and returned an invalid configuration as a message that never reached onError, and iOS reported every configuration error as unknownModule.

  • startOnboardingSection and startFlow now run through the shared Incode bridge, so they start and fail the same way on Android and iOS. See the Migration Guide.

  • startWorkflow now reports activityNotPresent instead of unknown when there is no host Activity or view controller.

  • Added the videoSelfieNotCompleted, interrupted, biometricConsentNotGiven, biometricConsentNotReceived, sessionCreationFailed (iOS only), captchaNotVerified (iOS only), sectionAlreadyRunning, noActiveSession (iOS only; on Android startOnboardingSection only), insufficientDiskSpace (Android only), onDeviceProcessingNotCompatible (Android only) and activityNotPresent codes to IncodeSdkFlowError.

  • Added an optional onSuccess callback to startOnboardingSection. It is called once with the sectionTag when the section finished, and you can start the next section from it. After a cancel, call setupOnboardingSession again before you start the next section.

  • Deprecated onOnboardingSectionCompleted of startOnboardingSection. Use onSuccess, which receives the sectionTag. onOnboardingSectionCompleted still works: it is called with the same tag just before onSuccess, and you can still start the next section from it.

  • Fixed flows that never finished: a cancelled flow, a finished section, and an Android flow that the system interrupted (Android SDK onInterrupted) now end the flow with exactly one final callback. This applies to startOnboarding, startOnboardingSection, startFlow, startFlowFromDeepLink, and startWorkflow.

Geolocation

  • Breaking change Changed GeoLocationResult to the shared native contract: the address moved to addressFields, and latitude, longitude, status, and resultCode were added. Address fields are null instead of "" when unknown. The top-level city, colony, postalCode, state, and street fields are removed; read them from addressFields. See the Migration Guide.
  • Breaking change Changed state on Android to hold the country name, as it already did on iOS. It previously held the region. city now falls back to the region when the city is unknown on both platforms.
  • Breaking change Fixed a bug on Android where an unavailable location raised an onGeolocationUnavailable error on the event stream, which ended the startOnboarding / startOnboardingSection call even when the native SDK continued the flow. It is now delivered to onGeolocationCompleted with status fail, as on iOS.
  • Changed GeoLocationResult.error to be reported on Android too, with the actual cause instead of a hardcoded permissionsDenied.
  • Changed onError on Android to report permissionsDenied or locationUnavailable for a non-skippable Geolocation failure, instead of unknown.
  • Changed addGeolocation to send isSkippable only when you set it, so the native SDK default applies otherwise.

Enhancements

  • Added the setLogo method. It sets a custom logo for the SDK screens, including every UX V2 screen. Pass the name of an image of your app: a drawable resource name on Android, and an image asset name on iOS. If the name cannot be resolved, onError is called with appearanceError. On Android, add the drawable to res/raw/keep.xml or the Android shrinker removes it from release builds.
  • Breaking change On iOS: startFaceLogin now ignores a call made while another Face Login is in progress. Neither onSuccess nor onError is called for the ignored call. Wait for the current Face Login to finish before you start another. See the Migration Guide.
  • On iOS: the local 1:1 startFaceLogin now shows "User not found" for a face that does not match the enrolled user. The result is delivered when the user taps Continue. The result already reported faceMatched == false. Previously, the success screen was shown.

Working with Android SDK 5.55.0 and iOS SDK 5.51.0

4.22.0

7 October 2026

4.22.0

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 and Results 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.

  • Breaking change 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.

  • Breaking change 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.

  • Breaking change 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.

  • Breaking change 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.

  • Breaking change On Android: getUserScore's fetchMode now defaults to accurate, previously fast.

  • Breaking change On Android: getUserScore now reports userScoreFailed when a session produced no score, instead of completing with an empty result.

  • Breaking change On iOS: the plugin now depends on IncodeBridgeCommon, which requires a new spec repository source in your Podfile.

  • Breaking change On iOS: getUserScore's onError now delivers IncodeSdkFlowError codes instead of the native SDK's error strings.

  • Breaking change Renamed faceMatch()'s faceMatchType parameter to matchType. The FaceMatch module's flow-config parameter is still faceMatchType.

  • Breaking change 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.

  • Breaking change 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.

  • Breaking change 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.

  • 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.

  • Enhanced jailbreak detection on iOS. Add the URL schemes it queries to LSApplicationQueriesSchemes in your app's Info.plist. See Installation.

Fixes

  • Breaking change 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.
  • 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

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.
  • 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.
  • 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

4.20.0

27 August 2026

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.
  • 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.
  • 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.

Working with Android SDK 5.51.0 and iOS SDK 5.47.0

4.19.0

29 July 2026

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

4.18.0

23 June 2026

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

4.17.0

28 May 2026

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

4.16.0

12 May 2026

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

4.15.0

29 April 2026

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

4.14.0

7 April 2026

4.14.0
  • Added support for Android SDK initialization without api key and with e2ee url.
  • Breaking change Added parameter showIdTypeChooser to IDScan module. See the Migration Guide. 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

4.13.0

26 February 2026

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

4.12.0

6 February 2026

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

4.11.0

2 December 2025

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

Was this page helpful?