---
title: "Issue W3C Credentials (JWT / SD-JWT) via OID4VC"
description: "Learn how to issue Verifiable Credentials (W3C) 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/vc-oid4vc
generated: 2026-07-20
---
# Issue W3C Credentials (JWT / SD-JWT) via OID4VC

This guide provides a walkthrough for issuing a Verifiable Credential based on
the [W3C standard](https://www.w3.org/TR/vc-data-model-2.0/)
with a JWT or SD-JWT signature using the walt.id Enterprise issuer API. The issuance process will utilize the OID4VCI
protocol, an
extension of OpenID, facilitating secure and standardized communication between identities.

**Verifiable Credential (VC)**: A digital equivalent of physical credentials such as a driver's license or university
degree.
VCs are cryptographically secure, privacy-respecting, and instantly verifiable.

**OID4VCI**: A protocol specifying how parties can issue credentials and present them in a way that's consistent
and secure across platforms ensuring interoperability.

## 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. **Signing Key & DID**: A cryptographic key used to sign the credential, confirming its authenticity and integrity
   during
   verification and a correlated DID.

During [the setup of issuer service](https://docs.walt.id/enterprise-stack/services/issuer-service/setup.md), you have the option to 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 the purposes of
this guide, we will focus on using a W3C `UniversityDegree` credential.

### Example Credential: Verifiable University Degree

```json
{
  // The contextual information required for data integrity and 1.api
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "id": "http://example.gov/credentials/3732",
  // The credential's unique identifier
  "type": [
    "VerifiableCredential",
    "UniversityDegree"
    // Specifies the kind of credential being issued
  ],
  "issuer": {
    "id": "did:web:vc.transmute.world"
    // The issuer's unique identifier (DID)
  },
  "validFrom": "2020-03-10T04:24:12.164Z",
  // When the credential becomes valid
  "credentialSubject": {
    // Information about the credential's recipient and the degree earned
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  }
}
```

**Note**: Fields like `issuer`, `validFrom`, and `credentialSubject.did` are dynamic and will be populated with
actual
data upon issuance.

## Issuing a Credential

In this section, we'll generate a signing key which we store ourselves. For production
environments, we recommend using an external KMS provider for key management due to the enhanced security.

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

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

### Step 2: Issue the Credential

Now, we'll issue a verifiable credential using the key and DID obtained. You can choose to
either issue the W3C credential as JWT or SD-JWT, which are two different signature types. JWT referring to a
JSON-Web-Token and SD-JWT to a Selective-Disclosure JSON Web Token.

Learn more about Selective
Disclosure [here](https://docs.walt.id/concepts/selective-disclosure/sd-jwt/intro). In short, it enables your users to only reveal a subset of the
claims in a credential
to a verifier when suitable. This increases privacy, reduces the risk of identity theft and other types of fraud.

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 and the chosen signature type (JWT, SD-JWT).
2) The information about the singed credential will be embedded into the OID Credential Offer
   URL, which we can send off to our users to claim the credential(s).

**Note:**

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

<br/>

**Option: JWT**

[API Reference](https://enterprise.sandbox.walt.id/swagger/index.html#/Service%20%7C%20Issuer%20Service/post_v1__target__issuer_service_api_credentials_issue)

**Option: CURL**

Endpoint: `/v1/{target}/issuer-service-api/credentials/issue` | [API Reference](https://enterprise.sandbox.walt.id/swagger/index.html#/Service%20%7C%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": "UniversityDegree_jwt_vc_json",
  "w3cVersion": "W3CV2",
  "credentialData": {
    "@context": [
      "https://www.w3.org/ns/credentials/v2",
      "https://www.w3.org/ns/credentials/examples/v2"
    ],
    "id": "http://example.gov/credentials/3732",
    "type": [
      "VerifiableCredential",
      "UniversityDegree"
    ],
    "issuer": {
      "id": "did:web:vc.transmute.world"
    },
    "validFrom": "2020-03-10T04:24:12.164Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "degree": {
        "type": "BachelorDegree",
        "name": "Bachelor of Science and Arts"
      }
    }
  },
  "mapping": {
    "id": "<uuid>",
    "issuer": {
      "id": "<issuerDid>"
    },
    "credentialSubject": {
      "id": "<subjectDid>"
    },
    "validFrom": "<timestamp>",
    "validUntil": "<timestamp-in:365d>"
  }
}'
```

**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": "UniversityDegree_jwt_vc_json",
  "w3cVersion": "W3CV2",
  "credentialData": {
    "@context": [
      "https://www.w3.org/ns/credentials/v2",
      "https://www.w3.org/ns/credentials/examples/v2"
    ],
    "id": "http://example.gov/credentials/3732",
    "type": [
      "VerifiableCredential",
      "UniversityDegree"
    ],
    "issuer": {
      "id": "did:web:vc.transmute.world"
    },
    "validFrom": "2020-03-10T04:24:12.164Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "degree": {
        "type": "BachelorDegree",
        "name": "Bachelor of Science and Arts"
      }
    }
  },
  "mapping": {
    "id": "<uuid>",
    "issuer": {
      "id": "<issuerDid>"
    },
    "credentialSubject": {
      "id": "<subjectDid>"
    },
    "validFrom": "<timestamp>",
    "validUntil": "<timestamp-in:365d>"
  }
}
```

**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. Configured
during [issuer service setup](https://docs.walt.id/enterprise-stack/services/issuer-service/setup.md).
- `w3cVersion`: _String_ - The W3C Verifiable Credentials Data Model version to use. Accepted values: `W3CV11` or `W3CV2`.

**Note:**

  The `w3cVersion` parameter controls the format of the **issued credential**. When set to `W3CV2`, the service automatically applies the correct VCDM v2 `@context` (`https://www.w3.org/ns/credentials/v2`) and uses `validFrom`/`validUntil` in place of `issuanceDate`/`expirationDate`, regardless of what is provided in `credentialData`.

- `credentialData`: _JSON_ - A credential data structure to sign (W3C compliant). A list of predefined valid structures
  can be
  found [here](https://credentials.walt.id/).
- `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>

---

**Example Response**

The issuer endpoint will respond with a Credential Offer URL. The offer is provided by reference — the URL contains a `credential_offer_uri` pointing to the full offer object rather than embedding it inline.

**Plain Response**

```
openid-credential-offer://{orgID}.enterprise-sandbox.waltid.dev/?credential_offer_uri=https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/openid4vc/draft13/credential-offer?id=c4420557-023d-4de0-84bf-9fafa351f103
```

**Decoded**

```
openid-credential-offer://{orgID}.enterprise-sandbox.waltid.dev/?
credential_offer_uri=https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/openid4vc/draft13/credential-offer?id=c4420557-023d-4de0-84bf-9fafa351f103
```

**Resolved Offer**

Opening the `credential_offer_uri` returns the full credential offer object:

```json
{
  "credential_issuer": "https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/openid4vc/draft13",
  "grants": {
    "urn:ietf:params:oauth:grant-type:pre-authorized_code": {
      "pre-authorized_code": "eyJraWQiOiJqOHBiWjl3UEVpVnZkOHFGa1oyQ0FxMHJNLUI5bWRBMVQ0OTk5UGFZeF9FIiwidHlwIjoiand0IiwiYWxnIjoiRWREU0EifQ.eyJzdWIiOiJjNDQyMDU1Ny0wMjNkLTRkZTAtODRiZi05ZmFmYTM1MWYxMDMiLCJpc3MiOiJodHRwczovL3dhbHRpZC5mZWF0dXJlLXdhbC05MjEuZW50ZXJwcmlzZS50ZXN0LndhbHRpZC5jbG91ZC92MS93YWx0aWQudGVuYW50MS5pc3N1ZXItMi9pc3N1ZXItc2VydmljZS1hcGkvb3BlbmlkNHZjL2RyYWZ0MTMiLCJhdWQiOiJUT0tFTiJ9.cvxzTzo3aTyhCvcB10NDrgIKMaiXqxo3iChAEFdre3wkdzx4s_s4ZKdOM0S8VD9z7GjAFRcyBNfInfuMaTjXBQ"
    }
  },
  "credential_configuration_ids": [
    "UniversityDegree_jwt_vc_json"
  ]
}
```

**Option: SD-JWT**

[API Reference](https://issuer.demo.walt.id/swagger/index.html#/Credential%20Issuance/post_openid4vc_sdjwt_issue)

**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",
  "credentialConfigurationId": "UniversityDegree_jwt_vc_json",
  "w3cVersion": "W3CV2",
  "credentialData": {
    "@context": [
      "https://www.w3.org/ns/credentials/v2",
      "https://www.w3.org/ns/credentials/examples/v2"
    ],
    "id": "http://example.gov/credentials/3732",
    "type": [
      "VerifiableCredential",
      "UniversityDegree"
    ],
    "issuer": {
      "id": "did:web:vc.transmute.world"
    },
    "validFrom": "2020-03-10T04:24:12.164Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "degree": {
        "type": "BachelorDegree",
        "name": "Bachelor of Science and Arts"
      }
    }
  },
  "mapping": {
    "id": "<uuid>",
    "issuer": {
      "id": "<issuerDid>"
    },
    "credentialSubject": {
      "id": "<subjectDid>"
    },
    "validFrom": "<timestamp>",
    "validUntil": "<timestamp-in:365d>"
  },
  "authenticationMethod": "PRE_AUTHORIZED",
  "selectiveDisclosure": {
  "fields": {
    "validFrom": {
      "sd": true
    },
    "credentialSubject": {
      "sd": false,
      "children": {
        "fields": {
          "degree": {
            "sd": false,
            "children": {
              "fields": {
                "name": {
                  "sd": true
                }
              }
            }
          }
        }
      }
    }
  }
}
}'
```

**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",
  "credentialConfigurationId": "UniversityDegree_jwt_vc_json",
  "w3cVersion": "W3CV2",
  "credentialData": {
    "@context": [
      "https://www.w3.org/ns/credentials/v2",
      "https://www.w3.org/ns/credentials/examples/v2"
    ],
    "id": "http://example.gov/credentials/3732",
    "type": [
      "VerifiableCredential",
      "UniversityDegree"
    ],
    "issuer": {
      "id": "did:web:vc.transmute.world"
    },
    "validFrom": "2020-03-10T04:24:12.164Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "degree": {
        "type": "BachelorDegree",
        "name": "Bachelor of Science and Arts"
      }
    }
  },
  "mapping": {
    "id": "<uuid>",
    "issuer": {
      "id": "<issuerDid>"
    },
    "credentialSubject": {
      "id": "<subjectDid>"
    },
    "validFrom": "<timestamp>",
    "validUntil": "<timestamp-in:365d>"
  },
  "authenticationMethod": "PRE_AUTHORIZED",
  "selectiveDisclosure": {
    "fields": {
      "validFrom": {
        "sd": true
      },
      "credentialSubject": {
        "sd": false,
        "children": {
          "fields": {
            "degree": {
              "sd": false,
              "children": {
                "fields": {
                  "name": {
                    "sd": true
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
```

**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).
- `w3cVersion`: _String_ - The W3C Verifiable Credentials Data Model version to use. Accepted values: `W3CV11` or `W3CV2`.

**Note:**

  The `w3cVersion` parameter controls the format of the **issued credential**. When set to `W3CV2`, the service automatically applies the correct VCDM v2 `@context` (`https://www.w3.org/ns/credentials/v2`) and uses `validFrom`/`validUntil` in place of `issuanceDate`/`expirationDate`, regardless of what is provided in `credentialData`.

- `credentialData`: _JSON_ - A credential data structure to sign (W3C compliant). A list of predefined valid structures
  can be
  found [here](https://credentials.walt.id/).
- `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:
    - `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": {
    "validFrom": {
      "sd": true
    },
    "credentialSubject": {
      "sd": false,
      "children": {
        "fields": {
          "degree": {
            "sd": false,
            "children": {
              "fields": {
                "name": {
                  "sd": true
                }
              }
            }
          }
        }
      }
    }
  }
}
```

**Example Response**

The issuer endpoint will respond with a Credential Offer URL. The offer is provided by reference — the URL contains a `credential_offer_uri` pointing to the full offer object rather than embedding it inline.

**Plain Response**

```
openid-credential-offer://{orgID}.enterprise-sandbox.waltid.dev/?credential_offer_uri=https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/openid4vc/draft13/credential-offer?id=c4420557-023d-4de0-84bf-9fafa351f103
```

**Decoded**

```
openid-credential-offer://{orgID}.enterprise-sandbox.waltid.dev/?
credential_offer_uri=https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/openid4vc/draft13/credential-offer?id=c4420557-023d-4de0-84bf-9fafa351f103
```

**Resolved Offer**

Opening the `credential_offer_uri` returns the full credential offer object:

```json
{
  "credential_issuer": "https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/issuer-service-api/openid4vc/draft13",
  "grants": {
    "urn:ietf:params:oauth:grant-type:pre-authorized_code": {
      "pre-authorized_code": "eyJraWQiOiJqOHBiWjl3UEVpVnZkOHFGa1oyQ0FxMHJNLUI5bWRBMVQ0OTk5UGFZeF9FIiwidHlwIjoiand0IiwiYWxnIjoiRWREU0EifQ.eyJzdWIiOiJjNDQyMDU1Ny0wMjNkLTRkZTAtODRiZi05ZmFmYTM1MWYxMDMiLCJpc3MiOiJodHRwczovL3dhbHRpZC5mZWF0dXJlLXdhbC05MjEuZW50ZXJwcmlzZS50ZXN0LndhbHRpZC5jbG91ZC92MS93YWx0aWQudGVuYW50MS5pc3N1ZXItMi9pc3N1ZXItc2VydmljZS1hcGkvb3BlbmlkNHZjL2RyYWZ0MTMiLCJhdWQiOiJUT0tFTiJ9.cvxzTzo3aTyhCvcB10NDrgIKMaiXqxo3iChAEFdre3wkdzx4s_s4ZKdOM0S8VD9z7GjAFRcyBNfInfuMaTjXBQ"
    }
  },
  "credential_configuration_ids": [
    "UniversityDegree_jwt_vc_json"
  ]
}
```

When you receive the credential using our web wallet and make a presentation to a verifier, you will see that before
accepting the verification request, you will have the option to select which field(s) to share that were marked as
selectively disclosable.

### Step 3: Receive the Credential Offer

Now you can receive the credential offer via the wallet service API. See [Receive Credential Offer](https://docs.walt.id/enterprise-stack/services/wallet-service/credential-receiving/legacy-draft13/vc-oid4vci.md) for more details.

🎉 Congratulations, you've issued a W3C-compliant Verifiable Credential using OID4VCI! 🎉
