Credential Management
The Wallet Server runs a multi-tenant cloud wallet. Each holder is a per-user tenant that stores the Verifiable Credentials (VCs) belonging to one user. A holder acquires a credential by processing a credential-offer URI: the platform requests, binds, and stores the credential automatically. (This offer flow is the only way credentials enter a wallet — there is no raw-JSON upload.) Once stored, you can list the credentials in their raw (encoded) form or as decoded payloads.
All endpoints in this section are scoped to a single holder under /holders/:holderId and require a valid Bearer token with the admin role. Ownership is enforced, so a user can only operate on holders they own.
Authorization: Bearer <token>A holder is created beforehand via POST /agent/holder (see Holders and Tenancy). The holderId returned there is the tenant id used in every path below.
Acquiring a credential
POST /holders/:holderId/process
Processes a URI scanned from a QR code or received from an issuer or verifier. The same endpoint handles both directions, dispatching on the URI scheme:
openid-credential-offer://...— accepts a credential offer. The holder resolves the offer, requests the offered credential(s), binds them to the holder's DID, and stores them in the wallet.openid4vp://...(or anhttps://authorization request) — responds to a verification request by selecting matching credentials and sending the presentation.
Request Body
uri (string, required): the credential-offer or authorization-request URI.
curl -X POST http://localhost:3000/holders/594b464b-20bd-495a-9fb6-87328c759629/process \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"uri": "openid-credential-offer://?credential_offer_uri=..."}'Response Body
For a credential offer (issuance):
status:
successon completion.claimed: number of credentials stored from the offer.
ids: identifiers of the stored credentials, usable to correlate entries returned by the listing endpoints.
For an authorization request (verification) the response is { "status": "success", "action": "presentation_sent" }. For the full issuance and presentation walkthroughs, see Processing Credential Offers and Presentation Requests.
Listing raw credentials
GET /holders/:holderId/credentials
Returns every credential currently stored for the holder in its raw, encoded form (the compact string the wallet received and can present).
Response Body
An array of credential entries:
id: the wallet record id for the credential.
format: the stored credential format (see Supported formats below).
credential: the encoded credential — a compact SD-JWT or JWT string, or a JSON object for JSON-LD VCs.
Listing decoded credentials
GET /holders/:holderId/credentials/decoded
Returns the same credentials with their payloads decoded, which is convenient for inspecting claims without parsing the compact encoding yourself.
Response Body
An array of decoded entries:
id: the wallet record id.
format: the decoded credential format.
decoded: the decoded content, which varies by format:
SD-JWT VC —
header,payload, andprettyClaims(claims with selective-disclosure digests resolved into their values);kbJwtis included when a key-binding JWT is present.JWT-VC-JSON —
headerandpayload.For a JSON-LD VC stored as a JSON object,
decodedis the object itself.
error (optional): a message describing why an entry could not be decoded;
decodedisnullin that case.
Supported formats
The cloud wallet can store and list credentials in the formats the platform issues, plus additional formats it may receive during presentation flows:
SD-JWT VC — reported as
dc+sd-jwt.JWT-VC-JSON — reported as
jwt_vc_json.JSON-LD VC — reported as
ldp_vc.W3C v2 credentials — reported with their claim format (
vc+jwtorvc+sd-jwt).mdoc — reported as
mso_mdoc.
Deletion
The holder API surface covers processing URIs and listing credentials (POST /holders/:holderId/process, GET /holders/:holderId/credentials, and GET /holders/:holderId/credentials/decoded). Deleting individual credentials or clearing a holder's store is not currently part of the API.
Last updated