Verifiable Data in ConsentFlow
A learner's My Skills Profile — goals, title, experience, pay expectations, self-assessed skills — is stored as verifiable data in their LearnCard. A consent contract can ask for it field by field, so a career platform or tutor can read exactly what the learner agreed to share, as structured data.
Supported fields
The supported My Skill Profile categories are:
Goals
Professional Title
Role Experience
Work Experience
Pay Rate
Work Life Balance
Job Stability
Self-Assigned Skills
These categories use the canonical CredentialCategoryEnum keys in contracts and app code.
What each category contains
Goals
{ goals: string[] }
Freeform learner goals
Professional Title
{ professionalTitle: string }
The learner’s current or desired title
Role Experience
{ lifetimeExperience: { years?: number; months?: number } }
Time spent in a role
Work Experience
{ selectedCredentialUris: string[] }
Selected work experience credentials
Pay Rate
{ salary: string; salaryType: 'per_hour' | 'per_year' }
Stored as a simple rate object
Work Life Balance
{ workLifeBalance: string }
Saved choice from the My Skill Profile flow
Job Stability
{ jobStability: string }
Saved choice from the My Skill Profile flow
Self-Assigned Skills
Boost credential with aligned skill names
Displayed from the boost alignment targets
Configuring a contract
Add the categories you want to share under read.credentials.categories. The category names must match the canonical names used by the app.
Notes
shareAll: truelets the contract sync the full category.sharing: truekeeps the category eligible for sync.The
sharedarray is populated by ConsentFlow when the learner syncs their data to the contract.
Reading it from your platform
Once a user has consented, their shared fields show up in their consented data like any other category: each record's credentials array holds { category, uri } pairs. Resolve the URI and the structured data is in credentialSubject.dataPayload. Two things to remember: the learner chooses which credential URIs to share under each category, and if the credential was stored encrypted, your platform's DID must be one of its encryption recipients — consent to a category does not by itself grant decryption.
Gate every read on verifyConsent(contractUri, profileId) first — see Reading & Writing Consented Data.
Last updated
Was this helpful?