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
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.
suspend fun initSdk(
config: SdkConfig,
initSdkListener: InitSdkResultListener
)
Parameters
| Parameter | Type | Description |
|---|---|---|
| config | SdkConfig | SDK configuration containing license key and application context. required |
| initSdkListener | InitSdkResultListener | Callback interface for initialization results. required |
SdkConfig
data class SdkConfig(
val apiKey: String,
val applicationContext: Context
)
InitSdkResultListener
interface InitSdkResultListener {
fun onInitializationSuccess(result: SdkInitializationResult)
fun onInitializationFailure(error: Error)
}
Example
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
}
})
}
Verify mDL
Call verifyMdoc with an EngagementConfig that sets the verification method: QR code, NFC, or both. Subscribe to MdocVerificationListener for lifecycle events.
suspend fun verifyMdoc(
engagementConfig: EngagementConfig,
mdocVerificationListener: MdocVerificationListener
)
Parameters
| Parameter | Type | Description |
|---|---|---|
| engagementConfig | EngagementConfig | Verification method configuration: QR, NFC, or both. required |
| mdocVerificationListener | MdocVerificationListener | Callback 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.
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.
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
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
val nfcConfig = EngagementConfig(
nfcConfig = NfcConfig(activity = this)
)
lifecycleScope.launch {
Tap2iDSdk.verifyMdoc(nfcConfig, verificationListener)
}
Example: Dual Mode (QR + NFC)
val dualConfig = EngagementConfig(
qrConfig = QrConfig(mDocString = scannedQrCode),
nfcConfig = NfcConfig(activity = this)
)
lifecycleScope.launch {
Tap2iDSdk.verifyMdoc(dualConfig, verificationListener)
}
Handle Results
The onVerificationCompleted callback returns a VerificationResult with the credential attributes and the outcome of each security check.
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
| Property | Type | Description |
|---|---|---|
| isIssuerSignedAuthenticated | Boolean | Mobile Security Object signature is valid. |
| isDeviceSignedAuthenticated | Boolean | ECDSA/MAC device signature passes verification. |
| isIssuerVerified | Boolean | Issuing CA found in the SDK trust store. |
| isMsoSigned | Boolean | Mobile Security Object is properly signed. |
| validationErrors | MutableSet? | Detailed issues. Null or empty when all checks pass. |
isIssuerSignedAuthenticated and isDeviceSignedAuthenticated before trusting the credential data.
Utility Methods
Get SDK Version
Returns the SDK version string. Useful for debugging and logging.
fun getSdkVersion(): String
val version = Tap2iDSdk.getSdkVersion()
Log.d("SDK", "Using Tap2iD SDK version: version")