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")