Digital ID Verification

Incode Digital ID Verification lets users verify with a mobile driver's license (mDL) or other supported digital ID from Apple Wallet or Google Wallet, instead of photographing a physical ID.

Incode Digital ID Wallet Verification lets users verify with a mobile driver's license (mDL) or other supported digital ID from Apple Wallet or Google Wallet, instead of photographing a physical ID.

You can offer this in two ways:

  • In the Incode Hosted onboarding app, where the wallet option appears automatically on the ID chooser screen after it is enabled in your flow configuration.
  • In your own custom web UI, using the Incode Web SDK headless renderWallet API to launch the wallet flow from your own button.

This page focuses on customer integration for web SDK and hosted onboarding experiences.

How It Works

Digital ID Wallet Verification follows the same onboarding session model as the rest of Incode ID verification:

  1. Your application creates or opens an Incode onboarding session.
  2. The user chooses to verify with a digital ID wallet.
  3. The browser launches the native wallet sheet with navigator.credentials.get().
  4. The user selects the credential and consents to share the requested attributes.
  5. The encrypted wallet response is sent to Incode for decryption and verification.
  6. Verification results are stored on the session and can be retrieved using the standard Incode result APIs.

The user's identity attributes are not returned directly to the web page from the wallet call. The wallet response is encrypted for Incode services, and verified attributes are made available through the session's standard OCR data, score, and webhook result surfaces.

Supported Wallets

PlatformWalletBrowserProvider
iOSApple WalletSafariapple_web
AndroidGoogle WalletChromegoogle

Apple Wallet web support requires the relying-party domain to be approved for wallet presentation. Coordinate with your Incode representative before going live with Apple Wallet.

Incode is an approved Google Verifier registrar and handles registration for you. You just provide basic verifier details (company name, logo, terms of service), and your Incode representative takes care of the rest. The user must still be on Android Chrome with a compatible digital ID in Google Wallet.

Enable Digital IDs In The Incode Dashboard

Before Digital ID Wallet Verification can be used, it must be enabled for the flow in the Incode Dashboard.

In the Dashboard:

  1. Open the flow you want to configure.
  2. Go to the ID Capture configuration.
  3. Enable Digital ID Acceptance.
  4. Select the supported wallet methods, such as Apple Wallet and Google Wallet.
  5. Configure the requested attributes for the flow.
  6. Save and publish the flow.

The requested attributes are configured per flow. Customers do not pass requested mDL fields directly from the browser at runtime. This keeps the wallet request aligned with the approved onboarding flow configuration.

When no custom attribute set is configured, Incode applies the default set for the enabled digital ID method.

Option 1: Use The Incode Hosted Onboarding App

If you use Incode's hosted or embedded onboarding app, no extra front-end integration is required after the flow is configured.

When the user reaches the ID chooser screen, the app shows a digital ID wallet option alongside the normal document capture options, when all of the following are true:

  • Digital IDs are enabled in the flow configuration.
  • Apple Wallet or Google Wallet is enabled for the flow.
  • The user's device and browser support the wallet method.
  • The user has a compatible digital ID in their wallet.

The user taps the wallet option, confirms the wallet presentation in Apple Wallet or Google Wallet, and returns to the onboarding flow after the encrypted response is verified.

If the wallet flow cannot be completed, the user can continue with the regular ID capture fallback path, depending on your flow configuration.

Option 2: Use The Web SDK Headless Wallet API

Use the Web SDK renderWallet API when you are building your own UI and want to expose only the wallet functionality.

This is useful when:

  • You do not use the Incode ID chooser screen.
  • You want a custom button, page, or modal for digital ID verification.
  • You want to offer wallet verification in a custom onboarding flow while still using Incode to create the wallet request, decrypt the response, and store results on the session.

Install And Initialize The SDK

Use the same Web SDK setup you already use for Incode onboarding sessions.

import { renderWallet } from '@incodetech/welcome';

The API requires an active Incode session with a valid session token.

Launch The Wallet Flow

Call renderWallet from a user gesture, such as a button click. This is important because Apple Wallet and browser Digital Credentials APIs require user activation to present the native wallet sheet.

import { renderWallet } from '@incodetech/welcome';

async function onDigitalIdButtonClick(session) {
  await renderWallet({
    session,
    onSuccess: result => {
      // The wallet response was submitted and processed.
      // Verified attributes are stored on the Incode session.
      console.log('Digital ID wallet verification submitted', result);
    },
    onError: error => {
      // Show your own retry or fallback UI.
      console.error('Digital ID wallet verification failed', error);
    },
  });
}

By default, the SDK auto-detects the wallet provider:

  • Android devices use Google Wallet.
  • iOS devices use Apple Wallet web.

You can also force a provider:

await renderWallet({
  session,
  provider: 'google',
  onSuccess: result => {
    console.log(result);
  },
  onError: error => {
    console.error(error);
  },
});
await renderWallet({
  session,
  provider: 'apple_web',
  onSuccess: result => {
    console.log(result);
  },
  onError: error => {
    console.error(error);
  },
});

Callback Shape

onSuccess receives the submission decision/status returned by Incode after the encrypted wallet response is submitted.

type DigitalIdWalletResult = {
  success: boolean;
  decision?: string;
  [key: string]: unknown;
} | null;

The wallet call does not return identity attributes directly. To retrieve verified attributes such as name, date of birth, document number, portrait, or issuing jurisdiction, use the standard Incode session result APIs after the wallet verification is processed.

onError receives a typed error object:

type DigitalIdWalletError = {
  code: 'UNSUPPORTED_PLATFORM' | 'NO_CREDENTIAL' | 'WALLET_ERROR';
  message: string;
  error?: unknown;
};

Handle these errors in your UI by offering retry, fallback to physical ID capture, or another flow-specific path.

Hide The Built-In Digital ID Button In ID Capture

If you use the Web SDK ID capture chooser but want to launch digital ID wallet verification from your own UI, you can hide the built-in digital ID button while keeping digital IDs enabled in the flow.

Pass hideDigitalIdButton: true in the ID capture configuration:

import { renderCaptureId } from '@incodetech/welcome';

renderCaptureId(document.getElementById('incode-id-capture'), {
  session,
  captureConfig: {
    showTutorial: true,
    captureAttempts: 3,
    enableIdRecording: false,
    autoCaptureTimeout: 0,
    enablePassport: true,
    isSecondId: false,
    ageAssurance: false,
    mergeSessionRecordings: false,
    showDocumentChooser: true,
    enableId: true,
    onlyBack: false,
    manualUploadIdCapture: false,
    digitalIdsUpload: false,
    idDetectionTimeout: 0,
    usSmartCapture: false,

    // Hides the wallet option from the built-in ID chooser,
    // even when the flow has Apple Wallet / Google Wallet enabled.
    hideDigitalIdButton: true,
  },
  onSuccess: result => {
    console.log(result);
  },
  onError: error => {
    console.error(error);
  },
});

This setting only hides the built-in wallet button in the Web SDK ID chooser. It does not disable the Digital ID configuration on the flow, and it does not prevent you from calling renderWallet from your own UI.

Retrieving Results

Digital ID Wallet Verification writes verification output to the Incode onboarding session.

Use your existing Incode result retrieval pattern, such as:

  • OCR data retrieval for verified identity attributes.
  • Score or validation result retrieval for decisioning.
  • Webhooks for session status transitions and downstream automation.

The response from renderWallet is not a replacement for the final session result. Treat it as confirmation that the wallet response was submitted and processed.

Recommended Integration Patterns

For Incode Hosted onboarding app customers:

  • Enable Digital ID Acceptance in the flow configuration.
  • Let the wallet option appear in the hosted chooser screen.
  • Use standard Incode session result and webhook handling after completion.

For Web SDK customers using the built-in ID capture UI:

  • Enable Digital IDs in the flow configuration.
  • Use the chooser wallet button by default.
  • Add hideDigitalIdButton: true only if you want to move the wallet entry point into your own UI.

For Web SDK customers with fully custom UI:

  • Enable Digital IDs in the flow configuration.
  • Create your own wallet button.
  • Call renderWallet from the button click handler.
  • Use onSuccess and onError to control your own UX.
  • Fetch final results from the session using standard Incode result APIs.

Error And Fallback Handling

Wallet presentation can fail when:

  • The device or browser does not support Digital Credentials APIs.
  • The user does not have a compatible digital ID in their wallet.
  • The user cancels the wallet presentation.
  • Apple Wallet domain approval is not complete.
  • The wallet response cannot be decrypted or verified.

Your application should provide a fallback path, such as retrying wallet verification or continuing with physical ID capture.


Did this page help you?