---
title: "Present SD-JWT Verifiable Credentials via OID4VP"
description: "Learn how to present SD-JWT Verifiable Credentials via OID4VP using the walt.id Enterprise wallet API."
stack: "Enterprise Stack (commercial) — version 1.1.1"
stack_version: "1.1.1"
stack_comparison: https://docs.walt.id/community-vs-enterprise.md
canonical_url: https://docs.walt.id/enterprise-stack/services/wallet-service/credential-presenting/sd-jwt-vc-oid4vp
generated: 2026-10-01
---
# Present SD-JWT Verifiable Credentials via OID4VP

**Note:**

To follow this guide, you need a wallet (wallet-service) configured with an additional service like the credential store
for storing received credentials. For more information on different setups, please go [here](https://docs.walt.id/enterprise-stack/services/wallet-service/setup.md).

<br/>

**Note:**

This guide works for both the Verifier Service and the Verifier2 Service.<br/>You will notice examples for Presentation Definitions, which are used in the draft OpenID4VP specifications implemented by the Verifier Service.<br/>
The Verifier2 Service uses the new OpenID4VP 1.0 specification, which does not support Presentation Definitions. Instead, it supports DCQL (Digital Credential Query Language).

<br/>

There are several methods by which a user (wallet) can present a credential to a verifier, and all are supported by the
wallet API:

1. User may receive a direct link, which opens the wallet and prompts credential sharing.
2. A website may display a QR code for the user to scan and share the credential.
3. The user may manually input a credential presentation request URL string into a text field.

## Credential Authorization Request URL

The authorization URL is a standardised method, as per the OID4VP specification, to communicate the needed
credentials and claims from verifier to the wallet.

**Example Presentation Request**

```
openid4vp://authorize
?response_type=vp_token
&client_id=<client_id>
&response_mode=direct_post
&state=<state>
&presentation_definition=<presentation_definition>
&client_id_scheme=redirect_uri
&response_uri=<response_uri>
```

**Option: Presentation Definition**

#### The Presentation Definition for SD-JWT VCs

The presentation definition specifies the criteria for the wallet to know what credentials and claims should
be requested from the user and shared with the verifier.

**Example for SD-JWT VCs**

```json
{
  "input_descriptors": [
    {
      "id": "VerifiableId",
      "format": {
        "vc+sd-jwt": {
          "alg": [
            "EdDSA"
          ]
        }
      },
      "constraints": {
        "fields": [
          {
            "path": [
              "$.type"
            ],
            "filter": {
              "type": "string",
              "pattern": "VerifiableId"
            }
          }
        ]
      }
    }
  ]
}
```

The definition specifies that one credential is requested in the SD-JWT format, specifically with the algorithm "EdDSA" and it
must be of type "VerifiableId".

**Option: DCQL**

#### DCQL (Data Credential Query Language) for SD-JWT VCs

DCQL is a newer approach in OpenID4VP that provides a more flexible and expressive way to specify credential requirements.

**Example DCQL Query for SD-JWT VCs**

```json
{
  "dcql_query": {
    "credentials": [
      {
        "id": "pid",
        "format": "dc+sd-jwt",
        "meta": {
          "vct_values": [
            "http://org.enterprise.localhost:3000/v1/org.tenant.issuer2/issuer-service-api/openid4vc/draft13/identity_credential"
          ]
        },
        "claims": [
          {
            "path": [
              "given_name"
            ]
          },
          {
            "path": [
              "family_name"
            ]
          },
          {
            "path": [
              "address",
              "street_address"
            ]
          }
        ]
      }
    ]
  }
```

DCQL provides enhanced support for selective disclosure features inherent in SD-JWT credentials, allowing verifiers to specify which claims should be selectively disclosed for the purposed of the presentation.

## Steps To Fulfill Presentation Request

To fulfill the presentation request received by the verifier, we will need to perform the following steps:

1. Find credentials matching the presentation definition in the linked credential store of the wallet.
2. Present matched credentials

## 1. Find Credentials To Present

To locate the credentials that align with the dcql query provided by the verifier, we will utilize the
credential store API.

**Option: CURL**

Endpoint: `/v1/{target}/credential-store-service-api/credentials/query/document/schema` | [API Reference](https://enterprise.sandbox.walt.id/swagger/index.html#/Service%20%7C%20Credential%20Store%20Service/post_v1__target__credential_store_service_api_credentials_query_document_schema)

**Example Request**

```bash
curl -X 'POST' \
  'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/credential-store-service-api/credentials/query/document/schema' \
  -H 'accept: */*' \
  -H 'Authorization: Bearer {yourToken}' \
  -H 'Content-Type: application/json' \
  -d '[
  {
        "id": "pid",
        "format": "dc+sd-jwt",
        "meta": {
          "vct_values": [
            "http://org.enterprise.localhost:3000/v1/org.tenant.issuer2/issuer-service-api/openid4vc/draft13/identity_credential"
          ]
        },
        "claims": [
          {
            "path": [
              "given_name"
            ]
          },
          {
            "path": [
              "family_name"
            ]
          },
          {
            "path": [
              "address",
              "street_address"
            ]
          }
        ]
      }
]'
```

---

**Response Codes**

- `200` - Matching credentials

## 2. Present Matched Credentials

**Option: CURL**

Endpoint: `/v1/{target}/wallet-service-api/credentials/present` | [API Reference](https://enterprise.sandbox.walt.id/swagger/index.html#/Service%20%7C%20Wallet%20Service/post_v1__target__wallet_service_api_present)

**Example Request**

```bash
curl -X 'POST' \
  'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/wallet-service-api/credentials/present' \
  -H 'accept: */*' \
  -H 'Authorization: Bearer {yourToken}' \
  -H 'Content-Type: application/json' \
  -d '{
  "requestUrl": "openid4vp://authorize?client_id=did%3Ajwk%3AeyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiU05JZ1ItTHZzSEUtNkhUUGxYYUpQVDVubHRZMFpqZlA0VkpTWEwzQ2ZkMCIsIngiOiJIVWM1ZHY1eFREV3VMVmZQcFdvVXBWTjZ1QTNJNzBsVzVnNEhoMG5VaDQ0In0&request_uri=http%3A%2F%2Forg.enterprise.localhost%3A3000%2Fv2%2Forg.tenant.verifier%2Fverifier-service-api%2Fbb3f89d1-8bc9-4d04-9418-12bc70bd76e9%2Frequest",
  "keyReference": "example.kms.key1",
  "didReference": "example.didstore.did1",
  "credentials": [
    {
      "credential": "waltid.tenant22.credential-store-wallet1.3d629d4b-4111-461d-9233-b2224fd64486",
      "disclosures": [
        "$.dateOfBirth",
      ]
    }
  ]
}'
```

**Body Parameters**

- `requestUrl` _String_ - An OID4VCP Authorization URL.
- `credentials` (optional) _Array_ - You can optionally provide a list of credential IDs from the linked credential
  store that you want to present. If you do not provide a list, the wallet will attempt to find matching credentials
  based on the dcql query specified in the request URL.

  For SD-JWT credentials, the selective disclosure mechanism is built into the credential format itself. The wallet will
  automatically handle the selective disclosure of claims based on the dcql query requirements.

  If you prefer, you can also explicitly specify which fields to disclose next to the credential ID under
  the "disclosures" field in the credential object.

- `keyReference` (optional) _String_ - The resource ID (target) of the key which owns the credential.
- `didReference` (optional) _String_ - The DID reference of a DID stored in a linked DID Store.

---

**Response Codes**

- `200` - Presentation was accepted

---

When the `present` endpoint is executed for SD-JWT credentials, the Wallet will create a Verifiable Presentation that
contains the selectively disclosed claims from the SD-JWT credential. The selective disclosure mechanism ensures that
only the claims specified in the presentation definition (or explicitly provided in the disclosures array) are shared
with the verifier, while maintaining the cryptographic integrity of the credential.
