Credentials, status, and trust
This guide is the starting point for an issuance or verification implementation. It explains which choices belong together, shows the matching Admin Console screen, and places the captured request, captured response, and live Scalar/OpenAPI operation beside the explanation.
Every REST + captured result panel uses four inner tabs:
- Overview identifies the endpoint and captured status.
- Request shows the sanitized request that was actually captured.
- Response shows the corresponding captured response.
- API reference embeds the same operation from the current OpenAPI contract in Scalar, including schemas and examples.
The captures prove only the displayed boundary. They do not prove a complete wallet flow or a different deployment. Use customer-neutral values and never place secrets, private keys, access tokens, or customer identifiers in a guide or Postman environment.
Select one coherent profile
Credential format and status format are a paired protocol choice. Do not issue one format and attach a status reference shaped for another.
| Credential profile | OID4VCI format | Status mechanism | Hosted media type | Primary trust input |
|---|---|---|---|---|
| SD-JWT VC | dc+sd-jwt | IETF Token Status List signed as JWT | application/statuslist+jwt | DID/JWK or X.509 evidence admitted by a trust domain |
| ISO mdoc | mso_mdoc | IETF Token Status List signed as CWT | application/statuslist+cwt | DSC chain to an admitted IACA; VICAL may distribute mdoc trust anchors |
| W3C VCDM 1.1 in JWT | jwt_vc_json | StatusList2021 bitstring credential signed as JWT | application/vc+jwt | DID/JWK or X.509 evidence admitted by a trust domain |
| W3C VCDM 2.0 in JWT | jwt_vc_json-ld | StatusList2021 bitstring credential signed as JWT | application/vc+jwt | DID/JWK or X.509 evidence admitted by a trust domain |
jwt_vc_json-ld means a JWT-encoded VCDM 2.0 JSON-LD credential. It is not the same wire contract as VCDM 1.1 jwt_vc_json. The credential @context, type binding, claim paths, and issuer metadata must match the selected row.
What each layer decides
| Layer | Question answered | Common mistake |
|---|---|---|
| Credential design | What is issued, in which format, with which claims and OID4VCI configuration id? | Treating an mdoc namespace path as a JSON claim path |
| KMS key/certificate | Which provider-native object performs the cryptographic operation? | Assuming a KMS resource id itself establishes issuer trust |
| Status list | Is the credential's indexed status currently valid? | Using JWT Token Status, CWT Token Status, and StatusList2021 interchangeably |
| Trust domain | Which issuer or signer evidence is admitted for this consumer? | Assuming a valid signature is automatically trusted |
| DCQL | Which credential formats and claims must the holder present? | Querying the wrong format identifier or claim path |
| Protocol session | Did issuance or presentation complete? | Treating session creation as proof that a wallet stored or presented a credential |
1. Define the credential design
Create the semantic model and claim paths first. Then bind that model to the wire format and a stable credentialConfigurationId. Wallets use this identifier when selecting a configuration from issuer metadata.
- Admin Console
- REST + captured result
Navigation: Resources > Credential Designs > Credential designs
Deep link: #resource=credentialDesigns&rarea=credential-designs

Open a design and inspect Overview for its format binding and Claims for its format-specific paths. A saved design is configuration; issuance still requires an issuer binding, signing selection, and protocol session.
The SD-JWT capture demonstrates vct and selective-disclosure-oriented JSON claims. The mdoc capture demonstrates a docType and namespaced element paths.
- Overview
- Request
- Response
Create EuPid SD-JWT design
Endpoint: POST /api/credential-design/v1/designs/credentials
Captured response: 201 Created
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Create Mdl mdoc design
Endpoint: POST /api/credential-design/v1/designs/credentials
Captured response: 201 Created
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
For the W3C rows, open the request examples VCDM 1.1 employee credential and VCDM 2.0 employee credential in the embedded Scalar operation. Compare their @context and OID4VCI binding instead of copying one version into the other.
Format-specific design rules
- SD-JWT VC: use
dc+sd-jwt, a stablevct, and explicit disclosure policy. A disclosed claim is released by the holder; it is not encrypted merely because undisclosed claims remain hidden. - mdoc: use
mso_mdoc, the correctdocType, and ISO namespace/element identifiers. The DSC certificate chain and device-authentication behavior are part of verification. - VCDM 1.1 JWT: use
jwt_vc_json, the VCDM 1.1 context, and the intendedtypevalues. - VCDM 2.0 JWT: use
jwt_vc_json-ld, the VCDM 2.0 context, and VCDM 2.0 claim semantics. Do not silently downgrade it to a 1.1 JWT VC.
2. Select keys and certificates
The credential design says what will be signed; the signing selection says which key performs the operation. For an external provider, the runtime must retain the provider-native key alias as well as the EDK resource handle.
- Admin Console
- REST + Scalar
Navigation: Resources > KMS > Providers, Keys, or Certificates

Use Keys to generate or register an existing provider-native key. Use Certificates to register public certificate material and its relationship to the key. Registration must never require exporting an external private key.
The complete provider setup, Azure Key Vault, BYOK, BYOC, validation, and deletion semantics are in Azure KMS, BYOK, and BYOC. The Scalar KMS contract is the source for provider- and algorithm-specific fields.
For mdoc, the KMS public key, DSC certificate, credential x5chain, and admitted IACA must describe the same chain. Azure Key Vault can protect the signing operation; it cannot decide which IACA is trusted.
3. Create the matching status list
Create the list before issuance so the credential can carry a stable URI and index. The status-management API controls list lifecycle and entries; the public hosting API returns the signed artifact consumed by verifiers.
- Admin Console
- REST + captured result
Navigation: Resources > Status Lists > Lists
Deep link: #resource=statuslists&rarea=lists

The detail page separates configuration, entries, and the hosted token. Verify the proof format and public media type before allocating production entries.
This captured lane creates a JWT Token Status List, reads its management representation, fetches its hosted token, and changes one entry.
- Overview
- Request
- Response
Create token status list
Endpoint: POST /api/statuslist/v1/statuslists
Captured response: 409 Conflict
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Get token status list
Endpoint: GET /api/statuslist/v1/statuslists/00000000-0000-4000-8000-000000000000
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Fetch hosted status list token
Endpoint: GET /public/statuslists/eupid-revocation
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Revoke a status entry
Endpoint: POST /api/statuslist/v1/statuslists/00000000-0000-4000-8000-000000000000/status
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
The same creation operation also contains named OpenAPI examples for mdoc CWT, VCDM 1.1 StatusList2021, and VCDM 2.0 StatusList2021. Those examples intentionally select different proof contracts.
The credential must reference the same list and entry using its own format-specific structure:
- SD-JWT uses its token-status claim and a JWT status-list endpoint.
- mdoc carries status metadata in the issuer-signed structure and points to a CWT status-list endpoint.
- VCDM 1.1 and 2.0 use
credentialStatusand a StatusList2021/bitstring status-list credential.
See Credential status profile walkthroughs for complete request bodies, media types, and valid-to-revoked checks.
4. Establish verifier trust
A cryptographically valid credential can still be untrusted. A trust domain records the anchors, admission classes, sources, and consumer attachment used to decide whether an issuer or signer is accepted.
- Admin Console
- REST + captured result
Navigation: Resources > Trust domains > Domains
Verifier attachment: Open Protocols > Verifier > Settings > Trust domains

Create the domain, add anchors and their admissions, activate it, and attach it to the intended tenant, verifier, query, or template consumer. A narrower attachment replaces the broader selection; it does not merge silently with it.
These captures resolve to the Trust Domain Scalar/OpenAPI operations as well as showing their exact request and response.
- Overview
- Request
- Response
Create trust domain
Endpoint: POST /api/trust-domain/v1/domains
Captured response: 201 Created
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Activate trust domain
Endpoint: PUT /api/trust-domain/v1/domains/trust-domain-partner-dids
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Replace the domain selection on an attachment
Endpoint: PUT /api/trust-domain/v1/attachments/OID4VP_VERIFIER/verifier-age-check/CREDENTIAL_ISSUER_TRUST
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
mdoc, IACA/DSC, and VICAL
The mdoc signer uses a Document Signer Certificate (DSC), which chains to an Issuing Authority Certificate Authority (IACA). A VICAL is a signed CBOR/COSE artifact for distributing mdoc certificate-authority information. It is trust material; it is not credential status.
The configured VICAL signer anchors need the appropriate VICAL-signer admission, while document issuers need the credential-issuer admission. The management contract below validates and stores VICAL configuration on a trust anchor.
Configuration alone is not proof that a running verifier fetched, parsed, cached, cryptographically verified, and enforced a remote VICAL. When claiming runtime VICAL support, capture each of those boundaries and prove fail-closed behavior for an untrusted signer, expiry, malformed content, and unavailability. Read mDoc VICAL and CWT status for the complete separation.
5. Issue the selected format through OID4VCI
An offer selects an advertised credential configuration. The wallet resolves the offer, obtains an access token, and requests that exact format. The issued credential must contain the status reference allocated earlier.
- Admin Console
- REST + captured result
Navigation: Open Protocols > Credential Issuer > Credentials, then Test

Use the testing surface to inspect the resolved configuration and status selection before execution. A successful server-side session does not by itself prove wallet storage.

The two captured lanes make the wire-format difference concrete.
SD-JWT VC
- Overview
- Request
- Response
Create EuPid offer
Endpoint: POST /api/oid4vci/v1/backend/credential/offers
Captured response: 201 Created
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Request EuPid credential
Endpoint: POST /oid4vci/acme/oid4vci/credential
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
ISO mdoc
- Overview
- Request
- Response
Create Mdl offer
Endpoint: POST /api/oid4vci/v1/backend/credential/offers
Captured response: 201 Created
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Request Mdl credential
Endpoint: POST /oid4vci/acme/oid4vci/credential
Captured response: 200 OK
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
For VCDM 1.1 and 2.0, select the matching jwt_vc_json or jwt_vc_json-ld credential configuration in the same OID4VCI flow. The Developer Console guide maps each profile to its exact collection folder and execution order.
6. Query, present, and verify
DCQL describes what the verifier requests; trust and status decide whether the returned credential is acceptable. Keep those decisions observable and separate.
- Admin Console
- REST + captured result
Navigation: Open Protocols > Verifier > DCQL & Bindings, then Test

Bind a pinned query version to the intended verifier. Then use Test with a real wallet when claiming holder presentation, device binding, or interoperability.

The SD-JWT and mdoc queries use different format values and different claim-path shapes. The binding capture shows how a specific query version is selected for a verifier.
- Overview
- Request
- Response
Create EuPid query
Endpoint: POST /api/dcql/v1/queries
Captured response: 409 Conflict
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Create Mdl query
Endpoint: POST /api/dcql/v1/queries
Captured response: 409 Conflict
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
- Overview
- Request
- Response
Bind combined query to verifier
Endpoint: POST /api/dcql/v1/verifiers/00000000-0000-4000-8000-000000000000/bindings
Captured response: 201 Created
This captured endpoint is shown from the E2E run; it is not mapped to one of the generated EDK REST API reference pages.
Connect an environment to rewrite this call to real service bases and run it.
7. Prove fail-closed behavior
First prove the valid path. Then revoke the same entry, refresh the verifier's view, and prove rejection of the same credential. Also test:
- status publication unavailable, expired, malformed, signed by the wrong issuer, or served with the wrong media type;
- trust domain inactive, unattached, empty, or attached at the wrong consumer level;
- certificate chain expired, unrelated to the signing key, or anchored outside the admitted IACA set;
- SD-JWT disclosures or holder binding that do not satisfy policy;
- mdoc issuer authentication or device authentication failure; and
- DCQL returning no matching credential because the format or claim path is wrong.
Run the profiles in Developer Console
Developer Console explains how its policy-filtered OpenAPI catalog, Scalar operations, and generated Postman collection relate to these guides. The dedicated credential/status profile collection contains 19 customer-neutral requests grouped into the four rows of the selection matrix; Azure KMS, BYOK, and BYOC mutations are present but disabled by default.
Do not call the lifecycle complete until the same configured lane proves issuance, wallet receipt, presentation, signature and holder/device binding, trust admission, current status, and fail-closed rejection. A screenshot, rendered guide, successful create call, or static contract test proves only its own boundary.