Skip to main content
Version: Next

Configuration

In this section, the configuration of the wallet is explained. Configuration is used based on a config.yaml file which should be placed in the apps/backend folder. This config.yaml file is loaded when booting the application. The values get type checked, and it gives a clear error message if there is a configuration field missing or provided incorrectly. Next to the config.yaml file, you can also set environment variables. These override the values that are listed in the config.yaml file.

Databases

By default, the development database is sqlite. We use postgres databases for production type instances of the wallets.

Authentication

Authentication for frontend services can be done via OAuth. This helps users who need to login to several components to authenticate themselves faster. The wallet is tested against the SSO Bridge, with an Helm chart provided alongside the Helm chart of the wallet, but other OAuth services should be usable (e.g. Keycloak, or hosted OAuth services).

DID Method

Two DID methods are currently supported: did:web and did:tdw. A comparison between the two is given below. The decision of which configuration to select should be made based on the specific use case of the wallet.

did:webdid:tdwdid:key
TSG Configuration value:did:web:did:tdw:- (DID Key is only supported for DID resolution but not for creation)
Specification link:W3C internal documentBCGov specification draftW3C internal document
Supported version:Unofficial draftDraft v1Unofficial draft v0.7
Underlying technology:Web-based DID method that serves the DID Document as a JSON under a certain endpoint (.well-known path) of a web domain that is accessible by the public.Web-based DID method that utilizes a public JSON Lines file hosted under a web domain to store each change (create, update, delete) that occurs on a DID Document. The DID Document is then resolved by fetching and processing the JSON Lines file.Multibase Multicodec public key, with generated DID document
Identifier format:did:web:{{public web domain}}
e.g. did:web:example.com
did:tdw:{{public web domain}}:{{generated self-certifying identifier}}
e.g. did:tdw:example.com:b7ep277b2mvxdpcrbja3iergubfy
did:key:{{ Public key }}
Advantages:Straightforward implementation with no additional processing other than hosting DID Document on web server.Additional security and validation mechanisms contained in the JSON Lines file that increases trustworthiness of DID Document.No server implementation required, so very suitable for mobile wallets
Disadvantages:Easily compromisable without notice by resolving parties when malicious access is gained to the web server.DID Document is not directly available as extra processing to verify signatures and validate entry hashes retrieved from the JSON Lines file needs to be performed to resolve the DID Document.DID document only contains the verification method, so additional properties like service are not supported

Tenants

A wallet process serves one or more tenants. A tenant is a participant in its own right: it has its own keys, DID, issuer configuration, credentials and members. There is no special "default" tenant — the first tenant is declared exactly like the hundredth, under initTenants, and at least one entry is required.

initTenants:
- name: Alice Corp
slug: alice-corp
members:
- identifier: alice
role: owner
didServices:
- id: did:web:wallet.example:tenants:alice-corp#control-plane
type: connector
serviceEndpoint: https://cp.example/

Members are invited by identifier — a user id, username or email address. The user does not have to exist yet: the invite becomes a membership the first time that user signs in.

Addressing

Every tenant is addressed by its slug, whether the process serves one tenant or a hundred:

  • DID and protocol endpoints: https://wallet.example/tenants/<slug>/..., with DID did:web:wallet.example:tenants:<slug>.
  • Management API: X-Tenant-Slug: <slug> (or X-Tenant-Id) on every call.

There is no unprefixed surface and no root did:web:<host> DID.

Upgrading from a pre-multi-tenancy deployment

The multi-tenancy migration moved all existing data onto a tenant with slug default. To keep that data reachable, either:

  • keep slug: default in your new initTenants entry — the bootstrap adopts the existing row and nothing moves; or
  • rename the tenant first with PATCH /management/tenants/default and then declare the new slug.

Issue Configurations

Issue configurations define the structure, validation rules, and visual presentation of credential types that the wallet can issue and manage. Each configuration combines semantic interoperability through JSON-LD contexts with schema validation and visual styling.

JSON-LD Context and Schema Relationship

Issue configurations leverage both JSON-LD contexts and JSON Schema for comprehensive credential definition:

  • JSON-LD Context (document or documentUrl): Defines semantic meaning of credential properties for interoperability across systems
  • JSON Schema (schema): Defines structure, validation rules, and user interface information for credential properties

Schema-Driven User Interface

The JSON Schema directly influences how credentials are presented to users:

  • Property Order: Schema property order determines display order in user interfaces
  • Human-Readable Titles: The title property provides user-friendly labels instead of technical property names
  • Example Values: The example property shows users expected data format
  • Validation Rules: Properties like enum, pattern, and required ensure data quality and guide user input when issuing credentials

Visual Styling

Issue configurations support visual customization through:

  • Background Color (backgroundColor): Hex color code for credential background
  • Background Image (backgroundImage): URL or base64-encoded image for credential branding. PNG-based images are recommended for transparency support and support across applications.
  • Text Color (textColor): Hex color code for credential text
  • Display Metadata (name, description): Human-readable credential information

Possible configuration parameters

KeyRequiredTypeDescriptionDefault
DatabaseConfig
dbYesDatabaseConfigDatabase configuration
db.typeYes"sqlite" | "postgres"Type of database
db.databaseYesStringName of the database
db.synchronizeBooleanSynchronize database schema
db{type=sqlite}YesSQLiteConfigDatabase configuration
db{type=sqlite}.type"sqlite" | "postgres"Type of database"sqlite"
db{type=sqlite}.databaseYesStringName of the database
db{type=sqlite}.synchronizeBooleanSynchronize database schema
db{type=postgres}YesPostgresConfigDatabase configuration
db{type=postgres}.hostYesStringHost of the database
db{type=postgres}.portYesNumberPort of the database
db{type=postgres}.usernameYesStringUsername of the database
db{type=postgres}.passwordYesStringPassword of the database
db{type=postgres}.sslUnknownSSL configuration of the database
db{type=postgres}.type"sqlite" | "postgres"Type of database"postgres"
db{type=postgres}.databaseYesStringName of the database
db{type=postgres}.synchronizeBooleanSynchronize database schema
ServerConfig
serverServerConfigServer configuration
server.listenStringIP address the server listens on"0.0.0.0"
server.portNumberPort the server listens on3000
server.publicDomainStringPublic domain of the server"localhost"
server.publicAddressStringPublic address of the server"http://localhost:3000"
server.subPathStringSub path of the server
AuthConfig
authYesAuthConfigManagement authentication configuration
auth.enabledBooleanEnable authenticationtrue
auth.openIdConfigurationURLStringOpenID configuration URL
auth.callbackURLURLCallback URL the auth service will redirect users
auth.redirectURLURLRedirect URL to UI after login/logout
auth.clientIdStringClient ID
auth.clientSecretStringClient secret (required for client_secret_post authentication)
auth.tokenEndpointAuthMethod"client_secret_post" | "private_key_jwt"Token endpoint authentication method: client_secret_post (default) or private_key_jwt"client_secret_post"
auth.privateKeyJwkObjectPrivate key in JWK format for private_key_jwt authentication. Alternative to privateKeyJwkFile.
auth.privateKeyJwkFileStringPath to file containing private key JWK for private_key_jwt authentication. Alternative to privateKeyJwk.
auth.permissionPathStringJSON path to extract permissions from the token"$.permissions[*]"
NodemailerConfiguration
emailNodemailerConfigurationEmail configuration
email.enabledYesBooleanEnable email sending
email.smtpFromStringEmail address to send emails from
email.smtpPortNumberSMTP port465
email.smtpSecureBooleanSMTP secure connectiontrue
email.smtpServerStringSMTP server
email.smtpUserStringSMTP user
email.smtpPasswordStringSMTP password
email.titleStringTitle
InitKeyConfig
initKeysInitKeyConfig[]Initial key configurations
initKeys[].typeYes"EdDSA" | "ES384" | "X509"Type of key
initKeys[].idYesStringID of the key
initKeys[].defaultBooleanDefault key
initKeys[].existingKeyStringExisting PKCS#8 encoded key
initKeys[].existingCertificateStringExisting PEM encoded certificate
AddScope
initScopesAddScope[]Initial scope configurations
initScopes[].aliasYesStringAlias of the scope
initScopes[].discriminatorYesStringDiscriminator of the scope, variables must be enclosed in
initScopes[].descriptionYesStringDescription of the scope
PresentationDefinition
initScopes[].presentationDefinitionYesPresentationDefinitionPresentation definition associated with the scope, should include variables from the discriminator
initScopes[].presentationDefinition.idYesStringundefined
InputDescriptor
initScopes[].presentationDefinition.input_descriptorsYesInputDescriptor[]undefined
initScopes[].presentationDefinition.input_descriptors[].idYesStringundefined
initScopes[].presentationDefinition.input_descriptors[].nameStringundefined
initScopes[].presentationDefinition.input_descriptors[].purposeStringundefined
Format
initScopes[].presentationDefinition.input_descriptors[].formatFormatundefined
JwtVpClaimFormat
initScopes[].presentationDefinition.input_descriptors[].format.jwt_vpJwtVpClaimFormatundefined
initScopes[].presentationDefinition.input_descriptors[].format.jwt_vp.algYesStringundefined
Constraint
initScopes[].presentationDefinition.input_descriptors[].constraintsYesConstraintundefined
Field
initScopes[].presentationDefinition.input_descriptors[].constraints.fieldsField[]undefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].pathYesStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].idStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].purposeStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].nameStringundefined
Filter
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filterFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.typeYesStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.constUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.enumArrayundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.exclusiveMinimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.exclusiveMaximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.formatStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.minLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.maxLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.minimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.maximumUnknownundefined
NestedFilter
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.notNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.typeStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.constUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.enumArrayundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.exclusiveMinimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.exclusiveMaximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.formatStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.minLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.maxLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.minimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.maximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.notNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.patternStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.containsNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.requiredStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.propertiesObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.allOfNestedFilter[]undefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.not.itemsObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.patternStringundefined
NestedFilter
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.containsNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.typeStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.constUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.enumArrayundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.exclusiveMinimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.exclusiveMaximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.formatStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.minLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.maxLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.minimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.maximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.notNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.patternStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.containsNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.requiredStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.propertiesObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.allOfNestedFilter[]undefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.contains.itemsObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.requiredStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.propertiesObjectundefined
NestedFilter
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOfNestedFilter[]undefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].typeStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].constUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].enumArrayundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].exclusiveMinimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].exclusiveMaximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].formatStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].minLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].maxLengthUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].minimumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].maximumUnknownundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].notNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].patternStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].containsNestedFilterundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].requiredStringundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].propertiesObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].allOfNestedFilter[]undefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.allOf[].itemsObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].filter.itemsObjectundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.fields[].optionalBooleanundefined
initScopes[].presentationDefinition.input_descriptors[].constraints.limit_disclosureundefined
initScopes[].presentationDefinition.nameStringundefined
initScopes[].presentationDefinition.purposeStringundefined
Format
initScopes[].presentationDefinition.formatFormatundefined
JwtVpClaimFormat
initScopes[].presentationDefinition.format.jwt_vpJwtVpClaimFormatundefined
initScopes[].presentationDefinition.format.jwt_vp.algYesStringundefined
initScopes[].requirementSetIdStringundefined
initScopes[].revisionUnknownundefined
initScopes[].digestStringundefined
initScopes[].immutableBooleanundefined
InitCredentialConfig
initCredentialsInitCredentialConfig[]Initial credential configurations
initCredentials[].contextUnknownJSON-LD contexts for the credential[]
initCredentials[].typeStringTypes of the verifiable credential[]
initCredentials[].idYesStringID of the credential
initCredentials[].proofTypeType of proof used for the credential"ldp"
initCredentials[].keyIdStringID of key signing the credential
initCredentials[].validityDurationMsNumberValidity duration of self-issued credentials in milliseconds. Defaults to 3 months.7776000000
initCredentials[].revocableBooleanRevocable credentialtrue
initCredentials[].credentialSubjectYesObjectCredential subject
initCredentials[].evidenceObjectEvidence attached to the verifiable credential
TrustAnchorConfig
trustAnchorsTrustAnchorConfig[]Trust anchor configurations
trustAnchors[].idYesStringDID of the trust anchor
trustAnchors[].credentialTypesStringCredential types trusted of the trust anchor[]
IssueConfigurationConfig
issueConfigurationsYesIssueConfigurationConfig[]Issue configuration settings
issueConfigurations[].idYesStringID of the configuration
issueConfigurations[].credentialTypeYesStringCredential type associated with the configuration
issueConfigurations[].proofTypeProof type for the credential"jwt"
issueConfigurations[].evidenceObjectEvidence attached to credentials issued with this configuration
issueConfigurations[].documentUrlURLURL of the JSON-LD context
issueConfigurations[].documentObjectJSON-LD context body
issueConfigurations[].schemaObjectJSON-Schema of the issue configuration
issueConfigurations[].nameStringDisplay name of the issue configuration
issueConfigurations[].descriptionStringDescription of the issue configuration
issueConfigurations[].backgroundColorStringBackground color for the credential display
issueConfigurations[].backgroundImageStringBackground image for the credential display, must be a URL
issueConfigurations[].textColorStringText color for the credential display
PresentationDefinition
issueConfigurations[].issuancePolicyPresentationDefinitionPresentation definition that the holder must satisfy before this credential is issued
issueConfigurations[].issuancePolicy.idYesStringundefined
InputDescriptor
issueConfigurations[].issuancePolicy.input_descriptorsYesInputDescriptor[]undefined
issueConfigurations[].issuancePolicy.input_descriptors[].idYesStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].nameStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].purposeStringundefined
Format
issueConfigurations[].issuancePolicy.input_descriptors[].formatFormatundefined
JwtVpClaimFormat
issueConfigurations[].issuancePolicy.input_descriptors[].format.jwt_vpJwtVpClaimFormatundefined
issueConfigurations[].issuancePolicy.input_descriptors[].format.jwt_vp.algYesStringundefined
Constraint
issueConfigurations[].issuancePolicy.input_descriptors[].constraintsYesConstraintundefined
Field
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fieldsField[]undefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].pathYesStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].idStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].purposeStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].nameStringundefined
Filter
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filterFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.typeYesStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.constUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.enumArrayundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.exclusiveMinimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.exclusiveMaximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.formatStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.minLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.maxLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.minimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.maximumUnknownundefined
NestedFilter
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.notNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.typeStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.constUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.enumArrayundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.exclusiveMinimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.exclusiveMaximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.formatStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.minLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.maxLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.minimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.maximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.notNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.patternStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.containsNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.requiredStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.propertiesObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.allOfNestedFilter[]undefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.not.itemsObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.patternStringundefined
NestedFilter
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.containsNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.typeStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.constUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.enumArrayundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.exclusiveMinimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.exclusiveMaximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.formatStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.minLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.maxLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.minimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.maximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.notNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.patternStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.containsNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.requiredStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.propertiesObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.allOfNestedFilter[]undefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.contains.itemsObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.requiredStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.propertiesObjectundefined
NestedFilter
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOfNestedFilter[]undefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].typeStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].constUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].enumArrayundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].exclusiveMinimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].exclusiveMaximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].formatStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].minLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].maxLengthUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].minimumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].maximumUnknownundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].notNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].patternStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].containsNestedFilterundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].requiredStringundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].propertiesObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].allOfNestedFilter[]undefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.allOf[].itemsObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].filter.itemsObjectundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.fields[].optionalBooleanundefined
issueConfigurations[].issuancePolicy.input_descriptors[].constraints.limit_disclosureundefined
issueConfigurations[].issuancePolicy.nameStringundefined
issueConfigurations[].issuancePolicy.purposeStringundefined
Format
issueConfigurations[].issuancePolicy.formatFormatundefined
JwtVpClaimFormat
issueConfigurations[].issuancePolicy.format.jwt_vpJwtVpClaimFormatundefined
issueConfigurations[].issuancePolicy.format.jwt_vp.algYesStringundefined
issueConfigurations[].canReIssueBooleanWhether credentials of this type may be automatically reissued before they expire. Defaults to true.true
IssuanceConfig
issuanceYesIssuanceConfigIssuance configuration
issuance.dcpProfile"vc20-bssl/jwt"DCP credential profile used for issuance and requests"vc20-bssl/jwt"
issuance.preAuthorizedCodeTtlMsNumberLifetime of OID4VCI pre-authorized codes in milliseconds300000
IssuerConfig
issuance.issuerYesIssuerConfig[]Issuer configuration
issuance.issuer[].tenantSlugStringTenant slug that acts as issuer (multi-tenant only)
issuance.issuer[].holderIdYesStringDID of the holder
issuance.issuer[].credentialTypeYesStringCredential type to be issued
issuance.issuer[].credentialIdStringStable logical credential ID to use for this configured issuance. Defaults to a holder-bound random ID.
issuance.issuer[].credentialSubjectYesObjectCredential subject
issuance.issuer[].preAuthorizedCodeStringPre-authorized code
issuance.issuer[].validityDurationMsNumberValidity duration of self-issued credentials in milliseconds. Defaults to 3 months.7776000000
issuance.issuer[].reissueBeforeExpiryMsNumberHow long before a credential's expiry (in milliseconds) a reissue offer is sent to the holder. Defaults to 7 days. Reissuance can be disabled per credential type via the issue configuration's canReIssue flag.604800000
DCPHolderConfig
issuance.dcpYesDCPHolderConfig[]DCP Holder configuration
issuance.dcp[].tenantSlugStringTenant slug that acts as holder/claimer (multi-tenant only)
issuance.dcp[].preAuthorizedCodeYesStringPre-authorized code
issuance.dcp[].issuerIdYesStringDID identifier of the issuer
issuance.dcp[].credentialTypeYesStringCredential type to be issued
issuance.dcp[].preferredProofTypePreferred proof type for the credential"jwt"
OID4VCIHolderConfig
issuance.oid4vciYesOID4VCIHolderConfig[]OID4VCI Holder configuration
issuance.oid4vci[].tenantSlugStringTenant slug that acts as holder/claimer (multi-tenant only)
issuance.oid4vci[].preAuthorizedCodeYesStringPre-authorized code
issuance.oid4vci[].issuerUrlYesURLRoot URL of the issuer
issuance.oid4vci[].credentialTypeYesStringCredential type(s) to be issued
issuance.statusListCountNumberMaximum number of status list entries per StatusListCredential1000
DidServiceConfig
didServicesYesDidServiceConfig[]DID service configurations
didServices[].idYesStringID of the service
didServices[].typeYesStringType of the service
didServices[].serviceEndpointYesURLService endpoint
DcpStsConfig
dcpStsDcpStsConfigDCP self-issued token configuration
dcpSts.tokenTtlSecondsNumberLifetime of DCP self-issued tokens in seconds300
InitTenantConfig
initTenantsYesInitTenantConfig[]Tenants served by this process, created on startup. At least one tenant must be declared; every tenant is addressed as /tenants/:slug/...
DidServiceConfig
initTenants[].didServicesDidServiceConfig[]DID service configurations specific to this tenant
initTenants[].didServices[].idYesStringID of the service
initTenants[].didServices[].typeYesStringType of the service
initTenants[].didServices[].serviceEndpointYesURLService endpoint
initTenants[].nameYesStringDisplay name of the tenant
initTenants[].slugYesStringURL-safe slug for the tenant
InitTenantMemberConfig
initTenants[].membersInitTenantMemberConfig[]Users granted access to this tenant on startup
initTenants[].members[].identifierYesStringUsername, email or auth subject id (sub) of the user
initTenants[].members[].usernameStringDisplay name to record for the user, when known
initTenants[].members[].role"owner" | "admin" | "member"Role granted to the user within the tenant"member"
RuntimeConfig
runtimeYesRuntimeConfigRuntime configuration
runtime.titleStringTitle of the wallet
runtime.acceptUnauthenticatedCredentialRequestsBooleanAccept unauthenticated credential requests
runtime.issueMobileCredentialsBooleanIssue mobile credentials
runtime.issueDebugCredentialsBooleanIssue debug credentials
runtime.colorStringPrimary color of the wallet"#3B8BF6"
runtime.lightThemeUrlStringLight theme logo URL
runtime.darkThemeUrlStringDark theme logo URL
DidConfig
didDidConfigDID configuration
did.method"did:web:" | "did:tdw:"Provided DID method"did:web:"
did.keyFormat"JWK" | "Multikey"Provided key format"JWK"
AuditModuleConfig
auditAuditModuleConfigAudit logging configuration
audit.enabledBooleanEnable audit loggingtrue
audit.minSeverity"debug" | "info" | "warning" | "error" | "critical"Minimum severity level to log"info"
audit.logDeniedBooleanAlways log denied access attempts regardless of action typetrue
audit.logDelegatedBooleanLog delegated access attempts when enabled, while still respecting action-specific success filterstrue
audit.logMutationsBooleanLog successful mutation actions (create, update, delete, manage)true
audit.logExecuteYesBooleanLog successful execute actions
audit.logReadsYesBooleanLog successful read actions — disabled by default as reads are frequent and rarely relevant for auditing
audit.sensitiveResourcesUnknownResources that are always logged regardless of action-specific success filters["w.key","w.credential","sso.user"]
AuditHandlersConfig
audit.handlersAuditHandlersConfigHandler configuration
audit.handlers.consoleYesBooleanEnable console audit log handler
audit.handlers.databaseBooleanEnable database audit log handlertrue
audit.handlers.otlpYesBooleanEnable OTLP audit log handler
OtlpAuditHandlerConfig
audit.otlpOtlpAuditHandlerConfigOTLP audit log handler configuration
audit.otlp.urlStringOTLP HTTP logs endpoint URL"http://localhost:4318/v1/logs"
audit.otlp.headersObjectAdditional HTTP headers to include in OTLP requests
audit.otlp.timeoutMillisUnknownOTLP export timeout in milliseconds5000
audit.otlp.concurrencyLimitUnknownMaximum number of concurrent OTLP export requests1
audit.otlp.serviceNameStringService name included on OTLP log attributes"tsg-dsp-api"
audit.otlp.serviceVersionStringOptional service version included on OTLP log attributes