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

  1. Expose an interaction URL (in a QR code or link) that advertises vcapi.
  2. When the wallet POSTs to your exchange URL, respond with the diploma in a verifiablePresentation.
  3. 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.

Go deeper

← Back to roles