Thoryn

VCT templates · VCT templates

Bank Customer Credential VCT

VCT template for a "verified customer of us" credential. Issued by a bank after KYC; consumed at partner services to skip re-KYC.

Tested against:credentialIssuer: 1.0.0vctRegistry: 1.0.0

vct-templates recipe — shared category architecture: how this pattern composes with Hub, Broker, and the rest of the catalog

Issuer archetype

A retail bank that has completed KYC on the customer. The bank mints a "verified customer of us" credential the customer can present at partner services — brokerages, insurers, peer banks — to skip re-KYC.

VCT URL

https://thoryn.org/vct/BankCustomerCredential-v1

Claim schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "BankCustomerCredential",
  "type": "object",
  "required": ["account_holder_name", "kyc_level", "kyc_completed_at"],
  "properties": {
    "account_holder_name": { "type": "string", "minLength": 1, "maxLength": 200 },
    "customer_id":         { "type": "string" },
    "kyc_level":           { "type": "string", "enum": ["LoA-low", "LoA-medium", "LoA-high"] },
    "kyc_completed_at":    { "type": "string", "format": "date" },
    "account_open_date":   { "type": "string", "format": "date" },
    "country":             { "type": "string", "pattern": "^[A-Z]{2}$" },
    "pep_flag":            { "type": "boolean" },
    "sanctions_clear":     { "type": "boolean" }
  }
}

The pep_flag (politically exposed person) and sanctions_clear claims are useful for partner services that need to apply enhanced due diligence — without seeing the underlying check details.

Display metadata

{
  "name": "Verified Bank Customer",
  "description": "KYC-verified customer credential.",
  "background_color": "#1a2a6e",
  "text_color": "#ffffff",
  "claims": [
    { "path": "account_holder_name", "label": "Account holder" },
    { "path": "kyc_level",           "label": "KYC level" },
    { "path": "kyc_completed_at",    "label": "Verified" }
  ]
}

Sample minted credential

{
  "iss": "did:bank:rabobank",
  "sub": "did:key:zQ3sh...",
  "vct": "https://thoryn.org/vct/BankCustomerCredential-v1",
  "iat": 1735000000,
  "exp": 1766000000,
  "account_holder_name": "Jan Jansen",
  "kyc_level": "LoA-high",
  "kyc_completed_at": "2025-11-12",
  "country": "NL",
  "pep_flag": false,
  "sanctions_clear": true
}

Lifecycle

  • Expiry: 12 months — KYC posture changes; re-mint annually
  • Revocation: instant on account closure; status-list driven
  • Deferred flow: not used

See also