Credential Templates
Templates are reusable blueprints that define the structure and requirements for credentials and verifications.
Overview
Credential Templates define the structure, attributes, and format of credentials you issue. They serve as reusable blueprints that ensure consistency across all credentials of the same type.
Template Types
Skippy supports multiple credential formats:
SD-JWT (vc+sd-jwt)
- Privacy-preserving credential format
- Selective disclosure capabilities
- Compact representation
- Recommended for most use cases
MSO mDoc (mso_mdoc)
- ISO 18013-5 compliant
- Mobile driver's license format
- Hardware-backed security
Creating a Credential Template
Prerequisites
Before creating a credential template, ensure you have:
- Created a Project: Credential templates belong to projects
- Created an Issuer DID: You'll need a DID to sign credentials
Step 1: Define Basic Information
Establish the foundational details of your credential:
- Template Name: Descriptive name (e.g., "Employee Badge", "University Diploma")
- Description: Clear explanation of what this credential represents
- Credential Type: Unique identifier (e.g., "EmployeeBadge", "BachelorDegree")
- Format Selection: Choose credential format (SD-JWT recommended for privacy)
Step 2: Design Credential Structure
Define the data fields (attributes) your credential will contain:
Attribute Configuration:
- Name & Description: Clear labels and explanations for each field
- Data Type: Choose from String, Number, Boolean, Date, or Object
- Constraints: Set minimum/maximum values, patterns, or required formats
- Disclosure Settings: Mark fields as always visible or selectively disclosable
Supported Data Types:
| Type | Description | Example Use Cases |
|---|---|---|
| String | Text values | Names, IDs, addresses |
| Number | Numeric values | Age, scores, levels |
| Boolean | True/false | Active status, verified flags |
| Date | Timestamps | Birth date, expiration, issue date |
| Object | Nested structures | Addresses, contact info |
Step 3: Configure Display Settings
Customize how the credential appears to holders:
- Display Name: User-facing credential name
- Background Color: Brand color for credential card
- Text Color: Ensure readability and contrast
- Logo (optional): Organization or issuer logo
Step 4: Set Validity Parameters
Define the credential's lifecycle:
- Not Before (nbf): When the credential becomes valid
- Expiration (exp): When the credential expires
- Revocation: Enable if credentials may need to be revoked
Step 5: Assign Issuer
Select the issuer DID that will digitally sign credentials from this template. The issuer's signature:
- ✅ Proves credential authenticity
- ✅ Enables cryptographic verification
- ✅ Links credential to trusted issuer
Step 6: Review and Save
Verify all configuration:
- Confirm all required attributes are included
- Check disclosure settings are appropriate
- Review display configuration
- Ensure validity periods are correct
- Save the template
After creation, the template is ready for credential issuance.
Template Examples
Example 1: Employee Badge Template
A comprehensive employee identification credential with access control:
{
"name": "Employee Badge",
"description": "Employee identification and access credential",
"type": "EmployeeBadge",
"format": "vc+sd-jwt",
"attributes": {
"employeeId": {
"name": "Employee ID",
"type": "String",
"description": "Unique employee identifier",
"alwaysDisclosed": true
},
"fullName": {
"name": "Full Name",
"type": "String",
"description": "Employee's full name"
},
"department": {
"name": "Department",
"type": "String",
"description": "Employee's department"
},
"position": {
"name": "Job Title",
"type": "String",
"description": "Employee's job title"
},
"startDate": {
"name": "Start Date",
"type": "Date",
"description": "Employee start date"
},
"accessLevel": {
"name": "Access Level",
"type": "Number",
"description": "Security access level (1-5)",
"minimum": 1,
"maximum": 5
}
},
"display": {
"name": "Employee Badge",
"backgroundColor": "#0066CC",
"textColor": "#FFFFFF"
},
"nbf": 1704067200,
"exp": 1735689600,
"canBeRevoked": true
}
Key Features:
- ✅ Always Disclosed Field:
employeeIdensures immediate identification - ✅ Type Constraints:
accessLevellimited to 1-5 range - ✅ Multiple Data Types: Combines Strings, Date, and Number types
- ✅ Branded Display: Professional blue and white color scheme
- ✅ Revocable: Can be revoked when employee departs
Example 2: Academic Certificate Template
A university degree credential with nested educational details:
{
"name": "Bachelor Degree Certificate",
"description": "University bachelor degree credential",
"type": "BachelorDegree",
"format": "vc+sd-jwt",
"attributes": {
"studentId": {
"name": "Student ID",
"type": "String",
"alwaysDisclosed": true
},
"fullName": {
"name": "Graduate Name",
"type": "String",
"alwaysDisclosed": true
},
"degree": {
"name": "Degree Title",
"type": "String",
"description": "e.g., Bachelor of Science"
},
"major": {
"name": "Major",
"type": "String",
"description": "Field of study"
},
"gpa": {
"name": "GPA",
"type": "Number",
"description": "Grade point average",
"minimum": 0.0,
"maximum": 4.0,
"alwaysDisclosed": false
},
"graduationDate": {
"name": "Graduation Date",
"type": "Date"
}
},
"display": {
"name": "Bachelor Degree",
"backgroundColor": "#8B0000",
"textColor": "#FFFFFF"
},
"canBeRevoked": false
}
Key Features:
- ✅ No Expiration: Academic credentials typically don't expire
- ✅ Privacy Option: GPA can be selectively disclosed
- ✅ Non-Revocable: Degrees aren't typically revoked
- ✅ Institution Branding: Custom university colors
Advanced Features
Nested Objects
For complex data structures, use the Object type with nested properties:
{
"address": {
"name": "Address",
"type": "Object",
"description": "Physical address",
"properties": {
"street": {
"name": "Street",
"type": "String",
"description": "Street address"
},
"city": {
"name": "City",
"type": "String",
"description": "City name"
},
"zipCode": {
"name": "ZIP Code",
"type": "String",
"description": "Postal code"
}
}
}
}
Selective Disclosure (SD-JWT)
For privacy-preserving credentials, control which attributes are always visible versus selectively disclosable:
{
"credentialId": {
"name": "Credential ID",
"type": "String",
"description": "Unique credential identifier",
"alwaysDisclosed": true
},
"age": {
"name": "Age",
"type": "Number",
"description": "User's age",
"alwaysDisclosed": false
},
"dateOfBirth": {
"name": "Date of Birth",
"type": "Date",
"description": "Full birth date",
"alwaysDisclosed": false
}
}
Selective Disclosure Best Practices
Always Disclosed (true):
- Credential identifiers
- Essential identification fields
- Fields required for all verification scenarios
Selectively Disclosed (false):
- Sensitive personal information
- Fields that may not always be needed
- Privacy-sensitive attributes
Example: For age verification, a holder can prove they're over 18 without revealing their exact birthdate.
Managing Credential Templates
View & Browse
Browse all templates in your project, filter by type, and search by name or credential type.
Edit Templates
Modify template details. Use caution if credentials have already been issued from this template.
Delete Unused
Remove templates that haven't been used to issue any credentials yet.
Next Steps
With your credential template created, you're ready to:
- Issue Credentials based on this template
- Create Presentation Templates for verification requirements
- Set up Webhooks for real-time credential event notifications
- Explore the API for programmatic integration