Open Education API · Schema

TestComponent

A component is a part of a course

CompanyEducationHigher EducationOpen StandardsInteroperabilitySpecificationsNetherlands

Properties

Name Type Description
componentId string Unique id of this component
primaryCode object The primary human readable identifier for this component. This is often the source identifier as defined by the institution.
componentType object
name array The name of this component
abbreviation stringnull The abbreviation of this component
modesOfDelivery arraynull
duration stringnull The duration of this component. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.
extraDuration stringnull The extra duration of this component for candidates that are awarded extra time as a personal need. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.
resultValueType object
attempts integernull The number of attempts that are allowed for this component within one offering.
passFrom stringnull The minimum value that is required to pass this component within one offering. This value is inclusive and depends on the resultValueType.
state object
description arraynull The description of this component.
teachingLanguages arraynull The languages in which this test component is given, should be three-letter language codes as specified by ISO 639-2. A student should be reasonably proficient in each language to be able to follow th
learningOutcomeIds arraynull The identifiers of the learning outcomes related to this test component. When the client does not request expansion of `learningOutcomes`, only these identifiers are returned. This field is [`expandab
learningOutcomes arraynull The expanded learning outcome objects related to this test component. When the client requests expansion of `learningOutcomes`, the full learning outcome objects MUST be returned here instead of only
enrolment arraynull The extra information that is provided for enrolment
resources arraynull An overview of the literature and other resources that are allowed during this test
assessment arraynull A description of the way this test is taken.
addresses arraynull Addresses for this component
otherCodes arraynull An array of additional human readable codes/identifiers for the entity being described.
parentId object The identifier of the parent Test Component of which the current Test Component is a child. When the client does not request expansion of `parent`, only this identifier is returned. This field is [`ex
parent object The expanded parent Test Component of which the current Test Component is a child. When the client requests expansion of `parent`, the full Test Component object MUST be returned here instead of only
childIds array The identifiers of the Test Components that are part of this Test Component. When the client does not request expansion of `children`, only these identifiers are returned. This field is [`expandable`]
children array The expanded Test Components that are part of this Test Component (e.g. combined tests). When the client requests expansion of `children`, the full Test Component objects MUST be returned here instead
courseId object The identifier of the course of which this component is a part. When the client does not request expansion of `course`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/
course object The expanded course object of which this component is a part. When the client requests expansion of `course`, the full course object MUST be returned here instead of only the identifier. If no course
organisationId object The identifier of the organisation which provides this component. When the client does not request expansion of `organisation`, only this identifier is returned. This field is [`expandable`](https://o
organisation object The expanded organisation object which provides this component. When the client requests expansion of `organisation`, the full organisation object MUST be returned here instead of only the identifier.
consumer object
ext object
View JSON Schema on GitHub

JSON Schema

open-education-api-test-component-schema.json Raw ↑
{
  "$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-test-component-schema.json",
  "title": "TestComponent",
  "description": "A component is a part of a course",
  "x-generated": "2026-10-09",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/open-education-api-openapi.yml#/components/schemas/TestComponent",
  "type": "object",
  "required": [
    "componentId",
    "componentType",
    "name",
    "primaryCode"
  ],
  "properties": {
    "componentId": {
      "type": "string",
      "description": "Unique id of this component",
      "format": "uuid"
    },
    "primaryCode": {
      "description": "The primary human readable identifier for this component. This is often the source identifier as defined by the institution.",
      "$ref": "#/$defs/IdentifierEntry"
    },
    "componentType": {
      "$ref": "#/$defs/testComponentType"
    },
    "name": {
      "type": "array",
      "description": "The name of this component",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/LanguageTypedString"
      }
    },
    "abbreviation": {
      "type": [
        "string",
        "null"
      ],
      "description": "The abbreviation of this component",
      "maxLength": 256
    },
    "modesOfDelivery": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "#/$defs/modeOfDelivery"
      }
    },
    "duration": {
      "type": [
        "string",
        "null"
      ],
      "description": "The duration of this component. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.",
      "pattern": "^-?P(?:\\d+Y)?(?:\\d+M)?(?:\\d+(?:D|W))?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$"
    },
    "extraDuration": {
      "type": [
        "string",
        "null"
      ],
      "description": "The extra duration of this component for candidates that are awarded extra time as a personal need. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.",
      "pattern": "^-?P(?:\\d+Y)?(?:\\d+M)?(?:\\d+(?:D|W))?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$"
    },
    "resultValueType": {
      "oneOf": [
        {
          "$ref": "#/$defs/resultValueType"
        },
        {
          "type": "null"
        }
      ]
    },
    "attempts": {
      "type": [
        "integer",
        "null"
      ],
      "description": "The number of attempts that are allowed for this component within one offering."
    },
    "passFrom": {
      "type": [
        "string",
        "null"
      ],
      "description": "The minimum value that is required to pass this component within one offering. \nThis value is inclusive and depends on the resultValueType.\n"
    },
    "state": {
      "oneOf": [
        {
          "$ref": "#/$defs/componentState"
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "type": [
        "array",
        "null"
      ],
      "description": "The description of this component.",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/LanguageTypedString"
      }
    },
    "teachingLanguages": {
      "type": [
        "array",
        "null"
      ],
      "description": "The languages in which this test component is given, should be three-letter language codes as specified by ISO 639-2. A student should be reasonably proficient in each language to be able to follow the test component.",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/Language"
      }
    },
    "learningOutcomeIds": {
      "description": "The identifiers of the learning outcomes related to this test component.\nWhen the client does not request expansion of `learningOutcomes`, 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"
      }
    },
    "learningOutcomes": {
      "description": "The expanded learning outcome objects related to this test component.\nWhen the client requests expansion of `learningOutcomes`, the full learning outcome objects MUST be returned here instead of only the identifiers.\nIf no learning outcomes are defined, this value is `null`.\n",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "#/$defs/LearningOutcome",
        "title": "LearningOutcome"
      }
    },
    "enrolment": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "#/$defs/LanguageTypedString"
      },
      "description": "The extra information that is provided for enrolment"
    },
    "resources": {
      "type": [
        "array",
        "null"
      ],
      "description": "An overview of the literature and other resources that are allowed during this test",
      "items": {
        "type": "string"
      }
    },
    "assessment": {
      "type": [
        "array",
        "null"
      ],
      "description": "A description of the way this test is taken.",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/LanguageTypedString"
      }
    },
    "addresses": {
      "type": [
        "array",
        "null"
      ],
      "description": "Addresses for this component",
      "items": {
        "$ref": "#/$defs/Address"
      }
    },
    "otherCodes": {
      "type": [
        "array",
        "null"
      ],
      "description": "An array of additional human readable codes/identifiers for the entity being described.",
      "items": {
        "$ref": "#/$defs/IdentifierEntry"
      }
    },
    "parentId": {
      "description": "The identifier of the parent Test Component of which the current Test Component is a child.\nWhen the client does not request expansion of `parent`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "parent": {
      "description": "The expanded parent Test Component of which the current Test Component is a child.\nWhen the client requests expansion of `parent`, the full Test Component object MUST be returned here instead of only the identifier.\nIf no parent is defined, this value is `null`.\n",
      "oneOf": [
        {
          "$ref": "#/$defs/TestComponent"
        },
        {
          "type": "null"
        }
      ]
    },
    "childIds": {
      "description": "The identifiers of the Test Components that are part of this Test Component.\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",
      "items": {
        "$ref": "#/$defs/Identifier"
      }
    },
    "children": {
      "description": "The expanded Test Components that are part of this Test Component (e.g. combined tests).\nWhen the client requests expansion of `children`, the full Test Component objects MUST be returned here instead of only the identifiers.\n",
      "type": "array",
      "items": {
        "$ref": "#/$defs/TestComponent",
        "title": "Expanded TestComponent"
      }
    },
    "courseId": {
      "description": "The identifier of the course of which this component is a part.\nWhen the client does not request expansion of `course`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
      "oneOf": [
        {
          "$ref": "#/$defs/TestComponent"
        },
        {
          "type": "null"
        }
      ]
    },
    "course": {
      "description": "The expanded course object of which this component is a part.\nWhen the client requests expansion of `course`, the full course object MUST be returned here instead of only the identifier.\nIf no course is defined, this value is `null`.\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Course"
        },
        {
          "type": "null"
        }
      ],
      "title": "Course object"
    },
    "organisationId": {
      "description": "The identifier of the organisation which provides this component.\nWhen the client does not request expansion of `organisation`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "organisation": {
      "description": "The expanded organisation object which provides this component.\nWhen the client requests expansion of `organisation`, the full organisation object MUST be returned here instead of only the identifier.\nIf no organisation is defined, this value is `null`.\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Organisation"
        },
        {
          "type": "null"
        }
      ]
    },
    "consumer": {
      "oneOf": [
        {
          "$ref": "#/$defs/Consumer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ext": {
      "oneOf": [
        {
          "$ref": "#/$defs/Ext"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "$defs": {
    "Address": {
      "type": "object",
      "description": "The full street address",
      "required": [
        "addressType"
      ],
      "properties": {
        "addressType": {
          "$ref": "#/$defs/addressType"
        },
        "street": {
          "type": [
            "string",
            "null"
          ],
          "description": "The street name"
        },
        "streetNumber": {
          "type": [
            "string",
            "null"
          ],
          "description": "The street number"
        },
        "additional": {
          "type": [
            "array",
            "null"
          ],
          "description": "Further details like building name, suite, apartment number, etc.",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "postCode": {
          "type": [
            "string",
            "null"
          ],
          "description": "Code to help sort and deliver mail also known as Postal code and ZIP code"
        },
        "city": {
          "type": [
            "string",
            "null"
          ],
          "description": "name of the city / locality"
        },
        "countryCode": {
          "oneOf": [
            {
              "$ref": "#/$defs/Country"
            },
            {
              "type": "null"
            }
          ]
        },
        "geolocation": {
          "type": [
            "object",
            "null"
          ],
          "description": "Geolocation of the entrance of this address (WGS84 coordinate reference system)",
          "required": [
            "latitude",
            "longitude"
          ],
          "properties": {
            "latitude": {
              "type": "number",
              "format": "double"
            },
            "longitude": {
              "type": "number",
              "format": "double"
            }
          }
        },
        "ext": {
          "oneOf": [
            {
              "$ref": "#/$defs/Ext"
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "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
    },
    "Country": {
      "type": "object",
      "description": "An object indicating a country based on at least one iso-3166 code. In situations where more than one ISO-3166 code is provided, the codes must refer to the same country.\n",
      "properties": {
        "iso3166-1-alpha2": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 2,
          "maxLength": 2,
          "description": "A country code based on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2"
        },
        "iso3166-1-alpha3": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 3,
          "maxLength": 3,
          "description": "A country code based on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3"
        },
        "iso3166-2": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 5,
          "maxLength": 6,
          "description": "A country subdivision code based on https://en.wikipedia.org/wiki/ISO_3166-2"
        },
        "iso3166-3": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 4,
          "maxLength": 4,
          "description": "A code for a country that no longer exists is listed on ISO 3166-3 (https://en.wikipedia.org/wiki/ISO_3166-3).\nImplementations should refrain from using the original ISO 3166-1 code for such a country since country codes\ncan be reassigned to new countries once the original country code is officially declared obsolete.\n"
        }
      }
    },
    "Course": {
      "allOf": [
        {
          "$ref": "#/$defs/CourseId"
        },
        {
          "$ref": "#/$defs/CourseProperties"
        },
        {
          "type": "object",
          "properties": {
            "validFrom": {
              "description": "The first day and time this course is valid (inclusive).",
              "type": [
                "string",
                "null"
              ],
              "format": "date-time"
            },
            "validTo": {
              "description": "The day and time this course ceases to be valid (e.g. exclusive).",
              "type": [
                "string",
                "null"
              ],
              "format": "date-time"
            }
          }
        }
      ]
    },
    "CourseId": {
      "type": "object",
      "description": "An object describing the metadata of a course",
      "required": [
        "courseId"
      ],
      "properties": {
        "courseId": {
          "type": "string",
          "description": "Unique id of this course",
          "format": "uuid"
        }
      }
    },
    "CourseProperties": {
      "type": "object",
      "description": "An object describing the metadata of a course",
      "required": [
        "name",
        "primaryCode"
      ],
      "properties": {
        "primaryCode": {
          "description": "The primary human readable identifier for this course. This is often the source identifier as defined by the institution.",
          "$ref": "#/$defs/IdentifierEntry"
        },
        "name": {
          "type": "array",
          "description": "The name of this course (ECTS-title)",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "abbreviation": {
          "type": [
            "string",
            "null"
          ],
          "description": "The abbreviation or internal code used to identify this course (ECTS-code)",
          "maxLength": 256
        },
        "studyLoad": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/StudyLoadDescriptor"
          }
        },
        "modesOfDelivery": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/modeOfDelivery"
          }
        },
        "duration": {
          "type": [
            "string",
            "null"
          ],
          "description": "The duration of this course. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.",
          "pattern": "^-?P(?:\\d+Y)?(?:\\d+M)?(?:\\d+(?:D|W))?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$"
        },
        "firstStartDate": {
          "type": [
            "string",
            "null"
          ],
          "description": "The date and time when participants can follow this course for the first time.",
          "format": "date-time"
        },
        "description": {
          "type": [
            "array",
            "null"
          ],
          "description": "The description of this course (ECTS-description).",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "teachingLanguages": {
          "type": [
            "array",
            "null"
          ],
          "description": "The languages in which this course is given, should be three-letter language codes as specified by RFC 4647. A student should be reasonably proficient in each language to be able to follow the course.",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/Language"
          }
        },
        "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
        },
        "learningOutcomeIds": {
          "description": "The identifiers of the learning outcomes related to this course.\nWhen the client does not request expansion of `learningOutcomes`, only these\nidentifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Identifier"
          }
        },
        "learningOutcomes": {
          "description": "The expanded learning outcome objects related to this course.\nWhen the client requests expansion of `learningOutcomes`, the full expanded\nlearning outcome objects MUST be returned here instead of only the identifiers.\nIf no learning outcomes are defined, this value is `null`.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/LearningOutcome"
          }
        },
        "admissionRequirements": {
          "type": [
            "array",
            "null"
          ],
          "description": "This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students.",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "qualificationRequirements": {
          "type": [
            "array",
            "null"
          ],
          "description": "Normally, students will receive a diploma when they have completed the (official) study programme and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here.",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "level": {
          "oneOf": [
            {
              "$ref": "#/$defs/level"
            },
            {
              "type": "null"
            }
          ]
        },
        "enrolment": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          },
          "description": "The extra information that is provided for enrolment"
        },
        "resources": {
          "type": [
            "array",
            "null"
          ],
          "description": "An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources)",
          "items": {
            "type": "string"
          }
        },
        "assessment": {
          "type": [
            "array",
            "null"
          ],
          "description": "A description of the way exams for this course are taken (ECTS-assessment method and criteria).",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "link": {
          "type": [
            "string",
            "null"
          ],
          "description": "URL of the course's website",
          "format": "uri",
          "maxLength": 2048
        },
        "addresses": {
          "type": [
            "array",
            "null"
          ],
          "description": "Addresses for this course",
          "items": {
            "$ref": "#/$defs/Address"
          }
        },
        "otherCodes": {
          "type": [
            "array",
            "null"
          ],
          "description": "An array of additional human readable codes/identifiers for the entity being described.",
          "items": {
            "$ref": "#/$defs/IdentifierEntry"
          }
        },
        "programmeIds": {
          "description": "The identifiers of the programmes of which this course is a part.\nThis array is used because a course can belong to multiple programmes,\nfor example in alliances.\nWhen the client does not request expansion of `programmes`, only these\nidentifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Identifier"
          }
        },
        "supplementaryInformation": {
          "$ref": "#/$defs/SupplementaryInformation"
        },
        "programmes": {
          "description": "The expanded programme objects of which this course is a part.\nThis array is used because a course can belong to multiple programmes,\nfor example in alliances.\nWhen the client requests expansion of `programmes`, the full expanded\nprogramme objects MUST be returned here instead of only the identifiers.\nIf no programmes are defined, this value is `null`.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Programme"
          }
        },
        "coordinatorIds": {
          "description": "The identifiers of the persons responsible for this course.\nWhen the client does not request expansion of `coordinators`, only these\nidentifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Identifier"
          }
        },
        "coordinators": {
          "description": "The expanded person objects responsible for this course.\nWhen the client requests expansion of `coordinators`, the full expanded\nperson objects MUST be returned here instead of only the identifiers.\nIf no coordinators are defined, this value is `null`.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Person"
          }
        },
        "instructorIds": {
          "description": "The identifiers of the persons teaching or delivering this course.\nWhen the client does not request expansion of `instructors`, only these\nidentifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Identifier"
          }
        },
        "instructors": {
          "description": "The expanded person objects teaching or delivering this course.\nWhen the client requests expansion of `instructors`, the full expanded\nperson objects MUST be returned here instead of only the identifiers.\nIf no instructors are defined, this value is `null`.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Person"
          }
        },
        "organisationId": {
          "description": "The identifier of the organisation that manages this course.\nWhen the client does not request expansion of `organisation`, only this\nidentifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "oneOf": [
            {
              "$ref": "#/$defs/Identifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "organisation": {
          "description": "The expanded organisation object that manages this course.\nWhen the client requests expansion of `organisation`, the full expanded\norganisation object MUST be returned here instead of only the identifier.\nIf no organisation is defined, this value is `null`.\n",
          "oneOf": [
            {
              "$ref": "#/$defs/Organisation"
            },
            {
              "type": "null"
            }
          ]
        },
        "consumer": {
          "oneOf": [
            {
              "$ref": "#/$defs/Consumer"
            },
            {
              "type": "null"
            }
          ]
        },
        "ext": {
          "oneOf": [
            {
              "$ref": "#/$defs/Ext"
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "Ext": {
      "type": "object",
      "description": "Object for additional non-standard attributes"
    },
    "ICERelationType": {
      "type": "string",
      "description": "The type of relationship between the person and their In Case of Emergency (ICE) contact:\n\n- partner: Spouse or life partner\n- parent: Biological, adoptive, or legal parent\n- other: Any other type of relationship (e.g. sibling, friend, neighbour)\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
      "x-ooapi-extensible-enum": [
        "partner",
        "parent",
        "other"
      ]
    },
    "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/#/te

# --- truncated at 32 KB (109 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/open-education-api/refs/heads/main/json-schema/open-education-api-test-component-schema.json

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/open-education-api-test-component"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.