Verifying Verifiable Credentials (W3C) via OID4VP
This guide shows you how to verify a W3C Verifiable Credential using the walt.id Enterprise Verifier2 Service and the OID4VP protocol. The verification process sends a credential request to a holder's wallet, receives the credential presentation, and validates it against your policies.
Verifiable Credential (VC): A digital equivalent of physical credentials such as a driver's license or university degree. VCs are cryptographically secure, privacy-respecting, and instantly verifiable.
OID4VP: A protocol specifying how parties can present VCs in a way that's consistent and secure across platforms ensuring interoperability.
Prerequisites
Before you begin, ensure you have:
- Enterprise Verifier2 Service setup — Follow the Setup guide
- Valid authentication token — Obtain a JWT token with appropriate permissions for your organization and tenant
- A test wallet with credentials — Use the walt.id Wallet for testing, or any OID4VP-compatible wallet
Enterprise Architecture: The Enterprise Verifier2 Service runs as a dedicated microservice within your organization's infrastructure. All requests are scoped to {organizationID}.{tenantID}.{verifierServiceID} for multi-tenancy isolation.
Example 1: Basic Verification
This example requests a single W3C Verifiable Credential (UniversityDegree) and verifies its cryptographic signature using the default signature policy.
Endpoint: POST /v1/{target}/verifier2-service-api/verification-session/create | API Reference
Example Request
curl -X 'POST' \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/verifier2-service-api/verification-session/create' \
-H 'accept: */*' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"flow_type": "cross_device",
"core_flow": {
"dcql_query": {
"credentials": [
{
"id": "example_university_degree_jwt_vc",
"format": "jwt_vc_json",
"meta": {
"type_values": [
[
"VerifiableCredential",
"UniversityDegree"
]
]
}
}
]
}
}
}'
Path Parameters
- orgID: String (required) - Your organization's Base URL. For example, if your organization is named
test, your default Base URL will betest.enterprise-sandbox.waltid.devwhen using the sandbox environment. - target: String (required) - The target resource identifier specifying the organization, tenant, and verifier service with which to execute the credential verification. Format:
{organizationID}.{tenantID}.{verifierServiceID}, e.g.waltid.tenant1.verifier1
Header Parameters
- Authorization: String (required) - Bearer token obtained from your Enterprise authentication. Format:
Bearer {token}.
Body Parameters
- flow_type: String (required) - Specifies how the credential request will be delivered to the holder's wallet. Options:
"cross_device"— User scans a QR code on a different device (e.g. desktop browser → phone wallet)"same_device"— User clicks a deep link on the same device (e.g. phone browser → wallet app on same phone)"dc_api"— Browser/OS-native Digital Credentials API (Chrome, Safari, iOS/Android native) over OpenID4VP 1.0 (Annex D)."dc_api-annex-c"— Browser/OS-native Digital Credentials API (Chrome, Safari, iOS/Android native) over 18013-7 (Annex C).
- core_flow: Object (required) - Defines what credentials to request and which policies to apply. Contains:
- dcql_query: Object (required) - Specifies the credential type, format, and claims to request using the DCQL query language. You can also use the DCQL builder here.
- credentials: Array - List of credential queries. Each credential query contains:
- id: String - Unique identifier for this credential in the request (used in policy results)
- format: String - Credential format. For W3C VCs, use
"jwt_vc_json"(JWT format). - meta.type_values: Array - List of acceptable credential type arrays. The credential must match at least one type array. Example:
[["VerifiableCredential", "OpenBadgeCredential"]]. - claims: Array (optional) - Specific claims to request from the credential. Each claim has a
path(JSON path to the claim). If omitted, all claims that are non-selectively disclosable are provided by the wallet.
- credentials: Array - List of credential queries. Each credential query contains:
- policies: Object (optional) - Validation rules applied to the received credential. Defaults to signature verification only if omitted.
- vc_policies: Array - Policies applied to individual credentials. Each policy has a
policyfield specifying the policy name. Available policies:signature,expired,not-before,revoked-status-list,schema, and more. See Policies for the complete list. - vp_policies: Array (optional) - Policies applied to the entire presentation (not shown in this example)
- vc_policies: Array - Policies applied to individual credentials. Each policy has a
- signedRequest: Boolean (optional) - Whether to sign the authorization request JWT. Required for HAIP profile compliance and DC API Annex C (ISO 18013-7) flows. Defaults to
false. See Signed Requests to learn more. - encryptedResponse: Boolean (optional) - Whether the wallet should encrypt the VP token response. Defaults to
false. See Encrypted Responses to learn more. - key: Object (optional) - Signing key for this verification session. Overrides the service-wide default
keyconfigured during verifier2 service creation. Must be a serialized key in the format{"type":"jwk","jwk":{...}}. Required whensignedRequest: trueorencryptedResponse: trueand no service-wide default is configured. See Signed Requests and Encrypted Responses for when this is needed. - x5c: Array of Strings (optional) - X.509 certificate chain for this verification session. Overrides the service-wide default
x5cconfigured during verifier2 service creation. Must be an ordered chain in DER-encoded, Base64-encoded format where the first certificate corresponds to thekey. Required for X.509-based client authentication (x509_san_dns:orx509_hash:asclientId) and signed Annex C requests. See Signed Requests to learn more. - verifier_info: Object (optional) - An array of attestations about the Verifier relevant to the Credential Request. Each object is a JSON object with the following fields:
- format: String - The format of the attestation. Currently only
"jwt"is supported. - data: String - The attestation data in JWT format.
- credentialIds: Array (optional) - Specifies which credentials in your DCQL query this attestation applies to. References the
idfields from yourcredentialsarray in the DCQL query. If omitted, the attestation applies to all requested credentials.
- format: String - The format of the attestation. Currently only
- expirationDuration: String (optional) - ISO-8601 duration specifying how long the verification session remains valid. Defaults to 10 minutes (
PT10M). Example:"PT1H"for 1 hour,"PT30M"for 30 minutes. - expirationDate: String (optional) - ISO-8601 datetime specifying the exact time when the session expires. Takes precedence over
expirationDurationif both are set. Example:"2026-05-21T15:00:00Z". Session expires if left unused (no presentation pushed). Once a presentation is received, the session is no longer eligible for expiry.
- dcql_query: Object (required) - Specifies the credential type, format, and claims to request using the DCQL query language. You can also use the DCQL builder here.
- url_config: Object (optional) - URL configuration for this session. Only applies to
cross_deviceandsame_deviceflows (notdc_api).- url_prefix: String (optional) - The publicly accessible base URL where the wallet will fetch the authorization request and post its response.
- The service constructs: Request URI:
{urlPrefix}/{target}/verifier2-service-api/{sessionId}/requestand Response URI:{urlPrefix}/{target}/verifier2-service-api/{sessionId}/response - Must be reachable by the wallet (use ngrok or public URL for local development)
- The service constructs: Request URI:
- url_host: String (optional) - The base URL used to construct the authorization request link. Can be set as a service-wide default during verifier2 service creation and overridden per-session here.
- For standard OID4VP flows, use
"openid4vp://authorize"(default) - For custom authorization endpoints (e.g. conformance testing), provide a full HTTPS URL
- For standard OID4VP flows, use
- url_prefix: String (optional) - The publicly accessible base URL where the wallet will fetch the authorization request and post its response.
- redirects: Object (optional) - Success and error redirect URLs (only for
cross_deviceandsame_deviceflows)- successRedirectUrl: String - URL to redirect the user after successful verification
- errorRedirectUrl: String - URL to redirect the user if verification fails
Service-Level Defaults: The
key,x5c, andurl_hostparameters can be configured as service-wide defaults during verifier2 service creation. Request-level parameters provided here override these defaults for that specific session only.
Example Response
The response contains the session ID and authorization URLs to present to the user.
{
"sessionId": "ed593e34-9e86-4144-87c1-de6d5ae9beb4",
"bootstrapAuthorizationRequestUrl": "openid4vp://authorize?request_uri=https%3A%2F%2F{orgID}.enterprise-sandbox.waltid.dev%2Fv1%2Fwaltid.tenant1.verifier1%2Fverifier2-service-api%2Fed593e34-9e86-4144-87c1-de6d5ae9beb4%2Frequest",
"fullAuthorizationRequestUrl": "openid4vp://authorize?response_type=vp_token&state=a65f02bd-c7f0-4094-932f-555ddce1b32f&response_mode=direct_post&nonce=f9b57ec3-c852-49ad-9537-2e1820f23ad9&response_uri=https%3A%2F%2F{orgID}.enterprise-sandbox.waltid.dev%2Fv1%2Fwaltid.tenant1.verifier1%2Fverifier2-service-api%2Fed593e34-9e86-4144-87c1-de6d5ae9beb4%2Fresponse&dcql_query=%7B%22credentials%22%3A%5B%7B%22id%22%3A%22example_university_degree_jwt_vc%22%2C%22format%22%3A%22jwt_vc_json%22%2C%22meta%22%3A%7B%22type_values%22%3A%5B%5B%22VerifiableCredential%22%2C%22UniversityDegree%22%5D%5D%7D%7D%5D%7D&client_metadata=%7B%22vp_formats_supported%22%3A%7B%22mso_mdoc%22%3A%7B%22issuerauth_alg_values%22%3A%5B-7%2C-9%2C-50%5D%2C%22deviceauth_alg_values%22%3A%5B-7%2C-9%2C-50%2C-65537%5D%7D%7D%2C%22client_name%22%3A%22Verifier%22%7D",
"creationTarget": "waltid.tenant1.verifier1.ed593e34-9e86-4144-87c1-de6d5ae9beb4"
}
Response Fields:
- sessionId: String - The unique ID of this verification session. Use this to query the session status.
- bootstrapAuthorizationRequestUrl: String - Shortened URL using
request_uriby reference. Use this for QR codes to minimize QR code density. - fullAuthorizationRequestUrl: String - Complete URL with all parameters embedded. Use this if the wallet doesn't support
request_uri(rare). - creationTarget: String - The full resource path including the session ID. Use this as the
{creationTarget}path parameter when querying session info.
Presenting the Request to the User
After creating the session, you need to present the authorization request to the user based on the flow type you chose.
Cross-Device Flow (QR Code)
- Generate a QR code from the
bootstrapAuthorizationRequestUrl - Display the QR code to the user on your web page or application
- User scans the QR code with their wallet app
- Wallet presents the credential and posts the response to your verifier
- Monitor the session status by polling the session endpoint or using SSE/callbacks (see below)
Same-Device Flow (Deep Link)
- Redirect the user to the
bootstrapAuthorizationRequestUrl - User's wallet app opens automatically (via deep link)
- Wallet presents the credential and posts the response to your verifier
- User is redirected to your
successRedirectUrlorerrorRedirectUrl - Query the session status to retrieve the verification results
Checking Verification Results
You can query the verification session to check if the user has presented their credential and whether validation succeeded.
Endpoint: GET /v1/{creationTarget}/verifier2-service-api/verification-session/info | API Reference
Example Request
curl -X 'GET' \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{creationTarget}/verifier2-service-api/verification-session/info' \
-H 'accept: application/json' \
-H 'Authorization: Bearer {yourToken}'
Path Parameters
- orgID: String (required) - Your organization's Base URL. For example, if your organization is named
test, your default Base URL will betest.enterprise-sandbox.waltid.devwhen using the sandbox environment. - creationTarget: String (required) - The target creation target returned when creating the verification session. It is a concatenation of the target resource and the session ID (e.g.,
org.tenant.verifier.ff4f0c86-56ce-4e4a-a137-dd5569049ff3).
Header Parameters
- Authorization: String (required) - Bearer token obtained from your Enterprise authentication. Format:
Bearer {token}.
Example Response
The response contains the complete session information including setup, status, policy results, and presented credentials.
{
"_id": "waltid.tenant1.verifier1.ed593e34-9e86-4144-87c1-de6d5ae9beb4",
"session": {
"id": "ed593e34-9e86-4144-87c1-de6d5ae9beb4",
"setup": {
"flow_type": "cross_device",
"core_flow": {
"dcql_query": {
"credentials": [
{
"id": "example_university_degree_jwt_vc",
"format": "jwt_vc_json",
"multiple": false,
"meta": {
"type_values": [
[
"VerifiableCredential",
"UniversityDegree"
]
],
"format": "jwt_vc_json"
},
"require_cryptographic_holder_binding": true
}
]
},
"signed_request": false,
"encrypted_response": false,
"policies": {}
},
"url_config": {}
},
"creationDate": "2026-05-20T11:36:36.742929808Z",
"expirationDate": "2026-05-20T11:47:15.747252763Z",
"retentionDate": "2036-05-20T11:36:36.742929808Z",
"status": "SUCCESSFUL",
"attempted": true,
"reattemptable": true,
"bootstrapAuthorizationRequest": {
"response_type": "vp_token",
"request_uri": "https://waltid.testing-0-20-0.enterprise.test.waltid.cloud/v1/waltid.tenant1.verifier1/verifier2-service-api/ed593e34-9e86-4144-87c1-de6d5ae9beb4/request"
},
"bootstrapAuthorizationRequestUrl": "openid4vp://authorize?request_uri=https%3A%2F%2Fwaltid.testing-0-20-0.enterprise.test.waltid.cloud%2Fv1%2Fwaltid.tenant1.verifier1%2Fverifier2-service-api%2Fed593e34-9e86-4144-87c1-de6d5ae9beb4%2Frequest",
"authorizationRequest": {
"response_type": "vp_token",
"state": "a65f02bd-c7f0-4094-932f-555ddce1b32f",
"response_mode": "direct_post",
"nonce": "f9b57ec3-c852-49ad-9537-2e1820f23ad9",
"response_uri": "https://waltid.testing-0-20-0.enterprise.test.waltid.cloud/v1/waltid.tenant1.verifier1/verifier2-service-api/ed593e34-9e86-4144-87c1-de6d5ae9beb4/response",
"dcql_query": {
"credentials": [
{
"id": "example_university_degree_jwt_vc",
"format": "jwt_vc_json",
"multiple": false,
"meta": {
"type_values": [
[
"VerifiableCredential",
"UniversityDegree"
]
],
"format": "jwt_vc_json"
},
"require_cryptographic_holder_binding": true
}
]
},
"client_metadata": {
"vp_formats_supported": {
"mso_mdoc": {
"issuerauth_alg_values": [
-7,
-9,
-50
],
"deviceauth_alg_values": [
-7,
-9,
-50,
-65537
]
}
},
"client_name": "Verifier"
}
},
"authorizationRequestUrl": "openid4vp://authorize?response_type=vp_token&state=a65f02bd-c7f0-4094-932f-555ddce1b32f&response_mode=direct_post&nonce=f9b57ec3-c852-49ad-9537-2e1820f23ad9&response_uri=https%3A%2F%2Fwaltid.testing-0-20-0.enterprise.test.waltid.cloud%2Fv1%2Fwaltid.tenant1.verifier1%2Fverifier2-service-api%2Fed593e34-9e86-4144-87c1-de6d5ae9beb4%2Fresponse&dcql_query=%7B%22credentials%22%3A%5B%7B%22id%22%3A%22example_university_degree_jwt_vc%22%2C%22format%22%3A%22jwt_vc_json%22%2C%22meta%22%3A%7B%22type_values%22%3A%5B%5B%22VerifiableCredential%22%2C%22UniversityDegree%22%5D%5D%7D%7D%5D%7D&client_metadata=%7B%22vp_formats_supported%22%3A%7B%22mso_mdoc%22%3A%7B%22issuerauth_alg_values%22%3A%5B-7%2C-9%2C-50%5D%2C%22deviceauth_alg_values%22%3A%5B-7%2C-9%2C-50%2C-65537%5D%7D%7D%2C%22client_name%22%3A%22Verifier%22%7D",
"requestMode": "REQUEST_URI",
"policies": {
"vp_policies": {
"jwt_vc_json": [
"jwt_vc_json/audience-check",
"jwt_vc_json/nonce-check",
"jwt_vc_json/envelope_signature"
],
"dc+sd-jwt": [
"dc+sd-jwt/audience-check",
"dc+sd-jwt/kb-jwt_signature",
"dc+sd-jwt/nonce-check",
"dc+sd-jwt/sd_hash-check"
],
"mso_mdoc": [
"mso_mdoc/device-auth",
"mso_mdoc/device_key_auth",
"mso_mdoc/issuer_auth",
"mso_mdoc/issuer_signed_integrity",
"mso_mdoc/mso"
]
},
"vc_policies": [
{
"policy": "signature",
"id": "signature"
}
]
},
"policy_results": {
"vp_policies": {
"example_university_degree_jwt_vc": {
"jwt_vc_json/audience-check": {
"policy_executed": {
"policy": "jwt_vc_json/audience-check",
"id": "jwt_vc_json/audience-check",
"description": "Check if presentation audience matches expected audience for session"
},
"success": true,
"results": {
"presentation_audience": ""
},
"errors": [],
"execution_time": "PT0.010967155S"
},
"jwt_vc_json/nonce-check": {
"policy_executed": {
"policy": "jwt_vc_json/nonce-check",
"id": "jwt_vc_json/nonce-check",
"description": "Check if presentation nonce matches expected nonce for session"
},
"success": true,
"results": {},
"errors": [],
"execution_time": "PT0.011009056S"
},
"jwt_vc_json/envelope_signature": {
"policy_executed": {
"policy": "jwt_vc_json/envelope_signature",
"id": "jwt_vc_json/envelope_signature",
"description": "Verify signature using holders public key"
},
"success": true,
"results": {
"issuer": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"holder_key_jwk": {
"kty": "EC",
"crv": "P-256",
"x": "m4r2Sf0jYK3OXLPrdrwC2OSSkwCBUVNJH-kpIlzmBzo",
"y": "Uqa4uWu4rgrm3Cj9wugwYIig5ZS9DkLKxKnGk8sYr1o"
},
"verified_vp_jwt_content": {
"sub": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"nbf": 1779276975,
"iat": 1779277035,
"jti": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"iss": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"nonce": "f9b57ec3-c852-49ad-9537-2e1820f23ad9",
"aud": "",
"vp": {
"@context": [
"https://www.w3.org/2018/credentials/v1"
],
"type": [
"VerifiablePresentation"
],
"id": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"holder": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"verifiableCredential": [
"eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag"
]
}
}
},
"errors": [],
"execution_time": "PT0.030289930S"
}
}
},
"vc_policies": [
{
"policy": {
"policy": "signature",
"id": "signature"
},
"success": true,
"result": {
"verification_result": true,
"signed_credential": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag",
"credential_signature": {
"type": "signature-jwt",
"signature": "_oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag",
"jwtHeader": {
"kid": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0#iJMS5bkZVIlncfq_Lf_SuxJ2JtQ5Hvaz7tWPnAjUUds",
"typ": "JWT",
"alg": "EdDSA"
}
},
"verified_data": {
"iss": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0",
"sub": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"vc": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "urn:uuid:71895926-f4bc-48ca-972d-2118382832bd",
"type": [
"VerifiableCredential",
"UniversityDegree"
],
"issuer": {
"id": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0"
},
"issuanceDate": "2026-05-20T11:27:40.792103913Z",
"credentialSubject": {
"id": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts"
}
},
"expirationDate": "2027-05-20T11:27:40.792137614Z"
},
"jti": "urn:uuid:71895926-f4bc-48ca-972d-2118382832bd",
"exp": 1810812460,
"iat": 1779276460,
"nbf": 1779276460
},
"successful_issuer_public_key": {
"kty": "OKP",
"crv": "Ed25519",
"kid": "iJMS5bkZVIlncfq_Lf_SuxJ2JtQ5Hvaz7tWPnAjUUds",
"x": "FZdvwC8aGhRwqzWptej0NZgtwYAI1SyFg1mKDETOfqE"
},
"successful_issuer_public_key_id": "iJMS5bkZVIlncfq_Lf_SuxJ2JtQ5Hvaz7tWPnAjUUds"
}
}
],
"specific_vc_policies": {},
"overallSuccess": true
},
"presentation_validation_results": {
"example_university_degree_jwt_vc": {
"jwt_vc_json/audience-check": {
"policy_executed": {
"policy": "jwt_vc_json/audience-check",
"id": "jwt_vc_json/audience-check",
"description": "Check if presentation audience matches expected audience for session"
},
"success": true,
"results": {
"presentation_audience": ""
},
"errors": [],
"execution_time": "PT0.010967155S"
},
"jwt_vc_json/nonce-check": {
"policy_executed": {
"policy": "jwt_vc_json/nonce-check",
"id": "jwt_vc_json/nonce-check",
"description": "Check if presentation nonce matches expected nonce for session"
},
"success": true,
"results": {},
"errors": [],
"execution_time": "PT0.011009056S"
},
"jwt_vc_json/envelope_signature": {
"policy_executed": {
"policy": "jwt_vc_json/envelope_signature",
"id": "jwt_vc_json/envelope_signature",
"description": "Verify signature using holders public key"
},
"success": true,
"results": {
"issuer": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"holder_key_jwk": {
"kty": "EC",
"crv": "P-256",
"x": "m4r2Sf0jYK3OXLPrdrwC2OSSkwCBUVNJH-kpIlzmBzo",
"y": "Uqa4uWu4rgrm3Cj9wugwYIig5ZS9DkLKxKnGk8sYr1o"
},
"verified_vp_jwt_content": {
"sub": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"nbf": 1779276975,
"iat": 1779277035,
"jti": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"iss": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"nonce": "f9b57ec3-c852-49ad-9537-2e1820f23ad9",
"aud": "",
"vp": {
"@context": [
"https://www.w3.org/2018/credentials/v1"
],
"type": [
"VerifiablePresentation"
],
"id": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"holder": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"verifiableCredential": [
"eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag"
]
}
}
},
"errors": [],
"execution_time": "PT0.030289930S"
}
}
},
"presented_raw_data": {
"vpToken": {
"example_university_degree_jwt_vc": [
"eyJraWQiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMjekRuYWVhdTk4eG50OWF3Y2tOcEVxMzRDdzJMYmZwRWlnZ0pjNDN1d01oOHVBYThCMyIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJuYmYiOjE3NzkyNzY5NzUsImlhdCI6MTc3OTI3NzAzNSwianRpIjoidXJuOnV1aWQ6N2RhNDMyZWYtYmMyMC00MmRjLTk0ZTUtZjVjMGJkNzAyNzExIiwiaXNzIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwibm9uY2UiOiJmOWI1N2VjMy1jODUyLTQ5YWQtOTUzNy0yZTE4MjBmMjNhZDkiLCJhdWQiOiIiLCJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwiaWQiOiJ1cm46dXVpZDo3ZGE0MzJlZi1iYzIwLTQyZGMtOTRlNS1mNWMwYmQ3MDI3MTEiLCJob2xkZXIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJjbmYiOm51bGwsInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SnJhV1FpT2lKa2FXUTZhbmRyT21WNVNuSmtTR3RwVDJsS1VGTXhRV2xNUTBwcVkyNVphVTlwU2taYVJFa3hUbFJGTlVscGQybGhNbXhyU1dwdmFXRlZjRTVWZWxacFlURndWMU5YZUhWWk1scDRXREI0YlZneFRqRmxSVzk1VTI1U1VrNVZhREpaV0c4elpFWmtVV0pyUm5GV1ZsWnJZM2xKYzBsdVoybFBhVXBIVjIxU01tUXdUVFJaVldSdlZXNWtlR1ZzWkhka1IxWnhUVVUxWVZvelVqTlhWVVpLVFZaT05WSnRZM2hpVlhSRlVsWlNVRnB1UmtaSmJqQWphVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJblI1Y0NJNklrcFhWQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMC5leUpwYzNNaU9pSmthV1E2YW5kck9tVjVTbkprU0d0cFQybEtVRk14UVdsTVEwcHFZMjVaYVU5cFNrWmFSRWt4VGxSRk5VbHBkMmxoTW14clNXcHZhV0ZWY0U1VmVsWnBZVEZ3VjFOWGVIVlpNbHA0V0RCNGJWZ3hUakZsUlc5NVUyNVNVazVWYURKWldHOHpaRVprVVdKclJuRldWbFpyWTNsSmMwbHVaMmxQYVVwSFYyMVNNbVF3VFRSWlZXUnZWVzVrZUdWc1pIZGtSMVp4VFVVMVlWb3pVak5YVlVaS1RWWk9OVkp0WTNoaVZYUkZVbFpTVUZwdVJrWkpiakFpTENKemRXSWlPaUprYVdRNmEyVjVPbnBFYm1GbFlYVTVPSGh1ZERsaGQyTnJUbkJGY1RNMFEzY3lUR0ptY0VWcFoyZEtZelF6ZFhkTmFEaDFRV0U0UWpNaUxDSjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0lzSW1oMGRIQnpPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1ERTRMMk55WldSbGJuUnBZV3h6TDJWNFlXMXdiR1Z6TDNZeElsMHNJbWxrSWpvaWRYSnVPblYxYVdRNk56RTRPVFU1TWpZdFpqUmlZeTAwT0dOaExUazNNbVF0TWpFeE9ETTRNamd6TW1Ka0lpd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0lzSWxWdWFYWmxjbk5wZEhsRVpXZHlaV1VpWFN3aWFYTnpkV1Z5SWpwN0ltbGtJam9pWkdsa09tcDNhenBsZVVweVpFaHJhVTlwU2xCVE1VRnBURU5LYW1OdVdXbFBhVXBHV2tSSk1VNVVSVFZKYVhkcFlUSnNhMGxxYjJsaFZYQk9WWHBXYVdFeGNGZFRWM2gxV1RKYWVGZ3dlRzFZTVU0eFpVVnZlVk51VWxKT1ZXZ3lXVmh2TTJSR1pGRmlhMFp4VmxaV2EyTjVTWE5KYm1kcFQybEtSMWR0VWpKa01FMDBXVlZrYjFWdVpIaGxiR1IzWkVkV2NVMUZOV0ZhTTFJelYxVkdTazFXVGpWU2JXTjRZbFYwUlZKV1VsQmFia1pHU1c0d0luMHNJbWx6YzNWaGJtTmxSR0YwWlNJNklqSXdNall0TURVdE1qQlVNVEU2TWpjNk5EQXVOemt5TVRBek9URXpXaUlzSW1OeVpXUmxiblJwWVd4VGRXSnFaV04wSWpwN0ltbGtJam9pWkdsa09tdGxlVHA2Ukc1aFpXRjFPVGg0Ym5RNVlYZGphMDV3UlhFek5FTjNNa3hpWm5CRmFXZG5TbU0wTTNWM1RXZzRkVUZoT0VJeklpd2laR1ZuY21WbElqcDdJblI1Y0dVaU9pSkNZV05vWld4dmNrUmxaM0psWlNJc0ltNWhiV1VpT2lKQ1lXTm9aV3h2Y2lCdlppQlRZMmxsYm1ObElHRnVaQ0JCY25SekluMTlMQ0psZUhCcGNtRjBhVzl1UkdGMFpTSTZJakl3TWpjdE1EVXRNakJVTVRFNk1qYzZOREF1TnpreU1UTTNOakUwV2lKOUxDSnFkR2tpT2lKMWNtNDZkWFZwWkRvM01UZzVOVGt5TmkxbU5HSmpMVFE0WTJFdE9UY3laQzB5TVRFNE16Z3lPRE15WW1RaUxDSmxlSEFpT2pFNE1UQTRNVEkwTmpBc0ltbGhkQ0k2TVRjM09USTNOalEyTUN3aWJtSm1Jam94TnpjNU1qYzJORFl3ZlEuX29XSVFBUlp2b1RQNzFLMkp4Ym5EcFVhQTl0ZkJ4TUJNNmUza2psQVRmZnF3cFY1X3JIZ21ZRVlnWk5yUTFhSzdpZGxYQ2JzeXh0SGlVclZnUjU0QWciXX19.D6w2TPAx92_FGTH64K7ANrir6aJRRvyhicT1q5fJVuIy8M5EVjDWDM3sOibTHgDcmr3-EM-fv2WmTiY7YUpU2Q"
]
},
"state": "a65f02bd-c7f0-4094-932f-555ddce1b32f"
},
"presented_presentations": {
"example_university_degree_jwt_vc": {
"type": "jwt_vc_json",
"format": "jwt_vc_json",
"jwt": "eyJraWQiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMjekRuYWVhdTk4eG50OWF3Y2tOcEVxMzRDdzJMYmZwRWlnZ0pjNDN1d01oOHVBYThCMyIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJuYmYiOjE3NzkyNzY5NzUsImlhdCI6MTc3OTI3NzAzNSwianRpIjoidXJuOnV1aWQ6N2RhNDMyZWYtYmMyMC00MmRjLTk0ZTUtZjVjMGJkNzAyNzExIiwiaXNzIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwibm9uY2UiOiJmOWI1N2VjMy1jODUyLTQ5YWQtOTUzNy0yZTE4MjBmMjNhZDkiLCJhdWQiOiIiLCJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwiaWQiOiJ1cm46dXVpZDo3ZGE0MzJlZi1iYzIwLTQyZGMtOTRlNS1mNWMwYmQ3MDI3MTEiLCJob2xkZXIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJjbmYiOm51bGwsInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SnJhV1FpT2lKa2FXUTZhbmRyT21WNVNuSmtTR3RwVDJsS1VGTXhRV2xNUTBwcVkyNVphVTlwU2taYVJFa3hUbFJGTlVscGQybGhNbXhyU1dwdmFXRlZjRTVWZWxacFlURndWMU5YZUhWWk1scDRXREI0YlZneFRqRmxSVzk1VTI1U1VrNVZhREpaV0c4elpFWmtVV0pyUm5GV1ZsWnJZM2xKYzBsdVoybFBhVXBIVjIxU01tUXdUVFJaVldSdlZXNWtlR1ZzWkhka1IxWnhUVVUxWVZvelVqTlhWVVpLVFZaT05WSnRZM2hpVlhSRlVsWlNVRnB1UmtaSmJqQWphVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJblI1Y0NJNklrcFhWQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMC5leUpwYzNNaU9pSmthV1E2YW5kck9tVjVTbkprU0d0cFQybEtVRk14UVdsTVEwcHFZMjVaYVU5cFNrWmFSRWt4VGxSRk5VbHBkMmxoTW14clNXcHZhV0ZWY0U1VmVsWnBZVEZ3VjFOWGVIVlpNbHA0V0RCNGJWZ3hUakZsUlc5NVUyNVNVazVWYURKWldHOHpaRVprVVdKclJuRldWbFpyWTNsSmMwbHVaMmxQYVVwSFYyMVNNbVF3VFRSWlZXUnZWVzVrZUdWc1pIZGtSMVp4VFVVMVlWb3pVak5YVlVaS1RWWk9OVkp0WTNoaVZYUkZVbFpTVUZwdVJrWkpiakFpTENKemRXSWlPaUprYVdRNmEyVjVPbnBFYm1GbFlYVTVPSGh1ZERsaGQyTnJUbkJGY1RNMFEzY3lUR0ptY0VWcFoyZEtZelF6ZFhkTmFEaDFRV0U0UWpNaUxDSjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0lzSW1oMGRIQnpPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1ERTRMMk55WldSbGJuUnBZV3h6TDJWNFlXMXdiR1Z6TDNZeElsMHNJbWxrSWpvaWRYSnVPblYxYVdRNk56RTRPVFU1TWpZdFpqUmlZeTAwT0dOaExUazNNbVF0TWpFeE9ETTRNamd6TW1Ka0lpd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0lzSWxWdWFYWmxjbk5wZEhsRVpXZHlaV1VpWFN3aWFYTnpkV1Z5SWpwN0ltbGtJam9pWkdsa09tcDNhenBsZVVweVpFaHJhVTlwU2xCVE1VRnBURU5LYW1OdVdXbFBhVXBHV2tSSk1VNVVSVFZKYVhkcFlUSnNhMGxxYjJsaFZYQk9WWHBXYVdFeGNGZFRWM2gxV1RKYWVGZ3dlRzFZTVU0eFpVVnZlVk51VWxKT1ZXZ3lXVmh2TTJSR1pGRmlhMFp4VmxaV2EyTjVTWE5KYm1kcFQybEtSMWR0VWpKa01FMDBXVlZrYjFWdVpIaGxiR1IzWkVkV2NVMUZOV0ZhTTFJelYxVkdTazFXVGpWU2JXTjRZbFYwUlZKV1VsQmFia1pHU1c0d0luMHNJbWx6YzNWaGJtTmxSR0YwWlNJNklqSXdNall0TURVdE1qQlVNVEU2TWpjNk5EQXVOemt5TVRBek9URXpXaUlzSW1OeVpXUmxiblJwWVd4VGRXSnFaV04wSWpwN0ltbGtJam9pWkdsa09tdGxlVHA2Ukc1aFpXRjFPVGg0Ym5RNVlYZGphMDV3UlhFek5FTjNNa3hpWm5CRmFXZG5TbU0wTTNWM1RXZzRkVUZoT0VJeklpd2laR1ZuY21WbElqcDdJblI1Y0dVaU9pSkNZV05vWld4dmNrUmxaM0psWlNJc0ltNWhiV1VpT2lKQ1lXTm9aV3h2Y2lCdlppQlRZMmxsYm1ObElHRnVaQ0JCY25SekluMTlMQ0psZUhCcGNtRjBhVzl1UkdGMFpTSTZJakl3TWpjdE1EVXRNakJVTVRFNk1qYzZOREF1TnpreU1UTTNOakUwV2lKOUxDSnFkR2tpT2lKMWNtNDZkWFZwWkRvM01UZzVOVGt5TmkxbU5HSmpMVFE0WTJFdE9UY3laQzB5TVRFNE16Z3lPRE15WW1RaUxDSmxlSEFpT2pFNE1UQTRNVEkwTmpBc0ltbGhkQ0k2TVRjM09USTNOalEyTUN3aWJtSm1Jam94TnpjNU1qYzJORFl3ZlEuX29XSVFBUlp2b1RQNzFLMkp4Ym5EcFVhQTl0ZkJ4TUJNNmUza2psQVRmZnF3cFY1X3JIZ21ZRVlnWk5yUTFhSzdpZGxYQ2JzeXh0SGlVclZnUjU0QWciXX19.D6w2TPAx92_FGTH64K7ANrir6aJRRvyhicT1q5fJVuIy8M5EVjDWDM3sOibTHgDcmr3-EM-fv2WmTiY7YUpU2Q",
"payload": {
"sub": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"nbf": 1779276975,
"iat": 1779277035,
"jti": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"iss": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"nonce": "f9b57ec3-c852-49ad-9537-2e1820f23ad9",
"aud": "",
"vp": {
"@context": [
"https://www.w3.org/2018/credentials/v1"
],
"type": [
"VerifiablePresentation"
],
"id": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"holder": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"verifiableCredential": [
"eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag"
]
}
},
"issuer": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"audience": "",
"nonce": "f9b57ec3-c852-49ad-9537-2e1820f23ad9",
"vp": {
"@context": [
"https://www.w3.org/2018/credentials/v1"
],
"type": [
"VerifiablePresentation"
],
"id": "urn:uuid:7da432ef-bc20-42dc-94e5-f5c0bd702711",
"holder": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"verifiableCredential": [
"eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag"
]
},
"credentials": [
{
"type": "vc-w3c_1_1",
"disclosables": {},
"credentialData": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "urn:uuid:71895926-f4bc-48ca-972d-2118382832bd",
"type": [
"VerifiableCredential",
"UniversityDegree"
],
"issuer": {
"id": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0"
},
"issuanceDate": "2026-05-20T11:27:40.792103913Z",
"credentialSubject": {
"id": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts"
}
},
"expirationDate": "2027-05-20T11:27:40.792137614Z"
},
"issuer": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0",
"subject": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"signature": {
"type": "signature-jwt",
"signature": "_oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag",
"jwtHeader": {
"kid": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0#iJMS5bkZVIlncfq_Lf_SuxJ2JtQ5Hvaz7tWPnAjUUds",
"typ": "JWT",
"alg": "EdDSA"
}
},
"signed": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag",
"format": "jwt_vc_json"
}
]
}
},
"presented_credentials": {
"example_university_degree_jwt_vc": [
{
"type": "vc-w3c_1_1",
"disclosables": {},
"credentialData": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "urn:uuid:71895926-f4bc-48ca-972d-2118382832bd",
"type": [
"VerifiableCredential",
"UniversityDegree"
],
"issuer": {
"id": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0"
},
"issuanceDate": "2026-05-20T11:27:40.792103913Z",
"credentialSubject": {
"id": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science and Arts"
}
},
"expirationDate": "2027-05-20T11:27:40.792137614Z"
},
"issuer": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0",
"subject": "did:key:zDnaeau98xnt9awckNpEq34Cw2LbfpEiggJc43uwMh8uAa8B3",
"signature": {
"type": "signature-jwt",
"signature": "_oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag",
"jwtHeader": {
"kid": "did:jwk:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsIngiOiJGWmR2d0M4YUdoUndxeldwdGVqME5aZ3R3WUFJMVN5RmcxbUtERVRPZnFFIn0#iJMS5bkZVIlncfq_Lf_SuxJ2JtQ5Hvaz7tWPnAjUUds",
"typ": "JWT",
"alg": "EdDSA"
}
},
"signed": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAjaUpNUzVia1pWSWxuY2ZxX0xmX1N1eEoySnRRNUh2YXo3dFdQbkFqVVVkcyIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaWFVcE5VelZpYTFwV1NXeHVZMlp4WDB4bVgxTjFlRW95U25SUk5VaDJZWG8zZEZkUWJrRnFWVlZrY3lJc0luZ2lPaUpHV21SMmQwTTRZVWRvVW5keGVsZHdkR1ZxTUU1YVozUjNXVUZKTVZONVJtY3hiVXRFUlZSUFpuRkZJbjAiLCJzdWIiOiJkaWQ6a2V5OnpEbmFlYXU5OHhudDlhd2NrTnBFcTM0Q3cyTGJmcEVpZ2dKYzQzdXdNaDh1QWE4QjMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sImlkIjoidXJuOnV1aWQ6NzE4OTU5MjYtZjRiYy00OGNhLTk3MmQtMjExODM4MjgzMmJkIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlVuaXZlcnNpdHlEZWdyZWUiXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lhVXBOVXpWaWExcFdTV3h1WTJaeFgweG1YMU4xZUVveVNuUlJOVWgyWVhvM2RGZFFia0ZxVlZWa2N5SXNJbmdpT2lKR1dtUjJkME00WVVkb1VuZHhlbGR3ZEdWcU1FNWFaM1IzV1VGSk1WTjVSbWN4YlV0RVJWUlBabkZGSW4wIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDUtMjBUMTE6Mjc6NDAuNzkyMTAzOTEzWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6RG5hZWF1OTh4bnQ5YXdja05wRXEzNEN3MkxiZnBFaWdnSmM0M3V3TWg4dUFhOEIzIiwiZGVncmVlIjp7InR5cGUiOiJCYWNoZWxvckRlZ3JlZSIsIm5hbWUiOiJCYWNoZWxvciBvZiBTY2llbmNlIGFuZCBBcnRzIn19LCJleHBpcmF0aW9uRGF0ZSI6IjIwMjctMDUtMjBUMTE6Mjc6NDAuNzkyMTM3NjE0WiJ9LCJqdGkiOiJ1cm46dXVpZDo3MTg5NTkyNi1mNGJjLTQ4Y2EtOTcyZC0yMTE4MzgyODMyYmQiLCJleHAiOjE4MTA4MTI0NjAsImlhdCI6MTc3OTI3NjQ2MCwibmJmIjoxNzc5Mjc2NDYwfQ._oWIQARZvoTP71K2JxbnDpUaA9tfBxMBM6e3kjlATffqwpV5_rHgmYEYgZNrQ1aK7idlXCbsyxtHiUrVgR54Ag",
"format": "jwt_vc_json"
}
]
}
},
"timestamp": 1779276996743,
"parent": "waltid.tenant1.verifier1"
}
Key Response Fields:
- id: String - The verification session ID
- setup: Object - The complete session configuration that was used to create this verification session
- creationDate: String - ISO 8601 timestamp when the session was created
- expirationDate: String - ISO 8601 timestamp when the session expires (default: 10 minutes after creation). Session will expire if left unused (no presentation pushed). Once a presentation is received, the session is no longer eligible for expiry.
- status: String - The current status of the verification session. Possible values:
"UNKNOWN"— Session ended up in unknown flow (should be avoided)"ACTIVE"— Session was created and is active (can be used)"UNUSED"— Session was not used yet, but not expired (can be used)"IN_USE"— AuthorizationRequest was requested by wallet"VALIDATING_RECEIVED_REQUEST"— Checking if received presentation will be processed"PROCESSING_FLOW"— Received presentation is being processed (validation + policy execution)"EXPIRED"— Verification request expired without being utilized"SUCCESSFUL"— Verification completed fully successfully (all validation & policies passed)"FAILED"— Verification was unsuccessful (presentation validation or policies failed)
- attempted: Boolean - Whether the wallet has attempted to respond to the verification request
- reattemptable: Boolean - Whether the user can retry this verification session if it failed
- policies: Object - The policies configured for this session:
- vp_policies: Object (optional) - Policies to run on presentations
- vc_policies: Array (optional) - Policies to run on credentials
- specific_vc_policies: Object (optional) - Policies to run on specific credential IDs
- policy_results: Object (optional) - Detailed results for all policies applied to the verification (only present after presentation is received):
- vp_policies: Object - Results for presentation-level policies (audience check, nonce check, envelope signature), organized by credential ID. Structure:
{ "credential_id": { "policy_name": { ... } } } - vc_policies: Array - Results for credential-level policies (signature, expiry, schema, etc.). Each item contains
policy,success, andresult. - specific_vc_policies: Object - Results for credential-specific policies
- overallSuccess: Boolean (computed) - Whether all policies passed
- vp_policies: Object - Results for presentation-level policies (audience check, nonce check, envelope signature), organized by credential ID. Structure:
- presented_credentials: Object (optional) - The parsed credentials presented by the user, organized by credential ID
Instead of polling the session status, you can use callbacks or Server Sent Events (SSE) to be notified when the verification completes. See Callbacks & SSE for details (Enterprise implementation may differ).
Example 2: Requesting Multiple Credentials
You can request multiple credentials in a single verification session. The wallet will present all matching credentials, and policies will be applied to each one.
This example requests both an OpenBadgeCredential and a VerifiableId in JWT format.
Endpoint: POST /v1/{target}/verifier2-service-api/verification-session/create | API Reference
Example Request
curl -X 'POST' \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/verifier2-service-api/verification-session/create' \
-H 'accept: */*' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"flow_type": "cross_device",
"core_flow": {
"dcql_query": {
"credentials": [
{
"id": "example_openbadge_jwt_vc",
"format": "jwt_vc_json",
"meta": {
"type_values": [
[
"VerifiableCredential",
"OpenBadgeCredential"
]
]
},
"claims": [
{
"path": [
"name"
]
}
]
},
{
"id": "example_verifiableid_jwt_vc",
"format": "jwt_vc_json",
"meta": {
"type_values": [
[
"VerifiableCredential",
"VerifiableAttestation",
"VerifiableId"
]
]
},
"claims": [
{
"path": [
"issuanceDate"
]
}
]
}
]
},
"policies": {
"vc_policies": [
{
"policy": "signature"
}
]
}
}
}'
The wallet will present both credentials (if available), and the signature policy will be applied to each one. The policy_results in the session info response will contain separate results for each credential using their id values.
Understanding Flow Types and Core Concepts
Now that you've seen verification in action, let's understand the underlying structure.
Verification Session Structure
A VerificationSession defines the full lifecycle: authorization request → user presentation → policy validation → final result.
Every verification request follows this structure:
{
"flow_type": "cross_device | same_device | dc_api",
"core_flow": { /* common to all flows */ },
"url_config": { /* specific to cross_device and same_device */ },
"redirects": { /* optional */ }
}
Why this structure?
- flow_type determines how the credential request is delivered (QR code vs deep link vs browser API)
- core_flow contains the credential query and policies (same regardless of delivery method)
- url_config and redirects are flow-specific attributes
This separation makes it easy to switch between flows without changing your credential requirements.
Flow Type Comparison
| Flow Type | Use Case | Required Attributes | User Experience |
|---|---|---|---|
cross_device | User scans QR code from desktop | None beyond core flow | Desktop shows QR → User scans with phone → Phone wallet opens |
same_device | User clicks link on mobile | redirects (success/error URLs) | Browser redirects to wallet → Wallet opens → User returns to browser |
dc_api | Browser-native credential exchange | expectedOrigins (array of allowed origins) | Browser shows native credential picker → User selects → Instant return |
Advanced Options
Signed Requests
Sign the authorization request JWT using a verifier signing key. This is required for:
- HAIP profile compliance
- DC API Annex C (ISO 18013-7) flows
Enable by setting signedRequest: true in the request body.
Key Configuration Required: Signed requests require a signing key (key) to be configured. You can either:
- Set the
keyparameter during verifier2 service creation as a service-wide default - Override or provide the
keydirectly in the verification request body
Certificate Chain (x5c) Required for:
- X.509-based client authentication when using
x509_san_dns:orx509_hash:as theclientIdformat - Signed Annex C (ISO 18013-7) requests
The x5c parameter can be configured the same way as key — as a service-wide default or per-session override.
Encrypted Responses
The wallet can encrypt the VP token response. Enable by setting encryptedResponse: true in the request body.
Key Configuration Required: Encrypted responses require a key (key) for decrypting the VP token response. Configure it during verifier2 service creation or provide it in the verification request body.
Custom Policies
Beyond signature verification, you can apply additional policies:
"policies": {
"vc_policies": [
{ "policy": "signature" },
{ "policy": "expired" },
{ "policy": "not-before" },
{ "policy": "schema" }
]
}
See Policies for the complete list and configuration options.
Next Steps
- Apply custom policies — See Policies for validation rules beyond signature verification
- Verify other credential types — Try SD-JWT VC or mDL
- Use DC API — Try the Digital Credentials API for browser-native credential exchange
