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