{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/open-education-api/main/json-schema/open-education-api-learning-outcome-schema.json", "title": "LearningOutcome", "description": "statements regarding what a learner knows, understands and is able to do on completion of a learning process, which are defined in terms of knowledge, skills and responsibility and autonomy (https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32017H0615(01)&from=EN)", "x-generated": "2026-10-09", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/open-education-api-openapi.yml#/components/schemas/LearningOutcome", "type": "object", "required": [ "learningOutcomeId", "primaryCode", "name" ], "properties": { "learningOutcomeId": { "type": "string", "description": "Unique id of this learning outcome", "format": "uuid" }, "primaryCode": { "description": "The primary human readable identifier for this learning outcome. This is often the source identifier as defined by the institution.", "$ref": "#/$defs/IdentifierEntry" }, "name": { "type": "array", "description": "The name of this learning outcome", "minItems": 1, "items": { "$ref": "#/$defs/LanguageTypedString" } }, "abbreviation": { "type": [ "string", "null" ], "description": "The abbreviation or internal code used to identify this LearningOutcome", "maxLength": 256 }, "description": { "type": [ "array", "null" ], "description": "The description of this learning outcome.", "minItems": 1, "items": { "$ref": "#/$defs/LanguageTypedString" } }, "parentIds": { "description": "The identifiers of the learning outcomes which are the parents of this learning outcome.\nWhen the client does not request expansion of `parents`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/Identifier" } }, "parents": { "description": "The expanded learning outcome objects which are the parents of this learning outcome.\nWhen the client requests expansion of `parents`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers.\nIf no parents are defined, this value is `null`.\n", "type": [ "array", "null" ], "items": { "oneOf": [ { "$ref": "#/$defs/LearningOutcome" }, { "type": "null" } ] } }, "childIds": { "description": "The identifiers of all learning outcomes for which this learning outcome is the parent.\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/Identifier" } }, "children": { "description": "The expanded learning outcome objects for which this learning outcome is the parent.\nWhen the client requests expansion of `children`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n", "type": [ "array", "null" ], "items": { "oneOf": [ { "$ref": "#/$defs/LearningOutcome" }, { "type": "null" } ] } }, "fieldsOfStudy": { "type": [ "string", "null" ], "description": "Field(s) of study (e.g. ISCED-F) (https://unesdoc.unesco.org/ark:/48223/pf0000228085.locale=en). \nISCED-F categorizes the fields of study 2 digits at root level and further subdivision as more digits are added.\nPreferably fieldsOfStudy contains at least 4 digits.\nISCEDF2013vSOI2021 currently allows for 6 digits max (https://www.cbs.nl/-/media/cbs/onze-diensten/methoden/classificaties/documents/2025/pubsoi2021_ed2425.pdf).\n07 Engineering, manufacturing and construction\n073 Architecture and construction\n0731 Architecture and town planning\n073101 Town planning\n", "minLength": 2, "maxLength": 6 }, "otherCodes": { "type": [ "array", "null" ], "description": "An array of additional human readable codes/identifiers for the entity being described.", "items": { "$ref": "#/$defs/IdentifierEntry" } }, "complexityLevel": { "oneOf": [ { "$ref": "#/$defs/learningOutcomeLevel" }, { "type": "null" } ] }, "validFrom": { "type": [ "string", "null" ], "description": "The date and time for when this learning outcome will be active. Should be a string formatted as an RFC3099 full-date.", "format": "date-time" }, "validTo": { "type": [ "string", "null" ], "description": "The date and time when this learning outcome will no longer be valid, or should be renewed. Should be a string formatted as an RFC3099 full-date.", "format": "date-time" }, "consumer": { "oneOf": [ { "$ref": "#/$defs/Consumer" }, { "type": "null" } ] }, "ext": { "oneOf": [ { "$ref": "#/$defs/Ext" }, { "type": "null" } ] } }, "$defs": { "Consumer": { "type": "object", "description": "The additional elements of a consumer that may be provided, see the [documentation on support for specific consumers](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/) for further information about this mechanism.", "required": [ "consumerKey" ], "properties": { "consumerKey": { "description": "The key of the consumer (destination) for which this information is intended. See the [consumer registry](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/). This key is used to select the additional data to be presented in the request.", "type": "string" }, "exampleProperty": { "description": "An example of an additional property", "type": [ "string", "null" ] } }, "additionalProperties": true }, "Ext": { "type": "object", "description": "Object for additional non-standard attributes" }, "Identifier": { "type": "string", "description": "An identifier of another resource.", "format": "uuid" }, "IdentifierEntry": { "type": "object", "properties": { "codeType": { "$ref": "#/$defs/codeType" }, "code": { "description": "Human readable value for the code/identifier", "type": "string" } }, "required": [ "codeType", "code" ], "additionalProperties": false }, "Language": { "description": "The language used in the described entity. The value **must be a language tag that conforms to RFC 5646** (Tags for Identifying Languages, BCP 47):\nhttps://www.rfc-editor.org/rfc/rfc5646.html\n\nA tag consists of the following components, in this exact order:\n1. **language** – two‑ to three‑letter codes (ISO 639‑1/‑2) **or** four‑letter codes (ISO 639‑5) **or** five‑ to eight‑letter registered language subtags.\n2. **script** – optional, four letters in Title‑Case (e.g. `Latn`, `Hant`).\n3. **region** – optional, either two uppercase letters (ISO 3166‑1) **or** three digits (UN M.49).\n4. **variant** – zero or more subtags, each either five‑ to eight‑alphanumerics or a digit followed by three alphanumerics (e.g. `1901`, `oxendict`).\n5. **extension** – zero or more extensions. Each extension starts with a *singleton* (a single alphanumeric character except `x`) followed by one or more subtags of two‑ to eight‑alphanumerics (e.g. `u‑co‑phonebk`).\n6. **private‑use** – optional, the letter `x` followed by one or more subtags of one‑ to eight‑alphanumerics (e.g. `x‑private`).\n\nThe most common form is a two‑letter language code (ISO 639‑1) optionally followed by a hyphen and a two‑letter country code (ISO 3166‑1), for example `en` or `en‑GB`.\n\nMore specific tags are also valid, for instance `zh‑Hant‑TW` (Traditional Chinese as used in Taiwan).\n\nFor sign languages two conventions are recognised:\n* `sgn` – e.g. `nl‑sgn‑NL` (Dutch Sign Language)\n* `s` – e.g. `nl‑s‑NL` (Dutch Sign Language)\n", "type": "string", "minLength": 2, "pattern": "^(?:(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,2}|[A-Za-z]{4}|[A-Za-z]{5,8})(?:-[A-Za-z]{4})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*?(?:-(?:[A-WY-Za-wy-z0-9](?:-[A-Za-z0-9]{2,8})+))*?(?:-x(?:-[A-Za-z0-9]{1,8})+)?|x(?:-[A-Za-z0-9]{1,8})+)$" }, "LanguageTypedString": { "type": "object", "description": "A String with an associated language code. IF this object is used both fields are mandatory.", "required": [ "language", "value" ], "properties": { "language": { "$ref": "#/$defs/Language" }, "value": { "description": "String to describe the entity.", "type": "string" } } }, "LearningOutcome": { "type": "object", "description": "statements regarding what a learner knows, understands and is able to do on completion of a learning process, which are defined in terms of knowledge, skills and responsibility and autonomy (https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32017H0615(01)&from=EN)", "required": [ "learningOutcomeId", "primaryCode", "name" ], "properties": { "learningOutcomeId": { "type": "string", "description": "Unique id of this learning outcome", "format": "uuid" }, "primaryCode": { "description": "The primary human readable identifier for this learning outcome. This is often the source identifier as defined by the institution.", "$ref": "#/$defs/IdentifierEntry" }, "name": { "type": "array", "description": "The name of this learning outcome", "minItems": 1, "items": { "$ref": "#/$defs/LanguageTypedString" } }, "abbreviation": { "type": [ "string", "null" ], "description": "The abbreviation or internal code used to identify this LearningOutcome", "maxLength": 256 }, "description": { "type": [ "array", "null" ], "description": "The description of this learning outcome.", "minItems": 1, "items": { "$ref": "#/$defs/LanguageTypedString" } }, "parentIds": { "description": "The identifiers of the learning outcomes which are the parents of this learning outcome.\nWhen the client does not request expansion of `parents`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/Identifier" } }, "parents": { "description": "The expanded learning outcome objects which are the parents of this learning outcome.\nWhen the client requests expansion of `parents`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers.\nIf no parents are defined, this value is `null`.\n", "type": [ "array", "null" ], "items": { "oneOf": [ { "$ref": "#/$defs/LearningOutcome" }, { "type": "null" } ] } }, "childIds": { "description": "The identifiers of all learning outcomes for which this learning outcome is the parent.\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/Identifier" } }, "children": { "description": "The expanded learning outcome objects for which this learning outcome is the parent.\nWhen the client requests expansion of `children`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n", "type": [ "array", "null" ], "items": { "oneOf": [ { "$ref": "#/$defs/LearningOutcome" }, { "type": "null" } ] } }, "fieldsOfStudy": { "type": [ "string", "null" ], "description": "Field(s) of study (e.g. ISCED-F) (https://unesdoc.unesco.org/ark:/48223/pf0000228085.locale=en). \nISCED-F categorizes the fields of study 2 digits at root level and further subdivision as more digits are added.\nPreferably fieldsOfStudy contains at least 4 digits.\nISCEDF2013vSOI2021 currently allows for 6 digits max (https://www.cbs.nl/-/media/cbs/onze-diensten/methoden/classificaties/documents/2025/pubsoi2021_ed2425.pdf).\n07 Engineering, manufacturing and construction\n073 Architecture and construction\n0731 Architecture and town planning\n073101 Town planning\n", "minLength": 2, "maxLength": 6 }, "otherCodes": { "type": [ "array", "null" ], "description": "An array of additional human readable codes/identifiers for the entity being described.", "items": { "$ref": "#/$defs/IdentifierEntry" } }, "complexityLevel": { "oneOf": [ { "$ref": "#/$defs/learningOutcomeLevel" }, { "type": "null" } ] }, "validFrom": { "type": [ "string", "null" ], "description": "The date and time for when this learning outcome will be active. Should be a string formatted as an RFC3099 full-date.", "format": "date-time" }, "validTo": { "type": [ "string", "null" ], "description": "The date and time when this learning outcome will no longer be valid, or should be renewed. Should be a string formatted as an RFC3099 full-date.", "format": "date-time" }, "consumer": { "oneOf": [ { "$ref": "#/$defs/Consumer" }, { "type": "null" } ] }, "ext": { "oneOf": [ { "$ref": "#/$defs/Ext" }, { "type": "null" } ] } } }, "codeType": { "type": "string", "description": "The type of code or identifier.\n\nThe predefined values are:\n\n| Code | Description |\n|---------------------------|-------------------------------------------------------------------|\n| `account_id` | Identifier for an account. |\n| `bag_id` | Identifier for a building in the Dutch Building and Address |\n| | Registry (BAG). |\n| `building_id` | Identifier for a building. |\n| `component_code` | Identifier for a component (part of a course). |\n| `eckid` | Identifier assigned within the Dutch *Educatieve ContentKeten iD* |\n| | framework. It enables persistent identification and exchange of |\n| | digital learning resources within the Dutch educational sector for|\n| | EQF levels 1, 2, 3 and 4. Comparable international approaches |\n| | include LRMI, DOI and Handle |\n| | identifiers for learning resources. |\n| `email_address` | An email address. |\n| `esi` | European Student Identifier. |\n| `group_code` | Identifier for a group of people. |\n| `group_type_code` | Identifier for the type of group. |\n| `identifier` | Generic identifier. |\n| `institution_code` | Registration number of an educational institution. In the |\n| | Netherlands, the former BRIN code has been replaced by the |\n| | institution code, issued by the Ministry of Education, Culture |\n| | and Science (OCW). |\n| `isbn` | International Standard Book Number (for books). |\n| `issn` | International Standard Serial Number (for periodicals). |\n| `kvk_organisation_id` | Identifier for a KvK (Dutch Chamber of Commerce) registered |\n| | organisation. |\n| `kvk_establishment_id` | Identifier for a specific establishment of a KvK |\n| | (Dutch Chamber of Commerce) registered organisation. |\n| `leerbedrijf_id` | Dutch registration/accreditation id for organisations offering |\n| | internships for vocational education students. |\n| `national_identity_number`| Government-assigned personal identifier (e.g. NI number in the UK,|\n| | or *personnummer* in Sweden). |\n| `offering_code` | Identifier for a specific offering (programme, course or |\n| | component). |\n| `organisation_id` | Identifier for an organisation. |\n| `orcid` | Open Researcher and Contributor ID. |\n| `product_id` | Identifier for a product. |\n| `programme_code` | Identifier of a programme (a recognised collection of courses). |\n| | In the Netherlands, the former CREBO and CROHO codes have been |\n| | replaced by the programme code as registered in RIO, under the |\n| | authority of OCW. |\n| `room_code` | Identifier for a room. |\n| `schac_home` | Home organisation represented by its domain name. |\n| `student_number` | Identifier for a student. |\n| `studielink_number` | Identifier assigned to a student by Studielink (Dutch central |\n| | enrolment system). |\n| `system_id` | Identifier used within a specific system. |\n| `username` | User login name. |\n| `uuid` | Universally unique identifier. |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n", "x-ooapi-extensible-enum": [ "account_id", "bag_id", "building_id", "component_code", "eckid", "email_address", "esi", "group_code", "group_type_code", "identifier", "institution_code", "isbn", "issn", "kvk_organisation_id", "kvk_establishment_id", "leerbedrijf_id", "offering_code", "organisation_id", "orcid", "product_id", "programme_code", "room_code", "schac_home", "student_number", "studielink_number", "system_id", "username", "uuid", "national_identity_number" ] }, "learningOutcomeLevel": { "type": "string", "description": "The level of the learning outcome. This field supports multiple frameworks for\ndescribing cognitive complexity. Two common frameworks are provided below: **Bloom’s**\nand **SOLO**. These are intended as examples — additional levels or entirely\ndifferent frameworks MAY be added as needed.\n\n**Bloom’s taxonomy** ([https://en.wikipedia.org/wiki/Bloom's_taxonomy](https://en.wikipedia.org/wiki/Bloom's_taxonomy)):\n\n| Level | Label | Description |\n|---------|------------|---------------------------------------------------------------------|\n| bloom_1 | Remember | Recall facts and basic concepts (define, list, state). |\n| bloom_2 | Understand | Explain ideas or concepts (describe, discuss, explain). |\n| bloom_3 | Apply | Use knowledge in new situations (implement, solve, use). |\n| bloom_4 | Analyse | Draw connections among ideas (differentiate, compare, examine). |\n| bloom_5 | Evaluate | Justify a decision or course of action (critique, assess, argue). |\n| bloom_6 | Create | Produce new or original work (design, construct, develop). |\n\n**SOLO taxonomy** ([https://en.wikipedia.org/wiki/Structure_of_observed_learning_outcome](https://en.wikipedia.org/wiki/Structure_of_observed_learning_outcome)):\n\n| Level | Label | Description |\n|---------|-------------------|-----------------------------------------------------------------|\n| solo_0 | Prestructural | No understanding; the student misses the point. |\n| solo_1 | Unistructural | Identifies or carries out simple procedures; limited to one |\n| | | relevant aspect. |\n| solo_2 | Multistructural | Addresses several relevant aspects, but sees them as unrelated; |\n| | | knowledge is additive. |\n| solo_3 | Relational | Integrates aspects into a coherent whole, showing deeper |\n| | | understanding of relationships. |\n| solo_4 | Extended abstract | Generalises and applies learning to new domains, showing |\n| | | theoretical and abstract thinking. |\n\nThis is an *extensible enumeration*. Implementers MAY introduce other recognised\ntaxonomies, institutional or national frameworks. \n", "x-ooapi-extensible-enum": [ "bloom_1", "bloom_2", "bloom_3", "bloom_4", "bloom_5", "bloom_6", "solo_0", "solo_1", "solo_2", "solo_3", "solo_4" ] } } }