Repository navigation
Edubadges Metadata Model OB3
This page describes how the 17 metadata extensions of the Edubadges Metadata Model are expressed in Open Badges 3.0 (OB3, 1EdTech, with the W3C Verifiable Credentials Data Model 2.0).
In OB2 every extension was a separate object with its own JSON-LD context and JSON Schema. OB3 works differently:
- Most Edubadges metadata now has a native place in the OB3 data model: the institution becomes the issuer's
parentOrg, ECTS becomescreditsAvailable, programme codes becomeotherIdentifier, the EQF level becomes analignment, the grade becomes aresult. Ten of the 17 extensions need no Edubadges vocabulary at all. - The remaining seven are added as one Edubadges OB3 extension, following the OB3 Extending the Data Model rules: one JSON-LD context in
@context, one JSON Schema incredentialSchema, and an extra typeEdubadgesAchievementon the Achievement that activates the Edubadges properties. - Where OB3 has an extensible enumeration, Edubadges adds terms with the required
ext:prefix (ext:BRIN,ext:CROHO,ext:EQFLevel,ext:GradingTable, …).
| # | OB2 extension | OB3 location | Kind |
|---|---|---|---|
| 1 | InstitutionCountryExtension | issuer.parentOrg.address.addressCountryCode |
native |
| 2 | InstitutionNameExtension | issuer.parentOrg.name |
native |
| 3 | InstitutionIdentifierExtension |
issuer.parentOrg.otherIdentifier[] (identifierType ext:BRIN, ext:SCHAC, ext:ROR, ext:ErasmusCode, ext:PIC) |
native + extended enumeration |
| 4 | GradingTableExtension |
achievement.resultDescription[].alignment[] (targetType ext:GradingTable) |
native + extended enumeration |
| 5 | LanguageExtension | achievement.inLanguage |
native |
| 6 | ECTSExtension | achievement.creditsAvailable |
native (Edubadges profile: unit is ECTS) |
| 7 | StudyLoadExtension | achievement.studyLoadHours |
Edubadges extension |
| 8 | TimeInvestmentExtension | achievement.timeInvestmentHours |
Edubadges extension |
| 9 | EQFExtension |
achievement.alignment[] (targetType ext:EQFLevel) |
native + extended enumeration |
| 10 | LearningOutcomeExtension | achievement.learningOutcome |
Edubadges extension |
| 11 | EducationProgramIdentifierExtension |
achievement.otherIdentifier[] (identifierType ext:CROHO, ext:CREBO) |
native + extended enumeration |
| 12 | ParticipationFormExtension | achievement.formOfParticipation |
Edubadges extension |
| 13 | AssessmentTypeExtension | achievement.typeOfAssessment |
Edubadges extension |
| 14 | SupervisionTypeExtension | achievement.supervisionType |
Edubadges extension |
| 15 | QualityAssuranceExtension | achievement.qualityAssurance |
Edubadges extension |
| 16 | IntegrationOptionsExtension |
achievement.integrationOption, achievement.stacksInto
|
Edubadges extension |
| 17 | GradeAchievedExtension |
credentialSubject.result[].value (linked to the grade resultDescription) |
native |
-
Contexts. An Edubadges OB3 credential lists four contexts, in this order:
https://www.w3.org/ns/credentials/v2,https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json,https://purl.imsglobal.org/spec/ob/v3p0/extensions.jsonandhttps://api.edubadges.nl/extensions/ob3/v1/context.json. The third context is the one 1EdTech uses in its own OB 3.0.3 examples; it defines the type1EdTechJsonSchemaValidator2019. Without it, JSON-LD processors in safe mode (as used for Data Integrity proofs) reject thecredentialSchemaentries. -
Schemas.
credentialSchemalists the official OB3 AchievementCredential schema andhttps://api.edubadges.nl/extensions/ob3/v1/schema.json, both with type1EdTechJsonSchemaValidator2019. As in OB3 and in 1EdTech's own extensions, the Edubadges schema (JSON Schema draft 2019-09) validates the whole credential and allows additional properties. -
Extension type. The Edubadges properties are defined in a type-scoped,
@protectedcontext that is active only on an Achievement whosetypeincludesEdubadgesAchievement:"type": ["Achievement", "EdubadgesAchievement"]. The schema enforces this: an Achievement with Edubadges properties but without that type is invalid. -
Naming. Properties camelCase, types and enumeration values PascalCase, extended enumeration terms
ext:+ PascalCase. -
Namespace. Edubadges properties and enumeration values use the same IRIs as the OB2 v2 extensions
(
https://w3id.org/edubadges/terms#), so OB2 v2 and OB3 data produce the same RDF predicates and values. -
One language per credential. OB3 text properties (
name,description) are plain strings and an Achievement has oneinLanguage. Edubadges follows that:learningOutcome, institution name and quality framework texts are given in the language ofinLanguage. Other language versions of the same badge are separate Achievements linked with OB3related. -
Workload. In the Edubadges profile
creditsAvailableis always ECTS. Use at most one ofcreditsAvailable,studyLoadHoursandtimeInvestmentHours(enforced by the schema). -
URLs.
https://api.edubadges.nl/extensions/ob3/v1/context.jsonandhttps://api.edubadges.nl/extensions/ob3/v1/schema.json; published versions are immutable.
| Enumeration | Term | Meaning |
|---|---|---|
| IdentifierTypeEnum | ext:BRIN |
Institution code from the Basisregistratie Instellingen (DUO), e.g. 21PE
|
| IdentifierTypeEnum | ext:SCHAC |
schacHomeOrganization domain as used in SURFconext/eduGAIN, e.g. eur.nl
|
| IdentifierTypeEnum | ext:ROR |
Research Organization Registry URL |
| IdentifierTypeEnum | ext:ErasmusCode |
Erasmus institution code |
| IdentifierTypeEnum | ext:PIC |
EU Participant Identification Code (9 digits) |
| IdentifierTypeEnum | ext:CROHO |
ISAT code from the Central Register of Higher Education Programmes (5 digits) |
| IdentifierTypeEnum | ext:CREBO |
MBO qualification code (5 digits) |
| AlignmentTargetType | ext:EQFLevel |
Level of the European Qualifications Framework; targetCode 1–8, targetUrl http://data.europa.eu/snb/eqf/<level>
|
| AlignmentTargetType | ext:GradingTable |
Grading table or grading scheme that explains a result |
| Property | Type | Values / constraints | Replaces OB2 |
|---|---|---|---|
studyLoadHours |
number | > 0 | StudyLoadExtension |
timeInvestmentHours |
number | > 0 | TimeInvestmentExtension |
learningOutcome |
array of strings | ≥ 1, in the language of inLanguage
|
LearningOutcomeExtension |
formOfParticipation |
array of enumeration |
Online, Onsite, Blended, Volunteering, WorkExperience, PersonalizedLearningActivities, ByChoiceOfParticipant
|
ParticipationFormExtension |
typeOfAssessment |
array of enumeration |
Testing, ApplicationOfSkill, Portfolio, RecognitionOfPriorLearning, PersonalizedAssessment, ByChoiceOfParticipant
|
AssessmentTypeExtension |
supervisionType |
enumeration |
UnsupervisedWithNoIdentityVerification, UnsupervisedWithIdentityVerification, SupervisedWithNoIdentityVerification, SupervisedOnlineWithIdentityVerification, SupervisedOnsiteWithIdentityVerification
|
SupervisionTypeExtension |
qualityAssurance |
array of {frameworkName, frameworkUrl, frameworkDescription?}
|
name and URL required | QualityAssuranceExtension |
integrationOption |
enumeration |
Standalone, Stackable
|
IntegrationOptionsExtension |
stacksInto |
array of URLs | only with Stackable
|
IntegrationOptionsExtension |
Why typeOfAssessment and not assessmentType? The official 1EdTech Open Badges Assessment extension already
defines a protected JSON-LD term assessmentType (values Exam/Performance/Artifact). A credential that uses both
extensions would fail JSON-LD processing with "protected term redefinition" if Edubadges used the same name. The
term typeOfAssessment (the wording of the EU micro-credential element) maps to the same IRI as the OB2 v2 field,
eb:assessmentType.
In Edubadges the issuer belongs to an educational institution. OB3 models exactly this with Profile.parentOrg.
The institution's country goes in its address, its name in name and its identifiers in otherIdentifier, each
with an ext: identifier type. parentOrg needs an id: use the institution's ROR URL when available.
{
"issuer": {
"id": "https://api.edubadges.nl/public/issuers/eshcc",
"type": [
"Profile"
],
"name": "Erasmus School of History, Culture and Communication",
"url": "https://www.eur.nl/eshcc",
"email": "edubadges@eshcc.eur.nl",
"parentOrg": {
"id": "https://ror.org/057w15z03",
"type": [
"Profile"
],
"name": "Erasmus University Rotterdam",
"address": {
"type": [
"Address"
],
"addressCountryCode": "NL"
},
"otherIdentifier": [
{
"type": "IdentifierEntry",
"identifier": "21PE",
"identifierType": "ext:BRIN"
},
{
"type": "IdentifierEntry",
"identifier": "eur.nl",
"identifierType": "ext:SCHAC"
}
]
}
}
}Differences from OB2 v2: one country (OB3 Address has a single addressCountryCode) and one name language.
{
"achievement": {
"id": "https://api.edubadges.nl/public/badges/data-science-intro",
"type": [
"Achievement",
"EdubadgesAchievement"
],
"name": "Introduction to Data Science",
"inLanguage": "en",
"creditsAvailable": 2.5,
"alignment": [
{
"type": [
"Alignment"
],
"targetName": "EQF level 7",
"targetUrl": "http://data.europa.eu/snb/eqf/7",
"targetType": "ext:EQFLevel",
"targetFramework": "European Qualifications Framework",
"targetCode": "7"
}
],
"otherIdentifier": [
{
"type": "IdentifierEntry",
"identifier": "56823",
"identifierType": "ext:CROHO"
}
]
}
}-
inLanguageholds one BCP 47 tag. -
creditsAvailableis defined by OB3 as "credit hours"; the Edubadges profile fixes the unit to ECTS (0.5–240, steps of 0.5). Consumers outside the Edubadges profile may not know this. - The EQF level is an alignment to the EU EQF vocabulary;
targetCodecarries the level.
{
"achievement": {
"type": [
"Achievement",
"EdubadgesAchievement"
],
"learningOutcome": [
"Upon completion of the course, the student is able to explain core data science concepts.",
"Upon completion of the course, the student is able to apply basic statistical methods to a dataset."
],
"formOfParticipation": [
"Online",
"Onsite"
],
"typeOfAssessment": [
"Testing"
],
"supervisionType": "SupervisedOnsiteWithIdentityVerification",
"qualityAssurance": [
{
"frameworkName": "Kwaliteitskader Microcredentials voor Professionals HBO en WO",
"frameworkUrl": "https://npuls.nl/doorbouwen-aan-microcredentials",
"frameworkDescription": "The quality framework sets out the agreements and principles for quality assurance of micro-credentials."
}
],
"integrationOption": "Stackable",
"stacksInto": [
"https://www.example.org/programmes/data-science-certificate"
]
}
}The grade is an OB3 Result on the credential subject. Its resultDescription points to a ResultDescription
on the Achievement, which links the grading table as an alignment. A grading scheme specific to one assertion
(OB2 v2 gradingSchemeUrl) goes in result.alignment.
{
"credentialSubject": {
"achievement": {
"id": "https://api.edubadges.nl/public/badges/data-science-intro",
"resultDescription": [
{
"id": "https://api.edubadges.nl/public/badges/data-science-intro#grade",
"type": [
"ResultDescription"
],
"name": "Grade",
"resultType": "Result",
"alignment": [
{
"type": [
"Alignment"
],
"targetName": "Grading table",
"targetUrl": "https://www.eur.nl/onderwijs/praktische-zaken/afstuderen/ects-grading-table",
"targetType": "ext:GradingTable"
}
]
}
]
},
"result": [
{
"type": [
"Result"
],
"resultDescription": "https://api.edubadges.nl/public/badges/data-science-intro#grade",
"value": "8"
}
]
}
}examples/ob3/ho-v2-credential.json, converted from examples/ob2/ho-v2-*.json:
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
"https://purl.imsglobal.org/spec/ob/v3p0/extensions.json",
"https://api.edubadges.nl/extensions/ob3/v1/context.json"
],
"id": "https://api.edubadges.nl/public/assertions/a1b2c3d4",
"type": [
"VerifiableCredential",
"OpenBadgeCredential"
],
"name": "Introduction to Data Science",
"issuer": {
"id": "https://api.edubadges.nl/public/issuers/eshcc",
"type": [
"Profile"
],
"name": "Erasmus School of History, Culture and Communication",
"url": "https://www.eur.nl/eshcc",
"email": "edubadges@eshcc.eur.nl",
"parentOrg": {
"id": "https://ror.org/057w15z03",
"type": [
"Profile"
],
"name": "Erasmus University Rotterdam",
"address": {
"type": [
"Address"
],
"addressCountryCode": "NL"
},
"otherIdentifier": [
{
"type": "IdentifierEntry",
"identifier": "21PE",
"identifierType": "ext:BRIN"
},
{
"type": "IdentifierEntry",
"identifier": "eur.nl",
"identifierType": "ext:SCHAC"
}
]
}
},
"validFrom": "2026-06-30T10:00:00Z",
"awardedDate": "2026-06-30T10:00:00Z",
"credentialSubject": {
"type": [
"AchievementSubject"
],
"identifier": [
{
"type": "IdentityObject",
"identityHash": "sha256$c7ef86405ba71b85acd8e2e95166c4b111448089f2e1599f42fe1bba46e865c5",
"identityType": "emailAddress",
"hashed": true,
"salt": "s4lt"
}
],
"achievement": {
"id": "https://api.edubadges.nl/public/badges/data-science-intro",
"type": [
"Achievement",
"EdubadgesAchievement"
],
"achievementType": "MicroCredential",
"name": "Introduction to Data Science",
"description": "Introductory course in data science methods for humanities researchers.",
"criteria": {
"narrative": "Pass the final assessment of the course *Introduction to Data Science*."
},
"image": {
"id": "https://api.edubadges.nl/media/uploads/badges/data-science-intro.png",
"type": "Image"
},
"inLanguage": "en",
"creditsAvailable": 2.5,
"alignment": [
{
"type": [
"Alignment"
],
"targetName": "EQF level 7",
"targetUrl": "http://data.europa.eu/snb/eqf/7",
"targetType": "ext:EQFLevel",
"targetFramework": "European Qualifications Framework",
"targetCode": "7"
}
],
"otherIdentifier": [
{
"type": "IdentifierEntry",
"identifier": "56823",
"identifierType": "ext:CROHO"
}
],
"resultDescription": [
{
"id": "https://api.edubadges.nl/public/badges/data-science-intro#grade",
"type": [
"ResultDescription"
],
"name": "Grade",
"resultType": "Result",
"alignment": [
{
"type": [
"Alignment"
],
"targetName": "Grading table",
"targetUrl": "https://www.eur.nl/onderwijs/praktische-zaken/afstuderen/ects-grading-table",
"targetType": "ext:GradingTable"
}
]
}
],
"learningOutcome": [
"Upon completion of the course, the student is able to explain core data science concepts.",
"Upon completion of the course, the student is able to apply basic statistical methods to a dataset."
],
"formOfParticipation": [
"Online",
"Onsite"
],
"typeOfAssessment": [
"Testing"
],
"supervisionType": "SupervisedOnsiteWithIdentityVerification",
"qualityAssurance": [
{
"frameworkName": "Kwaliteitskader Microcredentials voor Professionals HBO en WO",
"frameworkUrl": "https://npuls.nl/doorbouwen-aan-microcredentials",
"frameworkDescription": "The quality framework sets out the agreements and principles for quality assurance of micro-credentials."
}
],
"integrationOption": "Stackable",
"stacksInto": [
"https://www.example.org/programmes/data-science-certificate"
]
},
"result": [
{
"type": [
"Result"
],
"resultDescription": "https://api.edubadges.nl/public/badges/data-science-intro#grade",
"value": "8"
}
]
},
"credentialSchema": [
{
"id": "https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_achievementcredential_schema.json",
"type": "1EdTechJsonSchemaValidator2019"
},
{
"id": "https://api.edubadges.nl/extensions/ob3/v1/schema.json",
"type": "1EdTechJsonSchemaValidator2019"
}
]
}{
"@context": {
"@protected": true,
"id": "@id",
"type": "@type",
"EdubadgesAchievement": {
"@id": "https://w3id.org/edubadges/terms#EdubadgesAchievement",
"@context": {
"@protected": true,
"id": "@id",
"type": "@type",
"eb": "https://w3id.org/edubadges/terms#",
"studyLoadHours": {
"@id": "eb:studyLoadHours"
},
"timeInvestmentHours": {
"@id": "eb:timeInvestmentHours"
},
"learningOutcome": {
"@id": "eb:learningOutcome",
"@container": "@set"
},
"formOfParticipation": {
"@id": "eb:formOfParticipation",
"@type": "@vocab",
"@container": "@set"
},
"typeOfAssessment": {
"@id": "eb:assessmentType",
"@type": "@vocab",
"@container": "@set"
},
"supervisionType": {
"@id": "eb:supervisionType",
"@type": "@vocab"
},
"integrationOption": {
"@id": "eb:integrationOption",
"@type": "@vocab"
},
"stacksInto": {
"@id": "eb:stacksInto",
"@type": "@id",
"@container": "@set"
},
"qualityAssurance": {
"@id": "eb:qualityAssurance",
"@container": "@set",
"@context": {
"@protected": true,
"frameworkName": {
"@id": "https://w3id.org/edubadges/terms#frameworkName"
},
"frameworkUrl": {
"@id": "https://w3id.org/edubadges/terms#frameworkUrl",
"@type": "@id"
},
"frameworkDescription": {
"@id": "https://w3id.org/edubadges/terms#frameworkDescription"
}
}
},
"Online": "eb:Online",
"Onsite": "eb:Onsite",
"Blended": "eb:Blended",
"Volunteering": "eb:Volunteering",
"WorkExperience": "eb:WorkExperience",
"PersonalizedLearningActivities": "eb:PersonalizedLearningActivities",
"ByChoiceOfParticipant": "eb:ByChoiceOfParticipant",
"Testing": "eb:Testing",
"ApplicationOfSkill": "eb:ApplicationOfSkill",
"Portfolio": "eb:Portfolio",
"RecognitionOfPriorLearning": "eb:RecognitionOfPriorLearning",
"PersonalizedAssessment": "eb:PersonalizedAssessment",
"UnsupervisedWithNoIdentityVerification": "eb:UnsupervisedWithNoIdentityVerification",
"UnsupervisedWithIdentityVerification": "eb:UnsupervisedWithIdentityVerification",
"SupervisedWithNoIdentityVerification": "eb:SupervisedWithNoIdentityVerification",
"SupervisedOnlineWithIdentityVerification": "eb:SupervisedOnlineWithIdentityVerification",
"SupervisedOnsiteWithIdentityVerification": "eb:SupervisedOnsiteWithIdentityVerification",
"Standalone": "eb:Standalone",
"Stackable": "eb:Stackable"
}
}
}
}The schema is in extension/v1/schema.json.