> For the complete documentation index, see [llms.txt](/llms.txt)

# Introduction

This guide is intended as a migration reference for integrators migrating from the Onfido Smart Capture SDKs to the new Entrust IDV SDKs, released in early 2026.

| Onfido Smart Capture SDK                          | Entrust IDV SDK                                                               |
| ------------------------------------------------- | ----------------------------------------------------------------------------- |
| [Android v23.2.0](/sdk/android/23.2.0)            | [Android v100](https://github.com/EntrustCorporation/IdvSDK-Android)          |
| [iOS v32.6.2](/sdk/ios/32.6.2)                    | [iOS v100](https://github.com/EntrustCorporation/IdvSDK-iOS)                  |
| [React Native v15.2.0](/sdk/react-native/15.2.0/) | [React Native v100](https://github.com/EntrustCorporation/IdvSDK-ReactNative) |

**Notes:**

- Migration information for the Flutter SDK will be added in H1 2026 when the new _Entrust IDV SDK for Flutter_ is released
- The Web SDK is not yet in scope for this migration. More information will be provided towards the close of H2 2026

**It is highly recommended for all integrators to adopt Workflow Studio as part of their SDK migration, if orchestration is still based on manual `step` definitions. This will ensure a futureproof integration experience.**

For the complete context and specifications of the Entrust IDV SDKs, please refer to its dedicated [integration guide](/sdk/sdk-integration-guide-2025).

## Summary of changes

**New features:**

- **API**:

  - All mobile SDKs now share the same API and configurability, closing any gaps that existed between previous versions. The new Flutter SDK (when released in early 2026) will follow the new, shared API
  - Error codes returned by the SDK are streamlined across all SDKs and are now grouped and labeled by 'category' to simplify integration effort
  - While the Exit button (X) is now visible by default, the abililty to hide the component (along the entire navigation bar) is available as part of the API

- **Bundles**: SDK bundle sizes have been dramatically reduced to under 3MB by default. At its minimum sizes, SDKs are fully functional with integrators given the option to add project dependencies for modules that need to be executed locally (instead of the default Web/JS version)

- **Languages**:

  - All SDKs now support the ability to predefine a language for use during a given flow
  - All SDKs now support localization based on the i18n pattern, already used by the Web SDK
  - (new) Integrators can reduce the languages available to end users by specifying a subset of the 44 supported languages during initialization

- **UI**:
  - The screen layouts have been updated to match the redesign introduced by the [Web SDK 14.44.0](/sdk/web-sdk-ui-templates/). All SDKs are now visually aligned
  - All SDKs now have the same customization scope with common UI customization tokens and behaviors
  - Customizatition of the brand footer at the bottom of all screens no longer requires activation and is available by default

**Deprecation:**

- The iOS SDK is now solely distributed via Swift Package Manager as Cocoapods is nearing end-of-life
- The iOS SDK API is now only available in Swift, with no interface provided for Objective-C
- The ability to refresh SDK tokens is no longer supported as the validity of the new Studio SDK tokens is linked to the validation of the underlying workflow (typically 14 days)
- The UI no longer includes the 'Powered by Onfido' brand footer. The functionality to apply a custom brand remains available (and no longer requires activation)

**Not yet released:**

- SSL Certificate pinning
- Text overrides available via local bundle files (currently provided as delta during initialization of SDK)
- Ability to override the border radius of buttons in the UI
- Ability to modify typography (font size, weight etc.)

## Breaking Changes

### Minimum library versions

  
### Android

    |         | Entrust IDV SDK for Android |                                                    Onfido Smart Capture SDK               |
    | --------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -|
    | Sonatype/Maven Central  | [`com.entrust.identity.verification.sdk`](https://central.sonatype.com/namespace/com.entrust.identity.verification.sdk)                              | [`com.onfido.sdk.capture`](https://central.sonatype.com/namespace/com.onfido.sdk.capture:onfido-capture-sdk)  |
    | Target Version  | Android 15 (API level 35) <br />Kotlin 2.1.10<br />Compose 2025.02.00 | **Android 14 (API level 34)** <br />**Kotlin 1.9.22**<br /> |
    | Minimum Version | Android 5 (API level 21) | Android 5 (API level 21)  |
    | Additional info |  SDK supports [16KB page file size](https://developer.android.com/guide/practices/page-sizes) | |

  

  
### iOS

    |         | Entrust IDV SDK for iOS |        Onfido Smart Capture SDK               |
    | --------------- | ---------------------------------------------------------------------------- | - |
    | Swift Package Manager (SPM)  | [`entrustCorporation/Idv-SDK-iOS`](https://swiftpackageindex.com/entrustCorporation/Idv-SDK-iOS) | [`onfido/onfido-ios-sdk`](https://swiftpackageindex.com/onfido/onfido-ios-sdk) <br/> |
    | Target Version  | iOS 15                            | **iOS 13** |

    **Note:** Distribution via cocoapods is no longer provided

  

  
### React Native

    |             |  Entrust IDV SDK for React Native   | Onfido Smart Capture SDK |
    | ----------------------- | --------------------------------------------------------------- |-|
    | Node Package Manager (NPM)      | [`@entrust.corporation/IdvSdk-ReactNative`](https://www.npmjs.com/package/@entrust.corporation/IdvSdk-ReactNative)  | [`@onfido/react-native-sdk`](https://www.npmjs.com/package/@onfido/react-native-sdk) |
    | Library Version     | 0.79                              | **0.72** |
    | Minimum Android Version | Android API level 24                     | Android API level 21 |
    | Minimum iOS Version   | iOS 15                              | **iOS 13** |
    | Additional info |  SDK is now built using the React Native 'New Architecture' | |

  

### SDK initialization

The overall SDK initialization process remains the same with regard to the applicant, workflow run and SDK token generation.

**It is highly recommended for all integrators to adopt Workflow Studio as part of their SDK migration if orchestration is still based on manual `step` definitions. This will ensure a futureproof integration experience.**

  
### Android

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th> Entrust IDV SDK for Android </th>
      <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          EntrustIdv.start(
            StudioParameters(
              sdkToken = ""
            )
        )}
        ```
        **Note**: The `workflowRunId` is now extracted from the `sdkToken` and doesn't require explicit declaration
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        const val REQUEST_CODE = 0x05
        private lateinit var onfidoWorkflow: OnfidoWorkflow

        fun onCreate(savedInstanceState: Bundle?) {
          val workflowConfig = WorkflowConfig.Builder(
            workflowRunId = "",
            sdkToken = ""
          ).build()
        }

        onfidoWorkflow = OnfidoWorkflow.create(this)
        startActivityForResult(onfidoWorkflow.createIntent(workflowConfig), REQUEST_CODE)
        ```
      </td>
    </tr>

  </table>

  

  
### iOS

  <table style={{ width: "100%", maxWidth: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for iOS</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        @MainActor
        func startEntrustIdvSDK(from viewController: UIViewController) {
          let parameters = StudioParameters(
            sdkToken: ""
          )
          let entrustIdv = EntrustIdv(
            sdkParameters: parameters,
            callbacks: callbacks    // Defined in next section
          )
          entrustIdv.start(from: viewController)
        }
        ```
        **Note**: The `workflowRunId` is now extracted from the `sdkToken` and doesn't require explicit declaration
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        let workflowConfiguration = WorkflowConfiguration(
          workflowRunId: "",
          sdkToken: ""
        )
        let onfidoRun = OnfidoFlow(workflowConfiguration: orchestrationConfig)
        customerViewController.present(
          try onfidoRun.run(),
          animated: true,
          completion: nil
        )

        ```
      </td>
    </tr>

  </table>

  

  
### React Native

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for React Native</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        entrustIdv.start({
          sdkToken: "",
        })
        ```
        **Note**: The `workflowRunId` is now extracted from the `sdkToken` and doesn't require explicit declaration
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        config = {
          workflowRunId: ""
          sdkToken: "",
        }
        Onfido.start(config);
        ```
      </td>
    </tr>
  </table>

  
  

### Mandatory callbacks

Callback functionality remains unchanged with the new versions. The main difference is the alignment of callback payloads across all SDK platforms.

For details about the optional callbacks, refer to the dedicated section of the [integration guide](/sdk/sdk-integration-guide-2025/#optional-callbacks).

  
### Android

  
  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th> Entrust IDV SDK for Android </th>
      <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        private val entrustIdv = EntrustIdv(
          activity = this,
          callbacks = Callbacks(
            onComplete = { result -> ...
              // The verification flow was completed successfully with result: $result
            },
            onError = { error -> ...
              // Flow errored with category:${error.type.category} and  type ${error.type.name}/${error.type.message}
            },
            onUserExit = { userAction -> ...
              // User exited the verification flow. Reason: $exitReason
          })
        )
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
          onfidoWorkflow.handleActivityResult(resultCode, data, object : OnfidoWorkflow.ResultListener {
            override fun onUserCompleted() {
              // Corresponds to `onComplete`
            }
            override fun onUserExited(exitCode: ExitCode) {
              // Corresponds to `onUserExit`
            }
            override fun onException(exception: OnfidoWorkflow.WorkflowException) {
              // Corresponds to `onError`
            }
          })
        }
        ```
      </td>
    </tr>
  </table>

  

  
### iOS

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for iOS</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        @MainActor
        func startEntrustIdvSDK(from viewController: UIViewController) {
          let callbacks :Callbacks = Callbacks(
            onComplete: { (results: [String: CaptureResult]) in ...
              // The verification flow was completed successfully with result: $result
            },
            onError: { (error: IdvError) in ...
              // Flow errored with category:${error.type.category} and  type ${error.type.name}/${error.type.message}
            },
            onUserExit: { (userAction: UserAction) in ...
              // User exited the verification flow. Reason: $exitReason
            }
          )
        }
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        onfidoRun.with(responseHandler: { (response: OnfidoResponse) in
          switch response {
            case .success: ...              // Corresponds to `onComplete`
            case .cancel(let cancellationReason): ...   // Corresponds to `onUserExit`
            case .error(let error): ...     // Corresponds to `onError`
          }
        })
        ```
      </td>
    </tr>
  </table>

  

  
### React Native

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for React Native</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        const entrustIdv = new EntrustIdv({
          onComplete: (result) => {
            // The verification flow was completed successfully with result: $result
          },
          onError: (error) => {
            // Flow errored with category:${error.type.category} and  type ${error.type.name}/${error.type.message}
          },
          onUserExit: (userAction) => {
            // User exited the verification flow. Reason: $exitReason
          },
        })
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        Onfido.start(config)
          .then(res => ... )    // Corresponds to `onComplete`
          .catch(err => ... )   // Corresponds to `onError`
        ```
        **Note:** No equivalent to `onUserExit` on the Onfido React Native SDK
      </td>
    </tr>
  </table>

  
  

<br/>
By default and as per previous versions, the `result` payload returned by the completion callback, is **an empty object** for workflow-based sessions:
- The uploaded media are automatically processed by the workflow to generate reports
- If required, the media can be retrieved via the dedicated [Document](/api/latest/#list-documents), [Face Photo](/api/latest/#list-live-photos) and [Face Video](/api/latest/#list-live-videos) API endpoints

The following tables provide the schema of the `result` payload for sessions that are yet to migrate to Workflow Studio.

<table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
        <th> Entrust IDV SDK </th>
        <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
    <td style={{ verticalAlign: "top" }}>
      ```json
      {
      "document": {
        "type": "driving_licence",
        "sides": {
          "front": { "id": "" },
          "back":  { "id": "" },
          "front_video": { "id": "" },
          "back_video":  { "id": "" }
        }
      },
      "facePhoto":  { "id": "" },
      "faceVideo":  { "id": "" },
      "faceMotion": { "id": "" },
      "poa": {
        "type": "utility_bill",
        "sides": {
          "front": { "id": "" },
          "back":  { "id": "" },
          "front_video": { "id": "" },
          "back_video":  { "id": "" }
        }
      }}
      ```
    </td>
    <td style={{ verticalAlign: "top" }}>
        ```json
        {
        "document": {
          "type": "DRIVING_LICENCE"
            "front": {
              "id": "document_id",
              "side": "FRONT",
              "type": "DRIVING_LICENCE",
              "nfcSupported": false
            },
            "back": {
              "id": "document_id",
              "side": "BACK",
              "type": "DRIVING_LICENCE",
              "nfcSupported": false
            },
        },
        "face": {
          "id": "face_id",
          "variant": "PHOTO"
        },
        "proofOfAddress": {
          "type": "UTILITY_BILL",
          "front": {
            "id": "front_side_id",
            "type": null
          },
          "back": {
            "id": "back_side_id",
            "type": null
          }
        }}
        ```
    </td>

  </tr>

</table>

<br/>
The `error` payload returned by the error callback is defined as:

<table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
        <th> Entrust IDV SDK for Android </th>
        <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
      ```json
      {
        "error": {
          "errorType": {
            "category": <>,
            "type": <>
          },
          "message": string
        }
      }
      ```
      The [list](/sdk/sdk-integration-guide-2025/#onerrorerror-callback) of `category`/`type` values is the same across all SDKs.
    </td>
    <td style={{ verticalAlign: "top" }}>
      Error codes for:
      - [Android](/sdk/android/#error-handling)
      - [iOS](/sdk/ios/#error-handling)
      
      React Native returns the callback payload of the respective underlying Android and iOS SDKs (links above).
    </td>
  </tr>
</table>

<br/>
The `userAction` payload returned by the callback is defined as:
  
<table style={{ width: "100%", tableLayout: 'fixed' }}>
  <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
  </colgroup>
  <tr>
    <th>Entrust IDV SDK</th>
    <th>Onfido Smart Capture SDK</th>  
  </tr>
  <tr>
    <td style={{ verticalAlign: "top" }}>
      One of the following values:
      - `UserExit`
      - `ConsentDenied`
      - `RequiredNfcNotCompleted`

      Full description available in the [integration guide](/sdk/sdk-integration-guide-2025/#onexituseraction-callback). Values are the same across all SDKs
    </td>
    <td style={{ verticalAlign: "top" }}>
      Android:
      - `USER_LEFT_ACTIVITY`
      - `USER_CONSENT_DENIED`
      - `REQUIRED_NFC_FLOW_NOT_COMPLETED`

      iOS:
      - `.userExit`
      - `.consentDenied`

      Callback not available on the Onfido React Native SDK
    </td>

  </tr>

</table>

### UI Customization

The process for customizing the UI has been streamlined and aligned across all SDKs.
The main differences include:

- Token names have been changed and streamlined across all SDKs
- Colors are now customized globally instead of per-component to reduce the amount of duplication

The complete description is available in the UI customization section of the [integration guide](/sdk/sdk-integration-guide-2025/#user-interface-ui-customization).

#### Pre-selection of theme

  
### Android

  
  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th> Entrust IDV SDK for Android </th>
      <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        EntrustIdv.start(
          configuration = Configuration(
            theme = Theme(
              mode = ThemeMode.Light // or ThemeMode.Dark
          ))
        )
        ```
        Note that if `mode` is not specified, the SDK defaults to the current theme on the user's device
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        onfidoConfigBuilder.withTheme(
          OnfidoTheme.DARK // or OnfidoTheme.LIGHT or OnfidoTheme.AUTOMATIC
        )
        ```
      </td>
    </tr>
  </table>

  

  
### iOS

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for iOS</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        EntrustIdv(
          configuration: .init(
            theme: .init(
              mode: ThemeMode.light    // or ThemeMode.dark
          ))
        )
        ```
        Note that if `mode` is not specified, the SDK defaults to the current theme on the user's device
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        let appearance = Appearance()
        appearance.setUserInterfaceStyle(.dark)   // or .light or .unspecified (default)

        let configBuilder = OnfidoConfig.builder()
        configBuilder.withAppearance(appearance)  // Then apply the 'appearance' object
        ```
      </td>
    </tr>

  </table>

  

  
### React Native

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for React Native</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        entrustIdv.start({
          configuration: {
            theme: {
              mode: ThemeMode.Light,    // or ThemeMode.Dark
          }}
        });
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        Pre-select the theme is implemented directly in the embedding iOS and Android configuration as described in the respective tabs of this section.
      </td>
    </tr>
  </table>

  
  

#### Color customization

A key simplification introduced by the new SDK is that colors are modified centrally during initialization so that they can be applied uniformly across all UI assets.

The detailed mapping and mechanics of color customization is provided in the dedicated [SDK UI Customization Guide](/sdk/sdk-ui-customization/).

The full mapping of Onfido SDK UI tokens to new is provided in the [Appendix - UI token mapping](#appendix---ui-token-mapping).

  
### Android

  
  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th> Entrust IDV SDK for Android </th>
      <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        configuration = Configuration(
          theme = Theme(
            lightColors = mapOf(
              ColorTokens.BackgroundColorBrandDefault to "#FF00FF85",
              ColorTokens.ContentColorBase to "#0B1B0B",
            ),
            darkColors = mapOf(
              ColorTokens.BackgroundColorBrandDefault to "#0000FF85",
              ColorTokens.ContentColorBase to "#FF1CFF",
            ),
        ))
        ```
        Colors that need to be overridden must be defined in both the `lightColors` and `darkColors` objects to ensure that screens are rendered correctly.
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```xml
        <!-- Light theme -->
        <style name="OnfidoLightTheme" parent="OnfidoBaseActivityTheme">
          <item name="onfidoColorToolbarBackground">@color/brand_dark_blue</item>
          <item name="onfidoColorActionMain">@color/brand_accent_color</item>
        </style>

        <!-- Dark theme -->
        <style name="OnfidoDarkTheme" parent="OnfidoBaseDarkTheme">
          <item name="onfidoColorToolbarBackground">@color/brand_dark_blue</item>
          <item name="onfidoColorActionMain">@color/brand_accent_color</item>
        </style>
        ```
        Color overrides are defined in the app bundle's `themes.xml` file.
        The full list of available tokens is defined in the Onfido SDK [UI Customization](/sdk/sdk-customization/#android-sdk) guide.
      </td>
    </tr>

  </table>

  

  
### iOS

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for iOS</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        EntrustIdv(
          configuration: .init(
            theme: .init(
              lightColors: [
                ColorTokens.backgroundColorBrandDefault: "#FF00FF85",
                ColorTokens.contentColorBase: "#0B1B0B"
              ],
              darkColors: [
                ColorTokens.backgroundColorBrandDefault: "#0000FF85",
                ColorTokens.contentColorBase: "#FF1CFF"
              ],
          ))
        )
        ```
        Colors that need to be overridden must be defined in both the `lightColors` and `darkColors` objects to ensure that screens are rendered correctly.
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        let appearance = Appearance()
        appearance.primaryColor = 
        appearance.primaryTitleColor = 

        let configBuilder = OnfidoConfig.builder()
        configBuilder.withAppearance(appearance)   // Then apply the 'appearance' object
        ```
        The full list of available tokens is defined in the Onfido SDK [UI Customization](/sdk/sdk-customization/#ios-sdk) guide.
      </td>
    </tr>

  </table>

  

  
### React Native

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for React Native</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        entrustIdv.start({
          configuration: {
            theme: {
              lightColors: {
                backgroundColorBrandDefault: '#FF00FF85',
                contentColorBase: '#0b1c0b'
              },
              darkColors: {
                backgroundColorBrandDefault: '#0000FF85',
                contentColorBase: '#FF1cFF'
              }
          }}
        });
        ```
        Colors that need to be overridden must be defined in both the `lightColors` and `darkColors` objects to ensure that screens are rendered correctly.
      </td>
      <td style={{ verticalAlign: "top" }}>
        Customizing colors is achived directly in the embedding iOS and Android configuration as described in the respective tabs of this section.
      </td>
    </tr>
  </table>

  
  

#### Brand footer customization

  
### Android

  
  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th> Entrust IDV SDK for Android </th>
      <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        EntrustIdv.start(
          configuration = Configuration(
          theme = Theme(
            branding = Branding(
            text = "Custom Text",
            logo = "https://upload.wikimedia.org/wikipedia/commons/d/d7/Android_robot.svg",
            ),
          ))
        )
        ```
        **Notes:** 
        - The integrator needs to consider the `theme` (Light/Dark) currently applied to the screen when custom text and logo are provided
        - The color of the text and logo provided in the branding object can be customized via the base color tokens `content-color.subtle` and `background-color.surface.primary.default`
        - ⚠️ As a change from previous versions of the SDK, by default, no brand name or logo is shown. It is also no longer required to ask for activation of this feature
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        val enterpriseFeatures = EnterpriseFeatures.builder()
          .withCobrandingText("MyCompany")
          .withCobrandingLogo(
            R.drawable.logo_light_mode, 
            R.drawable.logo_dark_mode
          )
          .build()

        OnfidoConfig.builder(<context>)
          .withEnterpriseFeatures(enterpriseFeatures)
          .build()
        ```
      </td>
    </tr>

  </table>

  

  
### iOS

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for iOS</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        EntrustIdv(
          configuration: .init(
            theme: .init(
              branding: .init(
                text: "Custom Text",
                logo: "https://commons.wikimedia.org/wiki/File:Apple_Logo.svg",
              ),
          ))
        )
        ```
        **Notes:**
        - The integrator needs to consider the `theme` (Light/Dark) currently applied to the screen when custom text and logo are provided
        - The color of the text and logo provided in the branding object can be customized via the base color tokens `content-color.subtle` and `background-color.surface.primary.default`
        - ⚠️ As a change from previous versions of the SDK, by default, no brand name or logo is shown. It is also no longer required to ask for activation of this feature
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        let enterpriseFeatures = EnterpriseFeatures.builder()
          .withCobrandingText("MyCompany")
          .withCobrandingLogo(
            UIImage(
              named: "imageName_for_lightmode"
            )!,
            cobrandingLogoDarkMode: UIImage(
              named: "imageName_for_darkmode"
            )!
          )
          .build()

          let configBuilder = OnfidoConfig.builder()
          configBuilder.withEnterpriseFeatures(enterpriseFeatures) // Then add 'enterpriseFeatures' object
        ```
      </td>
    </tr>

  </table>

  

  
### React Native

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for React Native</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        entrustIdv.start({
          configuration: {
            theme: {
              branding: {
                text: "Custom Text",
                logo: "https://commons.wikimedia.org/wiki/File:React_Native_Logo.png"
          }}}
        });
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        The process to customize the brand footer is achieved in two steps:
        - The custom text or logo must be implemented in the embedding iOS and Android apps as described in the respective tabs of this section
        - The React Native configuration must be updated as follows

        ```javascript
        Onfido.start({
          logoCobrand: ""
        })
        ```
      </td>
    </tr>

  </table>

  
  

### Text and Locale Customization

The Entrust IDV SDK continues to support all languages/locales previously supported. The API now aligns all text customization options and follows the i18n pattern.

  
### Android

  
  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th> Entrust IDV SDK for Android </th>
      <th> Onfido Smart Capture SDK </th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        EntrustIdv.start(
          configuration = Configuration(
            localisation = Localisation(
              language = "en"
              allowedLanguages = listOf("en", "el") // New
              overrides = mapOf(
                "en" to mapOf(
                  "welcome.title" to "Custom welcome title",
              )),
        )))
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```kotlin
        final OnfidoConfig config = OnfidoConfig.builder()
          .withLocale(fr)
          .build();
        ```
        With each localization file stored locally requiring all keys to be defined in dedicated `string.xml` files ([example](https://github.com/onfido/onfido-android-sdk/blob/master/translations/values/strings.xml)).
      </td>
    </tr>
  </table>

  

  
### iOS

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for iOS</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        EntrustIdv(
          configuration: .init(
            theme: .init(localisation: .init(
              language: "en",
              allowedLanguages: ["en", "el"], // New
              overrides: [
                "en": [
                "welcome.title": "Custom welcome title",
                ]
              ]
          )))
        )
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        ```swift
        (void)withCustomLocalization {
          [self.configBuilder withCustomLocalization];
        }
        ```
        With each localization file stored locally in dedicated `Localizable.strings` files ([example](https://github.com/onfido/onfido-ios-sdk/blob/master/localization/Localizable_EN.strings)).
      </td>
    </tr>
  </table>

  

  
### React Native

  <table style={{ width: "100%", tableLayout: 'fixed' }}>
    <colgroup>
        <col style={{ width: '50%' }} />
        <col style={{ width: '50%' }} />
    </colgroup>
    <tr>
      <th>Entrust IDV SDK for React Native</th>
      <th>Onfido Smart Capture SDK</th>
    </tr>
    <tr>
      <td style={{ verticalAlign: "top" }}>
        ```javascript
        entrustIdv.start({
          configuration: {
            localisation: {
              language: 'en',     // New (for React Native)
              allowedLanguages: ['en', 'el'],   // New
              overrides: {
                en: {
                  'welcome.title': 'Custom welcome title',
                },
              },
          }}
        });
        ```
      </td>
      <td style={{ verticalAlign: "top" }}>
        The process to customize text is achieved in two steps:
        - The custom text strings and/or locales are implemented in the embedding iOS and Android apps as described in the respective tabs of this section
        - The React Native configuration must be updated as follows

        ```javascript
        Onfido.start({
          localisation: {
            ios_strings_file_name: '', // Only required for iOS
          },
        })
        ```

        **Note**: The ability to pre-select a language is not available in the Onfido React Native SDK
      </td>
    </tr>

  </table>

  
  

The full list of **new** capabilities and how to identify text strings is available in the [SDK integration guide](/sdk/sdk-integration-guide-2025/#localization-and-text-customization).

### Module Configuration

The configuration of sessions orchestrated with Workflow Studio remain unchanged. **It is highly recommended for all integrators to adopt Workflow Studio as part of their SDK migration.**

For integrations that are yet to migrate to workflow-based orchestration, the API for each of `Document`, `Face` (for all variants) and `ProofOfAddress` has been simplified to be common across all SDKs.

Details are available in the [SDK integration guide](/sdk/sdk-integration-guide-2025/#sdk-module-configuration).

# Appendix - UI token mapping

This section only highlights the mapping of the Onfido SDK UI customization tokens used by the Onfido Smart Capture iOS, Android and React Native SDKs to their Entrust IDV SDK equivalent.
The full list of UI customization tokens provided by the Entrust IDV SDKs is available in the dedicated [SDK UI Customization guide](/sdk/sdk-ui-customization).

The ability to customize typography and border radii will be documented in an upcoming release.

|                | Onfido Smart Capture for Android                             | Onfido Smart Capture SDK for iOS                                  | Entrust IDV SDK                                                                                                                                                                                                                                                                                                                           |
| -------------- | ------------------------------------------------------------ | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| General        | `onfidoColorBackground`                                      | `backgroundColor`                                                 | `backgroundColorSurfacePrimaryDefault`                                                                                                                                                                                                                                                                                                    |
| General        | `colorAccent`                                                | `primaryColor`                                                    | `backgroundColorBrandActive` <br /> `backgroundColorBrandDefault` <br /> `backgroundColorBrandHover` <br /> `borderColorBrandActive` <br /> `borderColorBrandDefault` <br /> `borderColorBrandHover` <br /> `contentColorBrandActive` <br /> `contentColorBrandDefault` <br /> `contentColorBrandHover` <br /> `contentColorBrandOnBrand` |
| General        | `onfidoColorContentMain` <br /> `onfidoColorContentMainDark` |                                                                   | `contentColorBase`                                                                                                                                                                                                                                                                                                                        |
| General        | `onfidoColorContentSecondary`                                |                                                                   | `contentColorBase`                                                                                                                                                                                                                                                                                                                        |
| General        | `onfidoColorContentNegative`                                 |                                                                   | `contentColorNegativeBaseDefault`                                                                                                                                                                                                                                                                                                         |
| Buttons        | `onfidoColorActionMain`                                      | `primaryTitleColor`                                               | `backgroundColorBrandDefault`                                                                                                                                                                                                                                                                                                             |
| Buttons        | `onfidoColorActionMainPressed`                               | `primaryBackgroundPressedColor`                                   | `backgroundColorBrandActive`                                                                                                                                                                                                                                                                                                              |
| Buttons        | `onfidoColorActionMainDisabled`                              |                                                                   | `backgroundColorDisabledDefault`                                                                                                                                                                                                                                                                                                          |
| Buttons        | `onfidoColorContentOnAction`                                 |                                                                   | `contentColorBrandOnBrand`                                                                                                                                                                                                                                                                                                                |
| Buttons        | `onfidoColorContentOnActionDisabled`                         |                                                                   | `contentColorDisabledDefault`                                                                                                                                                                                                                                                                                                             |
| Buttons        | `onfidoColorActionSecondary`                                 |                                                                   | N/A (transparent)                                                                                                                                                                                                                                                                                                                         |
| Buttons        | `onfidoColorActionSecondaryPressed`                          | `secondaryBackgroundPressedColor`                                 | N/A (transparent)                                                                                                                                                                                                                                                                                                                         |
| Buttons        | `onfidoColorActionSecondaryDisabled`                         |                                                                   | `backgroundColorDisabledDefault`                                                                                                                                                                                                                                                                                                          |
| Buttons        | `onfidoColorContentOnActionSecondary`                        | `secondaryTitleColor`                                             | `contentColorBase`                                                                                                                                                                                                                                                                                                                        |
| Buttons        | `onfidoColorContentOnActionSecondaryDisabled`                |                                                                   | `contentColorDisabledDefault`                                                                                                                                                                                                                                                                                                             |
| Buttons        | `onfidoColorActionSecondaryBorder`                           |                                                                   | `borderColorInputDefault` <br /> `borderColorInputActive` <br /> `borderColorInputHover`                                                                                                                                                                                                                                                  |
| Buttons        | `onfidoColorActionSecondaryBorderDisabled`                   |                                                                   | `borderColorDisabledDefault`                                                                                                                                                                                                                                                                                                              |
| Banners        | `onfidoColorDisclaimerBackground`                            |                                                                   | `backgroundColorInfoSubtleDefault` <br /> `backgroundColorNegativeSubtleDefault` <br /> `backgroundColorNeutralSubtleDefault` <br /> `backgroundColorPositiveSubtleDefault` <br /> `backgroundColorWarningSubtleDefault`                                                                                                                  |
| Banners        | `onfidoColorContentDisclaimer`                               |                                                                   | `contentColorBase`                                                                                                                                                                                                                                                                                                                        |
| Banners        | `onfidoColorIconDisclaimer`                                  |                                                                   | `contentColorInfoBaseDefault` <br /> `contentColorNegativeBaseDefault` <br /> `contentColorSubtle` <br /> `contentColorPositiveBaseDefault` <br /> `contentColorWarningBaseDefault`                                                                                                                                                       |
| Navigation Bar | `onfidoColorToolbarBackground`                               |                                                                   | `backgroundColorSurfacePrimaryDefault`                                                                                                                                                                                                                                                                                                    |
| Navigation Bar | `onfidoColorContentToolbarTitle`                             | `primaryColor`                                                    | `contentColorBase`                                                                                                                                                                                                                                                                                                                        |
| Navigation Bar | `colorPrimaryDark`                                           |                                                                   | *(not available — status bar color is not customizable in the Entrust IDV SDK)*                                                                                                                                                                                                                                                           |
| Icons (nav bar) | `onfidoColorIconStroke`                                     | (auto-capture) `captureSuccessColors` \ `tickViewImageTintColor`  | `contentColorBase` <br /> `contentColorBrandOnBrand`                                                                                                                                                                                                                                                                                      |
| Icons (banners) | `onfidoColorIconStroke`                                     | (auto-capture) `captureSuccessColors` \ `tickViewImageTintColor`  | `contentColorInfoBaseDefault` <br /> `contentColorNegativeBaseDefault` <br /> `contentColorSubtle` <br /> `contentColorPositiveBaseDefault` <br /> `contentColorWarningBaseDefault`                                                                                                                                                       |
| Icons          | `onfidoColorIconStrokeNegative`                              |                                                                   | N/A                                                                                                                                                                                                                                                                                                                                       |
| Icons (nav bar) | `onfidoColorIconFill`                                       |                                                                   | `contentColorBase` <br /> `contentColorBrandOnBrand`                                                                                                                                                                                                                                                                                      |
| Icons (banners) | `onfidoColorIconFill`                                       |                                                                   | `contentColorInfoBaseDefault` <br /> `contentColorNegativeBaseDefault` <br /> `contentColorSubtle` <br /> `contentColorPositiveBaseDefault` <br /> `contentColorWarningBaseDefault`                                                                                                                                                       |
| Icons          | `onfidoColorIconAccent`                                      |                                                                   | N/A                                                                                                                                                                                                                                                                                                                                       |
| Icons (nav bar) | `onfidoColorIconBackground`                                 | (auto-capture) `captureSuccessColors` \ `tickViewBackgroundColor` | `backgroundColorBrandDefault` <br /> `backgroundColorBrandActive` <br /> `backgroundColorSurfacePrimaryActive` <br /> N/A (transparent)                                                                                                                                                                                                   |
| Icons (banners) | `onfidoColorIconBackground`                                 | (auto-capture) `captureSuccessColors` \ `tickViewBackgroundColor` | N/A (transparent)                                                                                                                                                                                                                                                                                                                         |
| Icons          |                                                              | `captureSuccessColors.borderColor`                                | `borderColorBrandDefault`                                                                                                                                                                                                                                                                                                                 |
| Icons          | `onfidoColorWatermark` <br /> `onfidoColorWatermarkDark`     |                                                                   | `contentColorSubtle`                                                                                                                                                                                                                                                                                                                      |
| Spinner        | `onfidoColorProgressTrack`                                   |                                                                   | `backgroundColorNeutralSubtleDefault`                                                                                                                                                                                                                                                                                                     |
| Spinner        | `onfidoColorProgressIndicator`                               |                                                                   | `backgroundColorBrandDefault`                                                                                                                                                                                                                                                                                                             |