4.23.0
30 October 2026
CurpValidation
- Added optional
validationEnabledparameter to theCURPmodule (addCurpValidation). When set to tofalse, a CURP is captured in a valid format without a RENAPO check,validanddataarenull, andstatusissuccesswhen a CURP in a valid format was captured. Omit this parameter to keep the native SDK default, which istrue. - Breaking change Added
statusandresultCodetoCurpValidationResult, as on thePhone,Email, andFullNameresults.statusfollowsvalid: it issuccessonly when RENAPO accepted the CURP. The constructor takes them as required named parameters. See the Migration Guide. - Breaking change On Android:
onCurpValidationCompletedis 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. CurpValidationResultnow has the same shape on both platforms.curp,valid, anddataarenullwhen the SDK has no value, and every level ofdatais aMap<String, dynamic>.- Fixed
onCurpValidationCompletedfailing to parse a result withoutdata, for example after a failed validation request on Android.
Flow methods
Breaking change
onErrorofstartOnboarding,startOnboardingSection,startFlow, andstartFlowFromDeepLinknow receives anIncodeSdkFlowErrorcode, such aspermissionsDenied, instead of the native error message. Convert it witherror.toIncodeSdkFlowError().startWorkflowalready has this functionality. See the Migration Guide.Breaking change When you do not pass
onUserCancelled, a cancelled flow now callsonErrorwithuserCancelled. Previously, no callback was called.Breaking change A flow that the system interrupted now calls
onErrorwith the newinterruptedcode on Android and iOS. Previously, the flow never finished on Android and reportedunknownon iOS.Breaking change
IncodeSdkFlowErrorhas eleven new values:- iOS:
sessionCreationFailed,captchaNotVerified,noActiveSession - Android:
insufficientDiskSpace,onDeviceProcessingNotCompatible - Both:
videoSelfieNotCompleted,interrupted,biometricConsentNotGiven,biometricConsentNotReceived,sectionAlreadyRunning, andactivityNotPresent.
A
switchoverIncodeSdkFlowErrorwithout adefaultno longer compiles until it handles them.- iOS:
Breaking change Some flow errors now report a more specific code where
unknownwas reported before:videoSelfieNotCompleted,locationUnavailable,permissionsDenied,biometricConsentNotGivenandbiometricConsentNotReceived- iOS:
sessionCreationFailed,captchaNotVerifiedandnoActiveSession - Android:
insufficientDiskSpaceandonDeviceProcessingNotCompatible.
On Android, an unavailable location now reports
locationUnavailableorpermissionsDeniedinstead ofonGeolocationUnavailable.Breaking change
startFlownow reports start-up failures throughonErrorand ends the flow:activityNotPresentwithout a host Activity or view controllerconfigErrorwhensessionConfighas neither aconfigurationIdnor atoken
Previously, Android started the flow from the application context, and iOS returned
Error: No rootViewController foundwithout ending the flow.Breaking change Renamed
startNewOnboardingSectiontostartOnboardingSection, and itsflowTagparameter tosectionTag.onOnboardingSectionCompletedstill receives the tag. See the Migration Guide.Breaking change
startOnboardingSectionnow requires asectionTagthat is not blank. An empty or whitespace-onlysectionTagcallsonErrorwithconfigError, 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
startOnboardingSectioncall made while another section runs now callsonErrorwithsectionAlreadyRunningon 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 fromonSuccess, not fromonOnboardingSectionCompleted.Breaking change
startOnboardingSectionnow reports start-up failures throughonErrorand ends the call the same way on Android and iOS:activityNotPresentwithout a host Activity or view controllernoActiveSessionwithout an onboarding sessionunknownModulefor a module this SDK version does not supportconfigErrorfor an invalidflowConfigorrecordSessionConfig.
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 asunknownModule.startOnboardingSectionandstartFlownow run through the shared Incode bridge, so they start and fail the same way on Android and iOS. See the Migration Guide.startWorkflownow reportsactivityNotPresentinstead ofunknownwhen 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 AndroidstartOnboardingSectiononly),insufficientDiskSpace(Android only),onDeviceProcessingNotCompatible(Android only) andactivityNotPresentcodes toIncodeSdkFlowError.Added an optional
onSuccesscallback tostartOnboardingSection. It is called once with thesectionTagwhen the section finished, and you can start the next section from it. After a cancel, callsetupOnboardingSessionagain before you start the next section.Deprecated
onOnboardingSectionCompletedofstartOnboardingSection. UseonSuccess, which receives thesectionTag.onOnboardingSectionCompletedstill works: it is called with the same tag just beforeonSuccess, 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 tostartOnboarding,startOnboardingSection,startFlow,startFlowFromDeepLink, andstartWorkflow.
Geolocation
- Breaking change Changed
GeoLocationResultto the shared native contract: the address moved toaddressFields, andlatitude,longitude,status, andresultCodewere added. Address fields arenullinstead of""when unknown. The top-levelcity,colony,postalCode,state, andstreetfields are removed; read them fromaddressFields. See the Migration Guide. - Breaking change Changed
stateon Android to hold the country name, as it already did on iOS. It previously held the region.citynow 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
onGeolocationUnavailableerror on the event stream, which ended thestartOnboarding/startOnboardingSectioncall even when the native SDK continued the flow. It is now delivered toonGeolocationCompletedwithstatusfail, as on iOS. - Changed
GeoLocationResult.errorto be reported on Android too, with the actual cause instead of a hardcodedpermissionsDenied. - Changed
onErroron Android to reportpermissionsDeniedorlocationUnavailablefor a non-skippableGeolocationfailure, instead ofunknown. - Changed
addGeolocationto sendisSkippableonly when you set it, so the native SDK default applies otherwise.
Enhancements
- Added the
setLogomethod. 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,onErroris called withappearanceError. On Android, add the drawable tores/raw/keep.xmlor the Android shrinker removes it from release builds. - Breaking change On iOS:
startFaceLoginnow ignores a call made while another Face Login is in progress. NeitheronSuccessnoronErroris 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
startFaceLoginnow 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 reportedfaceMatched == 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
configErrorcode toIncodeSdkFlowError.startWorkflowreports it before the Workflow starts whensessionConfighas neither aconfigurationIdnor atoken. Previously Android reported a generic SDK error, and iOS failed only after making network requests.Added optional
interviewIdparameter to thegetUserScoremethod.Added
userScoreFailedanduserCancellederror codes toIncodeSdkFlowErrorfor thegetUserScoremethod.Added additional fields to the
UserScoreResultclass and turned its sections into structured objects. See Migration Guide and Results for more details.Added
approvemethod to programmatically initiate approval of the user.Added
errortoApprovalResult. It reports the module-level error from the native SDK usingIncodeSdkFlowErrorvalues.Added optional
documentSourcesparameter to theDocumentScanmodule. It takes aList<DocumentSource>(camera,photoUpload,fileUpload) and defines which capture sources are offered to the user. It applies to both the V1 and V2 UI.fileUploadis 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
mergeSessionRecordingstoOnboardingSessionConfiguration. It is only honoured bystartWorkflow()and ignored by the other entry points that take anOnboardingSessionConfiguration. Omit it to keep current behaviour.Breaking change
startWorkflow'sonErrornow receives anIncodeSdkFlowErrorcode, such aspermissionsDenied, instead of the native error message. Convert it witherror.toIncodeSdkFlowError(). See the Migration Guide.Breaking change The
otpVerificationEnabledparameter on thePhoneandEmailmodules is now namedotpVerification, matching the native SDK. It affectsaddPhone(),addEmail(),PhoneModule, andEmailModule. See the Migration Guide.Breaking change
PhoneNumberResult.phoneis 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
/100suffix, in bothgetUserScoreresults and theonUserScoreFetchedcallback. A score whose status wasmanualpreviously came through as a localized phrase rather than a number.Breaking change On Android:
getUserScore'sfetchModenow defaults toaccurate, previouslyfast.Breaking change On Android:
getUserScorenow reportsuserScoreFailedwhen 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'sonErrornow deliversIncodeSdkFlowErrorcodes instead of the native SDK's error strings.Breaking change Renamed
faceMatch()'sfaceMatchTypeparameter tomatchType. TheFaceMatchmodule's flow-config parameter is stillfaceMatchType.Breaking change Renamed
OnboardingSessionConfiguration'suserRegionparameter toregion, andonboardingValidationModulestovalidationModules. Affects every entry point taking anOnboardingSessionConfiguration.regionno longer defaults toALLwhen omitted; pass it explicitly if you relied on that.regionremains Android only. See the Migration Guide.Breaking change Changed
faceMatch()'sonErrorsignature fromFunction(String error)toFunction(String code, String message, PlatformException? cause), matchingsetQuantityStrings. Codes arefaceMatchErrorand, on Android,userCancelled, replacing the previous"UserCancelled"string. A cancellation reachesonErrorasuserCancelledwhen noonUserCancelledcallback is supplied.Breaking change Changed
faceMatch()'sconfidence,nfcVsIdConfidenceandnfcVsSelfieConfidenceon Android to returnnullwhen there was nothing to compare, instead of-1. Check fornullinstead of comparing to-1.Phone,Email, andFullNameresults now share one shape on both platforms: the captured value, plusstatusandresultCodeonPhoneNumberResult,AddEmailResultandAddFullNameResult. Both are non-nullable, so every result carries them on both platforms.status(success/fail) is the portable outcome;resultCodeis the finer detail, reportingsuccessanderroron both platforms and additionallyuserCancelledandemulatorDetectedon Android, since on iOS a cancellation is reported at the session level rather than through a module callback.ApprovalResult.uuidandApprovalResult.customerTokenare nownullon iOS when the user was not approved. Previously they were reported as empty strings. See the Migration Guide.PhoneModule.defaultRegionPrefixis now validated consistently on both platforms. Values outside1-9999are 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
showDocumentProviderOptionsparameter of theDocumentScanmodule. It maps to the deprecated native chooser flags, is not applied in V2, and is ignored whendocumentSourcesis provided. UsedocumentSourcesinstead. See the Migration Guide.Enhanced jailbreak detection on iOS. Add the URL schemes it queries to
LSApplicationQueriesSchemesin your app'sInfo.plist. See Installation.
Fixes
- Breaking change A flow configuration naming an unrecognized module now reports
unknownModulethroughonErrorinstead of being skipped. Previously, Android silently dropped the module with no log at all; iOS logged it withprint, 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
warnstatus, or a status the SDK left unset. - Fixed
faceMatch()'sFaceMatchResult.isFaceMatched,isNameMatched,nfcVsIdConfidence,nfcVsSelfieConfidenceandsecondIdConfidenceon iOS returningfalse/0when there was no data to compare. They now returnnull, sofalse/0means 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
minVideoLengthRequiredparameter to theVideoSelfiemodule. - Added
locationUnavailabletoIncodeSdkFlowError. - Added
storageUnavailabletoIncodeSdkFlowError. 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
userCanceledinstead ofuserCancelled. TheonUserCancelledcallback is unchanged. See the Migration Guide. - On Android, the Video Selfie V2 camera steps hide the close (X) button, so
showCloseButtonno longer applies to them. Other screens are unaffected. - On Android, Signature V2 reads its title and description from the new
onboard_sdk_signature_capture_titleandonboard_sdk_signature_capture_descriptionstring resources. See the Migration Guide. - Fixed a bug on iOS where a skipped, denied or unavailable location during the
Geolocationmodule ended thestartOnboarding/startOnboardingSectioncall 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
setQuantityStringsmethod, used to localize plural texts on Android. setThemeandsetUXConfignow take a JSONStringinstead ofMap<String, dynamic>. Encode maps withjsonEncodebefore calling. See the Migration Guide.- Added an optional
sdkModeparameter toinit(). It accepts the same values assetSdkMode, so you can set the mode during initialization. - Added a
sendDiagnosticsDataparameter toinit(), for iOS only. Set tofalseto prevent the Incode SDK from sending diagnostic data. If omitted, the native SDK default is used (true). Ignored on Android. - Added
configErrorandinvalidInitParamscodes toIncodeSdkInitError. Initialize failures now also include a human-readablemessage;onErrorstill receives the error code. - Removed unused
waitForTutorialsparameter frominit(). Tutorial behavior is configured per module withshowTutorials; see Modules. - Updated the Android build requirements:
compileSdk36, Kotlin Gradle plugin2.2.21, Android Gradle Plugin8.9.1, and Gradle8.14.5are 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
voiceConsentLanguageparameter toOnboardingSessionConfigurationto set the voice consent language in theVideoSelfiemodule. 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
jailbreakDetectederror code withintegrityCompromisedinIncodeSdkFlowErrorto indicate that the device integrity has been compromised (e.g., jail-broken or rooted). - Removed
disableJailbreakDetectionparameter frominit()method.
Working with Android SDK 5.50.0 and iOS SDK 5.46.0
4.18.0
23 June 2026
4.18.0
- Added
isInitializedmethod that returns a boolean indicating whether the SDK has been fully initialized. - Deprecated
FaceAuthMode.serverinstartFaceLogin. Migrate to theFaceAuthenticationmodule instead.FaceAuthMode.localandstartFaceLogin()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 viaonError. 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,headCoverCheckandlensesCheckparameters totruein theFaceAuthenticationmodule. - Updated the default values of the
faceMaskCheckandlensesCheckparameters totruein theSelfieScanmodule. - Fixed a bug on iOS where the
MLConsentmodule screen was not shown whentypewas not provided. Thetypeparameter ofMLConsentmodule 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
isSkippableflag to theGeolocationmodule. It allows the geolocation step to be skipped. When set totrue, skipping or denying location permission advances the flow instead of ending the session with a permission error. - Added
allAttemptsExhaustedflag toIdScanResultandSelfieScanResultindicating when capture or upload retries are no longer available. - Added per-attempt
IdScancallbacksonIdFrontAttemptCompleted/onIdBackAttemptCompleted. They fire after every individual capture attempt, including intermediate failures. The terminal attempt is signaled whenIdScanResult.allAttemptsExhaustedistrueor when the attempt succeeds. - Added per-attempt
SelfieScancallbackonSelfieScanAttemptCompleted. It fires after every individual selfie capture attempt, including intermediate failures. The terminal attempt is signaled whenSelfieScanResult.allAttemptsExhaustedistrueor 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
deleteLocalUserDatamethod. - 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
showIdTypeChoosertoIDScanmodule. See the Migration Guide. ID Document Chooser visibility is now controlled solely by theshowIdTypeChooserparameter inaddIdScan. Previously, settingidTypeimplicitly hid the chooser. The configuredidTypeis now only used as a pre-selection when the chooser is disabled(showIdTypeChooser == false) - Added new parameter
e2eeEncryptionEnabledforstartFaceLoginmethod that enables End-to-End Encryption (E2EE) on Android. - Introduced
startFaceMatchmethod to perform a face match without showing UI. - Fixed a bug caused by
flowTaghaving been an optional parameter ofstartNewOnboardingSection. It is now required to provide aflowTagto usestartNewOnboardingSection. - Removed parameters
disableHookDetection,disableEmulatorDetection,disableRootDetection,disableVirtualEnvironmentDetectionfrominitmethod. - Removed
simulatorDetected,rootDetected,hookDetected,virtualEnvDetectedfromIncodeSdkFlowError.
Working with Android SDK 5.45.1 and iOS SDK 5.41.0
4.13.0
26 February 2026
4.13.0
- Added
enableFrontShownAsBackCheckandenableBackShownAsFrontCheckoptional parameters to theVideoSelfiemodule. - Deprecated
autocaptureUxModeparameter from theIdScanmodule. - Deprecated
enableIdSummaryScreenparameter from theProcessIdmodule. - 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
enableRotationOnRetakeScreenparameter from theIdScanmodule. Captured documents are now always displayed in a vertical orientation on the Review Screen. - Renamed the
showRetakeScreenparameter toshowRetakeScreenForManualCapturein theIdScanmodule. - Renamed the
showAutoCaptureRetakeScreenparameter toshowRetakeScreenForAutoCapturein theIdScanmodule.
Working with Android SDK 5.43.0 and iOS SDK 5.39.1
4.11.0
2 December 2025
4.11.0
- Added optional
sslPinningEnabledandforceSSLPinningparameters to theinitmethod to support SSL pinning configuration. - Added
titleanddescriptionparams to theSignaturemodule. - Fixed error handling on Android.
Working with Android SDK 5.41.1 and iOS SDK 5.38.0