Build an issuer
You run the DMV side: start an exchange and deliver a signed mobile license into the resident's wallet — over the same VCALM exchange loop the wallet speaks.
You'll do exactly 3 things
- Expose an interaction URL (in a QR code or link) that advertises
vcapi. - Authenticate the resident, then deliver the license in a
verifiablePresentation. - Finish the exchange.
1. Advertise the exchange
The wallet dereferences your interaction URL (iuv=1) and you
return the protocols you support. Offer vcapi for VCALM:
{
"protocols": {
"vcapi": "https://issuer.dmv.state.example/exchanges/mdl-456"
}
}
2. Authenticate, then deliver
Identity credentials should be bound to the holder. Respond to the wallet's first POST with a DID Authentication request:
{
"verifiablePresentationRequest": {
"query": [{
"type": "DIDAuthentication",
"acceptedMethods": [{"method": "example"}]
}],
"challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
"domain": "issuer.dmv.state.example"
}
}
On the next turn, deliver the signed mobile license:
{
"verifiablePresentation": {
"@context": ["https://www.w3.org/ns/credentials/v2"],
"type": ["VerifiablePresentation"],
"verifiableCredential": [{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/vc/mdl/v1"
],
"type": ["VerifiableCredential", "Iso18013DriversLicenseCredential"],
"issuer": "did:web:dmv.state.example",
"credentialSubject": {
"id": "did:example:resident123",
"family_name": "Doe",
"given_name": "Jordan",
"birth_date": "1998-05-12",
"document_number": "D1234567",
"driving_privileges": [{"vehicle_category_code": "C"}]
},
"proof": { "...": "DMV signature" }
}]
}
}
The exchange is complete when you return no
verifiablePresentationRequest.
That's it
A conformant DMV issuer is this exchange: advertise, authenticate, deliver, confirm. Signing the credential is your issuer instance's job — the coordinator just runs the exchange.
Prefer a library to raw HTTP?
Issuer-side helpers live in Digital Bazaar's Bedrock VC modules. A dogfooded standalone VCALM client is planned; until it ships, the HTTP flow above is the supported path.