Setup
This guide walks you through setting up an Issuer2 service inside a tenant. If you don't have a tenant yet, you can learn how to create one here.
Prerequisites
Before creating an Issuer2 service, ensure you have:
- Tenant – An existing tenant in your organization
- KMS Service – A Key Management Service for storing signing keys
- Token Key – A key in the KMS for signing access tokens
Create an Issuer2 Service
CURL
Endpoint: /v1/{target}/resource-api/services/create | API Reference
Example Request
curl -X 'POST' \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/resource-api/services/create' \
-H 'accept: */*' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"type": "issuer2",
"baseUrl": "https://myorg.enterprise-sandbox.waltid.dev",
"kms": "waltid.tenant1.kms1",
"tokenKeyId": "waltid.tenant1.kms1.tokenKey",
"supportedCredentialTypes": {
"identity_credential_vc+sd-jwt": {
"format": "vc+sd-jwt",
"vct": "https://example.com/credentials/identity_credential",
"cryptographic_binding_methods_supported": ["jwk"],
"credential_signing_alg_values_supported": ["ES256"],
"sdJwtVcTypeMetadata": {
"name": "Identity Credential",
"description": "A verifiable identity credential",
"vct": "https://example.com/credentials/identity_credential"
}
},
"UniversityDegree_jwt_vc_json": {
"format": "jwt_vc_json",
"cryptographic_binding_methods_supported": ["did"],
"credential_signing_alg_values_supported": ["ES256"],
"credential_definition": {
"type": ["VerifiableCredential", "UniversityDegree"]
}
}
},
"displayConfigurations": [
{
"name": "My Organization Issuer",
"locale": "en-US",
"logo": {
"uri": "https://example.com/logo.png",
"alt_text": "Organization logo"
}
}
]
}'
Body
{
"type": "issuer2",
"baseUrl": "https://myorg.enterprise-sandbox.waltid.dev",
"kms": "waltid.tenant1.kms1",
"tokenKeyId": "waltid.tenant1.kms1.tokenKey",
"supportedCredentialTypes": {
"identity_credential_vc+sd-jwt": {
"format": "vc+sd-jwt",
"vct": "https://example.com/credentials/identity_credential",
"cryptographic_binding_methods_supported": ["jwk"],
"credential_signing_alg_values_supported": ["ES256"],
"sdJwtVcTypeMetadata": {
"name": "Identity Credential",
"description": "A verifiable identity credential",
"vct": "https://example.com/credentials/identity_credential"
}
},
"UniversityDegree_jwt_vc_json": {
"format": "jwt_vc_json",
"cryptographic_binding_methods_supported": ["did"],
"credential_signing_alg_values_supported": ["ES256"],
"credential_definition": {
"type": ["VerifiableCredential", "UniversityDegree"]
}
}
},
"displayConfigurations": [
{
"name": "My Organization Issuer",
"locale": "en-US",
"logo": {
"uri": "https://example.com/logo.png",
"alt_text": "Organization logo"
}
}
]
}
Path Parameters
orgID– Your organization's Base URL. For example, if your organization is namedtest, your default Base URL will betest.enterprise-sandbox.walt.devwhen using the sandbox environment.target– The resource identifier for the new issuer service ({organizationID}.{tenantID}.{newIssuerServiceID}), e.g.waltid.tenant1.issuer1
Body Parameters
Required Parameters
type: String – Must beissuer2for the Issuer2 ServicebaseUrl: String – The public URL where the issuer service will be accessible. This URL is included in credential offers and OpenID metadata. Format:https://{orgID}.yourEnterpriseStackUrl.comkms: resourceIdentifier – Reference to a KMS service in the same tenant. E.g.waltid.tenant1.kms1tokenKeyId: resourceIdentifier – Reference to a key in the KMS used for signing access tokens. E.g.waltid.tenant1.kms1.tokenKeysupportedCredentialTypes: Object – Map of credential configurations the issuer supports. See Credential Types Configuration for details.
Optional Parameters
displayConfigurations: Array – List of display metadata objects for different locales. See Display Configuration for details.clientAuthenticationConfig: Object – Declares which client authentication methods the issuer supports (for example anonymous pre-authorized code access and/or attestation-based wallet authentication). When aclient-attestationmethod is included, token requests must include validOAuth-Client-AttestationandOAuth-Client-Attestation-PoPheaders. See Client Attestation — Issuer Integration for JSON shape, examples, and how this maps to authorization server metadata.
Omit clientAuthenticationConfig entirely, or set supportedMethods to an empty list, to keep the previous issuer2 behavior where this layer does not enforce client authentication. Use supportedMethods with only preauth-anonymous when you want OID4VCI pre-authorized token requests without client_id but no wallet attestation.
Response
Success Response (201)
{
"id": "waltid.tenant1.issuer1",
"type": "issuer2",
"baseUrl": "https://myorg.enterprise-sandbox.waltid.dev",
"kms": "waltid.tenant1.kms1",
"tokenKeyId": "waltid.tenant1.kms1.tokenKey",
"supportedCredentialTypes": { ... },
"displayConfigurations": [ ... ]
}
Response Codes
201– Service created successfully400– Invalid request body409– Service with this ID already exists
Credential Type Examples
SD-JWT VC
{
"identity_credential_vc+sd-jwt": {
"format": "vc+sd-jwt",
"vct": "https://example.com/credentials/identity_credential",
"cryptographic_binding_methods_supported": ["jwk"],
"credential_signing_alg_values_supported": ["ES256"],
"sdJwtVcTypeMetadata": {
"name": "Identity Credential",
"description": "A verifiable identity credential",
"vct": "https://example.com/credentials/identity_credential"
}
}
}
W3C JWT
{
"UniversityDegree_jwt_vc_json": {
"format": "jwt_vc_json",
"cryptographic_binding_methods_supported": ["did"],
"credential_signing_alg_values_supported": ["ES256", "EdDSA"],
"credential_definition": {
"type": ["VerifiableCredential", "UniversityDegree"]
}
}
}
mDoc (ISO 18013-5)
{
"org.iso.18013.5.1.mDL": {
"format": "mso_mdoc",
"doctype": "org.iso.18013.5.1.mDL",
"cryptographic_binding_methods_supported": ["cose_key"],
"credential_signing_alg_values_supported": ["ES256"]
}
}
Display Configuration
Configure how your issuer appears in wallet applications:
{
"displayConfigurations": [
{
"name": "My Organization",
"locale": "en-US",
"logo": {
"uri": "https://example.com/logo.png",
"alt_text": "Organization logo"
}
},
{
"name": "Meine Organisation",
"locale": "de-DE",
"logo": {
"uri": "https://example.com/logo.png",
"alt_text": "Organisationslogo"
}
}
]
}
Next Steps
After creating your Issuer2 service:
- Create Credential Profiles – Define reusable configurations for each credential type
- Create Credential Offers – Issue credentials to users
- Configure Display Metadata – Customize how your issuer appears in wallets
Last updated on May 15, 2026
