Skip to content

Verify ISO/IEC 18013-5 mdoc credentials

This guide shows how to verify an ISO/IEC 18013-5:2021 mdoc (mDL) device response with the Vidos Verifier service.

Before you start, complete the setup guide so your verifier endpoint and API key are ready.


For ISO/IEC 18013-5, the Verifier expects the credential as a base64url-encoded string.

The example below is a sample device response. In a real flow, you would receive this from a wallet or device-to-reader exchange.

ISO/IEC 18013-5 mdoc device response (base64url)
uQADZ3ZlcnNpb25jMS4waWRvY3VtZW50c4G5AANnZG9jVHlwZXVvcmcuaXNvLjE4MDEzLjUuMS5tRExsaXNzdWVyU2lnbmVkuQACam5hbWVTcGFjZXO5AAFxb3JnLmlzby4xODAxMy41LjGM2BhYZ7kABGhkaWdlc3RJRABmcmFuZG9tWCD61pyp42bGpG7ZKWc1RCKdEVbzeW3EH_tyFl1UVSTOmXFlbGVtZW50SWRlbnRpZmllcmtmYW1pbHlfbmFtZWxlbGVtZW50VmFsdWVlU21pdGjYGFhluQAEaGRpZ2VzdElEAWZyYW5kb21YIJgyNfOKp_1v6NVBKuV9Kl01aplp5zY-Piu4Lgdz79kpcWVsZW1lbnRJZGVudGlmaWVyamdpdmVuX25hbWVsZWxlbWVudFZhbHVlZEpvaG7YGFhuuQAEaGRpZ2VzdElEAmZyYW5kb21YIB5_yuxA3sTp2Sa_U1BS397ZQCklxJs-sRFCgXJz8DM_cWVsZW1lbnRJZGVudGlmaWVyamJpcnRoX2RhdGVsZWxlbWVudFZhbHVl2QPsajE5ODAtMDYtMTXYGFhuuQAEaGRpZ2VzdElEA2ZyYW5kb21YIOUburfHLwXL5_8VZ4QjvIcUY7h_pNQDrYV82Mvm5MbTcWVsZW1lbnRJZGVudGlmaWVyamlzc3VlX2RhdGVsZWxlbWVudFZhbHVl2QPsajIwMjMtMDMtMDHYGFhvuQAEaGRpZ2VzdElEBGZyYW5kb21YIOSkBCVJEtEyglyjQu3tIkTtpH3RfVf2iWoQaj_wR4kZcWVsZW1lbnRJZGVudGlmaWVya2V4cGlyeV9kYXRlbGVsZW1lbnRWYWx1ZdkD7GoyMDI4LTAzLTMx2BhYaLkABGhkaWdlc3RJRAVmcmFuZG9tWCBLMwvV-dOqBOAs89TBFFEhVAokeC_Jzqe7FRaR2oqvdXFlbGVtZW50SWRlbnRpZmllcm9pc3N1aW5nX2NvdW50cnlsZWxlbWVudFZhbHVlYlVT2BhYbrkABGhkaWdlc3RJRAZmcmFuZG9tWCDAHo0PXgkqKqowuCU99WWjAAfa1LxhAuHhdz5AsYRhm3FlbGVtZW50SWRlbnRpZmllcnFpc3N1aW5nX2F1dGhvcml0eWxlbGVtZW50VmFsdWVmTlkgRE1W2BhYc7kABGhkaWdlc3RJRAdmcmFuZG9tWCBP_G7HokIEvNJyJ8CRD56aLoB0zulWdV56fGfG1JCo2XFlbGVtZW50SWRlbnRpZmllcnRpc3N1aW5nX2p1cmlzZGljdGlvbmxlbGVtZW50VmFsdWVoTmV3IFlvcmvYGFhxuQAEaGRpZ2VzdElECGZyYW5kb21YICZeRL1TA1YK-VZfTGnocQYtHoxZmADMDXlegfjFm1-8cWVsZW1lbnRJZGVudGlmaWVyb2RvY3VtZW50X251bWJlcmxlbGVtZW50VmFsdWVrMDEtMzMzLTcwNzDYGFhjuQAEaGRpZ2VzdElECWZyYW5kb21YIM_jHbcOLcknX02DFKiVNYiZ6a3A0OUZIOAoKFU26DO9cWVsZW1lbnRJZGVudGlmaWVyaHBvcnRyYWl0bGVsZW1lbnRWYWx1ZWRic3Ry2BhYsbkABGhkaWdlc3RJRApmcmFuZG9tWCDEkW1up2fuH-cP6pCkb5xjScujvjZ4EnHB7wDb31XOD3FlbGVtZW50SWRlbnRpZmllcnJkcml2aW5nX3ByaXZpbGVnZXNsZWxlbWVudFZhbHVlgbkAA3V2ZWhpY2xlX2NhdGVnb3J5X2NvZGVhQ2ppc3N1ZV9kYXRlajIwMjMtMDMtMDFrZXhwaXJ5X2RhdGVqMjAyOC0wMy0zMdgYWHq5AARoZGlnZXN0SUQLZnJhbmRvbVggS-PBhOrVDNVAt5o-hU6wBzcd4cjISvYsvwSb8YDlavNxZWxlbWVudElkZW50aWZpZXJ2dW5fZGlzdGluZ3Vpc2hpbmdfc2lnbmxlbGVtZW50VmFsdWVtdGJkLXVzLm55LmRtdmppc3N1ZXJBdXRohEOhASaiBEIxMRghgVkCLjCCAiowggHQoAMCAQICFFfGzNMIveQ-yjdE8qhxONq7uIToMAoGCCqGSM49BAMCMFMxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEPMA0GA1UEBwwGQWxiYW55MQ8wDQYDVQQKDAZOWSBETVYxDzANBgNVBAsMBk5ZIERNVjAeFw0yMzA5MTQxNDU1MThaFw0zMzA5MTExNDU1MThaMFMxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEPMA0GA1UEBwwGQWxiYW55MQ8wDQYDVQQKDAZOWSBETVYxDzANBgNVBAsMBk5ZIERNVjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIk8LYNHkG3GzWm39javS_1TP5YYTwqtrNEIMNpEcdvbYKwXDRz8U0-uLZ3NSI93R_35eNkl6jHp6Qg8OCup7VOjgYEwfzAdBgNVHQ4EFgQUq20uA7kdSSJAM4-8yt79kzPq9scwHwYDVR0jBBgwFoAUq20uA7kdSSJAM4-8yt79kzPq9scwDwYDVR0TAQH_BAUwAwEB_zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwCgYIKoZIzj0EAwIDSAAwRQIgCf0Mq5ewPnj2TnTX3O6IZoxHagr8WqLOv_4H0753LqkCIQDaOKvJiggPSfJP_s4f_8imzdWywLXaj8e3Z6w6ldy4PlkDGdgYWQMUuQAGZ3ZlcnNpb25jMS4wb2RpZ2VzdEFsZ29yaXRobWdTSEEtMjU2bHZhbHVlRGlnZXN0c7kAAm9vcmcuY3VzdG9tLnRlc3ShAFggPFEWEJwGj6f78xhrrsE-5svkjMbEoA_TSbn68KBPL_1xb3JnLmlzby4xODAxMy41LjGsAFggg8ZTwufH0uDwcvQmmiD06zXUOPl6HJMCaqEk-3B-FHkBWCCnDBSUOgAroGde-ilemF41YZd2T0WRZWy2syQbbLtfHgJYIPDF3PDqw57aYvT1LlJpL_3AnBM_RAYAhpaENQHlNk75A1gglPPMFL4hCs5PnUVFlIB0-vOgE4otEEGtrEXMrh8SCNIEWCDAetmSJTUAPkeIdlTqrgVWZ1Zce9GaiXXwM2hl-Cvw9QVYIGPLCRKJL7zXYehbgEjKqVS8DbYONnipdZAgRFsJpGI-BlggBSyCVHi5DlAY6FejrpDI3eNPX-UFahQ9t3181hB998kHWCCgDz4wlMPS6l1DYPJg1G9I3a2ry0niwrKFDykT_cToqghYIK6hsyC5fnkiR2xoAI0nXs9JBOoJ1yuVDeemBUvabni3CVgg92Sj9dDZmLc1Be8dwY6xXXes0SsuIQDlkAGrnAaF2lQKWCCh3Q_718_y_h7kRSPTXbu91cm1nGrgCtbdeFVUl4iYyQtYIP0siFlNZZSHK4esXVxD2XIRpz_9NIoKrqceVO8dwvvJbWRldmljZUtleUluZm-5AAFpZGV2aWNlS2V5pAECIVggiBh5ynojixm_D0wfjADpouGbp6b3Pq6SuFHU3htQhVkiWCCjFLU4A5Entc1Qc19UUZ4zwTRFBUXFYDrZ8mP6zFbTdyABZ2RvY1R5cGV1b3JnLmlzby4xODAxMy41LjEubURMbHZhbGlkaXR5SW5mb7kAA2ZzaWduZWTAdDIwMjMtMDktMjlUMTU6NDE6NTlaaXZhbGlkRnJvbcB0MjAyMy0wOS0yOVQxNTo0MTo1OVpqdmFsaWRVbnRpbMB0MjA3My0wOS0yOVQxNTo0MTo1OVpYQNgsmCtJJhS8BCQUhCBtphsc_2S_oNMbVQwJCWvGLybBO07yytS4fZ5zcXYgAB2ykX542oWJbQRuJTWVr59CpZRsZGV2aWNlU2lnbmVkuQACam5hbWVTcGFjZXPYGEGgamRldmljZUF1dGi5AAFvZGV2aWNlU2lnbmF0dXJlhEOhASahBEIxMVjS2BhYzoR0RGV2aWNlQXV0aGVudGljYXRpb26D9vaEZjEyMzQ1NngrQ3ExYW5QYjh2WlU1ajVDMGQ3aGNzYnVKTEJwSWF3VUpJRFFSaTJFYndiNHhcaHR0cDovL2xvY2FsaG9zdDo0MDAwL2FwaS9wcmVzZW50YXRpb25fcmVxdWVzdC9kYzg5OTlkZi1kNmVhLTRjODQtOTk4NS0zN2E4YjgxYTgyZWMvY2FsbGJhY2tnYWJjZGVmZ3VvcmcuaXNvLjE4MDEzLjUuMS5tREzYGEGgWECpe1-bWdGT7aZiVC5xy32vb6iVKsiwzOgvIueDTR-o8NLKslpwhlgibAPZaVDQDDUW_OYqIgdI1PCmlgciQ7UCZnN0YXR1cwA
Section titled “Step 2: Configure holder binding (recommended)”

To validate device authentication, provide ISO/IEC 18013-5 holder binding inputs under options.policyParams.proof.holderBinding.

Verification options (ISO/IEC 18013-5 holder binding)
{
"at": "2026-02-22T00:00:00.000Z",
"policyParams": {
"proof": {
"holderBinding": {
"type": "iso18013-5",
"encodedSessionTranscript": "2BhYnoP29oRmMTIzNDU2eCtDcTFhblBiOHZaVTVqNUMwZDdoY3NidUpMQnBJYXdVSklEUVJpMkVid2I0eFxodHRwOi8vbG9jYWxob3N0OjQwMDAvYXBpL3ByZXNlbnRhdGlvbl9yZXF1ZXN0L2RjODk5OWRmLWQ2ZWEtNGM4NC05OTg1LTM3YThiODFhODJlYy9jYWxsYmFja2dhYmNkZWZn",
"ephemeralReaderKey": "U0tSZWFkZXI"
}
}
}
}

If you omit encodedSessionTranscript and ephemeralReaderKey, the Verifier can skip the device signature check for mdoc proofs. Use holder binding options when you need device authentication to be enforced.

Send the credential and options.

Verify the mdoc credential
curl \
--request POST -i "$VIDOS_VERIFIER_ENDPOINT/vidos/verifier/v1/verify" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $VIDOS_API_KEY" \
--data '{
"credential": "uQADZ3ZlcnNpb25jMS4waWRvY3VtZW50c4G5AANnZG9jVHlwZXVvcmcuaXNvLjE4MDEzLjUuMS5tRExsaXNzdWVyU2lnbmVkuQACam5hbWVTcGFjZXO5AAFxb3JnLmlzby4xODAxMy41LjGM2BhYZ7kABGhkaWdlc3RJRABmcmFuZG9tWCD61pyp42bGpG7ZKWc1RCKdEVbzeW3EH_tyFl1UVSTOmXFlbGVtZW50SWRlbnRpZmllcmtmYW1pbHlfbmFtZWxlbGVtZW50VmFsdWVlU21pdGjYGFhluQAEaGRpZ2VzdElEAWZyYW5kb21YIJgyNfOKp_1v6NVBKuV9Kl01aplp5zY-Piu4Lgdz79kpcWVsZW1lbnRJZGVudGlmaWVyamdpdmVuX25hbWVsZWxlbWVudFZhbHVlZEpvaG7YGFhuuQAEaGRpZ2VzdElEAmZyYW5kb21YIB5_yuxA3sTp2Sa_U1BS397ZQCklxJs-sRFCgXJz8DM_cWVsZW1lbnRJZGVudGlmaWVyamJpcnRoX2RhdGVsZWxlbWVudFZhbHVl2QPsajE5ODAtMDYtMTXYGFhuuQAEaGRpZ2VzdElEA2ZyYW5kb21YIOUburfHLwXL5_8VZ4QjvIcUY7h_pNQDrYV82Mvm5MbTcWVsZW1lbnRJZGVudGlmaWVyamlzc3VlX2RhdGVsZWxlbWVudFZhbHVl2QPsajIwMjMtMDMtMDHYGFhvuQAEaGRpZ2VzdElEBGZyYW5kb21YIOSkBCVJEtEyglyjQu3tIkTtpH3RfVf2iWoQaj_wR4kZcWVsZW1lbnRJZGVudGlmaWVya2V4cGlyeV9kYXRlbGVsZW1lbnRWYWx1ZdkD7GoyMDI4LTAzLTMx2BhYaLkABGhkaWdlc3RJRAVmcmFuZG9tWCBLMwvV-dOqBOAs89TBFFEhVAokeC_Jzqe7FRaR2oqvdXFlbGVtZW50SWRlbnRpZmllcm9pc3N1aW5nX2NvdW50cnlsZWxlbWVudFZhbHVlYlVT2BhYbrkABGhkaWdlc3RJRAZmcmFuZG9tWCDAHo0PXgkqKqowuCU99WWjAAfa1LxhAuHhdz5AsYRhm3FlbGVtZW50SWRlbnRpZmllcnFpc3N1aW5nX2F1dGhvcml0eWxlbGVtZW50VmFsdWVmTlkgRE1W2BhYc7kABGhkaWdlc3RJRAdmcmFuZG9tWCBP_G7HokIEvNJyJ8CRD56aLoB0zulWdV56fGfG1JCo2XFlbGVtZW50SWRlbnRpZmllcnRpc3N1aW5nX2p1cmlzZGljdGlvbmxlbGVtZW50VmFsdWVoTmV3IFlvcmvYGFhxuQAEaGRpZ2VzdElECGZyYW5kb21YICZeRL1TA1YK-VZfTGnocQYtHoxZmADMDXlegfjFm1-8cWVsZW1lbnRJZGVudGlmaWVyb2RvY3VtZW50X251bWJlcmxlbGVtZW50VmFsdWVrMDEtMzMzLTcwNzDYGFhjuQAEaGRpZ2VzdElECWZyYW5kb21YIM_jHbcOLcknX02DFKiVNYiZ6a3A0OUZIOAoKFU26DO9cWVsZW1lbnRJZGVudGlmaWVyaHBvcnRyYWl0bGVsZW1lbnRWYWx1ZWRic3Ry2BhYsbkABGhkaWdlc3RJRApmcmFuZG9tWCDEkW1up2fuH-cP6pCkb5xjScujvjZ4EnHB7wDb31XOD3FlbGVtZW50SWRlbnRpZmllcnJkcml2aW5nX3ByaXZpbGVnZXNsZWxlbWVudFZhbHVlgbkAA3V2ZWhpY2xlX2NhdGVnb3J5X2NvZGVhQ2ppc3N1ZV9kYXRlajIwMjMtMDMtMDFrZXhwaXJ5X2RhdGVqMjAyOC0wMy0zMdgYWHq5AARoZGlnZXN0SUQLZnJhbmRvbVggS-PBhOrVDNVAt5o-hU6wBzcd4cjISvYsvwSb8YDlavNxZWxlbWVudElkZW50aWZpZXJ2dW5fZGlzdGluZ3Vpc2hpbmdfc2lnbmxlbGVtZW50VmFsdWVtdGJkLXVzLm55LmRtdmppc3N1ZXJBdXRohEOhASaiBEIxMRghgVkCLjCCAiowggHQoAMCAQICFFfGzNMIveQ-yjdE8qhxONq7uIToMAoGCCqGSM49BAMCMFMxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEPMA0GA1UEBwwGQWxiYW55MQ8wDQYDVQQKDAZOWSBETVYxDzANBgNVBAsMBk5ZIERNVjAeFw0yMzA5MTQxNDU1MThaFw0zMzA5MTExNDU1MThaMFMxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEPMA0GA1UEBwwGQWxiYW55MQ8wDQYDVQQKDAZOWSBETVYxDzANBgNVBAsMBk5ZIERNVjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIk8LYNHkG3GzWm39javS_1TP5YYTwqtrNEIMNpEcdvbYKwXDRz8U0-uLZ3NSI93R_35eNkl6jHp6Qg8OCup7VOjgYEwfzAdBgNVHQ4EFgQUq20uA7kdSSJAM4-8yt79kzPq9scwHwYDVR0jBBgwFoAUq20uA7kdSSJAM4-8yt79kzPq9scwDwYDVR0TAQH_BAUwAwEB_zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwCgYIKoZIzj0EAwIDSAAwRQIgCf0Mq5ewPnj2TnTX3O6IZoxHagr8WqLOv_4H0753LqkCIQDaOKvJiggPSfJP_s4f_8imzdWywLXaj8e3Z6w6ldy4PlkDGdgYWQMUuQAGZ3ZlcnNpb25jMS4wb2RpZ2VzdEFsZ29yaXRobWdTSEEtMjU2bHZhbHVlRGlnZXN0c7kAAm9vcmcuY3VzdG9tLnRlc3ShAFggPFEWEJwGj6f78xhrrsE-5svkjMbEoA_TSbn68KBPL_1xb3JnLmlzby4xODAxMy41LjGsAFggg8ZTwufH0uDwcvQmmiD06zXUOPl6HJMCaqEk-3B-FHkBWCCnDBSUOgAroGde-ilemF41YZd2T0WRZWy2syQbbLtfHgJYIPDF3PDqw57aYvT1LlJpL_3AnBM_RAYAhpaENQHlNk75A1gglPPMFL4hCs5PnUVFlIB0-vOgE4otEEGtrEXMrh8SCNIEWCDAetmSJTUAPkeIdlTqrgVWZ1Zce9GaiXXwM2hl-Cvw9QVYIGPLCRKJL7zXYehbgEjKqVS8DbYONnipdZAgRFsJpGI-BlggBSyCVHi5DlAY6FejrpDI3eNPX-UFahQ9t3181hB998kHWCCgDz4wlMPS6l1DYPJg1G9I3a2ry0niwrKFDykT_cToqghYIK6hsyC5fnkiR2xoAI0nXs9JBOoJ1yuVDeemBUvabni3CVgg92Sj9dDZmLc1Be8dwY6xXXes0SsuIQDlkAGrnAaF2lQKWCCh3Q_718_y_h7kRSPTXbu91cm1nGrgCtbdeFVUl4iYyQtYIP0siFlNZZSHK4esXVxD2XIRpz_9NIoKrqceVO8dwvvJbWRldmljZUtleUluZm-5AAFpZGV2aWNlS2V5pAECIVggiBh5ynojixm_D0wfjADpouGbp6b3Pq6SuFHU3htQhVkiWCCjFLU4A5Entc1Qc19UUZ4zwTRFBUXFYDrZ8mP6zFbTdyABZ2RvY1R5cGV1b3JnLmlzby4xODAxMy41LjEubURMbHZhbGlkaXR5SW5mb7kAA2ZzaWduZWTAdDIwMjMtMDktMjlUMTU6NDE6NTlaaXZhbGlkRnJvbcB0MjAyMy0wOS0yOVQxNTo0MTo1OVpqdmFsaWRVbnRpbMB0MjA3My0wOS0yOVQxNTo0MTo1OVpYQNgsmCtJJhS8BCQUhCBtphsc_2S_oNMbVQwJCWvGLybBO07yytS4fZ5zcXYgAB2ykX542oWJbQRuJTWVr59CpZRsZGV2aWNlU2lnbmVkuQACam5hbWVTcGFjZXPYGEGgamRldmljZUF1dGi5AAFvZGV2aWNlU2lnbmF0dXJlhEOhASahBEIxMVjS2BhYzoR0RGV2aWNlQXV0aGVudGljYXRpb26D9vaEZjEyMzQ1NngrQ3ExYW5QYjh2WlU1ajVDMGQ3aGNzYnVKTEJwSWF3VUpJRFFSaTJFYndiNHhcaHR0cDovL2xvY2FsaG9zdDo0MDAwL2FwaS9wcmVzZW50YXRpb25fcmVxdWVzdC9kYzg5OTlkZi1kNmVhLTRjODQtOTk4NS0zN2E4YjgxYTgyZWMvY2FsbGJhY2tnYWJjZGVmZ3VvcmcuaXNvLjE4MDEzLjUuMS5tREzYGEGgWECpe1-bWdGT7aZiVC5xy32vb6iVKsiwzOgvIueDTR-o8NLKslpwhlgibAPZaVDQDDUW_OYqIgdI1PCmlgciQ7UCZnN0YXR1cwA",
"options": {
"at": "2026-02-22T00:00:00.000Z",
"policyParams": {
"proof": {
"holderBinding": {
"type": "iso18013-5",
"encodedSessionTranscript": "2BhYnoP29oRmMTIzNDU2eCtDcTFhblBiOHZaVTVqNUMwZDdoY3NidUpMQnBJYXdVSklEUVJpMkVid2I0eFxodHRwOi8vbG9jYWxob3N0OjQwMDAvYXBpL3ByZXNlbnRhdGlvbl9yZXF1ZXN0L2RjODk5OWRmLWQ2ZWEtNGM4NC05OTg1LTM3YThiODFhODJlYy9jYWxsYmFja2dhYmNkZWZn",
"ephemeralReaderKey": "U0tSZWFkZXI"
}
}
}
}
}'

A successful verification returns HTTP 200 with individual policy outcomes.

You should see at least format and proof results for an mdoc credential. If temporal policies are enabled, you should also see notBefore and notAfter results.

{
"results": [
{
"data": {
"credentialType": "org.iso.18013.5.1.mDL",
"format": "mdoc",
"version": "1.0"
},
"path": [],
"policy": "format",
"service": "verifier",
"status": "success"
},
{
"data": {
"reference": "2073-09-29T15:41:59.000Z",
"status": "success",
"target": "2026-02-22T00:00:00.000Z"
},
"path": [],
"policy": "notAfter",
"service": "verifier",
"status": "success"
},
{
"data": {
"reference": "2023-09-29T15:41:59.000Z",
"status": "success",
"target": "2026-02-22T00:00:00.000Z"
},
"path": [],
"policy": "notBefore",
"service": "verifier",
"status": "success"
},
{
"data": {
"type": "mdl"
},
"path": [],
"policy": "proof",
"service": "verifier",
"status": "success"
}
]
}

You have verified the credential when:

  • The HTTP status is 200.
  • The format policy identifies the credential as mdoc.
  • The proof policy reports status: "success".
  • Unsupported credential format: Confirm your Verifier instance enables ISO 18013-5:2021 under the format policy.
  • Holder binding failure: Ensure encodedSessionTranscript and ephemeralReaderKey are base64url-encoded and match the values from your reader session.
  • Temporal failure: Change options.at to the time you want to verify against, or issue a new credential if it is outside its validity window.