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

  1. Expose an interaction URL (in a QR code or link) that advertises vcapi.
  2. Authenticate the resident, then deliver the license in a verifiablePresentation.
  3. 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.

Go deeper

← Back to roles