---
title: "Issue SD-JWT VC Credentials via OID4VC"
description: "Learn how to issue SD-JWT VC Credentials via OID4VCI and the walt.id enterprise issuer API."
stack: "Enterprise Stack (commercial) — version 0.21.0"
stack_version: "0.21.0"
stack_comparison: https://docs.walt.id/community-vs-enterprise.md
canonical_url: https://docs.walt.id/enterprise-stack/services/issuer-service/credential-issuance/sd-jwt-vc-oid4vc
generated: 2026-07-08
---
# Issue SD-JWT VC Credentials via OID4VC

This guide provides a comprehensive walkthrough for issuing an SD-JWT VC credential based on
the [IETF standard](https://datatracker.ietf.org/doc/draft-ietf-oauth-sd-jwt-vc/)
using the walt.id Enterprise Issuer API. If you are interested to learn how to issue an W3C Verifiable Credentials,
please
go [here](https://docs.walt.id/enterprise-stack/services/issuer-service/credential-issuance/vc-oid4vc.md).
The issuance process will utilize the OID4VCI protocol, an extension of OpenID,
facilitating secure and standardized communication between identities.

## Enterprise Service Dependencies

To issue a credential, you need to have the following enterprise services setup:

1. [Issuer Service](https://docs.walt.id/enterprise-stack/services/issuer-service/overview.md) - Have a running issuer service. Setup instructions can be found [here](https://docs.walt.id/enterprise-stack/services/issuer-service/setup.md).
2. [KMS Service](https://docs.walt.id/enterprise-stack/services/key-management-service/overview.md) - Have a running KMS service. Setup instructions can be
   found [here](https://docs.walt.id/enterprise-stack/services/key-management-service/setup.md).
3. [DID Service](https://docs.walt.id/enterprise-stack/services/did-service/overview.md) - Have a running DID service. Setup instructions can be
   found [here](https://docs.walt.id/enterprise-stack/services/did-service/setup.md).

## Preparing for Issuance: Key Components

Before issuing a verifiable credential, you'll need:

1. **Raw Credential Data**: The information you want to issue as a VC, typically following a specific template or
   schema.

2. **Issuer DID or X.509 Certificate**: When issuing a SD-JWT VC credential, it can either be signed using the key of an
   issuer DID or a key which is trusted by an X.509 certificate.

During [the setup of issuer service](https://docs.walt.id/enterprise-stack/services/issuer-service/setup.md), you can specify which credential types the issuer will
support. It is important to ensure that the credential type you wish to issue is included in this selection.
You can also update supported credential types after setup via [configuration management](https://docs.walt.id/enterprise-stack/services/issuer-service/configurations/general-config.md).
For this guide, we will focus on using a SD-JWT-VC Identity Credential.

### Example ID Credential:

```json
{
  "vct": "identity_credential_vc+sd-jwt",
  "given_name": "John",
  "family_name": "Doe",
  "email": "johndoe@example.com",
  "phone_number": "+1-202-555-0101",
  "address": {
    "street_address": "123 Main St",
    "locality": "Anytown",
    "region": "Anystate",
    "country": "US"
  },
  "birthdate": "1940-01-01",
  "is_over_18": true,
  "is_over_21": true,
  "is_over_65": true
}
```

## Issuing a Credential

Choose below if you want to sign the credential using the key of a DID or an X.509 certificate.

**Option: DID**

We will now generate a key and associated DID via the related Enterprise APIs.

### Step 1: Get a Signing Key & Issuer DID

Please use the KMS service to [create a key](https://docs.walt.id/enterprise-stack/services/key-management-service/overview.md) and the DID service
to [generate a DID](https://docs.walt.id/enterprise-stack/services/did-service/overview.md) for that key and have them at hand for the next section.

### Step 2: Issue the Credential

To issue a verifiable credential, we will use the obtained key or any other supported JWK. When issuing an SD-JWT
VC credential, we have the option to selectively disclose certain claims in the credential. By default, all claims are
visible. The configuration for selectively disclosing claims can be done through a configuration object outlined below.

To facilitate the issuance of the credential from us (the issuer) to the holder, we will utilise the OID4VCI protocol.
In particular, we will be generating an OID4VC offer URL that can be accepted by any OID compliant wallet to receive
credential(s).
  
**Note:**

  The credential offer URL specifies the credentials to be issued. This includes details such as
  the URL of the issuer, the authorisation and token endpoints, and information about the credential's format, type, and
  scope.

  <br />
  
  When we execute the issuance command, two things will happen.
  
  1) The credential will be signed with the provided key.
  2) Information about the offered credential will be embedded into the OID Credential Offer
     URL, which we can send off to our users to claim the credential(s) later on.
  
**Note:**

  The Verifiable Credential Type (VCT) is resolved through the credentialConfigurationId. The `vct` is found as a
  parameter within the corresponding entry associated with that id.
  The Enterprise Issuer API generates proper resolvable urls for VCT based on provided configuration and host endpoints to
  retrieve type metadata with the scheme `https://<authority>/.well-known/vct/<type>` (
  e.g. `https://waltid.enterprise-demo.waltid.dev/.well-known/vct/v1/waltid.tenant1.issuer1/issuer-service-api/openid4vc/identity_credential`).
  Find more
  info [here](https://docs.walt.id/concepts/digital-credentials/sd-jwt-vc.md#verifiable-credential-type-and-type-metadata)

  <br/>
  
**Note:**

  You can receive updates on your issuance progress, including notifications for successfully claimed credentials, by
  providing the callback header parameter.

  <br />
  
**Option: CURL**

  Endpoint: `/v1/{target}/issuer-service-api/credentials/issue` | [API Reference](https://enterprise.sandbox.walt.id/swagger/index.html#/Service%20%2F%20Issuer%20Service/post_v1__target__issuer_service_api_credentials_issue)
  
  **Example Request**
  
  ```bash
  curl -X 'POST' \
    'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/credentials/issue' \
    -H 'accept: */*' \
    -H 'Authorization: Bearer {yourToken}' \
    -H 'statusCallbackUri: https://example.com/$id' \
    -H 'Content-Type: application/json' \
    -d '{
    "issuerKeyId": "waltid.tenant1.kms1.key1",
    "issuerDid": "did:key:z6MkjoRhq1jSNJdLiruSXrFFxagqrztZaXHqHGUTKJbcNywp",
    "authenticationMethod": "PRE_AUTHORIZED",
    "credentialConfigurationId": "identity_credential_vc+sd-jwt",
    "credentialData": {
      "given_name": "John",
      "family_name": "Doe",
      "email": "johndoe@example.com",
      "phone_number": "+1-202-555-0101",
      "address": {
        "street_address": "123 Main St",
        "locality": "Anytown",
        "region": "Anystate",
        "country": "US"
      },
      "birthdate": "1940-01-01",
      "is_over_18": true,
      "is_over_21": true,
      "is_over_65": true
    },
    "mapping": {
      "id": "<uuid>",
      "iat": "<timestamp-seconds>",
      "nbf": "<timestamp-seconds>",
      "exp": "<timestamp-in-seconds:365d>"
    },
    "selectiveDisclosure": {
      "fields": {
        "birthdate": {
          "sd": true
        }
      },
      "decoyMode": "NONE",
      "decoys": 0
    }
  }'
  
  ```
  
  **Path Parameters**
  
  - `orgID`: - When performing operations within an organization, it is essential to use the organization's Base URL or
    another valid host alias. For example, if your organization is named `test`, your default Base URL will
    be `test.enterprise-sandbox.walt.dev` when using the sandbox environment.
  - `target`: _resourceIdentifier_ - The target indicates the organization + tenant + issuer service with which to execute
    the credential issuance (`{organizationID}.{tenantID}.{issuerServiceID}`), e.g. `waltid.tenant1.issuer1`
  
  **Header Parameters**
  
  - `statusCallbackUri`: _URL_ - Receive updates on the created issuance process, e.g. when a credential was successfully
    claimed. The parameter expects a URL which can accept a JSON POST request. The URL can also hold a `$id`, which will
    be
    replaced by the issuance session id. For example: `https://myurl.com/$id`, `https://myurl.com`
    or `https://myurl.com/test/$id`
    <br/>
    <br />
    <details><summary>Expand To Learn More</summary>
  
    <br /> 
  
    **Body**
  
    The data send to the provided URL will contain a JSON body:
      - `id` : _String_ - the issuance session id
      - `type`: _String_ - the event type
      - `data`: _JsonObject_ - the data for the event
  
    **Event Types**
  
    Possible events (event types) and their data are:
      - `resolved_credential_offer` with the credential offer as JSON (in our Web Wallet: called when the issuance offer
        is
        entered into the wallet, but not processing / accepted yet)
      - `requested_token` with the issuance request for the token as json object (called for the token required to receive
        the
        credentials)
  
    Credential issuance (called for every credential that's issued (= requested from wallet))
      - `jwt_issue` with `jwt` being the issued jwt
      - `sdjwt_issue` with `sdjwt` being the issued sdjwt
      - `batch_jwt_issue` with `jwt` being the issued jwt
      - `batch_sdjwt_issue` with `sdjwt` being the issued sdjwt
      - `generated_mdoc` with `mdoc` being the CBOR (HEX) of the signed mdoc
  
    To allow for secure business logic flows, if a callback URL is set, and it cannot be reached, the issuance will not
    commence further (after that point). If no callback URL is set, the issuance logic does not change in any way.
  
    </details>
  
  **Body**
  
  ```json
  {
    "issuerKeyId": "waltid.tenant1.kms1.key1",
    "issuerDid": "did:key:z6MkjoRhq1jSNJdLiruSXrFFxagqrztZaXHqHGUTKJbcNywp",
    "authenticationMethod": "PRE_AUTHORIZED",
    "credentialConfigurationId": "identity_credential_vc+sd-jwt",
    "credentialData": {
      "given_name": "John",
      "family_name": "Doe",
      "email": "johndoe@example.com",
      "phone_number": "+1-202-555-0101",
      "address": {
        "street_address": "123 Main St",
        "locality": "Anytown",
        "region": "Anystate",
        "country": "US"
      },
      "birthdate": "1940-01-01",
      "is_over_18": true,
      "is_over_21": true,
      "is_over_65": true
    },
    "mapping": {
      "id": "<uuid>",
      "iat": "<timestamp-seconds>",
      "nbf": "<timestamp-seconds>",
      "exp": "<timestamp-in-seconds:365d>"
    },
    "selectiveDisclosure": {
      "fields": {
        "birthdate": {
          "sd": true
        }
      },
      "decoyMode": "NONE",
      "decoys": 0
    }
  }
  ```
  
  **Body Parameters**
  
  - `issuerKeyId`: _resourceIdentifier_ - The keyID of a key stored in
    a [KMS service](https://docs.walt.id/enterprise-stack/services/key-management-service/overview.md) under the same tenant.
    E.g. `waltid.tenant1.kms1.key1`
  - `issuerDid`: _String_ - The DID related to the provided key.
  - `credentialConfigurationId`: _String_ - Reference to a specific credential configuration the issuer supports. As our
    issuer currently supports W3C JWT & SD-JWT credentials and SD-JWT VCs (IETF). The structure of the
    credentialConfigurationId is the following: "
    credentialType_jwt_vc_json" for W3C JWT & SD-JWT credentials
    and "credentialType_vc+sd-jwt" for SD-JWT VCs (IETF). E.g. "UniversityDegree_jwt_vc_json" or "
    UniversityDegree_vc+sd-jwt".
    You can also view
    the credentialConfigurationIds by visiting the `/.well-known/openid-credential-issuer` endpoint of your issuer.
    The metadata of our deployed issuer for testing can be
    seen [here](https://issuer.demo.walt.id/swagger/index.html#/oidc/get__well_known_openid_credential_issuer).
  - `credentialData`: _JSON_ - Credential data structure to sign.
  - `mapping` (optional): _JSON_ - The mapping object that allows for **dynamic value insertion via data functions**,
    executed at the time when the credentials is claimed. This feature enables personalized credentials based on real-time
    data. Learn more about it and see a list of supported data functions [here](https://docs.walt.id/enterprise-stack/services/issuer-service/data-functions.md).
    In case of IETF SD-JWT, the values could be `id`, `iat`, `nbf` and `exp`.
  - `authenticationMethod`: (optional) _String_ - Defines which OIDC4VC exchange flow is used (pre-auth or full-auth). If
    no value is
    provided, it will default to pre-auth flow indicated as `PRE_AUTHORIZED`. The parameter options are:
  
  <details><summary>Expand To Learn More About The Options</summary>
  
  - `expiresInSeconds` - (Optional) _Integer_ - The number of seconds the credential offer URL will be valid for. If not provided, the
    default value is 5 minutes. if the value is set to -1, the URL will not expire.
  - `PWD` - used for authorization code flow with username/password authentication with external auth server
  - `ID_TOKEN` - used for authorization code flow with id_token authentication. When this method is used an authorization
    request is sent to the wallet, which generates and issues the ID_TOKEN using its DID (
    Decentralized Identifier). The issuer then verifies the ID_TOKEN to confirm the holder's identity and DID.
  - `VP_TOKEN` - used for authorization code flow with vp_token(OIDC4VP). With this method, the receiver of the
    credential must be authenticated by presenting the requested credential. The credential which must be presented can
    be configured using the `vpRequestedValue` as explained below. The policies which are applied to the presented
    credential
    are 'signature,' 'expired,' and 'not-before.' Learn more about
    policies [here](https://docs.walt.id/enterprise-stack/services/verifier-service/policies/static-verification-policies.md).
  - `NONE` - used for authorization code flow with none authentication method
  - `PRE_AUTHORIZED` - used for pre-authorizated code flow
  
  **Additional parameters required for selected auth method:**
  
  **For "ID_TOKEN" and "VP_TOKEN":**
  
  - `useJar`: (Optional) _Boolean_ - used for using JAR OAuth specification in the id/vp_token requests. If omitted, the
    default value is true.
  
  **For VP_TOKEN:**
  
  - `vpRequestedValue`: _String_ - Specifies the requested credential type value for the VP token. E.g. "VerifiableId"
  - `vpProfile`: (Optional) _String_ - Specifies the profile of the VP request. Available Profiles: DEFAULT: For W3C
    OpenID4VP,
    ISO_18013_7_MDOC: For MDOC OpenID4VP, EBSIV3: For EBSI V3 Compliant VP. If omitted, the default value is DEFAULT
  
  </details>
  
  - [`selectiveDisclosure`](https://docs.walt.id/concepts/selective-disclosure/sd-jwt/intro) (optional): _JSON_ -An object that
    configures which
    claims in the credential should be
    selectively disclosable. It's manged through the following properties:
  
    <details><summary>Expand To Learn More</summary>
  
      - `fields`: An object illustrating the hierarchical structure of the credential contents. Each key in this object
        specifies the name of the fields in the credential. Every field, whether high-level or nested, can be represented
        by an object with a "sd" key. If the value for "sd" is set to true, it means that the corresponding field is
        selectively disclosable. Moreover, fields that have nested attributes are represented with a "children" key which
        contains another fields object reflecting the structure of the nested object. For example:
  
     ```json
     {
      "fields": {
        "issuanceDate": {
          "sd": true
        },
        "credentialSubject": {
          "sd": false,
          "children": {
            "fields": {
              "degree": {
                "sd": false,
                "children": {
                  "fields": {
                    "name": {
                      "sd": true
                    }
                  }
                }
              }
            }
          }
        }
      }
     }
     ```
    </details>
  
  ---
  
  **Example Response**
  
  The issuer endpoint will respond with Credential Offer URL.
  
  **Plain Response**
  
  ```
  openid-credential-offer://issuer.potential.walt-test.cloud/?credential_offer_uri=https%3A%2F%2Fissuer.potential.walt-test.cloud%2Fopenid4vc%2FcredentialOffer%3Fid%3D9aabdb65-defe-464b-baa0-9cc13b36074a
  ```
  
  **Decoded**
  
  ```
  {
    "credential_issuer": "https://issuer.potential.walt-test.cloud",
    "credential_configuration_ids": [
      "identity_credential_vc+sd-jwt"
    ],
    "grants": {
      "authorization_code": {
        "issuer_state": "9aabdb65-defe-464b-baa0-9cc13b36074a"
      },
      "urn:ietf:params:oauth:grant-type:pre-authorized_code": {
        "pre-authorized_code": "eyJhbGciOiJFZERTQSJ9.eyJzdWIiOiI5YWFiZGI2NS1kZWZlLTQ2NGItYmFhMC05Y2MxM2IzNjA3NGEiLCJpc3MiOiJodHRwczovL2lzc3Vlci5wb3RlbnRpYWwud2FsdC10ZXN0LmNsb3VkIiwiYXVkIjoiVE9LRU4ifQ.vl9fBjoYUqr1nrA0jZ3ZjpS45yHLp2roMPCxCoqjuLNyBhTGO0g_PXMw8_NWhD-3qllRq5J0kLAw8WmfvT95Cw"
      }
    }
  }
  ```
  
**Option: x.509 certificate**

In this section we will use an x.509 certificate to sign and issue the credential. As our credential is in the SD-JWT
VC format, we have the option to selectively disclose certain claims in the credential. By default, all claims are
visible. The configuration for selectively disclosing claims can be done through a configuration object outlined below.

To facilitate the issuance of the credential from us (the issuer) to the holder, we will utilise the OID4VCI protocol.
In particular, we will be generating an OID4VC offer URL that can be accepted by any OID compliant wallet to receive
credential(s).
  
**Note:**

  The credential offer URL specifies the credentials to be issued. This includes details such as
  the URL of the issuer, the authorisation and token endpoints, and information about the credential's format, type, and
  scope.

  <br />
  
  When we execute the issuance command, two things will happen.
  
  1) The credential will be signed with the provided certificate.
  2) Information about the offered credential will be embedded into the OID Credential Offer
     URL, which we can send off to our users to claim the credential(s) later on.
  
**Note:**

  The Verifiable Credential Type (VCT) is resolved through the credentialConfigurationId. The `vct` is found as a
  parameter within the corresponding entry associated with that id.
  The Enterprise Issuer API generates proper resolvable urls for VCT based on provided configuration and host endpoints to
  retrieve type metadata with the scheme `https://<authority>/.well-known/vct/<type>` (
  e.g. `https://waltid.enterprise-demo.waltid.dev/.well-known/vct/v1/waltid.tenant1.issuer1/issuer-service-api/openid4vc/identity_credential`).
  Find more
  info [here](https://docs.walt.id/concepts/digital-credentials/sd-jwt-vc.md#verifiable-credential-type-and-type-metadata)

  <br/>
  
**Note:**

  You can receive updates on your issuance progress, including notifications for successfully claimed credentials, by
  providing the callback header parameter.

  <br />
  
**Option: CURL**

  Endpoint: `/v1/{target}/issuer-service-api/credentials/issue` | [API Reference](https://enterprise.sandbox.walt.id/swagger/index.html#/Service%20%2F%20Issuer%20Service/post_v1__target__issuer_service_api_credentials_issue)
  
  **Example Request**
  
  ```bash
  curl -X 'POST' \
    'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/credentials/issue' \
    -H 'accept: */*' \
    -H 'Authorization: Bearer {yourToken}' \
    -H 'statusCallbackUri: https://example.com/$id' \
    -H 'Content-Type: application/json' \
    -d '{
    "issuerKeyId": "waltid.tenant1.kms1.key1",
    "credentialConfigurationId": "identity_credential_vc+sd-jwt",
    "credentialData": {
      "given_name": "John",
      "family_name": "Doe",
      "email": "johndoe@example.com",
      "phone_number": "+1-202-555-0101",
      "address": {
        "street_address": "123 Main St",
        "locality": "Anytown",
        "region": "Anystate",
        "country": "US"
      },
      "birthdate": "1940-01-01",
      "is_over_18": true,
      "is_over_21": true,
      "is_over_65": true
    },
    "mapping": {
      "id": "<uuid>",
      "iat": "<timestamp-seconds>",
      "nbf": "<timestamp-seconds>",
      "exp": "<timestamp-in-seconds:365d>"
    },
    "authenticationMethod": "PRE_AUTHORIZED",
    "selectiveDisclosure": {
      "fields": {
        "name": {
          "sd": true
        }
      },
      "decoyMode": "NONE",
      "decoys": 0
    },
    "authenticationMethod": "PRE_AUTHORIZED",
    "x5Chain": [
      "-----BEGIN CERTIFICATE-----\nMIIBRzCB7qADAgECAgg57ch6mnj5KjAKBggqhkjOPQQDAjAXMRUwEwYDVQQDDAxNRE9DIFJPT1QgQ0EwHhcNMjQwNTAyMTMxMzMwWhcNMjUwNTAyMTMxMzMwWjAbMRkwFwYDVQQDDBBNRE9DIFRlc3QgSXNzdWVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG0RINBiF+oQUD3d5DGnegQuXenI29JDaMGoMvioKRBN53d4UazakS2unu8BnsEtxutS2kqRhYBPYk9RAriU3gaMgMB4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwCgYIKoZIzj0EAwIDSAAwRQIhAI5wBBAA3ewqIwslhuzFn4rNFW9dkz2TY7xeImO7CraYAiAYhai1NzJ6abAiYg8HxcRdYpO4bu2Sej8E6CzFHK34Yw==\n-----END CERTIFICATE-----"
    ],
    "trustedRootCAs": [
      "-----BEGIN CERTIFICATE-----\nMIIBQzCB66ADAgECAgjbHnT+6LsrbDAKBggqhkjOPQQDAjAYMRYwFAYDVQQDDA1NRE9DIFJPT1QgQ1NQMB4XDTI0MDUwMjEzMTMzMFoXDTI0MDUwMzEzMTMzMFowFzEVMBMGA1UEAwwMTURPQyBST09UIENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWP0sG+CkjItZ9KfM3sLF+rLGb8HYCfnlsIH/NWJjiXkTx57ryDLYfTU6QXYukVKHSq6MEebvQPqTJT1blZ/xeKMgMB4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwIDRwAwRAIgWM+JtnhdqbTzFD1S3byTvle0n/6EVALbkKCbdYGLn8cCICOoSETqwk1oPnJEEPjUbdR4txiNqkHQih8HKAQoe8t5\n-----END CERTIFICATE-----\n"
    ]
  }'
  ```
  
  **Path Parameters**
  
  - `orgID`: - When performing operations within an organization, it is essential to use the organization's Base URL or
    another valid host alias. For example, if your organization is named `test`, your default Base URL will
    be `test.enterprise-sandbox.walt.dev` when using the sandbox environment.
  - `target`: _resourceIdentifier_ - The target indicates the organization + tenant + issuer service with which to execute
    the credential issuance (`{organizationID}.{tenantID}.{issuerServiceID}`), e.g. `waltid.tenant1.issuer1`
  
  **Header Parameters**
  
  - `statusCallbackUri`: _URL_ - Receive updates on the created issuance process, e.g. when a credential was successfully
    claimed. The parameter expects a URL which can accept a JSON POST request. The URL can also hold a `$id`, which will
    be
    replaced by the issuance session id. For example: `https://myurl.com/$id`, `https://myurl.com`
    or `https://myurl.com/test/$id`
    <br/>
    <br />
    <details><summary>Expand To Learn More</summary>
  
    <br /> 
  
    **Body**
  
    The data send to the provided URL will contain a JSON body:
      - `id` : _String_ - the issuance session id
      - `type`: _String_ - the event type
      - `data`: _JsonObject_ - the data for the event
  
    **Event Types**
  
    Possible events (event types) and their data are:
      - `resolved_credential_offer` with the credential offer as JSON (in our Web Wallet: called when the issuance offer
        is
        entered into the wallet, but not processing / accepted yet)
      - `requested_token` with the issuance request for the token as json object (called for the token required to receive
        the
        credentials)
  
    Credential issuance (called for every credential that's issued (= requested from wallet))
      - `jwt_issue` with `jwt` being the issued jwt
      - `sdjwt_issue` with `sdjwt` being the issued sdjwt
      - `batch_jwt_issue` with `jwt` being the issued jwt
      - `batch_sdjwt_issue` with `sdjwt` being the issued sdjwt
      - `generated_mdoc` with `mdoc` being the CBOR (HEX) of the signed mdoc
  
    To allow for secure business logic flows, if a callback URL is set, and it cannot be reached, the issuance will not
    commence further (after that point). If no callback URL is set, the issuance logic does not change in any way.
  
    </details>
  
  **Body**
  
  ```json
  {
    "issuerKeyId": "waltid.tenant1.kms1.key1",
    "credentialConfigurationId": "identity_credential_vc+sd-jwt",
    "credentialData": {
      "given_name": "John",
      "family_name": "Doe",
      "email": "johndoe@example.com",
      "phone_number": "+1-202-555-0101",
      "address": {
        "street_address": "123 Main St",
        "locality": "Anytown",
        "region": "Anystate",
        "country": "US"
      },
      "birthdate": "1940-01-01",
      "is_over_18": true,
      "is_over_21": true,
      "is_over_65": true
    },
    "mapping": {
      "id": "<uuid>",
      "iat": "<timestamp-seconds>",
      "nbf": "<timestamp-seconds>",
      "exp": "<timestamp-in-seconds:365d>"
    },
    "selectiveDisclosure": {
      "fields": {
        "name": {
          "sd": true
        }
      },
      "decoyMode": "NONE",
      "decoys": 0
    },
    "authenticationMethod": "PRE_AUTHORIZED",
    "x5Chain": [
      "-----BEGIN CERTIFICATE-----\nMIIBRzCB7qADAgECAgg57ch6mnj5KjAKBggqhkjOPQQDAjAXMRUwEwYDVQQDDAxNRE9DIFJPT1QgQ0EwHhcNMjQwNTAyMTMxMzMwWhcNMjUwNTAyMTMxMzMwWjAbMRkwFwYDVQQDDBBNRE9DIFRlc3QgSXNzdWVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG0RINBiF+oQUD3d5DGnegQuXenI29JDaMGoMvioKRBN53d4UazakS2unu8BnsEtxutS2kqRhYBPYk9RAriU3gaMgMB4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwCgYIKoZIzj0EAwIDSAAwRQIhAI5wBBAA3ewqIwslhuzFn4rNFW9dkz2TY7xeImO7CraYAiAYhai1NzJ6abAiYg8HxcRdYpO4bu2Sej8E6CzFHK34Yw==\n-----END CERTIFICATE-----"
    ],
    "trustedRootCAs": [
      "-----BEGIN CERTIFICATE-----\nMIIBQzCB66ADAgECAgjbHnT+6LsrbDAKBggqhkjOPQQDAjAYMRYwFAYDVQQDDA1NRE9DIFJPT1QgQ1NQMB4XDTI0MDUwMjEzMTMzMFoXDTI0MDUwMzEzMTMzMFowFzEVMBMGA1UEAwwMTURPQyBST09UIENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWP0sG+CkjItZ9KfM3sLF+rLGb8HYCfnlsIH/NWJjiXkTx57ryDLYfTU6QXYukVKHSq6MEebvQPqTJT1blZ/xeKMgMB4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwIDRwAwRAIgWM+JtnhdqbTzFD1S3byTvle0n/6EVALbkKCbdYGLn8cCICOoSETqwk1oPnJEEPjUbdR4txiNqkHQih8HKAQoe8t5\n-----END CERTIFICATE-----\n"
    ]
  }
  ```
  
  **Body Parameters**
  
  - `issuerKeyId`: _resourceIdentifier_ - The keyID of a key stored in
    a [KMS service](https://docs.walt.id/enterprise-stack/services/key-management-service/overview.md) under the same tenant.
    E.g. `waltid.tenant1.kms1.key1`
  - `credentialConfigurationId`: _String_ - Reference to a specific credential configuration the issuer supports. As our
    issuer currently supports W3C JWT & SD-JWT credentials and SD-JWT VCs (IETF). The structure of the
    credentialConfigurationId is the following: "
    credentialType_jwt_vc_json" for W3C JWT & SD-JWT credentials
    and "credentialType_vc+sd-jwt" for SD-JWT VCs (IETF). E.g. "UniversityDegree_jwt_vc_json" or "
    UniversityDegree_vc+sd-jwt".
    You can also view
    the credentialConfigurationIds by visiting the `/.well-known/openid-credential-issuer` endpoint of your issuer.
    The metadata of our deployed issuer for testing can be
    seen [here](https://issuer.demo.walt.id/swagger/index.html#/oidc/get__well_known_openid_credential_issuer).
  - `credentialData`: _JSON_ - Credential data structure to sign.
  - `mapping` (optional): _JSON_ - The mapping object that allows for **dynamic value insertion via data functions**,
    executed at the time when the credentials is claimed. This feature enables personalized credentials based on real-time
    data. Learn more about it and see a list of supported data functions [here](https://docs.walt.id/enterprise-stack/services/issuer-service/data-functions.md).
  - `authenticationMethod`: (optional) _String_ - Defines which OIDC4VC exchange flow is used (pre-auth or full-auth). If
    no value is
    provided, it will default to pre-auth flow indicated as `PRE_AUTHORIZED`. The parameter options are:
  
  <details><summary>Expand To Learn More About The Options</summary>
  
  - `expiresInSeconds` - (Optional) _Integer_ - The number of seconds the credential offer URL will be valid for. If not provided, the
    default value is 5 minutes. if the value is set to -1, the URL will not expire.
  - `PWD` - used for authorization code flow with username/password authentication with external auth server
  - `ID_TOKEN` - used for authorization code flow with id_token authentication. When this method is used an authorization
    request is sent to the wallet, which generates and issues the ID_TOKEN using its DID (
    Decentralized Identifier). The issuer then verifies the ID_TOKEN to confirm the holder's identity and DID.
  - `VP_TOKEN` - used for authorization code flow with vp_token(OIDC4VP). With this method, the receiver of the
    credential must be authenticated by presenting the requested credential. The credential which must be presented can
    be configured using the `vpRequestedValue` as explained below. The policies which are applied to the presented
    credential
    are 'signature,' 'expired,' and 'not-before.' Learn more about
    policies [here](https://docs.walt.id/enterprise-stack/services/verifier-service/policies/static-verification-policies.md).
  - `NONE` - used for authorization code flow with none authentication method
  - `PRE_AUTHORIZED` - used for pre-authorizated code flow
  
  **Additional parameters required for selected auth method:**
  
  **For "ID_TOKEN" and "VP_TOKEN":**
  
  - `useJar`: (Optional) _Boolean_ - used for using JAR OAuth specification in the id/vp_token requests. If omitted, the
    default value is true.
  
  **For VP_TOKEN:**
  
  - `vpRequestedValue`: _String_ - Specifies the requested credential type value for the VP token. E.g. "VerifiableId"
  - `vpProfile`: (Optional) _String_ - Specifies the profile of the VP request. Available Profiles: DEFAULT: For W3C
    OpenID4VP,
    ISO_18013_7_MDOC: For MDOC OpenID4VP, EBSIV3: For EBSI V3 Compliant VP. If omitted, the default value is DEFAULT
  
  </details>
  
  - [`selectiveDisclosure`](https://docs.walt.id/concepts/selective-disclosure/intro) (optional): _JSON_ -An object that configures which
    claims in the credential should be
    selectively disclosable. It's manged through the following properties:
  
    <details><summary>Expand To Learn More</summary>
  
      - `fields`: An object illustrating the hierarchical structure of the credential contents. Each key in this object
        specifies the name of the fields in the credential. Every field, whether high-level or nested, can be represented
        by an object with a "sd" key. If the value for "sd" is set to true, it means that the corresponding field is
        selectively disclosable. Moreover, fields that have nested attributes are represented with a "children" key which
        contains another fields object reflecting the structure of the nested object. For example:
  
     ```json
     {
      "fields": {
        "issuanceDate": {
          "sd": true
        },
        "credentialSubject": {
          "sd": false,
          "children": {
            "fields": {
              "degree": {
                "sd": false,
                "children": {
                  "fields": {
                    "name": {
                      "sd": true
                    }
                  }
                }
              }
            }
          }
        }
      }
     }
     ```
    </details>
  
  - `x5Chain` - contains the certificate chain used to verify the issuer's digital signature. The last certificate in the
    chain must contain the public key of the private key which signs the to be issued credential.
  - `trustedRootCAs` - contains trusted root certificates to validate the authenticity of the issuer's certificate chain.
  
  ---
  
  **Example Response**
  
  The issuer endpoint will respond with Credential Offer URL.
  
  **Plain Response**
  
  ```
  openid-credential-offer://issuer.potential.walt-test.cloud/?credential_offer_uri=https%3A%2F%2Fissuer.potential.walt-test.cloud%2Fopenid4vc%2FcredentialOffer%3Fid%3D9aabdb65-defe-464b-baa0-9cc13b36074a
  ```
  
  **Decoded**
  
  ```
  {
    "credential_issuer": "https://issuer.potential.walt-test.cloud",
    "credential_configuration_ids": [
      "identity_credential_vc+sd-jwt"
    ],
    "grants": {
      "authorization_code": {
        "issuer_state": "9aabdb65-defe-464b-baa0-9cc13b36074a"
      },
      "urn:ietf:params:oauth:grant-type:pre-authorized_code": {
        "pre-authorized_code": "eyJhbGciOiJFZERTQSJ9.eyJzdWIiOiI5YWFiZGI2NS1kZWZlLTQ2NGItYmFhMC05Y2MxM2IzNjA3NGEiLCJpc3MiOiJodHRwczovL2lzc3Vlci5wb3RlbnRpYWwud2FsdC10ZXN0LmNsb3VkIiwiYXVkIjoiVE9LRU4ifQ.vl9fBjoYUqr1nrA0jZ3ZjpS45yHLp2roMPCxCoqjuLNyBhTGO0g_PXMw8_NWhD-3qllRq5J0kLAw8WmfvT95Cw"
      }
    }
  }
  ```
  
### Step 3: Receive the Credential Offer

Now you can receive the credential offer via the wallet service API. See [Receive Credential Offer](../../wallet-service/credential-receiving/0.legacy-draft13/2.sd-jwt-vc-oid4vci.md) for more details.

🎉 Congratulations, you've issued a SD-JWT VC Credential using OID4VCI! 🎉
