Build an issuer
You run the university side: start an exchange and deliver a signed diploma credential into the graduate'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. - When the wallet POSTs to your exchange URL, respond with the
diploma in a
verifiablePresentation. - Optionally ask the wallet to authenticate first (DID Auth), then deliver; 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.university.example/exchanges/diploma-789"
}
}
2. Deliver the credential
The wallet POSTs an empty body to start. You respond with the signed diploma
wrapped in a verifiablePresentation:
{
"verifiablePresentation": {
"@context": ["https://www.w3.org/ns/credentials/v2"],
"type": ["VerifiablePresentation"],
"verifiableCredential": [{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/education/v2"
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"issuer": "did:web:university.example",
"credentialSubject": {
"id": "did:example:graduate123",
"degree": {"type": "BachelorDegree", "name": "B.Sc. Computer Science"}
},
"proof": { "...": "issuer signature" }
}]
}
}
The exchange is complete when you return no
verifiablePresentationRequest.
3. (Optional) Authenticate the holder first
To bind the diploma to a holder, respond to the wallet's first POST with a
verifiablePresentationRequest for DID Authentication, then
deliver on the next turn:
{
"verifiablePresentationRequest": {
"query": [{
"type": "DIDAuthentication",
"acceptedMethods": [{"method": "example"}]
}],
"challenge": "99612b24-63d9-11ea-b99f-4f66f3e4f81a",
"domain": "issuer.university.example"
}
}
That's it
A conformant education issuer is this exchange: advertise, deliver, confirm. The signing of the credential itself 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.