Transaction Data Profiles

transaction-data-profiles.conf defines the transaction data types the verifier and wallet recognize for binding presentations to specific actions (e.g., payment authorization, account access).

Transaction data types act as namespaces that:

  • Enforce which types the wallet will accept in authorization requests
  • Define the structure and fields for UI/discovery endpoints
  • Are validated by the wallet's TransactionDataTypeRegistry

The transaction-data-profiles feature is enabled by default for Verifier2 and backs the runtime discovery endpoint:

GET /transaction-data-profiles

The same profile format is also used by the walt.id Wallet API, which exposes:

GET /wallet-api/transaction-data-profiles

Fields

transactionDataProfiles

Array of Objects — List of recognized transaction data types. Each profile defines:

FieldTypeDescription
typeStringRequired. The transaction data type identifier. Used as the type field in transaction data entries and as the namespace for mdoc DeviceSigned binding. Example: "org.waltid.transaction-data.payment-authorization"
displayNameStringHuman-readable name for this type. Used in UIs and discovery endpoints. Defaults to type if not specified.
fieldsArrayList of expected field names for this type. Used for documentation and UI generation. Example: ["amount", "currency", "payee"]

Built-in Profiles

The default configuration includes two profiles:

transaction-data-profiles.conf
transactionDataProfiles = [
  {
    type = "org.waltid.transaction-data.payment-authorization"
    displayName = "Payment Authorization"
    fields = ["amount", "currency", "payee"]
  },
  {
    type = "org.waltid.transaction-data.account-access"
    displayName = "Account Access"
    fields = ["account_identifier", "access_scope"]
  }
]

Adding Custom Types

To add a custom transaction data type:

  1. Add a new entry to the transactionDataProfiles array in both the verifier and wallet config files:
    • Verifier: waltid-services/waltid-verifier-api2/config/transaction-data-profiles.conf
    • Wallet: waltid-services/waltid-wallet-api/config/transaction-data-profiles.conf
  2. Restart both services to load the new configuration

Example: Adding a subscription authorization type:

transaction-data-profiles.conf
transactionDataProfiles = [
  {
    type = "org.waltid.transaction-data.payment-authorization"
    displayName = "Payment Authorization"
    fields = ["amount", "currency", "payee"]
  },
  {
    type = "org.waltid.transaction-data.account-access"
    displayName = "Account Access"
    fields = ["account_identifier", "access_scope"]
  },
  {
    type = "org.example.subscription-authorization"
    displayName = "Subscription Authorization"
    fields = ["service_name", "billing_cycle", "price"]
  }
]

Important: Transaction data types must be configured on both the verifier and wallet. Mismatched configurations will cause the wallet to reject authorization requests with unknown types.

Usage in Verification Requests

Once configured, use the type in your verification session transaction data:

{
  "flow_type": "cross_device",
  "core_flow": {
    "dcql_query": { ... }
  },
  "openid": {
    "transactionData": [
      {
        "type": "org.example.subscription-authorization",
        "credential_ids": ["pid"],
        "require_cryptographic_holder_binding": true,
        "transaction_data_hashes_alg": ["sha-256"],
        "service_name": "Premium Streaming",
        "billing_cycle": "monthly",
        "price": "12.99"
      }
    ]
  }
}

See Transaction Data Authorization for complete usage details.

Last updated on June 15, 2026