Skip to content

Edubadges Metadata Model OB3

Frans Ward edited this page Oct 26, 2026 · 2 revisions

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 becomes creditsAvailable, programme codes become otherIdentifier, the EQF level becomes an alignment, the grade becomes a result. 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 in credentialSchema, and an extra type EdubadgesAchievement on 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, …).

Overview

# 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

Conventions

  • 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.json and https://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 type 1EdTechJsonSchemaValidator2019. Without it, JSON-LD processors in safe mode (as used for Data Integrity proofs) reject the credentialSchema entries.
  • Schemas. credentialSchema lists the official OB3 AchievementCredential schema and https://api.edubadges.nl/extensions/ob3/v1/schema.json, both with type 1EdTechJsonSchemaValidator2019. 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, @protected context that is active only on an Achievement whose type includes EdubadgesAchievement: "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 one inLanguage. Edubadges follows that: learningOutcome, institution name and quality framework texts are given in the language of inLanguage. Other language versions of the same badge are separate Achievements linked with OB3 related.
  • Workload. In the Edubadges profile creditsAvailable is always ECTS. Use at most one of creditsAvailable, studyLoadHours and timeInvestmentHours (enforced by the schema).
  • URLs. https://api.edubadges.nl/extensions/ob3/v1/context.json and https://api.edubadges.nl/extensions/ob3/v1/schema.json; published versions are immutable.

Extended enumeration terms

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

Edubadges extension properties (on EdubadgesAchievement)

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.

Per extension

Issuer: 1 InstitutionCountry, 2 InstitutionName, 3 InstitutionIdentifier

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.

BadgeClass → Achievement: 5 Language, 6 ECTS, 9 EQF, 11 EducationProgramIdentifier

{
  "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"
      }
    ]
  }
}
  • inLanguage holds one BCP 47 tag.
  • creditsAvailable is 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; targetCode carries the level.

BadgeClass → Achievement: 7, 8, 10, 12–16 (Edubadges extension)

{
  "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"
    ]
  }
}

4 GradingTable and 17 GradeAchieved

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"
      }
    ]
  }
}

Complete example

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.json

{
  "@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.