Tap2iD SDK for Android - API Reference

API reference for the Tap2iD Android SDK. Covers SDK initialization and mDL verification over BLE, NFC, and QR.

Overview

The Tap2iD Android SDK verifies ISO 18013-5 mobile driver's licenses (mDLs) over BLE, NFC, or QR engagement. Call Tap2iDSdk.initSdk(…) once at startup, then Tap2iDSdk.verifyMdoc(…) for each verification.

  • Language: Kotlin (Java interop supported)
  • Min SDK: Android 10 (API 29)
  • Transport: BLE, NFC, QR.
  • Standard: ISO/IEC 18013-5:2021
01

Initialize SDK

Call initSdk once at startup, before any mDL verification. Pass your license key and application context in SdkConfig, and receive results through InitSdkResultListener.

Tap2iDSdk: initSdk()
suspend fun initSdk(
    config: SdkConfig,
    initSdkListener: InitSdkResultListener
)

Parameters

ParameterTypeDescription
configSdkConfigSDK configuration containing license key and application context. required
initSdkListenerInitSdkResultListenerCallback interface for initialization results. required

SdkConfig

Kotlin
data class SdkConfig(
    val apiKey: String,
    val applicationContext: Context
)

InitSdkResultListener

Kotlin
interface InitSdkResultListener {
    fun onInitializationSuccess(result: SdkInitializationResult)
    fun onInitializationFailure(error: Error)
}
onInitializationSuccess(result: SdkInitializationResult)
Invoked when initialization completes successfully. The SDK is ready to use.
onInitializationFailure(error: Error)
Invoked on failure. Inspect the error to diagnose license key or network issues.

Example

Kotlin
val config = SdkConfig(
    apiKey = "your_api_key_here",
    applicationContext = applicationContext
)

lifecycleScope.launch {
    Tap2iDSdk.initSdk(config, object : InitSdkResultListener {
        override fun onInitializationSuccess(result: SdkInitializationResult) {
            // SDK ready to use
        }

        override fun onInitializationFailure(error: Error) {
            // Handle initialization error
        }
    })
}
02

Verify mDL

Call verifyMdoc with an EngagementConfig that sets the verification method: QR code, NFC, or both. Subscribe to MdocVerificationListener for lifecycle events.

Tap2iDSdk: verifyMdoc()
suspend fun verifyMdoc(
    engagementConfig: EngagementConfig,
    mdocVerificationListener: MdocVerificationListener
)

Parameters

ParameterTypeDescription
engagementConfigEngagementConfigVerification method configuration: QR, NFC, or both. required
mdocVerificationListenerMdocVerificationListenerCallback interface for verification lifecycle events. required

EngagementConfig

Sets QR code verification, NFC verification, or both. At least one of qrConfig or nfcConfig must be non-null.

Kotlin
data class EngagementConfig(
    val qrConfig: QrConfig? = null,
    val nfcConfig: NfcConfig? = null
)

data class QrConfig(
    val mDocString: String  // QR code payload
)

data class NfcConfig(
    val activity: Activity  // Activity for NFC operations
)

MdocVerificationListener

Lifecycle callbacks that report verification progress.

Kotlin
interface MdocVerificationListener {
    // Called when a verification stage begins
    fun onVerificationStageStarted(stage: VerificationStage)

    // Called if a verification stage encounters an error
    fun onVerificationStageError(stage: VerificationStage, error: Throwable)

    // Called when a verification stage completes successfully
    fun onVerificationStageCompleted(stage: VerificationStage)

    // Called with final verification result and credential data
    fun onVerificationCompleted(verificationResult: VerificationResult)
}

Example: QR Code Verification

Kotlin: QR Code
val qrConfig = EngagementConfig(
    qrConfig = QrConfig(mDocString = scannedQrCode)
)

lifecycleScope.launch {
    Tap2iDSdk.verifyMdoc(qrConfig, object : MdocVerificationListener {
        override fun onVerificationStageStarted(stage: VerificationStage) {
            // Update UI: show progress for current stage
        }

        override fun onVerificationStageError(stage: VerificationStage, error: Throwable) {
            // Handle stage-specific errors
        }

        override fun onVerificationStageCompleted(stage: VerificationStage) {
            // Stage completed successfully
        }

        override fun onVerificationCompleted(verificationResult: VerificationResult) {
            val attributes = verificationResult.mdocAttributes
            val isValid = verificationResult.isIssuerSignedAuthenticated &&
                         verificationResult.isDeviceSignedAuthenticated

            if (isValid) {
                // Process verified credential
            } else {
                verificationResult.validationErrors?.forEach { error ->
                    Log.e("Verification", "Error: ${error.message}")
                }
            }
        }
    })
}

Example: NFC Verification

Kotlin: NFC
val nfcConfig = EngagementConfig(
    nfcConfig = NfcConfig(activity = this)
)

lifecycleScope.launch {
    Tap2iDSdk.verifyMdoc(nfcConfig, verificationListener)
}

Example: Dual Mode (QR + NFC)

Kotlin: Dual Mode
val dualConfig = EngagementConfig(
    qrConfig  = QrConfig(mDocString = scannedQrCode),
    nfcConfig = NfcConfig(activity = this)
)

lifecycleScope.launch {
    Tap2iDSdk.verifyMdoc(dualConfig, verificationListener)
}
03

Handle Results

The onVerificationCompleted callback returns a VerificationResult with the credential attributes and the outcome of each security check.

VerificationResult structure
data class VerificationResult(
    val mdocAttributes: MdocAttributes,               // Extracted credential attributes
    val isIssuerSignedAuthenticated: Boolean,           // Issuer signature validation
    val isDeviceSignedAuthenticated: Boolean,           // Device signature validation
    val issuerInfo: String,                            // Issuer information
    val isIssuerVerified: Boolean,                     // Issuer trust verification
    val isMsoSigned: Boolean,                         // Mobile Security Object signature
    val validationErrors: MutableSet?                 // Any validation errors encountered
)

Security Properties

PropertyTypeDescription
isIssuerSignedAuthenticatedBooleanMobile Security Object signature is valid.
isDeviceSignedAuthenticatedBooleanECDSA/MAC device signature passes verification.
isIssuerVerifiedBooleanIssuing CA found in the SDK trust store.
isMsoSignedBooleanMobile Security Object is properly signed.
validationErrorsMutableSet?Detailed issues. Null or empty when all checks pass.
⚠ Always verify both isIssuerSignedAuthenticated and isDeviceSignedAuthenticated before trusting the credential data.

Utility Methods

Get SDK Version

Returns the SDK version string. Useful for debugging and logging.

Tap2iDSdk: getSdkVersion()
fun getSdkVersion(): String
Kotlin: Example
val version = Tap2iDSdk.getSdkVersion()
Log.d("SDK", "Using Tap2iD SDK version: version")