{
  "openapi": "3.1.1",
  "info": {
    "version": "6.0",
    "title": "Open Education API",
    "description": "OpenAPI (fka Swagger) specification for the Open Education API. \n\nThe model provides an overview of the educational domain that is modelled and\nforms the basis of the OOAPI. The overarching educational concept is not exposed\nthrough API endpoints. Instead, the educational specification defines four base\nobjects: programme, course, learning component, and test component, each with\nits own endpoint.\n\nThese base objects can be used to realise offerings. There is, however, no\ndedicated offering endpoint. Offerings are represented through four base\ntypes: programme offering, course offering, learning component offering, and\ntest component offering.\n\nRelations between an offering and a person, such as enrolment, are realised\nthrough association endpoints. These endpoints define the different types of\nassociations that can exist between offerings and persons. Other objects shown\nin the model represent groups and group memberships of a person.\n",
    "contact": {
      "name": "OOAPI Working Group / SURF",
      "url": "https://openonderwijsapi.nl",
      "email": "info@openonderwijsapi.nl"
    },
    "x-logo": {
      "url": "./logo.png",
      "href": "./docs.html"
    }
  },
  "servers": [
    {
      "url": "http://demo01.eduapi.nl/v6",
      "description": "SURF demo implementation"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "academic sessions",
      "description": "The academic sessions API provides information about the different time periods\na programme can be offered.\n"
    },
    {
      "name": "academic_session_model",
      "x-displayName": "AcademicSession",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/AcademicSession\" />\n"
    },
    {
      "name": "associations",
      "x-deprecated": true,
      "description": "The association API is now deprecated and has been replaced by more specific\nendpoints programme-offering-association, course-offering-association, \nlearning-component-offering-association and test-component-offering-association.\n"
    },
    {
      "name": "building_model",
      "x-displayName": "Building",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Building\" />\n"
    },
    {
      "name": "buildings",
      "description": "The building API provides a building that is currently used by the organisation.\nIt includes all location details.\n"
    },
    {
      "name": "components",
      "description": "This path is no longer supported; you can now use learning components or test\ncomponents.\n"
    },
    {
      "name": "course offering associations",
      "description": "The course offering associations API provides information about the association\nbetween a course offering and a person (e.g. students, lecturers, etc).\nAssociations can be posted between institutions. This requires detailed information\non the course offering and the persons. To allow for this information a\ncomplete person object and offering object can be part of the API. The structure\nis explained in the following model:\n<table>\n  <tr>\n   <td></td>\n   <td colspan=3 align=center>offering</td>\n  </tr>\n  <tr>\n   <td rowspan=3>student</td>\n   <td></td>\n   <!-- <td>internal</td>\n   -->\n   <td>external</td>\n  </tr>\n  <tr>\n   <td>internal</td>\n   <td>POST <a\n     href=\"#tag/course-offering-associations/operation/createExternalCourseOfferingAssociationByopenId\">\n     /course-offering-associations/external/me</a>Retrieves student details from the well known endpoint \n     that exposes person information at the home institution.\n     It passes offering details (provided by\n     external institution) to the home institution so the home institution can\n     create a placeholder for the offering and its results.\n   </td>\n  </tr>\n  <tr>\n   <td>external</td>\n   <td>no support needed</td>\n  </tr>\n</table>\nDirect update of current information: <a\n  href=\"#tag/course-offering-associations/operation/partialUpdateCourseOfferingAssociationById\">\n  PATCH /course-offering-associations/{courseOfferingAssociationId}</a>\nThis call is currently limited to passing results and a remote state. For future\nuse other association resource information could be passed. More information on\nthe support for student mobility can be found\n<a href=\"https://swimlanes.io/d/s5mfpj7Si\">here</a>\n"
    },
    {
      "name": "course offerings",
      "description": "The offerings API provides information about offerings which have a global\ntimeframe, e.g. a period to which students can enrol.\n"
    },
    {
      "name": "course_model",
      "x-displayName": "Course",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Course\" />\n"
    },
    {
      "name": "course_offering_association_model",
      "x-displayName": "CourseOfferingAssociation",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/CourseOfferingAssociation\" />\n"
    },
    {
      "name": "course_offering_model",
      "x-displayName": "CourseOffering",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/CourseOffering\" />\n"
    },
    {
      "name": "courses",
      "description": "The courses API provides a self-contained and formally structured learning experience,\naimed at delivering defined learning outcomes to students, usually within the context\nof a programme.\n"
    },
    {
      "name": "data_model",
      "x-displayName": "Data model",
      "description": "The Open Education API defines different objects using schemas.\nThese schemas are based on OpenAPI base types, with occasional specific amendments to these base types.\nThe types we use are:\n  The data type of a schema is defined by the type keyword, for example, type: string. OpenAPI defines the following basic types:\n  - [string](#strings) (this includes dates and files)\n  - number\n  - integer\n  - boolean\n  - array\n  - [object](#objects)\n\n\n### Strings\n\nA string of text is defined as:\n\n```yaml  \ntype: string\nString length can be restricted using minLength and maxLength:\n```\n\n\n```yaml\n  type: string\n  minLength: 3\n  maxLength: 20\n```\n\nNote that an empty string \"\" is a valid string unless minLength or pattern is specified.\nString Formats\n\nAn optional format modifier can be used as a hint about the contents and structure of the string. OpenAPI defines the following built-in string formats:\n\n\n```yaml  \ndate – full-date notation as defined by RFC 3339, section 5.6, for example, 2017-07-21\ndate-time – the date-time notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28+1:00\nbyte – base64-encoded characters, for example, U3dhZ2dlciByb2Nrcw==\nbinary – binary data, used to describe files\n```\n\n### Objects\n\nThe Open Education API contains a set of predefined objects that are related to one another. \nAll objects listed below, and the relations between them are shown in the model at the top of this page. \n"
    },
    {
      "name": "document_model",
      "x-displayName": "Document",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Document\" />\n"
    },
    {
      "name": "documents",
      "description": "The API for accessing and retrieving document resources."
    },
    {
      "name": "group_model",
      "x-displayName": "Group",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Group\" />\n"
    },
    {
      "name": "groups",
      "description": "The groups API provides information about groups that are related to\norganisations, persons and offerings. Groups of students that are related to an\noffering are typically used for rostering. The rostering application assigns\nstudents based on these groups. For example, class 1b will be assigned to the\ncourse offering on Monday morning. Not all groups are related to an offering. A\ngroup of people can also be a team that is working on a task outside the \nscope of the OOAPI. These can be teams of students, but also teams of employees.\n"
    },
    {
      "name": "learning component offering associations",
      "description": "The API for associations between persons and learning component offerings.\n"
    },
    {
      "name": "learning component offerings",
      "description": "The offerings API provides information about offerings which have a global\ntimeframe, e.g. a period to which students can enrol.\n"
    },
    {
      "name": "learning components",
      "description": "The learning components API provides information about learning activities that\nare part of a course (or learning component).\n"
    },
    {
      "name": "learning outcomes",
      "description": "The learning outcomes API provides information about the statements regarding\nwhat a learner knows, understands and is able to do on completion of a learning\nprocess, which are defined in terms of knowledge, skills and responsibility and\nautonomy.\n"
    },
    {
      "name": "learning_component_model",
      "x-displayName": "LearningComponent",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/LearningComponent\" />\n"
    },
    {
      "name": "learning_component_offering_association_model",
      "x-displayName": "LearningComponentOfferingAssociation",
      "description": "<SchemaDefinition\n  schemaRef=\"#/components/schemas/LearningComponentOfferingAssociation\" />\n"
    },
    {
      "name": "learning_component_offering_model",
      "x-displayName": "LearningComponentOffering",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/LearningComponentOffering\" />\n"
    },
    {
      "name": "learning_outcome_model",
      "x-displayName": "LearningOutcome",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/LearningOutcome\" />\n"
    },
    {
      "name": "membership_model",
      "x-displayName": "Membership",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Membership\" />\n"
    },
    {
      "name": "memberships",
      "description": "The memberships API provides information about memberships that are related to\ngroups and persons. \n"
    },
    {
      "name": "news",
      "description": "This path is no longer supported."
    },
    {
      "name": "organisation_model",
      "x-displayName": "Organisation",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Organisation\" />\n"
    },
    {
      "name": "organisations",
      "description": "The organisations API provides the organisations that are responsible for the\nexecution and recognition of education, either as an educational institution or\nas an organisation providing services, internships or facilities.\n"
    },
    {
      "name": "person_model",
      "x-displayName": "Person",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Person\" />\n"
    },
    {
      "name": "persons",
      "description": "The persons API provides information about persons related to an organisation.\n"
    },
    {
      "name": "programme offering associations",
      "description": "The programme offering associations API provides information about the association\nbetween a programme offering and a person (e.g. students, lecturers, etc).\nAssociations can be posted between institutions. This requires detailed information\non the programme offering and the persons. To allow for this information a\ncomplete person object and offering object can be part of the API. The structure\nis explained in the following model:\n<table>\n  <tr>\n   <td></td>\n   <td colspan=3 align=center>offering</td>\n  </tr>\n  <tr>\n   <td rowspan=3>student</td>\n   <td></td>\n   <!-- <td>internal</td>\n   -->\n   <td>external</td>\n  </tr>\n  <tr>\n   <td>internal</td>\n   <!-- <td>POST <a\n        href=\"#tag/offerings/paths/~1offerings~1{offeringId}~1associations~1external/post\">\n        /offerings/{offeringId}/associations/me</a> local enrolment based on\n        selected offering\n        This call will allow for a local student using his well known credentials\n        to enrol for the offering identified by the offeringId\n        <br>Alternatively the association can also be created through POST\n        <a href=\"#tag/associations/paths/~1associations~1me/post\">/associations/me</a>\n       </td>\n   -->\n   <td>POST <a\n     href=\"#tag/course-offering-associations/operation/createExternalProgrammeOfferingAssociationByopenId\">\n     /programme-offering-associations/external/me</a>Retrieves student details from the well known endpoint \n     that exposes person information at the home institution.\n     It passes offering details (provided by\n     external institution) to the home institution so the home institution can\n     create a placeholder for the offering and its results.\n   </td>\n  </tr>\n  <tr>\n   <td>external</td>\n    <!--\n    <td>\n    This method is not yet implemented it requires full student details and\n    offering details. This would mean the OOAPI message would contain more than\n    one resource in the message. At the moment the student mobility project is\n    looking into a solution.\n    <br> Alternatively it could be achieved through using two calls:\n    <ul>\n     <li>create student with POST\n         <a href=\"#tag/persons/paths/~1persons~1{personId}/post\">/persons</a>\n     </li>\n     <li>\n         <a href=\"#tag/offerings/paths/~1offerings~1{offeringId}~1associations~1external/post\">\n         /offerings/{offeringId}/associations/me</a>\n     </li>\n    </ul>\n    for the enrolment\n   </td>\n    -->\n   <td>no support needed</td>\n  </tr>\n</table>\nDirect update of current information: <a\n  href=\"#tag/programme-offering-associations/operation/partialUpdateProgrammeOfferingAssociationById\">\n  PATCH /programme-offering-associations/{programmeOfferingAssociationId}</a>\nThis call is currently limited to passing results and a remote state. For future\nuse other association resource information could be passed. More information on\nthe support for student mobility can be found\n<a href=\"https://swimlanes.io/d/s5mfpj7Si\">here</a>\n"
    },
    {
      "name": "programme offerings",
      "description": "The offerings API provides information about offerings which have a global\ntimeframe, e.g. a period to which students can enrol.\n"
    },
    {
      "name": "programme_model",
      "x-displayName": "Programme",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Programme\" />\n"
    },
    {
      "name": "programme_offering_association_model",
      "x-displayName": "ProgrammeOfferingAssociation",
      "description": "<SchemaDefinition\n  schemaRef=\"#/components/schemas/ProgrammeOfferingAssociation\" />\n"
    },
    {
      "name": "programme_offering_model",
      "x-displayName": "ProgrammeOffering",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/ProgrammeOffering\" />\n"
    },
    {
      "name": "programmes",
      "description": "The programmes API provides a coherent set of educational components, aimed at the\nrealisation of competences or objectives in the field of knowledge, insight,\nattitudes and skills that the person who completes the programme must have.\n"
    },
    {
      "name": "room_model",
      "x-displayName": "Room",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Room\" />\n"
    },
    {
      "name": "rooms",
      "description": "The rooms API provides the part of a building where an activity can take place.\nIncluding detailed information on the resources available, number of seats, etc.\n(Updated continuously)\n"
    },
    {
      "name": "security",
      "description": "Within the specification, no global security is defined. This keeps the core\nspecification neutral and avoids prescribing a single security model for all\noperations. For those API calls that require authentication or authorisation,\nthis is explicitly indicated in the accompanying documentation.\n\nBy leaving the global security section empty, implementation details are\nseparated from the functional description, while still providing guidance on how\nconcrete security measures can be applied in practice.\n"
    },
    {
      "name": "service metadata",
      "description": "The service API provides additional metadata needed to make the OOAPI fit for\nthis organisation.\n"
    },
    {
      "name": "service_model",
      "x-displayName": "Service",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/Service\" />\n"
    },
    {
      "name": "test component offering association attempts",
      "description": "The API for the attempts that are made by a person on a test component offering association."
    },
    {
      "name": "test component offering associations",
      "description": "The API for associations between persons and test component offerings.\n"
    },
    {
      "name": "test component offerings",
      "description": "The offerings API provides information about offerings which have a global\ntimeframe, e.g. a period to which students can enrol.\n"
    },
    {
      "name": "test components",
      "description": "The test components API provides information about test or assessment activities\nthat are part of a course (or learning unit).\n"
    },
    {
      "name": "test_component_model",
      "x-displayName": "TestComponent",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/TestComponent\" />\n"
    },
    {
      "name": "test_component_offering_association_attempt_model",
      "x-displayName": "TestComponentOfferingAssociationAttempt",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/TestComponentOfferingAssociationAttemptFull\" />\n"
    },
    {
      "name": "test_component_offering_association_model",
      "x-displayName": "TestComponentOfferingAssocation",
      "description": "<SchemaDefinition\n  schemaRef=\"#/components/schemas/TestComponentOfferingAssociation\" />\n"
    },
    {
      "name": "test_component_offering_model",
      "x-displayName": "TestComponentOffering",
      "description": "<SchemaDefinition schemaRef=\"#/components/schemas/TestComponentOffering\" />\n"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "parameters": [],
        "summary": "GET /",
        "operationId": "listServiceMetaData",
        "description": "Get metadata for the service.",
        "tags": [
          "service metadata"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Service"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/academic-sessions": {
      "get": {
        "summary": "GET /academic-sessions",
        "operationId": "listAcademicSessions",
        "description": "Get a list of all academic sessions, ordered chronologically.",
        "tags": [
          "academic sessions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "academicSessionType",
            "in": "query",
            "description": "Filter by academic session type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/academicSessionType"
            }
          },
          {
            "name": "parent",
            "in": "query",
            "description": "Filter by parent (academicSessionId)",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "year",
            "in": "query",
            "description": "Filter by year (academicSessionId)",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/AcademicSession"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/academic-sessions/{academicSessionId}": {
      "get": {
        "summary": "GET /academic-sessions/{academicSessionId}",
        "operationId": "listAcademicSessionById",
        "description": "Get a single academic session.",
        "tags": [
          "academic sessions"
        ],
        "parameters": [
          {
            "name": "academicSessionId",
            "in": "path",
            "description": "Academic session ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "parent",
                  "children",
                  "year"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AcademicSession"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/academic-sessions/{academicSessionId}/course-offerings": {
      "get": {
        "summary": "GET /academic-sessions/{academicSessionId}/course-offerings",
        "operationId": "listCourseOfferingsByAcademicSessionId",
        "description": "Get a list of all course offerings during this academic session",
        "tags": [
          "course offerings"
        ],
        "parameters": [
          {
            "name": "academicSessionId",
            "in": "path",
            "description": "Academic session ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "$ref": "#/components/schemas/CourseOffering"
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/academic-sessions/{academicSessionId}/learning-component-offerings": {
      "get": {
        "summary": "GET /academic-sessions/{academicSessionId}/learning-component-offerings",
        "operationId": "listLearningComponentOfferingsByAcademicSessionId",
        "description": "Get a list of all offerings during this academic session",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "academicSessionId",
            "in": "path",
            "description": "Academic session ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/academic-sessions/{academicSessionId}/programme-offerings": {
      "get": {
        "summary": "GET /academic-sessions/{academicSessionId}/programme-offerings",
        "operationId": "listProgrammeOfferingsByAcademicSessionId",
        "description": "Get a list of all programme offerings during this academic session",
        "tags": [
          "programme offerings"
        ],
        "parameters": [
          {
            "name": "academicSessionId",
            "in": "path",
            "description": "Academic session ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ProgrammeOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/academic-sessions/{academicSessionId}/test-component-offerings": {
      "get": {
        "summary": "GET /academic-sessions/{academicSessionId}/test-component-offerings",
        "operationId": "listTestComponentOfferingsByAcademicSessionId",
        "description": "Get a list of all test component offerings during this academic session",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "academicSessionId",
            "in": "path",
            "description": "Academic session ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/buildings": {
      "get": {
        "summary": "GET /buildings",
        "operationId": "listBuildings",
        "description": "Get a list of all buildings, ordered by name (ascending).",
        "tags": [
          "buildings"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Building"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/buildings/{buildingId}": {
      "get": {
        "summary": "GET /buildings/{buildingId}",
        "operationId": "listBuildingById",
        "description": "Get a single building.",
        "tags": [
          "buildings"
        ],
        "parameters": [
          {
            "name": "buildingId",
            "in": "path",
            "description": "Building ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Building"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/buildings/{buildingId}/rooms": {
      "get": {
        "summary": "GET /buildings/{buildingId}/rooms",
        "operationId": "listRoomsByBuildingId",
        "description": "Get a list of all rooms in a building.",
        "tags": [
          "buildings"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "buildingId",
            "in": "path",
            "description": "The id of the building to find rooms for",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "roomType",
            "in": "query",
            "description": "Filter by room type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/roomType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Room"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offering-associations/external/me": {
      "post": {
        "summary": "POST /course-offering-associations/external/me",
        "operationId": "createExternalCourseOfferingAssociationByopenId",
        "description": "POST a single course offering association, enrol a person based on person information obtained from well known endpoint, an offering, \nand the organisation/type=root information from the organisation that is issuing this association. \nThe offering can either be identified by an offeringId if known or the full offering details. \n\nSecurity must be implemented at the level of the actual deployment rather than in the core specification. \nThis means that the specification remains neutral, while concrete security measures can be applied in \npractice using established techniques such as OpenID with fine-grained scopes. For example, write access \non course-offering associations for an external user (me.write) can be granted in this way. The previous \ninline declaration has therefore been removed to avoid conflating implementation details with the \nspecification.\n",
        "tags": [
          "course offering associations"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "required": [
                  "remoteState"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CourseOfferingAssociationExternalMe"
                  },
                  {
                    "properties": {
                      "issuer": {
                        "$ref": "#/components/schemas/Organisation"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offering-associations/{courseOfferingAssociationId}": {
      "get": {
        "summary": "GET /course-offering-associations/{courseOfferingAssociationId}",
        "operationId": "listCourseOfferingAssociationById",
        "description": "Get a single course offering association.",
        "tags": [
          "course offering associations"
        ],
        "parameters": [
          {
            "name": "courseOfferingAssociationId",
            "in": "path",
            "description": "Course Offering Association ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "academic_session",
                  "course_offering",
                  "person"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseOfferingAssociation"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /course-offering-associations/{courseOfferingAssociationId}",
        "description": "PUT a single course offering association to enrol a person on a specific association that can later be retrieved.  \n",
        "operationId": "replaceCourseOfferingAssociationById",
        "tags": [
          "course offering associations"
        ],
        "parameters": [
          {
            "name": "courseOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CourseOfferingAssociation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /course-offering-associations/{courseOfferingAssociationId}",
        "operationId": "partialUpdateCourseOfferingAssociationById",
        "description": "Update the status or result of an enrolment. Other elements of the association object COULD \nalso be PATCHED. But are not likely and have therefore not been included in this endpoint.\nImplementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, \na specialized media type `application/merge-patch+json` for partial resource representation \nto update parts of resource objects.\n\nSecurity must be implemented at the level of the actual deployment rather than in the core \nspecification. This means that the specification remains neutral, while concrete security \nmeasures can be applied in practice using established techniques such as OpenID with fine-grained \nscopes. For example, write access on associations (associations.write) can be granted in this way. \nThe previous inline declaration has therefore been removed to avoid conflating implementation \ndetails with the specification.\n",
        "tags": [
          "course offering associations"
        ],
        "parameters": [
          {
            "name": "courseOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "properties": {
                  "remoteState": {
                    "$ref": "#/components/schemas/remoteAssociationState"
                  },
                  "result": {
                    "$ref": "#/components/schemas/CourseOfferingAssociationResult"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offerings/{courseOfferingId}": {
      "get": {
        "summary": "GET /course-offerings/{courseOfferingId}",
        "operationId": "listCourseOfferingsById",
        "description": "Get a single course offering.",
        "tags": [
          "course offerings"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "course",
                  "programme_offering",
                  "academic_session"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseOffering",
                  "title": "courseOffering"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /course-offerings/{courseOfferingId}",
        "operationId": "replaceCourseOfferingsById",
        "description": "Update all attributes of a single course offering.",
        "tags": [
          "course offerings"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CourseOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /course-offerings/{courseOfferingId}",
        "operationId": "partialUpdateCourseOfferingsById",
        "description": "Change attributes of a single course offering.",
        "tags": [
          "course offerings"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CourseOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offerings/{courseOfferingId}/course-offering-associations": {
      "get": {
        "summary": "GET /course-offerings/{courseOfferingId}/course-offering-associations",
        "operationId": "listCourseOfferingAssociationsByCourseOfferingId",
        "description": "Get a list of all course offering associations related to the course offering based on its ID.",
        "tags": [
          "course offering associations"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/CourseOfferingAssociation"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offerings/{courseOfferingId}/groups": {
      "get": {
        "summary": "GET /course-offerings/{courseOfferingId}/groups",
        "operationId": "listGroupsByCourseOfferingId",
        "description": "Get an ordered list of all groups related to a course offering, ordered by name.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "groupType",
            "in": "query",
            "description": "Filter by group type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/groupType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Group"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offerings/{courseOfferingId}/learning-component-offerings": {
      "get": {
        "summary": "GET /course-offerings/{courseOfferingId}/learning-component-offerings",
        "operationId": "listLearningComponentOfferingsByCourseOfferingId",
        "description": "Get a list of all learning component offerings related to the course offering based on its ID.",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (date-time). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (date-time).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/course-offerings/{courseOfferingId}/test-component-offerings": {
      "get": {
        "summary": "GET /course-offerings/{courseOfferingId}/test-component-offerings",
        "operationId": "listTestComponentOfferingsByCourseOfferingId",
        "description": "Get a list of all test component offerings related to the course offering based on its ID.",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "courseOfferingId",
            "in": "path",
            "description": "Course Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses": {
      "get": {
        "summary": "GET /courses",
        "operationId": "listCourses",
        "description": "Get a list of all courses, ordered by name (ascending).",
        "tags": [
          "courses"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "level",
            "in": "query",
            "description": "Filter by level",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/level"
            }
          },
          {
            "name": "modeOfDelivery",
            "in": "query",
            "description": "Filter by modeOfDelivery",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Course"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses/{courseId}": {
      "get": {
        "summary": "GET /courses/{courseId}",
        "operationId": "listCourseById",
        "description": "Get a single course.",
        "tags": [
          "courses"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "description": "Course ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to include, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "programmes",
                  "coordinators",
                  "instructors",
                  "organisation"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/returnTimelineOverrides"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseExpanded"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses/{courseId}/course-offerings": {
      "get": {
        "summary": "GET /courses/{courseId}/course-offerings",
        "operationId": "listCourseOfferingsByCourseId",
        "description": "Get a list of all course offerings for this course, ordered chronologically.",
        "tags": [
          "course offerings"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "description": "Course ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "modeOfDelivery",
            "in": "query",
            "description": "Filter by modeOfDelivery",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/CourseOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses/{courseId}/learning-component-offerings": {
      "get": {
        "summary": "GET /courses/{courseId}/learning-component-offerings",
        "operationId": "listLearningCompoentOfferingsByCourseId",
        "description": "Get a list of all learning component offerings for this course, ordered chronologically.",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "description": "Course ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "modeOfDelivery",
            "in": "query",
            "description": "Filter by modeOfDelivery",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to include, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "academic_session",
                  "course_offering",
                  "learning_component",
                  "organisation",
                  "rooms"
                ]
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses/{courseId}/learning-components": {
      "get": {
        "summary": "GET /courses/{courseId}/learning-components",
        "operationId": "listLearningComponentsByCourseId",
        "description": "Get an ordered list of all course learning components.",
        "tags": [
          "learning components"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "description": "Course ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponent"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses/{courseId}/test-component-offerings": {
      "get": {
        "summary": "GET /courses/{courseId}/test-component-offerings",
        "operationId": "listTestCompoentOfferingsByCourseId",
        "description": "Get a list of all test component offerings for this course, ordered chronologically.",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "description": "Course ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "modeOfDelivery",
            "in": "query",
            "description": "Filter by modeOfDelivery",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/courses/{courseId}/test-components": {
      "get": {
        "summary": "GET /courses/{courseId}/test-components",
        "operationId": "listTestComponentsByCourseId",
        "description": "Get an ordered list of all course test components.",
        "tags": [
          "test components"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "description": "Course ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponent"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/documents/{documentId}": {
      "get": {
        "summary": "GET /documents/{documentId}",
        "operationId": "listDocumentById",
        "description": "Get the binary data from a document.\n\nSecurity must be implemented at the level of the actual deployment rather than in the core specification. \nThis means that the specification remains neutral, while concrete security measures can be applied in practice \nusing established techniques such as OAuth flows with fine-grained definitions. For example, access may be \nmanaged through the flow identified as nl-test-admin-flow-2-3-4. The previous inline declaration has therefore \nbeen removed to avoid conflating implementation details with the specification.\n",
        "tags": [
          "documents"
        ],
        "parameters": [
          {
            "name": "documentId",
            "in": "path",
            "description": "Document ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                },
                "examples": {
                  "file-download": {
                    "description": "File download",
                    "summary": "File download",
                    "value": "<raw data>"
                  }
                }
              }
            },
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/groups": {
      "get": {
        "summary": "GET /groups",
        "operationId": "listGroups",
        "description": "Get a list of all groups, ordered by name (ascending).",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "groupType",
            "in": "query",
            "description": "Filter by group type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/groupType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Group"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/groups/{groupId}": {
      "get": {
        "summary": "GET /groups/{groupId}",
        "operationId": "listGroupById",
        "description": "Get a single group.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "groupId",
            "in": "path",
            "description": "Group ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "organisation"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Group"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /groups/{groupId}",
        "operationId": "replaceGroupById",
        "description": "Replace a single group from source system to recipient.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "groupId",
            "in": "path",
            "description": "Group ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Group",
                "title": "group"
              },
              "examples": {
                "Create a group in remote system": {
                  "value": {
                    "groupId": "123e4567-e89b-12d3-a456-426614174000",
                    "offeringIds": [
                      {
                        "courseOfferingId": "123e4567-e89b-12d3-a456-426614174000"
                      },
                      {
                        "programmeOfferingId": "223e4567-e89b-12d3-a456-426614174000"
                      }
                    ],
                    "primaryCode": {
                      "codeType": "identifier",
                      "code": "1234qwe12"
                    },
                    "groupType": "learning group",
                    "name": [
                      {
                        "language": "en-GB",
                        "value": "statistics students"
                      }
                    ],
                    "description": [
                      {
                        "language": "en-GB",
                        "value": "The group of students that follow statistics classes"
                      }
                    ],
                    "startDateTime": "2020-08-17T08:30:00+01:00",
                    "endDateTime": "2020-12-18T00:30:00+01:00",
                    "personCount": 183,
                    "otherCodes": [
                      {
                        "codeType": "identifier",
                        "code": "1234qwe12"
                      }
                    ],
                    "organisationId": "452c1a86-a0af-475b-b03f-724878b0f387"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/groups/{groupId}/memberships": {
      "get": {
        "summary": "GET /groups/{groupId}/memberships",
        "operationId": "listMembershipsByGroupId",
        "description": "Get an ordered list of membershipItems (personIds that are member of a given group, and duration) ordered by personId.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "groupId",
            "in": "path",
            "description": "Group ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Membership"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/groups/{groupId}/memberships/{personId}": {
      "put": {
        "summary": "PUT /groups/{groupId}/memberships/{personId}",
        "operationId": "replacePersoninGroupById",
        "description": "Replace or add a single group member from source system to recipient.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "groupId",
            "in": "path",
            "description": "Group ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "personId",
            "in": "path",
            "description": "membership ID based on person ID since a person can only be once in a group",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Membership",
                "title": "membership"
              },
              "examples": {
                "Create a new group member in remote system": {
                  "value": {
                    "personId": "123e4567-e89b-12d3-a456-122564174000",
                    "groupId": "123e4567-e89b-12d3-a456-122564174000",
                    "startDateTime": "2025-09-28T08:30:00+01:00",
                    "endDateTime": "2025-11-30T20:00:00+01:00",
                    "state": "active",
                    "role": "student"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-component-offering-associations/{learningComponentOfferingAssociationId}": {
      "get": {
        "summary": "GET /learning-component-offering-associations/{learningComponentOfferingAssociationId}",
        "operationId": "listLearningComponentOfferingAssociationById",
        "description": "Get a single learning component offering association.",
        "tags": [
          "learning component offering associations"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingAssociationId",
            "in": "path",
            "description": "Course Offering Association ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "person",
                  "learning_component_offering",
                  "rooms"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningComponentOfferingAssociation"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /learning-component-offering-associations/{learningComponentOfferingAssociationId}",
        "description": "PUT a single learning component offering association to enrol a person on a specific association that can later be retrieved. \n",
        "operationId": "replaceLearningComponentOfferingAssociationById",
        "tags": [
          "learning component offering associations"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LearningComponentOfferingAssociation"
              },
              "examples": {
                "Add student to created offering (zitting) (flow 2.2.B and 2.3)": {
                  "value": {
                    "associationId": "123e4567-e89b-12d3-a456-426614174000",
                    "role": "student",
                    "state": "associated",
                    "consumer": {
                      "consumerKey": "nl-test-admin",
                      "extraTimeInMin": 30,
                      "personalNeeds": [
                        "extraTime",
                        "spoken",
                        "spell-checker-on-screen"
                      ]
                    },
                    "person": {
                      "personId": "123e4567-e89b-12d3-a456-426614174000",
                      "primaryCode": {
                        "codeType": "student_number",
                        "code": "1234567"
                      },
                      "givenName": "Maartje",
                      "preferredName": "Maar",
                      "surnamePrefix": "van",
                      "surname": "Damme",
                      "displayName": "Maartje van Damme",
                      "activeEnrolment": true,
                      "affiliations": [
                        "student"
                      ],
                      "email": "vandamme.mcw@student.roc.nl",
                      "languageOfChoice": [
                        "nl-NL"
                      ],
                      "otherCodes": [
                        {
                          "codeType": "accountId",
                          "code": "s1234567@student.roc.nl"
                        },
                        {
                          "codeType": "eckid",
                          "code": "https://roc.nl/8078d3...28bc85"
                        }
                      ]
                    },
                    "learningComponentOfferingId": "123e4567-e89b-12d3-a456-134564174000"
                  }
                },
                "Change student enrolment to offering (zitting) (flow 2.x)": {
                  "value": {
                    "associationId": "123e4567-e89b-12d3-a456-426614174000",
                    "role": "student",
                    "state": "associated",
                    "consumer": {
                      "consumerKey": "nl-test-admin",
                      "extraTimeInMin": 30,
                      "personalNeeds": [
                        "extraTime",
                        "spoken",
                        "spell-checker-on-screen"
                      ]
                    },
                    "personId": "123e4567-e89b-12d3-a456-426614174000",
                    "learningComponentOfferingId": "123e4567-e89b-12d3-a456-134564174000"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /learning-component-offering-associations/{learningComponentOfferingAssociationId}",
        "operationId": "partialUpdateLearningComponentOfferingAssociationById",
        "description": "Update the status or result of an enrolment. Other elements of the association object COULD \nalso be PATCHED. But are not likely and have therefore not been included in this endpoint.\nImplementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, \na specialized media type `application/merge-patch+json` for partial resource representation \nto update parts of resource objects.\n\nSecurity must be implemented at the level of the actual deployment rather than in the core \nspecification. This means that the specification remains neutral, while concrete security \nmeasures can be applied in practice using established techniques such as OpenID with fine-grained \nscopes (for example, write access on associations). The previous inline declaration has therefore\nbeen removed to avoid conflating implementation details with the specification.\n",
        "tags": [
          "learning component offering associations"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "properties": {
                  "remoteState": {
                    "$ref": "#/components/schemas/remoteAssociationState"
                  },
                  "result": {
                    "$ref": "#/components/schemas/LearningComponentOfferingAssociationResult"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-component-offerings/{learningComponentOfferingId}": {
      "get": {
        "summary": "GET /learning-component-offerings/{learningComponentOfferingId}",
        "operationId": "listLearningComponentOfferingsById",
        "description": "Get a single learnig component offering.",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingId",
            "in": "path",
            "description": "Learning Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "learning_component",
                  "organisation",
                  "rooms"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningComponentOffering"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /learning-component-offerings/{learningComponentOfferingId}",
        "operationId": "replaceLearningComponentOfferingsById",
        "description": "Update all attributes of a single learning component offering.",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingId",
            "in": "path",
            "description": "Learning Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LearningComponentOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /learning-component-offerings/{learningComponentOfferingId}",
        "operationId": "partialUpdateLearningComponentOfferingsById",
        "description": "Change attributes of a single learning component offering.",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingId",
            "in": "path",
            "description": "Learning Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LearningComponentOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-component-offerings/{learningComponentOfferingId}/groups": {
      "get": {
        "summary": "GET /learning-component-offerings/{learningComponentOfferingId}/groups",
        "operationId": "listGroupsByLearningComponentOfferingId",
        "description": "Get an ordered list of all groups related to a learning component offering, ordered by name.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingId",
            "in": "path",
            "description": "Learning Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "groupType",
            "in": "query",
            "description": "Filter by group type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/groupType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Group"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-component-offerings/{learningComponentOfferingId}/learning-component-offering-associations": {
      "get": {
        "summary": "GET /learning-component-offerings/{learningComponentOfferingId}/learning-component-offering-associations",
        "operationId": "listLearningComponentOfferingAssociationsByLearningComponentOfferingId",
        "description": "Get a list of all learning component offering associations related to the learning component offering based on its ID.",
        "tags": [
          "learning component offering associations"
        ],
        "parameters": [
          {
            "name": "learningComponentOfferingId",
            "in": "path",
            "description": "Learning Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponentOfferingAssociation"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-components": {
      "get": {
        "summary": "GET /learning-components",
        "operationId": "listLearningComponents",
        "description": "Get a list of all learning components, ordered by name (ascending).",
        "tags": [
          "learning components"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponent"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-components/{learningComponentId}": {
      "get": {
        "summary": "GET /learning-components/{learningComponentId}",
        "operationId": "listLearningComponentById",
        "description": "Get a single learnig component.",
        "tags": [
          "learning components"
        ],
        "parameters": [
          {
            "name": "learningComponentId",
            "in": "path",
            "description": "learning component ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "course",
                  "organisation"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningComponent"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-components/{learningComponentId}/learning-component-offerings": {
      "get": {
        "summary": "GET /learning-components/{learningComponentId}/learning-component-offerings",
        "operationId": "listOfferingsByLearningComponentId",
        "description": "Get a list of all learning component offerings for this learning component, ordered chronologically.",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "learningComponentId",
            "in": "path",
            "description": "Learning Component ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-outcomes": {
      "get": {
        "summary": "GET /learning-outcomes",
        "operationId": "listLearningOutcomes",
        "description": "Get a list of all learning outcomes, ordered chronologically.",
        "tags": [
          "learning outcomes"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningOutcome"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/learning-outcomes/{learningOutcomeId}": {
      "get": {
        "summary": "GET /learning-outcomes/{learningOutcomeId}",
        "operationId": "listLearningOutcomeById",
        "description": "Get a single learnig outcome.",
        "tags": [
          "learning outcomes"
        ],
        "parameters": [
          {
            "name": "learningOutcomeId",
            "in": "path",
            "description": "learning outcome component ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "organisation",
                  "parents",
                  "children"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningOutcome"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations": {
      "get": {
        "summary": "GET /organisations",
        "operationId": "listOrganisations",
        "description": "Get an ordered list of all organisations, ordered by name.",
        "tags": [
          "organisations"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "organisationType",
            "in": "query",
            "description": "Filter by organisation type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/organisationType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Organisation"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}": {
      "get": {
        "summary": "GET /organisations/{organisationId}",
        "operationId": "listOrganisationById",
        "description": "Get a single organisation.",
        "tags": [
          "organisations"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "parent",
                  "children"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Organisation"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /organisations/{organisationId}",
        "operationId": "replaceOrganisationById",
        "description": "change the data of a single organisation.",
        "tags": [
          "organisations"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Organisation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/course-offerings": {
      "get": {
        "summary": "GET /organisations/{organisationId}/course-offerings",
        "operationId": "listCourseOfferingsByOrganisationId",
        "description": "Get a list of all course offerings for a given organisation",
        "tags": [
          "course offerings"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/CourseOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/courses": {
      "get": {
        "summary": "GET /organisations/{organisationId}/courses",
        "operationId": "listCoursesByOrganisationId",
        "description": "Get an ordered list of all courses for a given organisation, ordered by name.",
        "tags": [
          "courses"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "level",
            "in": "query",
            "description": "Filter by level",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/level"
            }
          },
          {
            "name": "modeOfDelivery",
            "in": "query",
            "description": "Filter by modeOfDelivery",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Course"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/groups": {
      "get": {
        "summary": "GET /organisations/{organisationId}/groups",
        "operationId": "listGroupsByOrganisationId",
        "description": "Get an ordered list of all groups for a given organisation, ordered by name.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "groupType",
            "in": "query",
            "description": "Filter by group type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/groupType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Group"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/learning-component-offerings": {
      "get": {
        "summary": "GET /organisations/{organisationId}/learning-component-offerings",
        "operationId": "listLearningComponentOfferingsByOrganisationId",
        "description": "Get a list of all learning component offerings for a given organisation",
        "tags": [
          "learning component offerings"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment (dateTime) for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment (dateTime) for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/learning-components": {
      "get": {
        "summary": "GET /organisations/{organisationId}/learning-components",
        "operationId": "listLearningComponentsByOrganisationId",
        "description": "Get an ordered list of all learning components for a given organisation, ordered by name.",
        "tags": [
          "learning components"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/LearningComponent"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/programme-offerings": {
      "get": {
        "summary": "GET /organisations/{organisationId}/programme-offerings",
        "operationId": "listProgrammeOfferingsByOrganisationId",
        "description": "Get a list of all programme offerings for a given organisation",
        "tags": [
          "programme offerings"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment (dateTime) for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment (dateTime) for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ProgrammeOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/programmes": {
      "get": {
        "summary": "GET /organisations/{organisationId}/programmes",
        "operationId": "listProgrammesByOrganisationId",
        "description": "Get an ordered list of all programmes for a given organisation, ordered by name.",
        "tags": [
          "programmes"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "programmeType",
            "in": "query",
            "description": "Filter by programme type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/programmeType"
            }
          },
          {
            "name": "qualificationAwarded",
            "in": "query",
            "description": "Filter by qualificationAwarded",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/qualificationAwarded"
            }
          },
          {
            "name": "levelOfQualification",
            "in": "query",
            "description": "Filter by levelOfQualification",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/levelOfQualification"
            }
          },
          {
            "name": "fieldsOfStudy",
            "in": "query",
            "description": "Filter by fieldsOfStudy",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Programme"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/test-component-offerings": {
      "get": {
        "summary": "GET /organisations/{organisationId}/test-component-offerings",
        "operationId": "listTestComponentOfferingsByOrganisationId",
        "description": "Get a list of all test component offerings for a given organisation",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment (dateTime) for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment (dateTime) for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/organisations/{organisationId}/test-components": {
      "get": {
        "summary": "GET /organisations/{organisationId}/test-components",
        "operationId": "listTestComponentsByOrganisationId",
        "description": "Get an ordered list of all test components for a given organisation, ordered by name.",
        "tags": [
          "test components"
        ],
        "parameters": [
          {
            "name": "organisationId",
            "in": "path",
            "description": "Organisation ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponent"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons": {
      "get": {
        "summary": "GET /persons",
        "operationId": "listPersons",
        "description": "Get an ordered list of all persons.",
        "tags": [
          "persons"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/personSearch"
          },
          {
            "name": "affiliations",
            "in": "query",
            "description": "Filter by affiliations",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/personAffiliation"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Person"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "post": {
        "summary": "POST /persons",
        "operationId": "createPerson",
        "description": "POST a single person.",
        "tags": [
          "persons"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/PersonProperties"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PersonId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons/me": {
      "get": {
        "summary": "GET /persons/me",
        "operationId": "listPersonByMyOauthId",
        "description": "Returns the person object for the currently authenticated user.\n\nSecurity must be implemented at the level of the actual deployment rather than in the core \nspecification. This means that the specification remains neutral, while concrete security \nmeasures can be applied in practice using established techniques such as OpenID with \nfine-grained scopes.\n",
        "tags": [
          "persons"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Person"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons/{personId}": {
      "get": {
        "summary": "GET /persons/{personId}",
        "operationId": "listPersonById",
        "description": "Get a single person.",
        "tags": [
          "persons"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "description": "User ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Person"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /persons/{personId}",
        "operationId": "replacePersonById",
        "description": "change the data of a single person.",
        "tags": [
          "persons"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "description": "User ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Person"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons/{personId}/course-offering-associations": {
      "get": {
        "summary": "GET /persons/{personId}/course-offering-associations",
        "operationId": "listCourseOfferingAssociationsByPersonId",
        "description": "Get a list of all course offering associations for an individual person.",
        "tags": [
          "course offering associations"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "description": "Person ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "academic_session",
                  "course_offering"
                ]
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "allOf": [
                              {
                                "$ref": "#/components/schemas/CourseOfferingAssociation"
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "academicSession": {
                                    "$ref": "#/components/schemas/AcademicSession"
                                  }
                                }
                              }
                            ]
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons/{personId}/learning-component-offering-associations": {
      "get": {
        "summary": "GET /persons/{personId}/learning-component-offering-associations",
        "operationId": "listLearningComponentOfferingAssociationsByPersonId",
        "description": "Get a list of all learning component offering associations for an individual person.",
        "tags": [
          "learning component offering associations"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "description": "Person ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "allOf": [
                              {
                                "$ref": "#/components/schemas/LearningComponentOfferingAssociation"
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "academicSession": {
                                    "$ref": "#/components/schemas/AcademicSession"
                                  }
                                }
                              }
                            ]
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons/{personId}/programme-offering-associations": {
      "get": {
        "summary": "GET /persons/{personId}/programme-offering-associations",
        "operationId": "listProgrammeOfferingAssociationsByPersonId",
        "description": "Get a list of all programme offering associations for an individual person.",
        "tags": [
          "programme offering associations"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "description": "Person ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "allOf": [
                              {
                                "$ref": "#/components/schemas/ProgrammeOfferingAssociation"
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "academicSession": {
                                    "$ref": "#/components/schemas/AcademicSession"
                                  }
                                }
                              }
                            ]
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/persons/{personId}/test-component-offering-associations": {
      "get": {
        "summary": "GET /persons/{personId}/test-component-offering-associations",
        "operationId": "listTestComponentOfferingAssociationsByPersonId",
        "description": "Get a list of all test component offering associations for an individual person.",
        "tags": [
          "test component offering associations"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "description": "Person ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "allOf": [
                              {
                                "$ref": "#/components/schemas/TestComponentOfferingAssociation"
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "academicSession": {
                                    "$ref": "#/components/schemas/AcademicSession"
                                  }
                                }
                              }
                            ]
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programme-offering-associations/external/me": {
      "post": {
        "summary": "POST /programme-offering-associations/external/me",
        "operationId": "createExternalProgrammeOfferingAssociationByopenId",
        "description": "POST a single programme offering association, enrol a person based on person information obtained from well known endpoint, an offering, \nand the organisation/type=root information from the organisation that is issuing this association. \nThe offering can either be identified by an offeringId if known or the full offering details. \n\nSecurity must be implemented at the level of the actual deployment rather than in the core specification. \nThis means that the specification remains neutral, while concrete security measures can be applied in \npractice using established techniques such as OpenID with fine-grained scopes. For example, write access \non programme-offering associations for an external user (“me.write”) can be granted in this way. The previous \ninline declaration has therefore been removed to avoid conflating implementation details with the specification.\n",
        "tags": [
          "programme offering associations"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "required": [
                  "remoteState"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ProgrammeOfferingAssociationExternalMe"
                  },
                  {
                    "properties": {
                      "issuer": {
                        "$ref": "#/components/schemas/Organisation"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "CREATED",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programme-offering-associations/{programmeOfferingAssociationId}": {
      "get": {
        "summary": "GET /programme-offering-associations/{programmeOfferingAssociationId}",
        "operationId": "listProgrammeOfferingAssociationById",
        "description": "Get a single programme offering association.",
        "tags": [
          "programme offering associations"
        ],
        "parameters": [
          {
            "name": "programmeOfferingAssociationId",
            "in": "path",
            "description": "Programme offering association ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "person",
                  "programme_offering"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgrammeOfferingAssociation"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /programme-offering-associations/{programmeOfferingAssociationId}",
        "description": "PUT a single programme offering association to enrol a person on a specific association that can later be retrieved.  \n",
        "operationId": "replaceProgrammeOfferingAssociationById",
        "tags": [
          "programme offering associations"
        ],
        "parameters": [
          {
            "name": "programmeOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgrammeOfferingAssociation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /programme-offering-associations/{programmeOfferingAssociationId}",
        "operationId": "partialUpdateProgrammeOfferingAssociationById",
        "description": "Update the status or result of an enrolment. Other elements of the association object COULD \nalso be PATCHED. But are not likely and have therefore not been included in this endpoint.\nImplementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, \na specialized media type `application/merge-patch+json` for partial resource representation \nto update parts of resource objects.\n\nSecurity must be implemented at the level of the actual deployment rather than in the core \nspecification. This means that the specification remains neutral, while concrete security \nmeasures can be applied in practice using established techniques such as OpenID with fine-grained \nscopes (for example, write access on associations). The previous inline declaration has therefore\nbeen removed to avoid conflating implementation details with the specification.\n",
        "tags": [
          "programme offering associations"
        ],
        "parameters": [
          {
            "name": "programmeOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "properties": {
                  "remoteState": {
                    "$ref": "#/components/schemas/remoteAssociationState"
                  },
                  "result": {
                    "$ref": "#/components/schemas/ProgrammeOfferingAssociationResult"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programme-offerings/{programmeOfferingId}": {
      "get": {
        "summary": "GET /programme-offerings/{programmeOfferingId}",
        "operationId": "listProgrammeOfferingsById",
        "description": "Get a single programme offering.",
        "tags": [
          "programme offerings"
        ],
        "parameters": [
          {
            "name": "programmeOfferingId",
            "in": "path",
            "description": "Programme Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "academic_session",
                  "course",
                  "course_offering",
                  "learning_component",
                  "organisation",
                  "programme",
                  "programme_offering",
                  "test_component"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgrammeOffering",
                  "title": "programmeOffering"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /programme-offerings/{programmeOfferingId}",
        "operationId": "replaceProgrammeOfferingsById",
        "description": "Update all attributes of a single programme offering.",
        "tags": [
          "programme offerings"
        ],
        "parameters": [
          {
            "name": "programmeOfferingId",
            "in": "path",
            "description": "Programme Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgrammeOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /programme-offerings/{programmeOfferingId}",
        "operationId": "partialUpdateProgrammeOfferingsById",
        "description": "Change attributes of a single programme offering.",
        "tags": [
          "programme offerings"
        ],
        "parameters": [
          {
            "name": "programmeOfferingId",
            "in": "path",
            "description": "Programme Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgrammeOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programme-offerings/{programmeOfferingId}/groups": {
      "get": {
        "summary": "GET /programme-offerings/{programmeOfferingId}/groups",
        "operationId": "listGroupsByProgrammeOfferingId",
        "description": "Get an ordered list of all groups related to a programme offering, ordered by name.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "programmeOfferingId",
            "in": "path",
            "description": "Programme Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "groupType",
            "in": "query",
            "description": "Filter by group type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/groupType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Group"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programme-offerings/{programmeOfferingId}/programme-offering-associations": {
      "get": {
        "summary": "GET /programme-offerings/{programmeOfferingId}/programme-offering-associations",
        "operationId": "listProgrammeOfferingAssociationsByProgrammeOfferingId",
        "description": "Get a list of all programme offering associations related to the programme offering based on its ID.",
        "tags": [
          "programme offering associations"
        ],
        "parameters": [
          {
            "name": "programmeOfferingId",
            "in": "path",
            "description": "Programme Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ProgrammeOfferingAssociation"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programmes": {
      "get": {
        "summary": "GET /programmes",
        "operationId": "listProgrammes",
        "description": "Get an ordered list of all programmes, ordered by name.",
        "tags": [
          "programmes"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "programmeType",
            "in": "query",
            "description": "Filter by programme type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/programmeType"
            }
          },
          {
            "name": "qualificationAwarded",
            "in": "query",
            "description": "Filter by qualificationAwarded",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/qualificationAwarded"
            }
          },
          {
            "name": "levelOfQualification",
            "in": "query",
            "description": "Filter by levelOfQualification",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/levelOfQualification"
            }
          },
          {
            "name": "fieldsOfStudy",
            "in": "query",
            "description": "Filter by fieldsOfStudy",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Programme"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programmes/{programmeId}": {
      "get": {
        "summary": "GET /programmes/{programmeId}",
        "operationId": "listProgrammeById",
        "description": "Get a single programme.",
        "tags": [
          "programmes"
        ],
        "parameters": [
          {
            "name": "programmeId",
            "in": "path",
            "description": "Programme ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to include, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "parent",
                  "children",
                  "coordinators",
                  "instructors",
                  "organisation"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/returnTimelineOverrides"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgrammeExpanded"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programmes/{programmeId}/courses": {
      "get": {
        "summary": "GET /programmes/{programmeId}/courses",
        "operationId": "listCoursesByProgrammeId",
        "description": "Get an ordered list of all courses given through this programme.",
        "tags": [
          "courses"
        ],
        "parameters": [
          {
            "name": "programmeId",
            "in": "path",
            "description": "Programme ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "level",
            "in": "query",
            "description": "Filter by level",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/level"
            }
          },
          {
            "name": "modeOfDelivery",
            "in": "query",
            "description": "Filter by modeOfDelivery",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Course"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programmes/{programmeId}/programme-offerings": {
      "get": {
        "summary": "GET /programmes/{programmeId}/programme-offerings",
        "operationId": "listOfferingsByProgrammeId",
        "description": "Get a list of all offerings for this programme, ordered chronologically.",
        "tags": [
          "programme offerings"
        ],
        "parameters": [
          {
            "name": "programmeId",
            "in": "path",
            "description": "Programme ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "modeOfStudy",
            "in": "query",
            "description": "Filter by modeOfStudy",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/modeOfStudy"
            }
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment (dateTime) for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment (dateTime) for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ProgrammeOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/programmes/{programmeId}/programmes": {
      "get": {
        "summary": "GET /programmes/{programmeId}/programmes",
        "operationId": "listProgrammesByProgrammeId",
        "description": "Get an ordered list of nested programmes, ordered by name.",
        "tags": [
          "programmes"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "programmeId",
            "in": "path",
            "description": "the id of the programme to find nested programmes for",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "programmeType",
            "in": "query",
            "description": "Filter by programme type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/programmeType"
            }
          },
          {
            "name": "qualificationAwarded",
            "in": "query",
            "description": "Filter by qualificationAwarded",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/qualificationAwarded"
            }
          },
          {
            "name": "levelOfQualification",
            "in": "query",
            "description": "Filter by levelOfQualification",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/levelOfQualification"
            }
          },
          {
            "name": "fieldsOfStudy",
            "in": "query",
            "description": "Filter by fieldsOfStudy",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Programme"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/rooms": {
      "get": {
        "summary": "GET /rooms",
        "operationId": "listRooms",
        "description": "Get a list of all rooms, ordered by name (ascending).",
        "tags": [
          "rooms"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/primaryCode"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "roomType",
            "in": "query",
            "description": "Filter by room type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/roomType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Room"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/rooms/{roomId}": {
      "get": {
        "summary": "GET /rooms/{roomId}",
        "operationId": "listRoomById",
        "description": "Get a single room.",
        "tags": [
          "rooms"
        ],
        "parameters": [
          {
            "name": "roomId",
            "in": "path",
            "description": "Room ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "building"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Room"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offering-associations/{testComponentOfferingAssociationId}": {
      "get": {
        "summary": "GET /test-component-offering-associations/{testComponentOfferingAssociationId}",
        "operationId": "listTestComponentOfferingAssociationById",
        "description": "Get a single test component offering association.",
        "tags": [
          "test component offering associations"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationId",
            "in": "path",
            "description": "Test Component Offering Association ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "person",
                  "test_component_offering",
                  "rooms"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestComponentOfferingAssociation"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /test-component-offering-associations/{testComponentOfferingAssociationId}",
        "description": "PUT a single test component offering association to enrol a person on a specific association that can later be retrieved.  \n",
        "operationId": "replaceTestComponentOfferingAssociationById",
        "tags": [
          "test component offering associations"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestComponentOfferingAssociation"
              },
              "examples": {
                "Add student to created offering (zitting) (flow 2.2.B and 2.3)": {
                  "value": {
                    "associationId": "123e4567-e89b-12d3-a456-426614174000",
                    "role": "student",
                    "state": "associated",
                    "consumer": {
                      "consumerKey": "nl-test-admin",
                      "extraTimeInMin": 30,
                      "personalNeeds": [
                        "extraTime",
                        "spoken",
                        "spell-checker-on-screen"
                      ]
                    },
                    "person": {
                      "personId": "123e4567-e89b-12d3-a456-426614174000",
                      "primaryCode": {
                        "codeType": "studentNumber",
                        "code": "1234567"
                      },
                      "givenName": "Maartje",
                      "preferredName": "Maar",
                      "surnamePrefix": "van",
                      "surname": "Damme",
                      "displayName": "Maartje van Damme",
                      "activeEnrolment": true,
                      "affiliations": [
                        "student"
                      ],
                      "email": "vandamme.mcw@student.roc.nl",
                      "languageOfChoice": [
                        "nl-NL"
                      ],
                      "otherCodes": [
                        {
                          "codeType": "accountId",
                          "code": "s1234567@student.roc.nl"
                        },
                        {
                          "codeType": "eckid",
                          "code": "https://roc.nl/8078d3...28bc85"
                        }
                      ]
                    },
                    "testComponentOfferingId": "123e4567-e89b-12d3-a456-134564174000"
                  }
                },
                "Change student enrolment to offering (zitting) (flow 2.x)": {
                  "value": {
                    "associationId": "123e4567-e89b-12d3-a456-426614174000",
                    "role": "student",
                    "state": "associated",
                    "consumer": {
                      "consumerKey": "nl-test-admin",
                      "extraTimeInMin": 30,
                      "personalNeeds": [
                        "extraTime",
                        "spoken",
                        "spell-checker-on-screen"
                      ]
                    },
                    "personId": "123e4567-e89b-12d3-a456-426614174000",
                    "testComponentOfferingId": "123e4567-e89b-12d3-a456-134564174000"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /test-component-offering-associations/{testComponentOfferingAssociationId}",
        "operationId": "partialUpdateTestComponentOfferingAssociationById",
        "description": "Update the status or result of an enrolment. Other elements of the association object COULD \nalso be PATCHED. But are not likely and have therefore not been included in this endpoint.\nImplementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, \na specialized media type `application/merge-patch+json` for partial resource representation \nto update parts of resource objects.\n\nSecurity must be implemented at the level of the actual deployment rather than in the core \nspecification. This means that the specification remains neutral, while concrete security \nmeasures can be applied in practice using established techniques such as OpenID with fine-grained \nscopes (for example, write access on associations). The previous inline declaration has therefore\nbeen removed to avoid conflating implementation details with the specification.\n",
        "tags": [
          "test component offering associations"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "properties": {
                  "remoteState": {
                    "$ref": "#/components/schemas/remoteAssociationState"
                  },
                  "result": {
                    "$ref": "#/components/schemas/TestComponentOfferingAssociationResult"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offering-associations/{testComponentOfferingAssociationId}/url": {
      "get": {
        "summary": "GET /test-component-offering-associations/{testComponentOfferingAssociationId}/url",
        "description": "Get the URL of the test component association to start the testing tool.\n",
        "operationId": "listTestComponentOfferingAssociationUrl",
        "tags": [
          "test component offering associations"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationId",
            "in": "path",
            "description": "Association ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Url"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offering-associations/{testComponentOfferingAssociationId}/test-component-offering-association-attempts": {
      "get": {
        "summary": "GET /test-component-offering-associations/{testComponentOfferingAssociationId}/test-component-offering-association-attempts",
        "operationId": "listTestComponentOfferingAssociationAttemptsByTestComponentOfferingAssociationId",
        "description": "Get a list of all test component offering association attempts related to the test component offering association based on its ID.",
        "tags": [
          "test component offering association attempts"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationId",
            "in": "path",
            "description": "Test Component Offering Association ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "attendance",
            "in": "query",
            "description": "Filter by attendance",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/attendance"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/attemptState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOfferingAssociationAttempt"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offering-associations/{testComponentOfferingAssociationId}/test-component-offering-association-attempt/{testComponentOfferingAssociationAttemptId}": {
      "put": {
        "summary": "PUT /test-component-offering-associations/{testComponentOfferingAssociationId}/test-component-offering-association-attempt/{testComponentOfferingAssociationAttemptId}",
        "description": "PUT a single test component offering association attempt to enrol a person on a specific attempt or update information on that enrolment that can later be retrieved.\nAn additional path is supported for systems that need to process attempt results based on the association ID the attempt belongs to.\n",
        "operationId": "insertOrReplaceTestComponentOfferingAssociationAttemptByAssociationIdAndAttemptId",
        "tags": [
          "test component offering association attempts"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "testComponentOfferingAssociationAttemptId",
            "in": "path",
            "description": "The id of the attempt to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestComponentOfferingAssociationAttempt"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offering-associations-attempt/{testComponentOfferingAssociationAttemptId}": {
      "get": {
        "summary": "GET /test-component-offering-association-attempts/{testComponentOfferingAssociationAttemptId}",
        "operationId": "listTestComponentOfferingAssociationAttemptById",
        "description": "Get a single test component offering association attempt.",
        "tags": [
          "test component offering association attempts"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationAttemptId",
            "in": "path",
            "description": "Test Component Offering Association Attempt ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestComponentOfferingAssociationAttemptFull"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /test-component-offering-association-attempts/{testComponentOfferingAssociationAttemptId}",
        "description": "PUT a single test component offering association attempt to enrol a person in a specific attempt or \nupdate information on that enrolment that can later be retrieved.\n",
        "operationId": "insertOrReplaceTestComponentOfferingAssociationAttemptById",
        "tags": [
          "test component offering association attempts"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationAttemptId",
            "in": "path",
            "description": "The id of the association to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestComponentOfferingAssociationAttemptFull"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /test-component-offering-association-attempts/{testComponentOfferingAssociationAttemptId}",
        "operationId": "partialUpdateTestComponentOfferingAssociationAttemptById",
        "description": "Update the result of an attempt. Other elements of the attempt object COULD \nalso be PATCHED. But are not likely and have therefore not been included in this endpoint.\nImplementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, \na specialized media type `application/merge-patch+json` for partial resource representation \nto update parts of resource objects.\n",
        "tags": [
          "test component offering association attempts"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingAssociationAttemptId",
            "in": "path",
            "description": "The id of the association attempt to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "properties": {
                  "result": {
                    "$ref": "#/components/schemas/Result"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AssociationId"
                    },
                    {
                      "$ref": "#/components/schemas/PostResponse"
                    },
                    {
                      "properties": {
                        "state": {
                          "$ref": "#/components/schemas/associationState"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offerings/{testComponentOfferingId}": {
      "get": {
        "summary": "GET /test-component-offerings/{testComponentOfferingId}",
        "operationId": "listTestComponentOfferingsById",
        "description": "Get a single learnig component offering.",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingId",
            "in": "path",
            "description": "Test Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "test_component",
                  "organisation",
                  "rooms"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestComponentOffering"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "put": {
        "summary": "PUT /test-component-offerings/{testComponentOfferingId}",
        "operationId": "replaceTestComponentOfferingsById",
        "description": "Update all attributes of a single test component offering.",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingId",
            "in": "path",
            "description": "Test Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestComponentOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      },
      "patch": {
        "summary": "PATCH /test-component-offerings/{testComponentOfferingId}",
        "operationId": "partialUpdateTestComponentOfferingsById",
        "description": "Change attributes of a single test component offering.",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingId",
            "in": "path",
            "description": "Test Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestComponentOffering"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "202": {
            "description": "Accepted"
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offerings/{testComponentOfferingId}/groups": {
      "get": {
        "summary": "GET /test-component-offerings/{testComponentOfferingId}/groups",
        "operationId": "listGroupsByTestComponentOfferingId",
        "description": "Get an ordered list of all groups related to a test component offering, ordered by name.",
        "tags": [
          "groups"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingId",
            "in": "path",
            "description": "Test Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "name": "groupType",
            "in": "query",
            "description": "Filter by group type",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/groupType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Group"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-component-offerings/{testComponentOfferingId}/test-component-offering-associations": {
      "get": {
        "summary": "GET /test-component-offerings/{testComponentOfferingId}/test-component-offering-associations",
        "operationId": "listTestComponentOfferingAssociationsByTestComponentOfferingId",
        "description": "Get a list of all test component offering associations related to the test component offering based on its ID.",
        "tags": [
          "test component offering associations"
        ],
        "parameters": [
          {
            "name": "testComponentOfferingId",
            "in": "path",
            "description": "Test Component Offering ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "name": "role",
            "in": "query",
            "description": "Filter by role",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationRole"
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Filter by state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/associationState"
            }
          },
          {
            "name": "resultState",
            "in": "query",
            "description": "Filter by result state",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/resultState"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOfferingAssociation"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-components": {
      "get": {
        "summary": "GET /test-components",
        "operationId": "listTestComponents",
        "description": "Get a list of all test components, ordered by name.",
        "tags": [
          "test components"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponent"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-components/{testComponentId}": {
      "get": {
        "summary": "GET /test-components/{testComponentId}",
        "operationId": "listTestComponentById",
        "description": "Get a single test component.",
        "tags": [
          "test components"
        ],
        "parameters": [
          {
            "name": "testComponentId",
            "in": "path",
            "description": "component ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "expand",
            "in": "query",
            "explode": false,
            "description": "Optional properties to expand, separated by a comma",
            "required": false,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "course",
                  "organisation"
                ]
              }
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/consumer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestComponent"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    },
    "/test-components/{testComponentId}/test-component-offerings": {
      "get": {
        "summary": "GET /test-components/{testComponentId}/test-component-offerings",
        "operationId": "listOfferingsByTestComponentId",
        "description": "Get a list of all offerings for this test component, ordered chronologically.",
        "tags": [
          "test component offerings"
        ],
        "parameters": [
          {
            "name": "testComponentId",
            "in": "path",
            "description": "Test Component ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/pageNumber"
          },
          {
            "$ref": "#/components/parameters/consumer"
          },
          {
            "$ref": "#/components/parameters/filterQuery"
          },
          {
            "$ref": "#/components/parameters/filterQueryOr"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/teachingLanguage"
          },
          {
            "$ref": "#/components/parameters/offeringState"
          },
          {
            "name": "resultExpected",
            "in": "query",
            "description": "Filter by resultExpected",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Filter all offerings by providing a minimum start moment (dateTime) for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=<today>`).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "description": "Filter all offerings by providing a maximum end moment (dateTime) for the corresponding academic session, RFC3339 (full-date).",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    {
                      "type": "object",
                      "required": [
                        "items"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/TestComponentOffering"
                          }
                        },
                        "ext": {
                          "$ref": "#/components/schemas/Ext"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ErrorBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/ErrorUnauthorized"
          },
          "403": {
            "$ref": "#/components/responses/ErrorForbidden"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNotFound"
          },
          "405": {
            "$ref": "#/components/responses/ErrorMethodNotAllowed"
          },
          "406": {
            "$ref": "#/components/responses/ErrorNotAcceptable"
          },
          "429": {
            "$ref": "#/components/responses/ErrorTooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ErrorInternalServerError"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Service": {
        "type": "object",
        "description": "A metadata set providing details on the provider of this OOAPI implementation",
        "required": [
          "contactEmail",
          "specification"
        ],
        "properties": {
          "contactEmail": {
            "type": "string",
            "description": "Contact e-mail address of the service owner",
            "format": "email",
            "maxLength": 256,
            "example": "admin@universiteitvanharderwijk.nl"
          },
          "specification": {
            "type": "string",
            "description": "URL of the API specification (YAML or JSON, compliant with [Open API Specification v3](https://github.com/OAI/OpenAPI-Specification/))",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://rawgit.com/open-education-api/specification/v3/docs.html#tag/course-offerings/paths/~1course-offerings/get"
          },
          "documentation": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL of the API documentation, including general terms and privacy statement",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://open-education-api.github.io/specification/v4/docs.html"
          },
          "supportedConsumers": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "description": "Object for communicating data to a specific consumer (destination). This object has no relationship with the consumer query parameter.",
              "required": [
                "consumerKey",
                "version"
              ],
              "properties": {
                "consumerKey": {
                  "description": "The key of the consumer (destination) for which this information is intended. See the consumer registry for more information.",
                  "type": "string",
                  "example": "nl-test-admin"
                },
                "version": {
                  "description": "the version number of this consumer",
                  "type": "string",
                  "example": "0.9.3"
                }
              }
            }
          },
          "supportedOperations": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "description": "Object for communicating VERBS and endpoints that are supported by this implementation.",
              "required": [
                "verbs",
                "path"
              ],
              "properties": {
                "verbs": {
                  "type": "array",
                  "description": "The type of method or verb.",
                  "items": {
                    "type": "string",
                    "enum": [
                      "GET",
                      "PUT",
                      "PATCH",
                      "POST"
                    ],
                    "example": "GET"
                  }
                },
                "path": {
                  "description": "the path of the operation",
                  "type": "string",
                  "format": "uri-reference",
                  "maxLength": 2048,
                  "example": "/courses"
                }
              }
            }
          },
          "supportedExpands": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "description": "Object for communicating the expands and paths for which they are implemented.",
              "required": [
                "expandableObjects",
                "path"
              ],
              "properties": {
                "expandableObjects": {
                  "description": "the objects that are expandable for a specific path",
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/expandableObjects"
                  }
                },
                "path": {
                  "description": "the path of the operation",
                  "type": "string",
                  "format": "uri-reference",
                  "maxLength": 2048,
                  "example": "/courses"
                }
              }
            }
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "AcademicSession": {
        "type": "object",
        "description": "A named period of time that can be used to communicate the various schedules and time periods an institution recognizes and uses to organise their education. AcademicSessions can be nested.\nOfferings MAY be linked to a specific AcademicSession to indicate that the specified Offering takes place during the AcademicSession, however this is not mandatory.\n",
        "required": [
          "academicSessionId",
          "academicSessionType",
          "primaryCode",
          "name",
          "startDateTime",
          "endDateTime"
        ],
        "properties": {
          "academicSessionId": {
            "type": "string",
            "description": "Unique id for this academic session",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "academicSessionType": {
            "$ref": "#/components/schemas/academicSessionType"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for this academic session. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "identifier",
              "code": "2012-Q1"
            }
          },
          "name": {
            "type": "array",
            "description": "The name of this academic session",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Autumn term 2020"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation or internal code used to identify this AcademicSession",
            "maxLength": 256,
            "example": "SPRING-2026"
          },
          "startDateTime": {
            "type": "string",
            "description": "The moment on which this academic session starts, RFC3339 (full-date)",
            "format": "date-time",
            "example": "2025-09-28T08:30:00+01:00"
          },
          "endDateTime": {
            "type": "string",
            "description": "The moment on which this academic session ends, RFC3339 (full-date)",
            "format": "date-time",
            "example": "2025-09-28T08:30:00+01:00"
          },
          "parentId": {
            "description": "The identifier of the parent academicSession for this session (e.g. Autumn\nterm 20xx where the current session is week 40).\nWhen the client does not request expansion of `parent`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "parent": {
            "description": "The expanded parent academicSession object of this session (e.g. Autumn\nterm 20xx where the current session is week 40).\nWhen the client requests expansion of `parent`, the full expanded\nacademicSession object MUST be returned here instead of only the identifier.\nIf no parent is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/AcademicSession"
              }
            ]
          },
          "childIds": {
            "description": "The list of identifiers of child academicSessions of this session (e.g. all\nacademic sessions in Autumn term 20xx).\nWhen the client does not request expansion of `children`, only these\nidentifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/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": "#/components/schemas/Identifier"
            }
          },
          "children": {
            "description": "The expanded child academicSession objects of this session (e.g. all\nacademic sessions in Autumn term 20xx).\nWhen the client requests expansion of `children`, the full expanded\nacademicSession objects MUST be returned here instead of only the identifiers.\nIf no child sessions are defined, this value is `null`.\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/AcademicSession"
            }
          },
          "yearId": {
            "description": "The identifier of the top-level academicSession year for this session\n(e.g. 20xx where the current session is week 40 of a semester).\nWhen the client does not request expansion of `year`, only this identifier\nis returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "year": {
            "description": "The expanded top-level academicSession year object for this session\n(e.g. 20xx where the current session is week 40 of a semester).\nWhen the client requests expansion of `year`, the full expanded\nacademicSession object MUST be returned here instead of only the identifier.\nIf no top-level year is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/AcademicSession"
              }
            ]
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            }
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "Building": {
        "type": "object",
        "description": "An object describing a building and the properties of a building.",
        "required": [
          "buildingId",
          "name",
          "primaryCode"
        ],
        "properties": {
          "buildingId": {
            "type": "string",
            "description": "Unique id of this building",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-331214174000"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for this building. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "buildingId",
              "code": "45"
            }
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation of the name of this building",
            "maxLength": 256,
            "example": "Bb"
          },
          "name": {
            "type": "array",
            "description": "The name of this building",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Beatrix building"
              }
            ]
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this building.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "external rooms location for exams"
              }
            ]
          },
          "address": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Address"
              },
              {
                "type": "null"
              }
            ]
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            },
            "example": [
              {
                "codeType": "bagId",
                "code": "0344100000139910"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "LearningComponent": {
        "type": "object",
        "description": "A component is a part of a course",
        "required": [
          "componentId",
          "componentType",
          "name",
          "primaryCode"
        ],
        "properties": {
          "componentId": {
            "type": "string",
            "description": "Unique id of this component",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for this component. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "componentCode",
              "code": "INFOMQNM-WRKCLG-1"
            }
          },
          "componentType": {
            "$ref": "#/components/schemas/learningComponentType"
          },
          "name": {
            "type": "array",
            "description": "The name of this component",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Written test for INFOMQNM"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation of this component",
            "maxLength": 256,
            "example": "Test-INFOMQNM"
          },
          "modesOfDelivery": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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)?)?$",
            "example": "P1DT10H30M"
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this component.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "'Prove executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms Able to design suitable research studies (e.g., choose between within and between subject designs) Define/apply/design metrics and scales Define/produce materials (e.g., stimuli and questionnaires) Define protocols for research studies Understands and take in account concepts of reliability and validity Analyse and improve methods and analysis of published scientific articles Able to deliver scientific reports\nProve executable knowledge of ­­­statistics, including: Handle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates) Data preparation (e.g., coding and feature selection) Reason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors) Select an appropriate sampling method (e.g., stratified) Perform parametric tests (e.g., repeated measures (M)ANOVA) Perform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)'\n"
              }
            ]
          },
          "teachingLanguages": {
            "type": [
              "array",
              "null"
            ],
            "description": "The languages in which this learning 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 learning component.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/Language"
            }
          },
          "learningOutcomeIds": {
            "description": "The identifiers of the learning outcomes related to this learning component.\nWhen the client does not request expansion of `learningOutcomes`, only these\nidentifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Identifier"
            }
          },
          "learningOutcomes": {
            "description": "The expanded learning outcome objects related to this learning component.\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": {
              "type": [
                "object",
                "null"
              ],
              "allOf": [
                {
                  "$ref": "#/components/schemas/LearningOutcome"
                }
              ]
            }
          },
          "enrolment": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "description": "The extra information that is provided for enrolment",
            "example": [
              {
                "language": "en-GB",
                "value": "enrolment through SIS. [The limited implementation of Git Hub Markdown syntax](https://openonderwijsapi.nl/v6.0/#/technical/formatting-text) MAY be used for rich text representation."
              }
            ]
          },
          "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"
            },
            "example": [
              "book to be announced",
              "on-line resource x"
            ]
          },
          "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": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Exam on campus"
              }
            ]
          },
          "addresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Addresses for this component",
            "items": {
              "$ref": "#/components/schemas/Address"
            }
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            }
          },
          "parentId": {
            "description": "The identifier of the parent learningComponent of which the current learningComponent is a child.\nWhen the client does not request expansion of `parent`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "parent": {
            "description": "The expanded parent learningComponent of which the current learningComponent is a child.\nWhen the client requests expansion of `parent`, the full expanded learningComponent object MUST be returned here instead of only the identifier.\nIf no parent is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/LearningComponent"
              }
            ]
          },
          "childIds": {
            "description": "The identifiers of the learningComponents which are a part of this learningComponent (e.g. combined tests).\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/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": "#/components/schemas/Identifier"
            }
          },
          "children": {
            "description": "The expanded learningComponent objects which are a part of this learningComponent (e.g. combined tests).\nWhen the client requests expansion of `children`, the full expanded learningComponent objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": [
                "object",
                "null"
              ],
              "allOf": [
                {
                  "$ref": "#/components/schemas/LearningComponent"
                }
              ]
            }
          },
          "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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "course": {
            "description": "The expanded course object of which this component is a part.\nWhen the client requests expansion of `course`, the full expanded course object MUST be returned here instead of only the identifier.\nIf no course is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Course"
              }
            ]
          },
          "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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "organisation": {
            "description": "The expanded organisation object which provides this component.\nWhen the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no organisation is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Organisation"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "TestComponent": {
        "type": "object",
        "description": "A component is a part of a course",
        "required": [
          "componentId",
          "componentType",
          "name",
          "primaryCode"
        ],
        "properties": {
          "componentId": {
            "type": "string",
            "description": "Unique id of this component",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for this component. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "componentCode",
              "code": "INFOMQNM-WRKCLG-1"
            }
          },
          "componentType": {
            "$ref": "#/components/schemas/testComponentType"
          },
          "name": {
            "type": "array",
            "description": "The name of this component",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Written test for INFOMQNM"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation of this component",
            "maxLength": 256,
            "example": "Test-INFOMQNM"
          },
          "modesOfDelivery": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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)?)?$",
            "example": "PT1H30M"
          },
          "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)?)?$",
            "example": "PT30M"
          },
          "resultValueType": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/resultValueType"
              },
              {
                "type": "null"
              }
            ]
          },
          "attempts": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The number of attempts that are allowed for this component within one offering.",
            "example": 2
          },
          "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",
            "example": "5.5"
          },
          "state": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/componentState"
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this component.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "'Prove executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms Able to design suitable research studies (e.g., choose between within and between subject designs) Define/apply/design metrics and scales Define/produce materials (e.g., stimuli and questionnaires) Define protocols for research studies Understands and take in account concepts of reliability and validity Analyse and improve methods and analysis of published scientific articles Able to deliver scientific reports\nProve executable knowledge of statistics, including: Handle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates) Data preparation (e.g., coding and feature selection) Reason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors) Select an appropriate sampling method (e.g., stratified) Perform parametric tests (e.g., repeated measures (M)ANOVA) Perform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)'\n"
              }
            ]
          },
          "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": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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": "#/components/schemas/LearningOutcome",
              "title": "LearningOutcome"
            }
          },
          "enrolment": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "description": "The extra information that is provided for enrolment",
            "example": [
              {
                "language": "en-GB",
                "value": "enrolment through SIS. [The limited implementation of Git Hub Markdown syntax](https://openonderwijsapi.nl/v6.0/#/technical/formatting-text) MAY be used for rich text representation."
              }
            ]
          },
          "resources": {
            "type": [
              "array",
              "null"
            ],
            "description": "An overview of the literature and other resources that are allowed during this test",
            "items": {
              "type": "string"
            },
            "example": [
              "Scientific calculator",
              "Criminal code law book"
            ]
          },
          "assessment": {
            "type": [
              "array",
              "null"
            ],
            "description": "A description of the way this test is taken.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Exam on campus"
              }
            ]
          },
          "addresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Addresses for this component",
            "items": {
              "$ref": "#/components/schemas/Address"
            }
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "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",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/TestComponent"
              }
            ]
          },
          "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://openonderwijsapi.nl/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": "#/components/schemas/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": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "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",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Course"
              }
            ],
            "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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "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",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Organisation"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "LearningComponentOffering": {
        "allOf": [
          {
            "$ref": "#/components/schemas/LearningComponentOfferingId"
          },
          {
            "$ref": "#/components/schemas/OfferingProperties"
          },
          {
            "type": "object",
            "description": "startDateTime and endDateTime of an offering are to be provided at least in the state `active`. In all other states the\ntimes on the academic session should indicate in what timeframe the offering will or should have been available.\n",
            "properties": {
              "startDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering starts, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2020-12-15T10:00:00+01:00"
              },
              "endDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering ends, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2020-12-16T18:00:00+01:00"
              },
              "resultWeight": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "The result weight of this offering",
                "minimum": 0,
                "maximum": 100,
                "example": 100
              },
              "addresses": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Addresses for this offering",
                "items": {
                  "$ref": "#/components/schemas/Address"
                }
              },
              "priceInformation": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Price information for this offering.",
                "items": {
                  "$ref": "#/components/schemas/Cost"
                }
              },
              "roomIds": {
                "description": "The identifiers of the rooms for this offering.\nWhen the client does not request expansion of `rooms`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/Identifier"
                }
              },
              "rooms": {
                "description": "The expanded room objects for this offering. \nWhen the client requests expansion of `rooms`, the full expanded room objects MUST be returned here instead of only the identifiers. \nIf no rooms are defined, this value is `null`.\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Room"
                    }
                  ]
                }
              },
              "learningComponentId": {
                "description": "The identifier of the learningComponent that is offered in this learningComponent offering.\nWhen the client does not request expansion of `learningComponent`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "learningComponent": {
                "description": "The expanded learningComponent object that is offered in this learningComponent offering.\nWhen the client requests expansion of `learningComponent`, the full expanded learningComponent object MUST be returned here instead of only the identifier.\nIf no learningComponent is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/LearningComponent"
                  }
                ]
              },
              "courseOfferingIds": {
                "description": "The identifiers of the courseOfferings to which this learningComponent offering is related.\nWhen the client does not request expansion of `courseOfferings`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/Identifier"
                }
              },
              "courseOfferings": {
                "description": "The expanded courseOffering objects to which this learningComponent offering is related.\nWhen the client requests expansion of `courseOfferings`, the full expanded courseOffering objects MUST be returned here instead of only the identifiers.\nIf no courseOfferings are defined, this value is `null`.\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/CourseOffering"
                    }
                  ]
                }
              },
              "organisationId": {
                "description": "The identifier of the organisation that manages this component offering.\nWhen the client does not request expansion of `organisation`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "organisation": {
                "description": "The expanded organisation object that manages this component offering.\nWhen the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no organisation is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Organisation"
                  }
                ]
              }
            }
          }
        ]
      },
      "LearningComponentOfferingAssociation": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AssociationId"
          },
          {
            "$ref": "#/components/schemas/AssociationProperties"
          },
          {
            "type": "object",
            "anyOf": [
              {
                "required": [
                  "personId",
                  "learningComponentOfferingId"
                ]
              },
              {
                "title": "With expanded learning component offering",
                "required": [
                  "personId",
                  "learningComponentOffering"
                ]
              },
              {
                "title": "With expanded person",
                "required": [
                  "person",
                  "learningComponentOfferingId"
                ]
              },
              {
                "title": "With expanded person and learning component offering",
                "required": [
                  "person",
                  "learningComponentOffering"
                ]
              }
            ],
            "properties": {
              "result": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/LearningComponentOfferingAssociationResult"
                  }
                ]
              },
              "attendance": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/associationAttendance"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "personId": {
                "description": "The identifier of the person referenced here.\nWhen the client does not request expansion of `person`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "person": {
                "description": "The expanded person object referenced here.\nWhen the client requests expansion of `person`, the full expanded person object MUST be returned here instead of only the identifier.\nIf no person is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Person"
                  }
                ]
              },
              "learningComponentOfferingId": {
                "description": "The identifier of the learningComponentOffering referenced here.\nWhen the client does not request expansion of `offering`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "learningComponentOffering": {
                "description": "The expanded learningComponentOffering object referenced here.\nWhen the client requests expansion of `offering`, the full expanded learningComponentOffering object MUST be returned here instead of only the identifier.\nIf no offering is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/LearningComponentOffering"
                  }
                ]
              }
            }
          }
        ]
      },
      "TestComponentOffering": {
        "allOf": [
          {
            "$ref": "#/components/schemas/TestComponentOfferingId"
          },
          {
            "$ref": "#/components/schemas/OfferingProperties"
          },
          {
            "type": "object",
            "description": "startDateTime and endDateTime of an offering must be provided at least in the state `active`. In all other states the\ntimes on the academic session should indicate in what timeframe the offering will or should have been available.\n",
            "properties": {
              "startDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering starts, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2025-03-01T08:30:00+01:00"
              },
              "endDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering ends, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2025-07-19T08:30:00+01:00"
              },
              "resultWeight": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "The result weight of this offering",
                "minimum": 0,
                "maximum": 100,
                "example": 100
              },
              "addresses": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Addresses for this offering",
                "items": {
                  "$ref": "#/components/schemas/Address"
                }
              },
              "priceInformation": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Price information for this offering.",
                "items": {
                  "$ref": "#/components/schemas/Cost"
                }
              },
              "roomIds": {
                "description": "The identifiers of the rooms for this offering.\nWhen the client does not request expansion of `rooms`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/Identifier"
                }
              },
              "rooms": {
                "description": "The expanded room objects for this offering. \nWhen the client requests expansion of `rooms`, the full expanded room objects MUST be returned here instead of only the identifiers. \nIf no rooms are defined, this value is `null`.\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Room"
                    }
                  ]
                }
              },
              "componentId": {
                "description": "The identifier of the component that is offered in this component offering.\nWhen the client does not request expansion of `component`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "component": {
                "description": "The expanded component that is offered in this component offering.\nWhen the client requests expansion of `component`, the full component object MUST be returned here instead of only the identifier.\nIf no component is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/TestComponent"
                  }
                ]
              },
              "courseOfferingIds": {
                "description": "The identifiers of the course offerings to which this test component offering is related.\nWhen the client does not request expansion of `courseOfferings`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/Identifier",
                  "title": "courseOfferingId"
                }
              },
              "courseOfferings": {
                "description": "The expanded course offering objects to which this test component offering is related.\nWhen the client requests expansion of `courseOfferings`, the full course offering objects MUST be returned here instead of only the identifiers.\nIf no course offerings are defined, this value is `null`.\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/CourseOffering"
                }
              },
              "organisationId": {
                "description": "The identifier of the organisation that manages this component offering.\nWhen the client does not request expansion of `organisation`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "organisation": {
                "description": "The expanded organisation object that manages this component offering.\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",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Organisation"
                  }
                ]
              },
              "documents": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Documents that are related to the test component offering. E.g. instructions, assignment, reports, etc.\n",
                "items": {
                  "type": "object",
                  "required": [
                    "documentId",
                    "documentType",
                    "documentName"
                  ],
                  "properties": {
                    "documentId": {
                      "type": "string",
                      "description": "The unique identifier of the document",
                      "example": "12345678-1234-1234-1234-123456789012"
                    },
                    "documentType": {
                      "$ref": "#/components/schemas/documentType"
                    },
                    "documentName": {
                      "type": "string",
                      "description": "The name of the document",
                      "example": "Assignment 1.pdf"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "TestComponentOfferingAssociation": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AssociationId"
          },
          {
            "$ref": "#/components/schemas/AssociationProperties"
          },
          {
            "type": "object",
            "anyOf": [
              {
                "required": [
                  "personId",
                  "testComponentOfferingId"
                ]
              },
              {
                "title": "With expanded test component offering",
                "required": [
                  "personId",
                  "testComponentOffering"
                ]
              },
              {
                "title": "With expanded person",
                "required": [
                  "person",
                  "testComponentOfferingId"
                ]
              },
              {
                "title": "With expanded test component offering and person",
                "required": [
                  "person",
                  "testComponentOffering"
                ]
              }
            ],
            "properties": {
              "extraDuration": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The extra duration of this component for this specific candidate. 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)?)?$",
                "example": "PT20M"
              },
              "requiredPersonalNeeds": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "The additional facilities or resources needed by a person to make the component accessible and usable.",
                "items": {
                  "$ref": "#/components/schemas/personalNeed"
                }
              },
              "attempt": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "The attempt this association is linked to.",
                "example": 2
              },
              "attendance": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/associationAttendance"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "irregularities": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "The irregularities that are reported for this association. This is a list of the irregularities that are reported for this association.",
                "items": {
                  "type": "string"
                }
              },
              "documents": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Documents that are related to the test component offering association. E.g. handed in documents, plagiarism reports, test made, etc.\n",
                "items": {
                  "$ref": "#/components/schemas/Document"
                }
              },
              "result": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TestComponentOfferingAssociationResult"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "personId": {
                "description": "The identifier of the person referenced here.\nWhen the client does not request expansion of `person`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "person": {
                "description": "The expanded person object referenced here.\nWhen the client requests expansion of `person`, the full person object MUST be returned here instead of only the identifier.\nIf no person is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Person"
                  }
                ],
                "title": "Person"
              },
              "testComponentOfferingId": {
                "description": "The identifier of the testComponentOffering referenced here.\nWhen the client does not request expansion of `offering`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "testComponentOffering": {
                "description": "The expanded testComponentOffering object referenced here.\nWhen the client requests expansion of `testComponentOffering`, the full TestComponentOffering object MUST be returned here instead of only the identifier.\nIf no testComponentOffering is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/TestComponentOffering"
                  }
                ]
              },
              "attemptIds": {
                "description": "The identifiers of the attempts related to this testComponentOffering association.\nWhen the client does not request expansion of `attempts`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/Identifier",
                  "title": "attemptId"
                }
              },
              "attempts": {
                "description": "The expanded attempt objects related to this testComponentOffering association.\nWhen the client requests expansion of `attempts`, the full TestComponentOfferingAssociationAttempt objects MUST be returned here instead of only the identifiers.\nIf no attempts are defined, this value is `null`.\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/TestComponentOfferingAssociationAttempt"
                }
              }
            }
          }
        ]
      },
      "Course": {
        "allOf": [
          {
            "$ref": "#/components/schemas/CourseId"
          },
          {
            "$ref": "#/components/schemas/CourseProperties"
          },
          {
            "type": "object",
            "properties": {
              "validFrom": {
                "description": "The first day and time this course is valid (inclusive).",
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "example": "2025-09-01T09:00:00+01:00"
              },
              "validTo": {
                "description": "The day and time this course ceases to be valid (e.g. exclusive).",
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "example": "2025-09-01T09:00:00+01:00"
              }
            }
          }
        ]
      },
      "CourseOffering": {
        "allOf": [
          {
            "$ref": "#/components/schemas/CourseOfferingId"
          },
          {
            "$ref": "#/components/schemas/OfferingProperties"
          },
          {
            "type": "object",
            "description": "startDateTime and endDateTime of an offering are to be provided at least in the state `active`. In all other states the\ntimes on the academic session should indicate in what timeframe the offering will or should have been available.\n",
            "title": "CourseOffering",
            "properties": {
              "startDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering starts, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2019-08-21T08:30:00+01:00"
              },
              "endDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering ends, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2019-10-23T22:59:59+01:00"
              },
              "flexibleEntryPeriodStartDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Use this attribute for courses that allow participants who have already\nenrolled to begin their participation at different moments without\nmissing essential content. This attribute MUST be used in combination\nwith `flexibleEntryPeriodEndDateTime`.\n",
                "format": "date-time",
                "example": "2019-08-21T09:00:00+01:00"
              },
              "flexibleEntryPeriodEndDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "If this is a course wherein participants who have already enrolled can\nstart at various moments without missing any essential content, use this\nattribute in combination with `flexibleEntryPeriodStartDateTime`.\n",
                "format": "date",
                "example": "2019-10-21T22:59:59+01:00"
              },
              "addresses": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Addresses for this offering",
                "items": {
                  "$ref": "#/components/schemas/Address"
                }
              },
              "priceInformation": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Price information for this offering.",
                "items": {
                  "$ref": "#/components/schemas/Cost"
                }
              },
              "courseId": {
                "description": "The identifier of the course that is offered in this course offering.\nWhen the client does not request expansion of `course`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "course": {
                "description": "The expanded course object that is offered in this course offering.\nWhen the client requests expansion of `course`, the full expanded\ncourse object MUST be returned here instead of only the identifier.\nIf no course is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Course"
                  }
                ]
              },
              "programmeOfferingIds": {
                "description": "An array of 0 or more identifiers of programmeOfferings that this\ncourse offering is related to.\nWhen the client does not request expansion of `programmeOfferings`,\nonly these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/Identifier"
                }
              },
              "programmeOfferings": {
                "description": "An array of 0 or more expanded programmeOffering objects that this\ncourse offering is related to.\nWhen the client requests expansion of `programmeOfferings`, the full\nexpanded programmeOffering objects MUST be returned here instead of\nonly the identifiers.\nIf no programmeOfferings are defined, this value is `null`.\n",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/ProgrammeOffering"
                }
              },
              "organisationId": {
                "description": "The identifier of the organisation that manages this course offering.\nWhen the client does not request expansion of `organisation`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "organisation": {
                "description": "The expanded organisation object that manages this course offering.\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",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Organisation"
                  }
                ]
              }
            }
          }
        ]
      },
      "CourseOfferingAssociation": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AssociationId"
          },
          {
            "$ref": "#/components/schemas/AssociationProperties"
          },
          {
            "type": "object",
            "anyOf": [
              {
                "required": [
                  "courseOfferingId",
                  "personId"
                ]
              },
              {
                "title": "With expanded person",
                "required": [
                  "courseOfferingId",
                  "person"
                ]
              },
              {
                "title": "With expanded course offering and person",
                "required": [
                  "courseOffering",
                  "person"
                ]
              },
              {
                "title": "With expanded course offering",
                "required": [
                  "courseOffering",
                  "personId"
                ]
              }
            ],
            "properties": {
              "studyLoad": {
                "description": "Only required when the studyload for the individual student/enrolment is different \nfrom the studyload of the course offering.\n",
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/StudyLoadDescriptor"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "result": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CourseOfferingAssociationResult"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "courseOfferingId": {
                "description": "The identifier of the courseOffering referenced here.\nWhen the client or server does not expand `offering`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "courseOffering": {
                "description": "The expanded courseOffering object referenced here.\nWhen the client or server expands `offering`, the full expanded\ncourseOffering object MUST be returned here instead of only the\nidentifier.\nIf no offering is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CourseOffering"
                  }
                ]
              },
              "personId": {
                "description": "The identifier of the person referenced here.\nWhen the client or server does not expand `person`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "person": {
                "description": "The expanded person object referenced here.\nWhen the client or server expands `person`, the full expanded\nperson object MUST be returned here instead of only the identifier.\nIf no person is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Person"
                  }
                ]
              }
            }
          }
        ]
      },
      "Group": {
        "allOf": [
          {
            "$ref": "#/components/schemas/GroupId"
          },
          {
            "type": "object",
            "description": "A group is simply a collection of persons. Groups can be used to accommodate various use cases.\nGroups MAY optionally have a relation to an offering, however the meaning of such relations is left unspecified and is left up to the implementer.\n",
            "required": [
              "groupType",
              "name",
              "primaryCode"
            ],
            "properties": {
              "primaryCode": {
                "description": "The primary human readable identifier for this group. This is often the source identifier as defined by the institution.",
                "$ref": "#/components/schemas/IdentifierEntry",
                "example": {
                  "codeType": "groupCode",
                  "code": "group-abc987"
                }
              },
              "groupType": {
                "$ref": "#/components/schemas/groupType"
              },
              "name": {
                "type": "array",
                "description": "The name of this group",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/LanguageTypedString"
                },
                "example": [
                  {
                    "language": "en-GB",
                    "value": "statistics students"
                  }
                ]
              },
              "description": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "The description of this group",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/LanguageTypedString"
                },
                "example": [
                  {
                    "language": "en-GB",
                    "value": "The group of students that follow statistics classes"
                  }
                ]
              },
              "startDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this group starts being active, RFC3339 (date-time).\nGroups can be ordered in time through the academicSession. The start and \nend date and time fields SHOULD always contain the most accurate dates.\n",
                "format": "date-time",
                "example": "2025-05-30T20:00:00+01:00"
              },
              "endDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this group ends being active, RFC3339 (date-time)\nGroups can be ordered in time through the academicSession. The start and \nend date and time fields SHOULD always contain the most accurate dates.\n",
                "format": "date-time",
                "example": "2025-06-30T20:00:00+01:00"
              },
              "personCount": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "The number of persons that are member of this group",
                "format": "int32",
                "minimum": 0,
                "example": 183
              },
              "otherCodes": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "An array of additional human readable codes/identifiers for the entity being described.",
                "items": {
                  "$ref": "#/components/schemas/IdentifierEntry"
                }
              },
              "consumer": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/Consumer"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "organisationId": {
                "description": "The identifier of the organisation that manages this group.\nWhen the client does not request expansion of `organisation`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "organisation": {
                "description": "The expanded organisation object that manages this group.\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",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Organisation"
                  }
                ]
              },
              "academicSessionId": {
                "description": "The identifier of the academicSession for which this group is intended.\nWhen the client does not request expansion of `academicSession`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "academicSession": {
                "description": "The expanded academicSession object for which this group is intended.\nWhen the client requests expansion of `academicSession`, the full expanded\nacademicSession object MUST be returned here instead of only the identifier.\nIf no academicSession is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/AcademicSession"
                  }
                ]
              },
              "offeringIds": {
                "description": "The offering identifiers (0..N) associated with this group.\n",
                "oneOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "minProperties": 1,
                      "maxProperties": 1,
                      "additionalProperties": false,
                      "properties": {
                        "courseOfferingId": {
                          "$ref": "#/components/schemas/courseOfferingId"
                        },
                        "programmeOfferingId": {
                          "$ref": "#/components/schemas/programmeOfferingId"
                        },
                        "learningComponentOfferingId": {
                          "$ref": "#/components/schemas/learningComponentOfferingId"
                        },
                        "testComponentOfferingId": {
                          "$ref": "#/components/schemas/testComponentOfferingId"
                        }
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "ext": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/Ext"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          }
        ]
      },
      "Membership": {
        "type": "object",
        "description": "A membership contains the information on a membership of a person for a specific group",
        "required": [
          "personId",
          "groupId",
          "role",
          "state"
        ],
        "properties": {
          "personId": {
            "type": "string",
            "description": "Unique id for this membership (this is the personID since there is a 1-1 relationship between membership of a group and a person) item",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-122564174000"
          },
          "groupId": {
            "type": "string",
            "description": "Id for the group where the person has a membership",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-122564174000"
          },
          "startDateTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "The moment from which the person participates in this membership, RFC3339 (date-time)",
            "format": "date-time",
            "example": "2020-09-28T08:30:00+01:00"
          },
          "endDateTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "The moment until which this person participates in this membership (when the membership stops), RFC3339 (date-time)",
            "format": "date-time",
            "example": "2020-09-30T20:00:00+01:00"
          },
          "state": {
            "$ref": "#/components/schemas/membershipState"
          },
          "role": {
            "$ref": "#/components/schemas/membershipRole"
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "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",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for this learning outcome. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "learningOutcomeCode",
              "code": "LO 2.1"
            }
          },
          "name": {
            "type": "array",
            "description": "The name of this learning outcome",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Describe the differing views, within society, relating to the scientific uses of animals and recognize the need to respect these.\n"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation or internal code used to identify this LearningOutcome",
            "maxLength": 256,
            "example": "LO12_INFO_RET"
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this learning outcome.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "The candidate should have retained the information that they\nhave been taught and be able to:\n1. Relate opinions as voiced collectively or individually by:\n  * animal protection societies\n  * patient support societies\n  * establishments and researchers\n  * industry, including pharma, biotech and food\n  * people with personal, cultural or religious beliefs;\n2. Recognize the fundamental right of freedom of speech;\n3. Recall different perspectives which enable an individual to\n  determine their own opinion on the use of animals for scientific\n  purposes;\n4. Explain how different perspectives drive forward advancements\n  in animal welfare, legislation and science.\n(based on: https://repub.eur.nl/pub/132564/Repub_132564_O-A.pdf)\n"
              }
            ]
          },
          "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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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": {
              "type": [
                "object",
                "null"
              ],
              "allOf": [
                {
                  "$ref": "#/components/schemas/LearningOutcome"
                }
              ]
            }
          },
          "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://openonderwijsapi.nl/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": "#/components/schemas/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": {
              "type": [
                "object",
                "null"
              ],
              "allOf": [
                {
                  "$ref": "#/components/schemas/LearningOutcome"
                }
              ]
            }
          },
          "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,
            "example": "0732"
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            }
          },
          "complexityLevel": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/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",
            "example": "2025-09-01T09:00:00+01:00"
          },
          "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",
            "example": "2025-09-01T09:00:00+01:00"
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "Organisation": {
        "type": "object",
        "description": "A description of a group of people working together to achieve a goal",
        "required": [
          "organisationId",
          "organisationType",
          "name",
          "primaryCode"
        ],
        "properties": {
          "organisationId": {
            "type": "string",
            "description": "Unique id of this organisation",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-123514174000"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for the organisation. This is often the source identifier as defined by the root organisation.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "organisation_id",
              "code": "Org01-Root"
            }
          },
          "organisationType": {
            "$ref": "#/components/schemas/organisationType"
          },
          "name": {
            "type": "array",
            "description": "The name of the organisation",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "nl-NL",
                "value": "Coöperatie SURF U.A."
              }
            ]
          },
          "shortName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Short name of the organisation",
            "maxLength": 256,
            "example": "SURF"
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "If the organisation is an educational organisation, any general description should clearly mention the type of \neducation organisation, especially in the case of a binary system. In Dutch; universiteit (university) or \nhogeschool (university of applied sciences).\nIf the organisation is not an educational organisation, a general description should describe the role it plays \nin education like providing certain types of internships, educational services, products or facilities.\n",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "nl-NL",
                "value": "SURF is een coöperatieve vereniging van Nederlandse onderwijs- en onderzoeksinstellingen waarin de leden hun krachten bundelen. De leden zijn eigenaar van SURF."
              }
            ]
          },
          "addresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Addresses of this organisation",
            "items": {
              "$ref": "#/components/schemas/Address"
            }
          },
          "link": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL of the organisation's website",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://surf.nl"
          },
          "logo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Logo of this organisation",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://www.surf.nl/themes/surf/logo.svg"
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            },
            "example": [
              {
                "codeType": "institution_code",
                "code": "114B529"
              },
              {
                "codeType": "kvk_organisation_id",
                "code": "50277374"
              }
            ]
          },
          "rootId": {
            "description": "The identifier of the organisation which is the root organisation of this organisation.\nWhen the client does not request expansion of `root`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "root": {
            "description": "The expanded organisation object which is the root organisation of this organisation.\nWhen the client requests expansion of `root`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no root organisation is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Organisation"
              }
            ]
          },
          "parentId": {
            "description": "The identifier of the organisational unit which is the parent of this organisation.\nWhen the client does not request expansion of `parent`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "parent": {
            "description": "The expanded organisation object which is the parent of this organisation.\nWhen the client requests expansion of `parent`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no parent organisation is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Organisation"
              }
            ]
          },
          "childIds": {
            "description": "The identifiers of the organisational units for which this organisation is the parent.\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/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": "#/components/schemas/Identifier"
            }
          },
          "children": {
            "description": "The expanded organisational unit objects for which this organisation is the parent.\nWhen the client requests expansion of `children`, the full expanded organisation objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": [
                "object",
                "null"
              ],
              "allOf": [
                {
                  "$ref": "#/components/schemas/Organisation"
                }
              ]
            }
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "Person": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PersonId"
          },
          {
            "$ref": "#/components/schemas/PersonProperties"
          }
        ]
      },
      "Programme": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ProgrammeId"
          },
          {
            "$ref": "#/components/schemas/ProgrammeProperties"
          },
          {
            "type": "object",
            "properties": {
              "validFrom": {
                "description": "The first moment this programme is valid (inclusive).",
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "example": "2025-09-01T09:00:00+01:00"
              },
              "validTo": {
                "description": "The moment this programme ceases to be valid (e.g. exclusive).",
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "example": "2025-09-01T09:00:00+01:00"
              }
            }
          }
        ]
      },
      "ProgrammeOffering": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ProgrammeOfferingId"
          },
          {
            "$ref": "#/components/schemas/OfferingProperties"
          },
          {
            "type": "object",
            "description": "A programme offering which describes the programme in time.",
            "title": "ProgrammeOffering",
            "properties": {
              "startDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering starts, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2025-09-28T08:30:00+01:00"
              },
              "endDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The moment on which this offering ends, RFC3339 (date-time)",
                "format": "date-time",
                "example": "2025-12-28T08:30:00+01:00"
              },
              "flexibleEntryPeriodStartDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Use this attribute for courses that allow participants who have already\nenrolled to begin their participation at different moments without\nmissing essential content. This attribute MUST be used in combination\nwith `flexibleEntryPeriodEndDateTime`.\n",
                "format": "date-time",
                "example": "2019-08-21T09:00:00+01:00"
              },
              "flexibleEntryPeriodEndDateTime": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "If this is a course wherein participants who have enrolled can start at\nvarious moments without missing anything, use this attribute in\ncombination with `flexibleEntryPeriodStartDateTime`.\n",
                "format": "date-time",
                "example": "2019-10-21T22:59:59+01:00"
              },
              "addresses": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Addresses for this offering",
                "items": {
                  "$ref": "#/components/schemas/Address"
                }
              },
              "priceInformation": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Price information for this offering.",
                "items": {
                  "$ref": "#/components/schemas/Cost"
                },
                "minItems": 1
              },
              "programmeId": {
                "description": "The identifier of the programme that is offered in this programmeOffering.\nWhen the client does not request expansion of `programme`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "programme": {
                "description": "The expanded programme object that is offered in this programmeOffering.\nWhen the client requests expansion of `programme`, the full expanded programme object MUST be returned here instead of only the identifier.\nIf no programme is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Programme"
                  }
                ]
              },
              "organisationId": {
                "description": "The identifier of the organisation that manages this programmeOffering.\nWhen the client does not request expansion of `organisation`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "organisation": {
                "description": "The expanded organisation object that manages this programmeOffering.\nWhen the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no organisation is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Organisation"
                  }
                ]
              }
            }
          }
        ]
      },
      "Room": {
        "type": "object",
        "description": "An area within a building where education can take place",
        "required": [
          "roomId",
          "roomType",
          "name",
          "primaryCode"
        ],
        "properties": {
          "roomId": {
            "type": "string",
            "description": "Unique id for this room",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-332114174000"
          },
          "primaryCode": {
            "description": "The primary human readable identifier for the room. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "roomCode",
              "code": "Bb4.54"
            }
          },
          "roomType": {
            "$ref": "#/components/schemas/roomType"
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation of the name of this room",
            "maxLength": 256,
            "example": "Bb4.54"
          },
          "name": {
            "type": "array",
            "description": "The name of this room",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Beatrix building room 4.54"
              }
            ]
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this room. [The limited implementation of Git Hub Markdown syntax](https://openonderwijsapi.nl/v6.0/#/technical/formatting-text) MAY be used for rich text representation.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "External education and exam room 4.54"
              }
            ]
          },
          "totalSeats": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "The total number of seats located in the room",
            "example": 300
          },
          "availableSeats": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "The total number of available (=non-reserved) seats in the room",
            "example": 200
          },
          "floor": {
            "type": [
              "string",
              "null"
            ],
            "description": "The floor on which this room is located",
            "example": "4"
          },
          "wing": {
            "type": [
              "string",
              "null"
            ],
            "description": "The wing in which this room is located",
            "example": "None"
          },
          "geolocation": {
            "type": [
              "object",
              "null"
            ],
            "description": "Geolocation of the entrance of this room (WGS84 coordinate reference system)",
            "required": [
              "latitude",
              "longitude"
            ],
            "properties": {
              "latitude": {
                "type": "number",
                "format": "double",
                "example": 52.088255
              },
              "longitude": {
                "type": "number",
                "format": "double",
                "example": 5.106669
              }
            }
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            }
          },
          "buildingId": {
            "description": "The identifier of the building in which the room is located.\nWhen the client does not request expansion of `building`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "building": {
            "description": "The expanded building object in which the room is located.\nWhen the client requests expansion of `building`, the full building object MUST be returned here instead of only the identifier.\nIf no building is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Building"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ProgrammeOfferingAssociation": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ProgrammeOfferingAssociationExternalMe"
          },
          {
            "type": "object",
            "anyOf": [
              {
                "required": [
                  "programmeOfferingId",
                  "personId"
                ]
              },
              {
                "title": "With expanded person",
                "required": [
                  "programmeOfferingId",
                  "person"
                ]
              },
              {
                "title": "With expanded programme offering and person",
                "required": [
                  "programmeOffering",
                  "person"
                ]
              },
              {
                "title": "With expanded programme offering",
                "required": [
                  "programmeOffering",
                  "personId"
                ]
              }
            ],
            "properties": {
              "personId": {
                "description": "The identifier of the person referenced here.\nWhen the client does not request expansion of `person`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "readOnly": true,
                "$ref": "#/components/schemas/Identifier"
              },
              "person": {
                "description": "The expanded person object referenced here.\nWhen the client requests expansion of `person`, the full expanded person object MUST be returned here instead of only the identifier.\nIf no person is defined, this value is `null`.\n",
                "readOnly": true,
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Person"
                  }
                ]
              },
              "programmeOfferingId": {
                "description": "The identifier of the `programmeOffering` referenced here.\nWhen the client does not request expansion of `offering`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "programmeOffering": {
                "description": "The expanded programmeOffering object referenced here.\nWhen the client requests expansion of `offering`, the full expanded programmeOffering object MUST be returned here instead of only the identifier.\nIf no offering is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ProgrammeOffering"
                  }
                ]
              }
            }
          }
        ]
      },
      "TestComponentOfferingAssociationAttempt": {
        "type": "object",
        "description": "Planning and execution information on an attempt belong to a TestComponentOfferingAssociation. Result on the attempt\nis only relevant when a score or rawScore can be determined.\n",
        "required": [
          "attemptId"
        ],
        "properties": {
          "attemptId": {
            "type": "string",
            "description": "Unique id of this attempt",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          },
          "opportunity": {
            "type": [
              "string",
              "null"
            ],
            "description": "The opportunity during which this attempt can be fulfilled. \nOnly relevant when only one attempt is allowed per association.\n",
            "example": "2025Semester1"
          },
          "attempt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Which attempt this is for the given person on the given offering.\n",
            "format": "int32",
            "example": 1
          },
          "state": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/attemptState"
              },
              {
                "type": "null"
              }
            ]
          },
          "startDateTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Moment (date and time) of the start of the actual attempt. This can be the\nstart date and time for an assessment where the association has no start or\nend date and time, but only has a relation with an academic session representing\na term, trimester, semester or academic year.\n",
            "format": "date-time",
            "example": "2025-09-01T09:00:00+01:00"
          },
          "endDateTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Moment (date and time) of the end of the actual attempt. This can be the deadline \nfor handing in a document for an assignment or the end\ndate and time for an test where the association has no start or\nend date and time, but only has a relation with an academic session representing\na term, trimester, semester or academic year.\n",
            "format": "date-time",
            "example": "2025-09-01T09:00:00+01:00"
          },
          "roomIds": {
            "description": "The identifiers of the rooms for this offering.\nWhen the client does not request expansion of `rooms`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Identifier"
            }
          },
          "rooms": {
            "description": "The expanded room objects for this offering. \nWhen the client requests expansion of `rooms`, the full expanded room objects MUST be returned here instead of only the identifiers. \nIf no rooms are defined, this value is `null`.\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": [
                "object",
                "null"
              ],
              "allOf": [
                {
                  "$ref": "#/components/schemas/Room"
                }
              ]
            }
          },
          "attendance": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/attendance"
              },
              {
                "type": "null"
              }
            ]
          },
          "irregularities": {
            "type": [
              "string",
              "null"
            ],
            "description": "Additional information about external disturbances or (potentially) illegal actions by the student, \nbefore, during or after the test.\n",
            "example": "The student was late because there was a train delay"
          },
          "coordinatorId": {
            "description": "The identifier of the coordinator responsible for overseeing the test.\nWhen the client does not request expansion of `coordinator`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "coordinator": {
            "description": "The expanded person object representing the coordinator responsible for overseeing the test.\nWhen the client requests expansion of `coordinator`, the full person object MUST be returned here instead of only the identifier.\nIf no coordinator is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Person"
              }
            ]
          },
          "documents": {
            "type": [
              "array",
              "null"
            ],
            "description": "Documents that are related to the test component offering association attempt. E.g. test completed, work handed in, etc.\n",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          },
          "result": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Result"
              },
              {
                "type": "null"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "expandableObjects": {
        "type": "string",
        "description": "The object that can be expanded for this path.\n  - academic_session: the academicSession object can be expanded.\n  - building: the building object can be expanded.\n  - child: the child object (which is an instance of the current object) can be expanded.\n  - children: a set of objects (which are an instance of the current object) can be expanded.\n  - coordinators: the person object indicating a coordinator can be expanded.\n  - instructors: the person object indicating an instructor can be expanded.\n  - course: the course object can be expanded.\n  - course_offering: the courseOffering object can be expanded.\n  - learning_component: the learningComponent object can be expanded.\n  - learning_component_offering: the learningComponentOffering object can be expanded.\n  - learning_outcome: the learningOutcome object can be expanded.\n  - learning_outcomes: the learningOutcomes in the array containing learningOutcome objects can be expanded.\n  - organisation: the organisation object can be expanded.\n  - parent: the parent object (which is an instance of the current object) can be expanded.\n  - person: the person object can be expanded.\n  - programme: the programme object can be expanded.\n  - programmes: the programmes in the array containing programme objects can be expanded.\n  - programme_offering: the programmeOffering object can be expanded.\n  - room: the room object can be expanded.\n  - rooms: the rooms in the array can be expanded.\n  - test_component: the testComponent object can be expanded.\n  - test_component_offering: the testComponentOffering object can be expanded.\n  - year: the academicSession object indicating the year can be expanded.\n",
        "x-ooapi-extensible-enum": [
          "academic_session",
          "building",
          "child",
          "children",
          "coordinators",
          "course",
          "course_offering",
          "instructors",
          "learning_component",
          "learning_component_offering",
          "learning_outcome",
          "learning_outcomes",
          "organisation",
          "parent",
          "person",
          "programme",
          "programmes",
          "programme_offering",
          "room",
          "rooms",
          "test_component",
          "test_component_offering",
          "year"
        ],
        "example": "programme"
      },
      "Ext": {
        "type": "object",
        "description": "Object for additional non-standard attributes"
      },
      "Problem": {
        "type": "object",
        "description": "A problem details object, conforming to RFC 7807 (Problem Details for HTTP\nAPIs). See https://datatracker.ietf.org/doc/html/rfc7807. It provides a\nmachine-readable format for error conditions, including a type URI, title,\nstatus code, and optional detail and instance fields. This ensures\nconsistent handling of error responses across the API.\n",
        "required": [
          "type",
          "status",
          "title"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "maxLength": 2048,
            "description": "An absolute URI that identifies the problem type. When dereferenced, \nit should provide human-readable documentation.\n",
            "example": "https://example.org/problems/bad-request"
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type",
            "example": "Resource not found"
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "description": "The HTTP status code generated by the origin server for this occurrence \nof the problem.\n",
            "example": 404
          },
          "detail": {
            "type": [
              "string",
              "null"
            ],
            "description": "A human-readable explanation specific to this occurrence of the problem\n",
            "example": "The course with id 'abc123' could not be found in the catalogue."
          },
          "instance": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "maxLength": 2048,
            "description": "An absolute URI that identifies the specific occurrence of the problem.\n",
            "example": "https://api.example.org/courses/abc123"
          }
        }
      },
      "type": {
        "type": "string",
        "format": "uri",
        "maxLength": 2048,
        "description": "An absolute URI that identifies the problem type. When dereferenced, \nit should provide human-readable documentation.\n",
        "example": "https://example.org/problems/bad-request"
      },
      "title": {
        "type": "string",
        "description": "A short, human-readable summary of the problem type",
        "example": "Resource not found"
      },
      "Consumer": {
        "type": "object",
        "description": "The additional elements of a consumer that may be provided, see the [documentation on support for specific consumers](https://openonderwijsapi.nl/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://openonderwijsapi.nl/v6.0/#/technical/consumers-and-profiles/). This key is used to select the additional data to be presented in the request.",
            "type": "string",
            "example": "test-consumer"
          },
          "exampleProperty": {
            "description": "An example of an additional property",
            "type": [
              "string",
              "null"
            ],
            "example": "value-of-example-property"
          }
        },
        "additionalProperties": true
      },
      "ProblemVersionNotAcceptable": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Problem"
          },
          {
            "type": "object",
            "required": [
              "requestedVersion",
              "supportedVersions"
            ],
            "properties": {
              "type": {
                "$ref": "#/components/schemas/type"
              },
              "title": {
                "$ref": "#/components/schemas/title"
              },
              "consumer": {
                "description": "Indicates which party caused the version mismatch. When null, the 406 was\ntriggered by an unsupported OOAPI version. If populated with a Consumer\nobject, the 406 was caused by a consumer-specific version that did not match\nany supported version. This field MAY contain a full Consumer object or be\nnull.\n",
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/Consumer"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "requestedVersion": {
                "type": "string",
                "description": "The version requested by the client.",
                "example": "5.0"
              },
              "supportedVersions": {
                "type": "array",
                "description": "Versions the server can serve, typically in descending order.",
                "items": {
                  "type": "string"
                },
                "example": [
                  "4.2",
                  "4.1"
                ]
              }
            }
          }
        ]
      },
      "filterPresence": {
        "type": "string",
        "description": "Presence check or special value for filter operations.\n\nInspired by Storyblok (https://www.storyblok.com/docs/api/content-delivery/v2/filter-queries)\n\nImplementation note:\n- The availability and behaviour of this query functionality are entirely determined by the organisation hosting\n  the API implementation. It is not mandatory for implementers to support this functionality, and it cannot be enforced \n  upon organisations that provide or consume OOAPI endpoints.\n- It is up to each implementer to decide whether to support this feature. It is **not** a requirement of the OOAPI \n  standard itself.\n- Consumers or working groups that wish to apply specific filtering mechanisms are encouraged to do so using \n  this approach for the sake of consistency across implementations.\n",
        "enum": [
          "empty",
          "not_empty",
          "empty_array",
          "not_empty_array",
          "true",
          "false",
          "null",
          "not_null"
        ],
        "example": "not_empty"
      },
      "academicSessionType": {
        "type": "string",
        "description": "The type of this academic session. This is an *extensible enumeration*.\n\n- academic_year: Academic year\n- semester: Semester, typically comprising two terms per academic year\n- trimester: Trimester, typically comprising three terms per academic year\n- quarter: Quarter, typically comprising four terms per academic year\n- testing_period: A period during which tests take place\n- period: Any other period within an academic year\n\nImplementations may add further values beyond those listed above, provided they do not overlap in definition with existing values.\n",
        "x-ooapi-extensible-enum": [
          "academic_year",
          "semester",
          "trimester",
          "quarter",
          "testing_period",
          "period"
        ],
        "example": "semester"
      },
      "Pagination": {
        "type": "object",
        "required": [
          "pageSize",
          "pageNumber",
          "hasPreviousPage",
          "hasNextPage"
        ],
        "properties": {
          "pageSize": {
            "type": "integer",
            "format": "int32",
            "description": "The number of items per page",
            "example": 10
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32",
            "description": "The current page number",
            "example": 1,
            "minimum": 1
          },
          "hasPreviousPage": {
            "type": "boolean",
            "description": "Whether there is a previous page",
            "example": false
          },
          "hasNextPage": {
            "type": "boolean",
            "description": "Whether there is a previous page",
            "example": true
          },
          "totalPages": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Total number of pages",
            "example": 8
          }
        }
      },
      "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"
        ],
        "example": "identifier"
      },
      "IdentifierEntry": {
        "type": "object",
        "properties": {
          "codeType": {
            "$ref": "#/components/schemas/codeType"
          },
          "code": {
            "description": "Human readable value for the code/identifier",
            "type": "string",
            "example": "1234qwe12"
          }
        },
        "required": [
          "codeType",
          "code"
        ],
        "additionalProperties": false,
        "example": {
          "codeType": "identifier",
          "code": "1234qwe12"
        }
      },
      "Language": {
        "description": "The language used in the described entity. A string formatted according to RFC 4647 https://www.rfc-editor.org/rfc/rfc4647.html\nRFC 4647 supports language specifications from very general to very specific. \nThis breaks down as:\n- ([a-z]{2,3}) - Primary language subtag (2-3 letters) ISO 639-1, ISO 639-2, or ISO 639-3 https://www.iso.org/iso-639-language-code\n- (-([A-Z]{2}|[0-9]{3}))? - Optional region/country (2 uppercase letters or 3 digits) ISO 3166-1 or UN M.49 https://www.iso.org/iso-3166-country-codes.html\n- (-([a-z]{4}))? - Optional script subtag (4 lowercase letters)\n- (-([a-z]{2}|[0-9]{3}))* - Optional variant subtags\n- (-[a-z0-9]{2,8})* - Optional extension subtags\n- (-x(-[a-z0-9]{1,8})+)? - Optional private use extensions\n\nWhen using this schema, the most common format is a two-letter language code as specified by ISO 639-1, optionally followed by a dash and a two-letter country code as specified by ISO 3166-1 (e.g. \"en\" or \"en-GB\").\nMore specific language tags are also allowed, such as \"zh-Hant-TW\" for Traditional Chinese as used in Taiwan.\nFor sign language based on a certain language two methods are commonly used: either using the subtag \"sgn\" (e.g. \"nl-sgn-NL\" for Dutch Sign Language) or using the subtag \"s\" (e.g. \"nl-s-NL\" for Dutch Sign Language). Both methods are allowed.\n",
        "type": "string",
        "minLength": 2,
        "pattern": "^([a-z]{2,3})(-([A-Z]{2}|[0-9]{3}))?(-([a-z]{4}))?(-([a-z]{2}|[0-9]{3}))*(-[a-z0-9]{2,8})*(-x(-[a-z0-9]{1,8})+)?$",
        "example": "en-GB"
      },
      "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": "#/components/schemas/Language"
          },
          "value": {
            "description": "String to describe the entity.",
            "type": "string",
            "example": "programme that is a place holder for all courses that are made available for student mobility"
          }
        },
        "example": {
          "language": "en-GB",
          "value": "programme that is a place holder for all courses that are made available for student mobility"
        }
      },
      "Identifier": {
        "type": "string",
        "description": "An identifier of another resource.",
        "format": "uuid",
        "example": "123e4567-e89b-12d3-a456-426614174000"
      },
      "offeringState": {
        "type": "string",
        "description": "The state of this offering:\n\n- concept: The offering is still in development and not yet available for students\n- cancelled: The offering has been cancelled and is no longer available\n- active: The offering is currently available for students to enrol in and participate\n- inactive: The offering is not currently available for students, but may be available in the future\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "concept",
          "cancelled",
          "active",
          "inactive"
        ],
        "example": "active"
      },
      "CourseOfferingId": {
        "type": "object",
        "required": [
          "courseOfferingId"
        ],
        "properties": {
          "courseOfferingId": {
            "type": "string",
            "description": "The unique ID of the course offering, this should be unique across all programme, course, learning, and test component offerings.",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-134564174000"
          }
        }
      },
      "rosteringState": {
        "type": "string",
        "description": "Precision indicator with values for rostering purposes:\n  \n- definitive: Confirmed final timeslot.\n- preliminary: Broadest possible time range, will be further refined.\n- tentative: Scheduled but subject to change.\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "definitive",
          "preliminary",
          "tentative"
        ],
        "example": "definitive"
      },
      "modeOfDelivery": {
        "type": "string",
        "description": "The mode of delivery of the component, based on the EU vocabulary:  \nhttps://op.europa.eu/en/web/eu-vocabularies/dataset/-/resource?uri=http://publications.europa.eu/resource/dataset/learning-assessment\n\n| Code                 | Description                                               |\n|----------------------|-----------------------------------------------------------|\n| `blended`            | Structured combination of online and in-person learning   |\n| `coil`               | Collaborative Online International Learning; joint, cross-|\n|                      | institutional, online delivery (virtual exchange /        |\n|                      | co-taught across institutions)                            |\n| `hybrid`             | Delivery using different modes in a flexible and          |\n|                      | interchangeable way                                       |\n| `joint_delivery`     | Programme delivered collaboratively by two or more        |\n|                      | institutions (national or international), with shared     |\n|                      | responsibility for curriculum and teaching                |\n| `online`             | Real-time learning delivered entirely via the internet    |\n| `presential`         | Learning that takes place in a physical classroom setting |\n| `project_based`      | Learning or assessment conducted as part of a project team|\n| `research_lab_based` | Learning that occurs within a research environment        |\n| `work_based`         | Learning through practical work or workplace experience   |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "blended",
          "coil",
          "hybrid",
          "joint_delivery",
          "online",
          "presential",
          "project_based",
          "research_lab_based",
          "work_based"
        ],
        "example": "blended"
      },
      "resultValueType": {
        "type": "string",
        "description": "The result value type for this offering.\n\n- pass_or_fail: A simple pass or fail result.\n- insufficient_satisfactory_good: A result with three levels (insufficient, satisfactory and good).\n- us_letter: A result in the US letter grading system (A, B, C, D, F).\n- uk_letter: A result in the UK letter grading system (A, B, C, D, E, U).\n- de_grade: A result in the German grading system (1, 2, 3, 4, 5, 6).\n- grade_0_100: A result in the 0–100 grading system.\n- grade_0_10: A result in the 0–10 grading system (no decimals allowed).\n- grade_0_10_one_decimal: A result in the 0–10 grading system (with one decimal place).\n- reference_level_europass: A result in the Europass reference level grading system (A1, A2, B1, B2, C1, C2).\n- other: Any other grading system not specified above.\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "pass_or_fail",
          "insufficient_satisfactory_good",
          "us_letter",
          "uk_letter",
          "de_grade",
          "grade_0_100",
          "grade_0_10",
          "grade_0_10_one_decimal",
          "reference_level_europass",
          "other"
        ],
        "example": "grade_0_10"
      },
      "EnrolmentPeriods": {
        "type": "object",
        "description": "An enrolment period describes the moment at which an offering is available for enrolment.\nThe enrolment period is supplemented with additional information regarding the intended users, the time for the enrolment as well as a URL that contains the enrolment logic.\n",
        "required": [
          "startDateTime"
        ],
        "properties": {
          "startDateTime": {
            "type": "string",
            "description": "The moment from which the enrolment should be available",
            "format": "date-time",
            "example": "2020-09-28T08:30:00+01:00"
          },
          "endDateTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "The moment until which the enrolment should be available (when the enrolment for this target group stops), RFC3339 (date-time)",
            "format": "date-time",
            "example": "2020-09-30T20:00:00+01:00"
          },
          "targetGroups": {
            "type": [
              "array",
              "null"
            ],
            "description": "The people for whom this enrolment is available.",
            "items": {
              "type": "string",
              "description": "the specific target group"
            }
          },
          "enrolmentType": {
            "type": [
              "string",
              "null"
            ],
            "description": "The way the enrolment process should be handled for this period and target group. \nLikely values are:\n  url - a url where the user should be directed to for finishing the enrolment\n  broker - using a system that is specialized to handle enrolment\n",
            "example": "url"
          },
          "enrolmentUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "The URL where a person of this target group can enrol him or herself",
            "example": "https://university.example.org/"
          },
          "queueEnabled": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "a boolean value (true or false) indicating whether enrolment is queued.\n",
            "example": false
          },
          "queuedNumberStudents": {
            "type": [
              "number",
              "null"
            ],
            "description": "The number of students that have a queued enrolment state for this offering.",
            "format": "int32",
            "minimum": 0,
            "example": 200
          },
          "maxQueuedNumberStudents": {
            "type": [
              "number",
              "null"
            ],
            "description": "The maximum number of students allowed in the queue for this offering.",
            "format": "int32",
            "minimum": 0,
            "example": 200
          },
          "comment": {
            "type": [
              "string",
              "null"
            ],
            "description": "Additional information regarding this enrolment period that can be shared with the persons in the target groups.",
            "example": "Additional information..."
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "supplementaryRole": {
        "type": "string",
        "description": "The fundamental semantic purpose of the supplementary content. The selected\n`role` describes the intent or function of the item (for example, badge,\nteaser or promotional highlight).\n\nThe `role` MUST NOT duplicate or encode the technical media form defined by\n`type`. The `type` specifies the underlying media form (such as text, image,\nvideo or http), whereas the `role` clarifies how that media is intended to be\ninterpreted or used.\n\n| Code           | Description                                         |\n|----------------|-----------------------------------------------------|\n| `announcement` | General-purpose announcement or notice              |\n| `badge`        | A visual label or achievement marker                |\n| `marketing`    | Promotional or marketing-related content            |\n| `promo`        | A short promotional highlight or teaser             |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "announcement",
          "badge",
          "marketing",
          "promo"
        ],
        "example": "badge"
      },
      "supplementaryType": {
        "type": "string",
        "description": "The fundamental media form of the supplementary content. The selected `type`\ndetermines how the associated `value` MUST be interpreted. It defines the\ntechnical representation of the content, independent of its semantic role.\n\nThe `type` specifies the underlying media form, such as text_plain,\ntext_md, text_http, image, video or uri.\n\nThe `role` defines the semantic intent of the item and MUST NOT duplicate the\ntechnical media form defined by `type`.\n\n| Code        | Description                                                              |\n|-------------|--------------------------------------------------------------------------|\n| `image`     | Visual media referenced via a URI (for example photographs or artwork)   |\n| `text_http` | HTTP-encoded textual content                                             |\n| `text_md`   | Markdown-formatted text content.                                         |\n| `text_plain`| Plain text content.                                                      |\n| `uri`       | A URI linking to an external resource                                    |\n| `video`     | Video media referenced via a URI (for example recordings or trailers)    |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "image",
          "text_http",
          "text_md",
          "text_plain",
          "uri",
          "video"
        ],
        "example": "text_plain"
      },
      "SupplementaryInformation": {
        "type": "array",
        "description": "Optional supplementary information associated with this resource.",
        "items": {
          "type": "object",
          "description": "A supplementary content item consists of a technical media form (`type`),\na semantic purpose (`role`), and an array of `value` entries. Together these\nfields define both how the content MUST be interpreted (`type`) and why it\nis provided (`role`).\n\nThe `type` specifies the underlying media form (text, image, video or http)\nand determines how each `value` item MUST be handled. The `role` describes\nthe intent or purpose of the supplementary item (for example announcement,\nbadge, marketing or promotional teaser) and MUST NOT duplicate or encode\nthe media form defined by `type`.\n\nThe separation between `type` and `role` ensures that the same media form\ncan serve multiple purposes, and that the semantic meaning remains\nindependent from the technical representation of the content. The `value`\narray contains one or more language-typed strings, allowing the same content\nitem to be expressed in multiple languages or alternative textual variants.\n",
          "properties": {
            "role": {
              "$ref": "#/components/schemas/supplementaryRole"
            },
            "type": {
              "$ref": "#/components/schemas/supplementaryType"
            },
            "value": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/components/schemas/LanguageTypedString"
              }
            }
          },
          "required": [
            "role",
            "type",
            "value"
          ]
        }
      },
      "OfferingProperties": {
        "type": "object",
        "required": [
          "primaryCode",
          "name"
        ],
        "properties": {
          "primaryCode": {
            "description": "The primary human readable identifier for this offering. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "offeringCode",
              "code": "INFOMQNM-20FS"
            }
          },
          "groupIds": {
            "description": "The offering identifiers (0..N) associated with this group.\n",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Identifier"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "academicSessionId": {
            "description": "The identifier of the academicSession during which this courseOffering takes place.\nWhen the client does not request expansion of `academicSession`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "academicSession": {
            "description": "The expanded academicSession object during which this courseOffering takes place.\nWhen the client requests expansion of `academicSession`, the full expanded academicSession object MUST be returned here instead of only the identifier.\nIf no academicSession is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/AcademicSession"
              }
            ]
          },
          "name": {
            "type": "array",
            "description": "The name of this offering",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Final written test for INFOMQNM for fall semester 2020"
              }
            ]
          },
          "state": {
            "description": "The state of this offering, e.g. active, inactive, archived",
            "oneOf": [
              {
                "$ref": "#/components/schemas/offeringState"
              },
              {
                "type": "null"
              }
            ]
          },
          "rosteringState": {
            "description": "The rostering state of this offering indicating the state in relation to planning, e.g. active, inactive, archived",
            "oneOf": [
              {
                "$ref": "#/components/schemas/rosteringState"
              },
              {
                "type": "null"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation or internal code used to identify this offering",
            "maxLength": 256,
            "example": "Test-INFOMQNM-20FS"
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this offering.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "'Prove in writing knowledge of research methods, including:\nAcquire knowledge of HCI research paradigms\nAble to design suitable research studies (e.g., choose between within and between subject designs)\nDefine/apply/design metrics and scales\nDefine/produce materials (e.g., stimuli and questionnaires)\nDefine protocols for research studies\nUnderstands and take in account concepts of reliability and validity\nAnalyse and improve methods and analysis of published scientific articles\nAble to deliver scientific reports\nProve in writing knowledge of ­­­statistics, including:\nHandle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates)\nData preparation (e.g., coding and feature selection)\nReason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors)\nSelect an appropriate sampling method (e.g., stratified)\nPerform parametric tests (e.g., repeated measures (M)ANOVA)\nPerform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)'\n"
              }
            ]
          },
          "teachingLanguages": {
            "type": [
              "array",
              "null"
            ],
            "description": "The languages in which this course is given, should at least a two-letter language code as specified by RFC 4647. A student should be reasonably proficient in each language to be able to follow the offering.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/Language"
            }
          },
          "modesOfDelivery": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          },
          "maxNumberStudents": {
            "type": [
              "number",
              "null"
            ],
            "description": "The maximum number of students allowed to enrol for this offering",
            "format": "int32",
            "minimum": 0,
            "example": 200
          },
          "enrolledNumberStudents": {
            "type": [
              "number",
              "null"
            ],
            "description": "The number of students who have already enrolled for this offering",
            "format": "int32",
            "minimum": 0,
            "example": 150
          },
          "pendingNumberStudents": {
            "type": [
              "number",
              "null"
            ],
            "description": "The number of students who have a pending enrolment request for this offering",
            "format": "int32",
            "minimum": 0,
            "example": 50
          },
          "minNumberStudents": {
            "type": [
              "number",
              "null"
            ],
            "description": "The minimum number of students needed for this offering to proceed",
            "format": "int32",
            "minimum": 0,
            "example": 15
          },
          "resultExpected": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "resultExpected, previously known as isLineItem is used so the specific instance of the object is \nidentified as being an element that CAN contain “grade” information.\nOfferings need not always result in a grade or another type of result. \nIf there is a result expected from a programmeOffering/courseOffering/componentOffering the \nis resultExpected field should be set to true\n",
            "example": true
          },
          "resultValueType": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/resultValueType"
              },
              {
                "type": "null"
              }
            ]
          },
          "link": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL of this offering's webpage.",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM"
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            }
          },
          "enrolmentPeriods": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of periods that a person can enrol into this offering. The period is defined by target group and dateTime",
            "items": {
              "$ref": "#/components/schemas/EnrolmentPeriods"
            }
          },
          "supplementaryInformation": {
            "$ref": "#/components/schemas/SupplementaryInformation"
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "addressType": {
        "type": "string",
        "description": "The type of address, indicating its intended use:\n  \n- postal: Used for receiving post\n- visit: Used for physical visits\n- deliveries: Used for deliveries\n- invoicing: Used for invoicing purposes\n- teaching: The location where educational activities take place\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "postal",
          "visit",
          "deliveries",
          "invoicing",
          "teaching"
        ],
        "example": "postal"
      },
      "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",
            "example": "NL"
          },
          "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",
            "example": "NLD"
          },
          "iso3166-2": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 5,
            "maxLength": 6,
            "description": "A country subdivision code based on https://en.wikipedia.org/wiki/ISO_3166-2",
            "example": "BQ-BO"
          },
          "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",
            "example": "ANHH"
          }
        }
      },
      "Address": {
        "type": "object",
        "description": "The full street address",
        "required": [
          "addressType"
        ],
        "properties": {
          "addressType": {
            "$ref": "#/components/schemas/addressType"
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "description": "The street name",
            "example": "Moreelsepark"
          },
          "streetNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "The street number",
            "example": "48"
          },
          "additional": {
            "type": [
              "array",
              "null"
            ],
            "description": "Further details like building name, suite, apartment number, etc.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "On the other side of the road"
              }
            ]
          },
          "postCode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code to help sort and deliver mail also known as Postal code and ZIP code",
            "example": "3511 EP"
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "name of the city / locality",
            "example": "Utrecht"
          },
          "countryCode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/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",
                "example": 52.089123
              },
              "longitude": {
                "type": "number",
                "format": "double",
                "example": 5.113337
              }
            }
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "costType": {
        "type": "string",
        "description": "The type of cost. This is an *extensible enumeration*.\n\nThe following values are defined in the specification:\n  \n  - stap_eligible: costs for which a student may receive STAP funding\n  - total_costs: the total amount a student is required to pay to participate in this offering\n\nImplementations may add additional values beyond those listed above, provided they do not overlap in meaning with existing values.\n",
        "x-ooapi-extensible-enum": [
          "stap_eligible",
          "total_costs"
        ],
        "example": "total_costs"
      },
      "Cost": {
        "type": "object",
        "required": [
          "costType"
        ],
        "properties": {
          "costType": {
            "$ref": "#/components/schemas/costType"
          },
          "amount": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+(?:\\.\\d+)?$",
            "description": "The total amount of the cost as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.",
            "example": "340.84"
          },
          "vatAmount": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+(?:\\.\\d+)?$",
            "description": "The part of the cost that is VAT, as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.",
            "example": "40"
          },
          "amountWithoutVat": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+(?:\\.\\d+)?$",
            "description": "The part of the cost that is non-VAT. as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.",
            "example": "300.84"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "The currency this cost is in. Should correspond to one of the currency codes from ISO 4217.",
            "example": "EUR"
          },
          "displayAmount": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "description": "An array of optional pre-formatted strings in different locales. Clients can choose to use this string instead of rendering their own based on the current locale of the user.",
            "example": [
              {
                "language": "nl-NL",
                "value": "€380,84"
              },
              {
                "language": "en-US",
                "value": "$401.17"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "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",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          }
        }
      },
      "studyloadUnit": {
        "type": "string",
        "description": "The unit in which the study load is specified:\n\n- contact_time: Amount of time spent in scheduled classroom or contact hours.\n- ects: European Credit Transfer and Accumulation System (ECTS credits), typically 1 ECTS = 28 study hours.\n- sbu: Student workload hours, representing the total estimated effort.\n- sp: Study points used in some national systems (e.g. studiepunt in Flanders or the Netherlands).\n- hour: Plain number of hours, regardless of context (e.g. used for informal or modular learning units).\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "contact_time",
          "ects",
          "sbu",
          "sp",
          "hour"
        ],
        "example": "ects"
      },
      "StudyLoadDescriptor": {
        "type": "object",
        "description": "The amount of effort to complete this education in the specified unit.",
        "required": [
          "studyLoadUnit",
          "value"
        ],
        "properties": {
          "studyLoadUnit": {
            "$ref": "#/components/schemas/studyloadUnit"
          },
          "value": {
            "description": "The amount of load depicted in numbers",
            "type": "number",
            "example": 3
          }
        },
        "example": {
          "studyLoadUnit": "ects",
          "value": 3
        }
      },
      "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"
        ],
        "example": "bloom_1"
      },
      "level": {
        "type": "string",
        "description": "The level of this course (ECTS year of study if applicable):\n\n- pre_vocational: Pre-vocational education, preparatory stage prior to vocational training, typically before secondary vocational education (Dutch: mbo) level\n- secondary_vocational_education: Secondary vocational education (Dutch: mbo)\n- secondary_vocational_education_1: Secondary vocational education level 1, corresponds to levelOfQualification 1 (Dutch: mbo 1)\n- secondary_vocational_education_2: Secondary vocational education level 2, corresponds to levelOfQualification 2 (Dutch: mbo 2)\n- secondary_vocational_education_3: Secondary vocational education level 3, corresponds to levelOfQualification 3 (Dutch: mbo 3)\n- secondary_vocational_education_4: Secondary vocational education level 4, corresponds to levelOfQualification 4 (Dutch: mbo 4)\n- associate_degree: Associate degree, corresponds to levelOfQualification 5\n- bachelor: Bachelor degree, corresponds to levelOfQualification 6\n- master: Master degree, corresponds to levelOfQualification 7\n- doctoral: Doctoral level, corresponds to levelOfQualification 8\n- post_doctoral: Post-doctoral level, advanced academic or professional qualification beyond the doctoral level\n- undefined: The level is not specified\n- undivided: Integrated programme not divided into bachelor and master phases\n- nt2_1: Dutch as a second language, Programme I, intended for vocational training (CEFR level A2–B1)\n- nt2_2: Dutch as a second language, Programme II, intended for higher education or professional purposes (CEFR level B2)\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "pre_vocational",
          "secondary_vocational_education",
          "secondary_vocational_education_1",
          "secondary_vocational_education_2",
          "secondary_vocational_education_3",
          "secondary_vocational_education_4",
          "associate_degree",
          "bachelor",
          "master",
          "doctoral",
          "post_doctoral",
          "undefined",
          "undivided",
          "nt2_1",
          "nt2_2"
        ],
        "example": "master"
      },
      "ProgrammeId": {
        "type": "object",
        "description": "A collection of courses that lead to a certifiable learning outcome",
        "required": [
          "programmeId"
        ],
        "properties": {
          "programmeId": {
            "type": "string",
            "description": "Unique id for this programme",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          }
        }
      },
      "programmeType": {
        "type": "string",
        "description": "The type of this programme:\n\n- programme: A full formal programme of study leading to a qualification or degree\n- minor: A smaller, complementary programme that broadens or deepens the main field of study\n- honours: An honours programme, typically with additional academic requirements or distinction\n- specialisation: A focused area of study within a broader programme or degree\n- track: A structured learning path within a programme, often thematically or methodologically defined\n- specification: A further defined variant or subset of a track or specialisation\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "programme",
          "minor",
          "honours",
          "specialisation",
          "track",
          "specification"
        ],
        "example": "programme"
      },
      "qualificationAwarded": {
        "type": "string",
        "description": "Type of qualification that can be obtained upon completing the programme:\n- diploma\n- vocational_diploma\n- certificate\n- associate_degree: Associate degree — short-cycle higher education qualification (EQF level 5)\n- bachelor: Bachelor — undergraduate degree (EQF level 6)\n- master: Master — postgraduate degree (EQF level 7)\n- doctoral: Doctoral degree — research-based doctoral degree (EQF level 8)\n- none: No formal qualification is awarded for this programme\n\nIn case of a degree (for example bachelor or master), the type of degree can be specified using `qualificationDesignations`.\n",
        "x-ooapi-extensible-enum": [
          "diploma",
          "vocational_diploma",
          "certificate",
          "associate_degree",
          "bachelor",
          "master",
          "doctoral",
          "none"
        ],
        "example": "none"
      },
      "modeOfStudy": {
        "type": "string",
        "description": "Indicates the mode of study: full-time, part-time, dual or self-paced.\n\n- full_time: Standard daytime study schedule\n- part_time: Study scheduled outside regular working hours, such as evenings and weekends\n- dual_training: Combination of workplace learning and academic study\n- self_paced: Student sets their own pace and timing for study\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "full_time",
          "part_time",
          "dual_training",
          "self_paced"
        ],
        "example": "full_time"
      },
      "levelOfQualification": {
        "type": "string",
        "description": "Level of qualification according to the European Qualifications Framework (EQF).  \nSee:  \n- https://europass.europa.eu/en/description-eight-eqf-levels  \n- https://europass.europa.eu/en/europass-digital-tools/european-qualifications-framework  \n- https://nlqf.nl/\n- https://database.nlqf.nl/assets/pdf/schema-en-print.pdf\n\nThis list is extended with:\n- eqf_0: Informal or pre-qualification learning, below EQF level 1, e.g. basic literacy or life skills\n- eqf_1: Basic general knowledge and skills to carry out simple tasks\n- eqf_2: Basic factual knowledge and practical skills in a field of work or study\n- eqf_3: Knowledge of facts, principles and processes, with basic problem-solving skills\n- eqf_4: Factual and theoretical knowledge in broad contexts within a field of work or study\n- nlqf_4plus: Dutch pre-university education (VWO), considered above EQF level 4 but not formally mapped to EQF level 5\n- eqf_5: Comprehensive, specialised knowledge and practical skills, typically short-cycle higher education (e.g. associate degree)\n- eqf_6: Advanced knowledge and skills for complex problem-solving, typically bachelor level\n- eqf_7: Highly specialised knowledge and critical awareness, typically master level\n- eqf_8: Knowledge at the most advanced frontier of a field, typically doctoral level\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "eqf_0",
          "eqf_1",
          "eqf_2",
          "eqf_3",
          "eqf_4",
          "nlqf_4plus",
          "eqf_5",
          "eqf_6",
          "eqf_7",
          "eqf_8"
        ],
        "example": "eqf_6"
      },
      "formalDocument": {
        "type": "string",
        "description": "The type of formal document obtained upon completion of an educational programme:\n\n| Code                        | Description                                    |\n|-----------------------------|------------------------------------------------|\n| `certificate`               | A formal recognition of participation or       |\n|                             | achievement                                    |\n| `diploma`                   | An official qualification awarded upon         |\n|                             | graduation                                     |\n| `micro_credential_certificate` | Formal certification specifically           |\n|                             | documenting the award of a micro-credential    |\n| `school_advice`             | Educational recommendation or guidance issued  |\n|                             | by the school                                  |\n| `testimonial`               | A written statement confirming attendance or   |\n|                             | performance                                    |\n| `no_official_document`      | No official document is issued                 |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "certificate",
          "diploma",
          "micro_credential_certificate",
          "school_advice",
          "testimonial",
          "no_official_document"
        ],
        "example": "diploma"
      },
      "PersonId": {
        "type": "object",
        "properties": {
          "personId": {
            "type": "string",
            "description": "Unique id of this person",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          }
        },
        "required": [
          "personId"
        ]
      },
      "Nationality": {
        "type": "object",
        "description": "An object indicating nationality based on at least one iso-3166 code. In situations where more than one iso-3166 code is provided the codes have address 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",
            "example": "NL"
          },
          "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",
            "example": "NLD"
          },
          "iso3166-3": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 4,
            "maxLength": 4,
            "description": "A nationality code for a country that no longer exists on https://en.wikipedia.org/wiki/ISO_3166-3 It is not advised to use the original iso3166-1 for such a country since country codes can get reassigned to new countries ones the original country code is officially obsolete. It is possible that a person has a nationality of a country that does not exist any more (after a country got split up like CZ and YU)\\ and never applied for nationality of one of the new countries.\n",
            "example": "ANHH"
          }
        }
      },
      "personAffiliation": {
        "type": "string",
        "description": "The affiliations of this person — the roles or relationships a person has with the organisation providing this endpoint:\n\n- student: Enrolled learner or participant in educational offerings\n- employee: Staff member employed by the organisation (e.g. teacher, administrator)\n- guest: External person temporarily affiliated, without formal student or employee status\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "student",
          "employee",
          "guest"
        ],
        "example": "student"
      },
      "gender": {
        "type": "string",
        "description": "The gender of this person, based on international standards for education and data interoperability.\n\nThe values follow practices from agencies such as:\n- European Commission (EULF, INSPIRE, GeoDCAT-AP)\n- Edustandaard, EUNIS\n\n- m: male\n- f: female\n- x: non-binary or gender-diverse, officially registered\n- o: other gender identity, not officially classified as m/f/x\n- u: unknown or not registered\n- n: not applicable, e.g. for non-person entities or gender-irrelevant use cases\n",
        "x-ooapi-extensible-enum": [
          "m",
          "f",
          "x",
          "o",
          "u",
          "n"
        ],
        "example": "f"
      },
      "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"
        ],
        "example": "partner"
      },
      "PersonProperties": {
        "type": "object",
        "description": "A person that has a relationship with this institution",
        "anyOf": [
          {
            "required": [
              "surname",
              "primaryCode",
              "activeEnrolment"
            ]
          },
          {
            "title": "With required given name",
            "required": [
              "givenName",
              "primaryCode",
              "activeEnrolment"
            ]
          },
          {
            "title": "With required preferred name",
            "required": [
              "preferredName",
              "primaryCode",
              "activeEnrolment"
            ]
          }
        ],
        "properties": {
          "primaryCode": {
            "description": "The primary human readable identifier for the person. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "studentNumber",
              "code": 0
            }
          },
          "givenName": {
            "type": [
              "string",
              "null"
            ],
            "description": "The first name of this person",
            "maxLength": 256,
            "example": "Martina"
          },
          "alternateName": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Name a person chooses to use. this is part of a Self Sovereign name e.g. in the eduId process comparable to schema.org alternateName",
            "maxLength": 256,
            "example": "Marieke"
          },
          "preferredName": {
            "type": [
              "string",
              "null"
            ],
            "description": "The name how the person would like to be called. Usually first name of this person. In line with ISO/IEC 24760 – Identity Management Vocabulary",
            "maxLength": 256,
            "example": "Maartje"
          },
          "surnamePrefix": {
            "type": [
              "string",
              "null"
            ],
            "description": "The prefix of the family name of this person",
            "example": "van"
          },
          "surname": {
            "type": "string",
            "description": "The family name of this person",
            "maxLength": 256,
            "example": "Damme"
          },
          "displayName": {
            "type": [
              "string",
              "null"
            ],
            "description": "The name of this person which will be displayed",
            "maxLength": 256,
            "example": "Maartje van Damme"
          },
          "initials": {
            "type": [
              "string",
              "null"
            ],
            "description": "The initials of this person",
            "example": "MCW"
          },
          "idCheckName": {
            "type": [
              "string",
              "null"
            ],
            "description": "The name of the person as printed on official identification documents\n(driving licence, passport or identity card). This MUST be formatted as\n\"surname prefix surname, given names\" (separating surnamePrefix and surname\nwith a single space, and surname and given names with a comma and space).\n\nIf the surname or given names are not available or are secret, the values\n\"secret\" and \"not_available\" are recommended. The surname prefix may be\nomitted. E.g. \"van der Graaf, Jacobus Adrianus\". \n\nOptionally, the value of\nthe student number can be added to this field by appending it at the end,\nseparated by a comma. E.g. \"van der Graaf, Jacobus Adrianus, s12345678\"\n",
            "example": "van der Graaf, Jacobus Adrianus, s12345678"
          },
          "activeEnrolment": {
            "type": "boolean",
            "description": "Whether this person has an active enrolment.",
            "example": false
          },
          "dateOfBirth": {
            "type": [
              "string",
              "null"
            ],
            "description": "The date of birth of this person, using the `full-date` format as defined in \nRFC 3339 (section 5.6).\n",
            "format": "date",
            "example": "2003-09-30"
          },
          "cityOfBirth": {
            "type": [
              "string",
              "null"
            ],
            "description": "The city of birth of this person",
            "example": "Utrecht"
          },
          "countryOfBirth": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Country"
              },
              {
                "type": "null"
              }
            ]
          },
          "nationality": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Nationality"
              },
              {
                "type": "null"
              }
            ]
          },
          "dateOfNationality": {
            "type": [
              "string",
              "null"
            ],
            "description": "The date of nationality of this person, using the `full-date` format as defined in \nRFC 3339 (section 5.6).\n",
            "format": "date",
            "example": "2003-09-30"
          },
          "affiliations": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/personAffiliation"
            }
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "The primary email address of this person",
            "format": "email",
            "maxLength": 256,
            "example": "vandamme.mcw@universiteitvanharderwijk.nl"
          },
          "secondaryEmail": {
            "type": [
              "string",
              "null"
            ],
            "description": "The secondary email address of this person",
            "format": "email",
            "maxLength": 256,
            "example": "poekie@xyz.nl"
          },
          "telephoneNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "The telephone number of this person",
            "maxLength": 256,
            "example": "+31 123 456 789"
          },
          "mobileNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "The mobile number of this person",
            "maxLength": 256,
            "example": "+31 612 345 678"
          },
          "photoSocial": {
            "type": [
              "string",
              "null"
            ],
            "description": "The url of the informal picture of this person",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Placeholder_female_superhero_c.png/203px-Placeholder_female_superhero_c.png"
          },
          "photoOfficial": {
            "type": [
              "string",
              "null"
            ],
            "description": "The url of the official picture of this person",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://upload.wikimedia.org/wikipedia/commons/6/66/Johannes_Vermeer_%281632-1675%29_-_The_Girl_With_The_Pearl_Earring_%281665%29.jpg"
          },
          "gender": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/gender"
              },
              {
                "type": "null"
              }
            ]
          },
          "titlePrefix": {
            "type": [
              "string",
              "null"
            ],
            "description": "A title prefix to be used for this person",
            "example": "drs"
          },
          "titleSuffix": {
            "type": [
              "string",
              "null"
            ],
            "description": "A title suffix to be used for this person",
            "example": "BSc"
          },
          "office": {
            "type": [
              "string",
              "null"
            ],
            "description": "The name of the office where this person is located",
            "example": "Zernikecomplex"
          },
          "address": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Address"
              },
              {
                "type": "null"
              }
            ]
          },
          "ICEName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Full name of In Case of Emergency contact",
            "maxLength": 256,
            "example": "Janne"
          },
          "ICEPhoneNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Phone number of In Case of Emergency contact",
            "maxLength": 256,
            "example": "+31 623 456 789"
          },
          "ICERelation": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ICERelationType"
              },
              {
                "type": "null"
              }
            ]
          },
          "languageOfChoice": {
            "type": [
              "array",
              "null"
            ],
            "description": "The language(s) of choice for this person according to RFC4647. For details see the descriptions in the Language schema.",
            "items": {
              "$ref": "#/components/schemas/Language"
            }
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            },
            "example": [
              {
                "codeType": "nationalIdentityNumber",
                "code": "00000"
              }
            ]
          },
          "assignedNeeds": {
            "description": "Assigned resources or time based on the needs of a person. \nThey describe which needs the student requires under which conditions e.g. 15% extra time for tests that requires maths skills.\nThese needs can later in the flows be mapped to a personalNeed for a specific association.\nExamples of such assignedNeeds: \"ExtraTimeOnlyMaths25%\", \"ExtraTimeOnlyMaths30Min\", \"ExtraTimeDigitalTests25%\"\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "description": "Human readable value for the code/identifier",
                  "type": [
                    "string",
                    "null"
                  ],
                  "example": "ExtraTimeOnlyMaths25%"
                },
                "description": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "The description of this assignedNeed.",
                  "minItems": 1,
                  "items": {
                    "$ref": "#/components/schemas/LanguageTypedString"
                  },
                  "example": [
                    {
                      "language": "en-GB",
                      "value": "Extra time for Maths tests shown in a percentile of the overall time of a test"
                    }
                  ]
                },
                "startDateTime": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The moment on which this assigned need starts, RFC3339 (date-time)",
                  "format": "date-time",
                  "example": "2025-05-30T20:00:00+01:00"
                },
                "endDateTime": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The moment on which this assigned need ends, RFC3339 (date-time)",
                  "format": "date-time",
                  "example": "2025-07-30T20:00:00+01:00"
                }
              }
            },
            "minItems": 0
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "organisationType": {
        "type": "string",
        "description": "The type of this organisation. When using non-root organisation types, make sure that there is always a parent organisation of type root available.\n\n- root: The top-level organisation, representing the organisation itself\n- institute: A subdivision of the root organisation, typically focused on a broad field of study\n- department: An organisational unit within an organisation or one of the subdivisions of an organisation, focused on a specific discipline\n- faculty: A major academic division within an institution, often overseeing multiple departments\n- branch: A geographically separate location or campus of an organisation\n- academy: A specialised academic unit, often focused on applied or artistic disciplines\n- school: An organisational unit typically used in primary, secondary, or specialised higher education contexts\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "root",
          "institute",
          "department",
          "faculty",
          "branch",
          "academy",
          "school"
        ],
        "example": "root"
      },
      "ProgrammeProperties": {
        "type": "object",
        "description": "A collection of courses that lead to a certifiable learning outcome",
        "required": [
          "programmeType",
          "name",
          "primaryCode"
        ],
        "properties": {
          "primaryCode": {
            "description": "The primary human readable identifier for the programme. This is often the source identifier as defined by the institution.",
            "$ref": "#/components/schemas/IdentifierEntry",
            "example": {
              "codeType": "programmeCode",
              "code": "BIO"
            }
          },
          "programmeType": {
            "$ref": "#/components/schemas/programmeType"
          },
          "name": {
            "description": "The name of this programme",
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Biology"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation of this programme",
            "maxLength": 256,
            "example": "BIO"
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this programme",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "The study of life"
              }
            ]
          },
          "teachingLanguages": {
            "type": [
              "array",
              "null"
            ],
            "description": "The languages in which this programme 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 programme.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/Language"
            }
          },
          "studyLoad": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/StudyLoadDescriptor"
            }
          },
          "qualificationAwarded": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/qualificationAwarded"
              },
              {
                "type": "null"
              }
            ]
          },
          "qualificationDesignations": {
            "type": "array",
            "description": "Academic field designations that specify the discipline area of the degree (e.g., \"of Arts\", \"of Sciences\", \"of Engineering\"). Multiple designations may apply to interdisciplinary programmes.",
            "items": {
              "type": "string",
              "description": "The designation suffix indicating the academic field or discipline (e.g., \"of Arts\" for humanities, \"of Sciences\" for natural sciences, \"of Engineering\" for engineering disciplines)"
            }
          },
          "modeOfStudy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/modeOfStudy"
              },
              {
                "type": "null"
              }
            ]
          },
          "modesOfDelivery": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/modeOfDelivery"
            }
          },
          "duration": {
            "type": [
              "string",
              "null"
            ],
            "description": "The duration of this programme. 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)?)?$",
            "example": "P1DT10H30M"
          },
          "firstStartDateTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "The moment when participants can follow this programme for the first time.",
            "format": "date-time",
            "example": "2025-08-28T08:30:00+01:00"
          },
          "levelOfQualification": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/levelOfQualification"
              },
              {
                "type": "null"
              }
            ]
          },
          "level": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/level"
              },
              {
                "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,
            "example": "0732"
          },
          "enrolment": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "description": "The extra information that is provided for enrolment",
            "example": [
              {
                "language": "en-GB",
                "value": "enrolment through SIS. [The limited implementation of Git Hub Markdown syntax](https://openonderwijsapi.nl/v6.0/#/technical/formatting-text) MAY be used for rich text representation."
              }
            ]
          },
          "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"
            },
            "example": [
              "book to be announced",
              "on-line resource x"
            ]
          },
          "learningOutcomeIds": {
            "description": "The identifiers of the learning outcomes related to this programme.\nWhen the client does not request expansion of `learningOutcomes`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Identifier"
            }
          },
          "learningOutcomes": {
            "description": "The expanded learning outcome objects related to this programme.\nWhen the client requests expansion of `learningOutcomes`, the full expanded 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": "#/components/schemas/LearningOutcome"
            }
          },
          "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": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Exam on campus"
              }
            ]
          },
          "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.",
            "example": [
              {
                "language": "en-GB",
                "value": "Students need to be enrolled at qualifying institutions of higher education that participate in this alliance"
              }
            ],
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/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": "#/components/schemas/LanguageTypedString"
            }
          },
          "formalDocument": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/formalDocument"
              },
              {
                "type": "null"
              }
            ]
          },
          "link": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL of the programme's website",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://bijvak.nl"
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/IdentifierEntry"
            },
            "example": [
              {
                "codeType": "crohoCreboCode",
                "code": "59312"
              }
            ]
          },
          "addresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Addresses for this programme",
            "items": {
              "$ref": "#/components/schemas/Address"
            }
          },
          "parentId": {
            "description": "The identifier of the parent programme of which the current programme is a child.\nWhen the client does not request expansion of `parent`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "parent": {
            "description": "The expanded parent programme of which the current programme is a child.\nWhen the client requests expansion of `parent`, the full expanded programme object MUST be returned here instead of only the identifier.\nIf no parent is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Programme"
              }
            ]
          },
          "childIds": {
            "description": "The identifiers of the programmes which are a part of this programme (e.g. specialisations).\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/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": "#/components/schemas/Identifier"
            }
          },
          "children": {
            "description": "The expanded programme objects which are a part of this programme (e.g. specialisations).\nWhen the client requests expansion of `children`, the full expanded programme objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Programme"
            }
          },
          "coordinatorIds": {
            "description": "The identifiers of the persons responsible for this programme.\nWhen the client does not request expansion of `coordinators`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Identifier"
            }
          },
          "coordinators": {
            "description": "The expanded person objects responsible for this programme.\nWhen the client requests expansion of `coordinators`, the full expanded person 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": "#/components/schemas/Person"
            }
          },
          "instructorIds": {
            "description": "The identifiers of the persons teaching or delivering this programme.\nWhen the client does not request expansion of `instructors`, only these identifiers are returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Identifier"
            }
          },
          "instructors": {
            "description": "The expanded person objects teaching or delivering this programme.\nWhen the client requests expansion of `instructors`, the full expanded person 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": "#/components/schemas/Person"
            }
          },
          "organisationId": {
            "description": "The identifier of the organisation providing this programme.\nWhen the client does not request expansion of `organisation`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "organisation": {
            "description": "The expanded organisation object providing this programme.\nWhen the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no organisation is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Organisation"
              }
            ]
          },
          "supplementaryInformation": {
            "$ref": "#/components/schemas/SupplementaryInformation"
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "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": "#/components/schemas/IdentifierEntry"
          },
          "name": {
            "type": "array",
            "description": "The name of this course (ECTS-title)",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Academic and Professional Writing"
              }
            ]
          },
          "abbreviation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The abbreviation or internal code used to identify this course (ECTS-code)",
            "maxLength": 256,
            "example": "INFOMQNM"
          },
          "studyLoad": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/StudyLoadDescriptor"
            }
          },
          "modesOfDelivery": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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)?)?$",
            "example": "P1DT10H30M"
          },
          "firstStartDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "The date and time when participants can follow this course for the first time.",
            "format": "date-time",
            "example": "2020-09-28T08:30:00+01:00"
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "description": "The description of this course (ECTS-description).",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "As with all empirical sciences, to assure valid outcomes, HCI studies heavily rely on research methods and statistics. This holds for the design of user interfaces, personalized recommender systems, and interaction paradigms for the internet of things. This course prepares you to do so by learning you to collect data, design experiments, and analyse the results. By the end of the course, you will have a detailed understanding of how to select and apply quantitative research methods and analysis to address virtually all HCI challenges. Quantitative research and data analysis will be taught in the context of state-of-the-art HCI challenges. Lectures will be alternated with hands-on learning, including work with predefined datasets (e.g., addressing facial features, cognitive load, and emotion). Additionally, students will set up their own research (e.g., using eye tracking). Data processing and analysis will be executed using R."
              }
            ]
          },
          "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": "#/components/schemas/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,
            "example": "0732"
          },
          "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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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": "#/components/schemas/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.",
            "example": [
              {
                "language": "en-GB",
                "value": "Students need to be enrolled at qualifying institutions of higher education that participate in this alliance"
              }
            ],
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/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": "#/components/schemas/LanguageTypedString"
            }
          },
          "level": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/level"
              },
              {
                "type": "null"
              }
            ]
          },
          "enrolment": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "description": "The extra information that is provided for enrolment",
            "example": [
              {
                "language": "en-GB",
                "value": "enrolment through SIS. [The limited implementation of Git Hub Markdown syntax](https://openonderwijsapi.nl/v6.0/#/technical/formatting-text) MAY be used for rich text representation."
              }
            ]
          },
          "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"
            },
            "example": [
              "book to be announced",
              "on-line resource x"
            ]
          },
          "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": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Exam on campus"
              }
            ]
          },
          "link": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL of the course's website",
            "format": "uri",
            "maxLength": 2048,
            "example": "https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM"
          },
          "addresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Addresses for this course",
            "items": {
              "$ref": "#/components/schemas/Address"
            }
          },
          "otherCodes": {
            "type": [
              "array",
              "null"
            ],
            "description": "An array of additional human readable codes/identifiers for the entity being described.",
            "items": {
              "$ref": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Identifier"
            }
          },
          "supplementaryInformation": {
            "$ref": "#/components/schemas/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": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/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": "#/components/schemas/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://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "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",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Organisation"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ProgrammeOfferingId": {
        "type": "object",
        "required": [
          "programmeOfferingId"
        ],
        "properties": {
          "programmeOfferingId": {
            "type": "string",
            "description": "The unique ID of the programme offering, this should be unique across all programme, course, learning, and test component offerings.",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-134564174000"
          }
        }
      },
      "LearningComponentOfferingId": {
        "type": "object",
        "required": [
          "learningComponentOfferingId"
        ],
        "properties": {
          "learningComponentOfferingId": {
            "type": "string",
            "description": "The unique ID of the learning component offering, this should be unique across all programme, course, learning, and test component offerings.",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-134564174000"
          }
        }
      },
      "roomType": {
        "type": "string",
        "description": "The type of this room.\n\n- general_purpose: Multi-purpose space used for general activities or flexible functions.\n- lecture_room: Room primarily used for lectures or large instructional sessions.\n- computer_room: Space equipped with computers for teaching, training or research.\n- laboratory: Room designed for practical experiments, testing or scientific work.\n- office: Workspace for administrative or academic staff.\n- workspace: Shared or individual area for working or studying.\n- exam_location: Designated space for taking written or digital examinations.\n- study_room: Quiet area intended for individual or group study.\n- examination_room: Private space for medical or psychological assessments.\n- conference_room: Room intended for meetings, discussions or presentations.\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "general_purpose",
          "lecture_room",
          "computer_room",
          "laboratory",
          "office",
          "workspace",
          "exam_location",
          "study_room",
          "examination_room",
          "conference_room"
        ],
        "example": "exam_location"
      },
      "learningComponentType": {
        "type": "string",
        "description": "The type of learning component, indicating the format or method of educational delivery.\nOne learning component of a certain type can have multiple offerings, one component can refer to a set of componentOfferings.\ne.g. the component lecture can be a set of lectures (group of offerings)\nAn example of such a case in natural language: the lecture takes place weekly for 7 weeks\nThis implies one learningComponent of type lecture with seven learningComponentOfferings of type lecture. \n\n| Code                | Description                                                    |\n|---------------------|----------------------------------------------------------------|\n| `consultation`      | Scheduled meeting for individual or group guidance.            |\n| `excursion`         | Educational trip or site visit.                                |\n| `external`          | Activity outside the home institution (e.g. internship,        |\n|                     | course at a partner institution).                              |\n| `independent_study` | Self-directed learning without scheduled contact hours.        |\n| `learning_community`| Structured collaboration between education, research and       |\n|                     | industry with shared ownership of learning and outcomes;       |\n|                     | distinct from internships and from COIL.                       |\n| `lecture`           | Classroom-based or online lecture given by an instructor.      |\n| `practical`         | Hands-on session focusing on application of concepts.          |\n| `project`           | Structured assignment carried out over a period of time.       |\n| `skills_training`   | Session focused on developing specific practical or            |\n|                     | professional skills.                                           |\n| `tutorial`          | Interactive small-group session to reinforce learning.         |\n| `workshop`          | Intensive session focused on practical skills or knowledge.    |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "consultation",
          "excursion",
          "external",
          "independent_study",
          "learning_community",
          "lecture",
          "practical",
          "project",
          "skills_training",
          "tutorial",
          "workshop"
        ],
        "example": "learning_community"
      },
      "TestComponentOfferingId": {
        "type": "object",
        "required": [
          "testComponentOfferingId"
        ],
        "properties": {
          "testComponentOfferingId": {
            "type": "string",
            "description": "The unique ID of the test component offering, this should be unique across all programme, course, learning, and test component offerings.",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-134564174000"
          }
        }
      },
      "testComponentType": {
        "type": "string",
        "description": "The way the test is conducted. This can be a test on paper, a digital test, a life-skills test, an oral test, or a portfolio assessment.  \nTogether with modeOfStudy or assessment, it indicates where the test is taken and how it is conducted:\n\n- unknown: The type of test is not (yet) known or not specified.\n- test_on_paper: Written examination on paper, typically in a controlled setting.\n- digital_test: Computer-based or online test, conducted via a digital platform.\n- life_skills_test: Practical assessment of real-world competencies and life-skills.\n- oral_test: Spoken examination, typically involving verbal questioning and answering.\n- portfolio_assessment: Evaluation based on a collection of the candidate's work over time.\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "unknown",
          "test_on_paper",
          "digital_test",
          "life_skills_test",
          "oral_test",
          "portfolio_assessment"
        ],
        "example": "test_on_paper"
      },
      "componentState": {
        "type": "string",
        "description": "The state of this component or offering:\n  \n- concept: not yet finalised or published\n- cancelled: withdrawn and no longer available\n- active: currently available and in use\n- inactive: no longer in use, but not cancelled\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "concept",
          "cancelled",
          "active",
          "inactive"
        ],
        "example": "active"
      },
      "documentType": {
        "type": "string",
        "description": "The type of document:\n\n  - additional_document: Used to provide supplementary information\n  - assessment_form: A form used to assess a test\n  - assessment_model: A formal description of how a test is assessed\n  - assignment: A description of what is expected from a student, e.g. to submit a paper\n  - attendance_report: A report containing information on a student’s attendance for a course or test\n  - handed_in_document: A document submitted by the student\n  - instructions: Instructions for the student on how to enrol in a course or take a test\n  - plagiarism_report: A report containing information on (potential) plagiarism, e.g. in a submitted document\n  - session_report: A report containing information on a session, e.g. an academic session, course, or test session\n  - test_made: The completed test, including all answers provided by the student\n  - other: Any other type of document not listed above\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "additional_document",
          "assessment_form",
          "assessment_model",
          "assignment",
          "attendance_report",
          "handed_in_document",
          "instructions",
          "plagiarism_report",
          "session_report",
          "test_made",
          "other"
        ],
        "example": "test_made"
      },
      "AssociationId": {
        "type": "object",
        "properties": {
          "associationId": {
            "type": "string",
            "description": "Unique id of this association",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-426614174000"
          }
        },
        "required": [
          "associationId"
        ]
      },
      "associationRole": {
        "type": "string",
        "description": "The role of the person associated with the offering:\n  \n- student: Enrolled participant in the offering\n- lecturer: Delivers lectures or leads teaching\n- teaching_assistant: Supports the lecturer in teaching activities\n- coordinator: Responsible for organisational or administrative aspects\n- invigilator: Supervises examinations or assessments\n- assessor: Evaluates student performance or work\n- guest: External participant with an atypical role\n  \nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "student",
          "lecturer",
          "teaching_assistant",
          "coordinator",
          "invigilator",
          "assessor",
          "guest"
        ],
        "example": "student"
      },
      "associationState": {
        "type": "string",
        "description": "The state of this association:\n  \n- pending: A student has requested enrolment, but it has not yet been confirmed, accepted or processed\n- cancelled: The association has been cancelled, for example by the student or the institution\n- denied: The student was denied enrolment, for example because they did not meet the requirements\n- associated: The association has been confirmed, accepted or processed; the student is enrolled\n- queued: The association is in a queue, for example because the course is full\n- finished: The association has ended, for example because the course has ended or the student has completed the course\n  \nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "pending",
          "cancelled",
          "denied",
          "associated",
          "queued",
          "finished"
        ],
        "example": "associated"
      },
      "remoteAssociationState": {
        "type": "string",
        "description": "The state of this association for the organisation performing the request:\n\n- pending: The association request has been submitted, but not yet processed\n- cancelled: The association request was withdrawn before completion\n- denied: The association request was reviewed, and explicitly rejected\n- associated: The association has been successfully established, and is active\n- queued: The association request is awaiting processing in a queue\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "pending",
          "cancelled",
          "denied",
          "associated",
          "queued"
        ],
        "example": "associated"
      },
      "AssociationProperties": {
        "type": "object",
        "description": "A relationship between a person object and an offering",
        "required": [
          "role",
          "state"
        ],
        "properties": {
          "role": {
            "$ref": "#/components/schemas/associationRole"
          },
          "startDateTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The start date and time the person is intended to start participating in the offering. Formatted according to RFC3339 (full-date)",
            "example": "2025-01-01T08:30:00+01:00"
          },
          "expectedEndDateTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The expected end date and time the person is intended to stop participating in the offering. Formatted according to RFC3339 (date-time)",
            "example": "2025-10-25T08:30:00+01:00"
          },
          "actualEndDateTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The actual end date and time the person stopped participating in the offering. Formatted according to RFC3339 (full-date)",
            "example": "2025-10-23T08:30:00+01:00"
          },
          "state": {
            "$ref": "#/components/schemas/associationState"
          },
          "remoteState": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/remoteAssociationState"
              },
              {
                "type": "null"
              }
            ]
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "resultState": {
        "type": "string",
        "description": "The state of this result:\n\n- in_progress: The result is currently being worked on or assessed\n- postponed: The result process has been delayed and will be resumed later\n- completed: The result has been finalised and recorded\n- queued: The result is awaiting processing or evaluation\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "in_progress",
          "postponed",
          "completed",
          "queued"
        ],
        "example": "completed"
      },
      "passState": {
        "type": "string",
        "description": "The state of this result:\n\n- unknown: The result has not been determined, recorded, or is not yet available\n- passed: The individual has met the required criteria to pass\n- failed: The individual did not meet the required criteria to pass\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "unknown",
          "passed",
          "failed"
        ],
        "example": "passed"
      },
      "Document": {
        "type": "object",
        "required": [
          "documentId",
          "documentType",
          "documentName"
        ],
        "properties": {
          "documentId": {
            "type": "string",
            "description": "The unique identifier of the document",
            "example": "12345678-1234-1234-1234-123456789012"
          },
          "documentType": {
            "$ref": "#/components/schemas/documentType"
          },
          "documentName": {
            "type": "string",
            "description": "The name of the document",
            "example": "paper_test_1234333.pdf"
          }
        }
      },
      "Result": {
        "type": "object",
        "description": "A result as part of an association or attempt",
        "required": [
          "state",
          "resultDateTime"
        ],
        "properties": {
          "state": {
            "$ref": "#/components/schemas/resultState"
          },
          "pass": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/passState"
              },
              {
                "type": "null"
              }
            ]
          },
          "comment": {
            "type": [
              "string",
              "null"
            ],
            "description": "The comment on this result",
            "example": "Strong performance overall, only minor calculation errors in section 3."
          },
          "score": {
            "type": [
              "string",
              "null"
            ],
            "description": "The score of this programme/course/component association (based on resultValueType in offering)",
            "example": "9"
          },
          "rawScore": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The number of points scored by a person (on the test or assessment) from which the result could be calculated. \nThe raw score provides additional insight in the achievement of the person. \nThe raw score also needs the value of maxRawScore to provide necessary context.\n",
            "example": 72
          },
          "maxRawScore": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The maximum number of points a person could achieve on the test or assessment form.\n",
            "example": 80
          },
          "final": {
            "type": [
              "boolean",
              "null"
            ],
            "default": false,
            "description": "final: indicates that the result has been finalised by the exam committee. \nThis can be done in any step of the test taking and assessment cycle. \n",
            "example": true
          },
          "assessorId": {
            "description": "The identifier of the assessor responsible for evaluating the result.\nWhen the client does not request expansion of `assessor`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
            "$ref": "#/components/schemas/Identifier"
          },
          "assessor": {
            "description": "The expanded assessor (person) responsible for evaluating the result.\nWhen the client requests expansion of `assessor`, the full person object MUST be returned here instead of only the identifier.\nIf no assessor is defined, this value is `null`.\n",
            "type": [
              "object",
              "null"
            ],
            "allOf": [
              {
                "$ref": "#/components/schemas/Person"
              }
            ]
          },
          "resultDateTime": {
            "type": "string",
            "description": "The date this result has been published, RFC3339 (full-date)",
            "format": "date-time",
            "example": "2025-11-28T08:30:00+01:00"
          },
          "documents": {
            "type": [
              "array",
              "null"
            ],
            "description": "Documents that are related to the result of the test component offering association. E.g. assessment form, assessment model, etc.\n",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          },
          "consumer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Consumer"
              },
              {
                "type": "null"
              }
            ]
          },
          "ext": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ext"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "CourseOfferingAssociationResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Result"
          },
          {
            "type": "object",
            "required": [
              "studyLoad"
            ],
            "properties": {
              "studyLoad": {
                "$ref": "#/components/schemas/StudyLoadDescriptor"
              }
            }
          }
        ]
      },
      "CourseOfferingAssociationExternalMe": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AssociationId"
          },
          {
            "$ref": "#/components/schemas/AssociationProperties"
          },
          {
            "type": "object",
            "anyOf": [
              {
                "required": [
                  "courseOfferingId"
                ]
              },
              {
                "title": "With expanded course offering",
                "required": [
                  "courseOffering"
                ]
              }
            ],
            "properties": {
              "studyLoad": {
                "description": "Only required when the studyload for the individual student/enrolment is different \nfrom the studyload of the course offering.\n",
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/StudyLoadDescriptor"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "result": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CourseOfferingAssociationResult"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "courseOfferingId": {
                "description": "The identifier of the courseOffering referenced here.\nWhen the client or server does not expand `offering`, only this\nidentifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "courseOffering": {
                "description": "The expanded courseOffering object referenced here.\nWhen the client or server expands `offering`, the full expanded\ncourseOffering object MUST be returned here instead of only the\nidentifier.\nIf no offering is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CourseOffering"
                  }
                ]
              }
            }
          }
        ]
      },
      "PostResponse": {
        "type": "object",
        "description": "A system message as a response to a POST message",
        "required": [
          "message"
        ],
        "properties": {
          "message": {
            "description": "information displayed to user",
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/LanguageTypedString"
            },
            "example": [
              {
                "language": "en-GB",
                "value": "Your enrolment was partly successful, you have been placed on the waiting list"
              }
            ]
          },
          "redirect": {
            "description": "URL where additional information can be found e.g. by use of deep link",
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "maxLength": 2048,
            "example": "https://university.example.org/"
          }
        }
      },
      "groupType": {
        "type": "string",
        "description": "The type of this group:\n\n- class: A group of students jointly scheduled for, assigned to, or engaged in educational activities\n- team: A group composed of members of a team, which may consist of students, staff, or a mix of both\n- group: A group of students jointly scheduled for, assigned to, or engaged in educational activities in a context not covered by a class\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "class",
          "team",
          "group"
        ],
        "example": "class"
      },
      "GroupId": {
        "type": "object",
        "required": [
          "groupId"
        ],
        "properties": {
          "groupId": {
            "type": "string",
            "description": "The unique ID of the group.",
            "format": "uuid",
            "example": "123e4567-e89b-12d3-a456-134564174000"
          }
        }
      },
      "courseOfferingId": {
        "type": "string",
        "description": "The unique ID of the course offering, this should be unique across all programme, course, learning, and test component offerings.",
        "format": "uuid",
        "example": "123e4567-e89b-12d3-a456-134564174000"
      },
      "programmeOfferingId": {
        "type": "string",
        "description": "The unique ID of the programme offering, this should be unique across all programme, course, learning, and test component offerings.",
        "format": "uuid",
        "example": "123e4567-e89b-12d3-a456-134564174000"
      },
      "learningComponentOfferingId": {
        "type": "string",
        "description": "The unique ID of the learning component offering, this should be unique across all programme, course, learning, and test component offerings.",
        "format": "uuid",
        "example": "123e4567-e89b-12d3-a456-134564174000"
      },
      "testComponentOfferingId": {
        "type": "string",
        "description": "The unique ID of the test component offering, this should be unique across all programme, course, learning, and test component offerings.",
        "format": "uuid",
        "example": "123e4567-e89b-12d3-a456-134564174000"
      },
      "TimelineOverrideCourse": {
        "type": "object",
        "required": [
          "validFrom",
          "course"
        ],
        "description": "A timeline override of the course.",
        "properties": {
          "validFrom": {
            "type": "string",
            "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)",
            "format": "date-time",
            "example": "2025-09-01T08:30:00+01:00"
          },
          "validTo": {
            "type": [
              "string",
              "null"
            ],
            "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)",
            "format": "date-time",
            "example": "2025-11-30T08:30:00+01:00"
          },
          "course": {
            "$ref": "#/components/schemas/CourseProperties"
          }
        }
      },
      "CourseExpanded": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Course"
          },
          {
            "type": "object",
            "description": "These properties are only present when explicitly included",
            "properties": {
              "timelineOverrides": {
                "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/TimelineOverrideCourse"
                }
              }
            }
          }
        ]
      },
      "membershipState": {
        "type": "string",
        "description": "The state of this membership:\n\n- cancelled: The membership has been formally terminated and is no longer valid\n- active: The membership is currently valid and in effect\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "cancelled",
          "active"
        ],
        "example": "active"
      },
      "membershipRole": {
        "type": "string",
        "description": "The role of this person in the context of this membership:\n\n- student: Enrolled participant in the offering\n- lecturer: Delivers lectures or leads teaching\n- teaching_assistant: Supports the lecturer in teaching activities\n- coordinator: Responsible for organisational or administrative aspects\n- invigilator: Supervises examinations or assessments\n- assessor: Evaluates student performance or work\n- guest: External participant with an atypical role\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "student",
          "lecturer",
          "teaching_assistant",
          "coordinator",
          "invigilator",
          "assessor",
          "guest"
        ],
        "example": "student"
      },
      "LearningComponentOfferingAssociationResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Result"
          },
          {
            "type": "object",
            "properties": {
              "weight": {
                "type": "integer",
                "description": "The weight to 100 as total for this offering in the course",
                "format": "int32",
                "minimum": 0,
                "maximum": 100,
                "example": 100
              }
            }
          }
        ]
      },
      "associationAttendance": {
        "type": "string",
        "description": "The attendance status of an individual's association with an offering:\n- unknown: attendance status is unknown or unrecorded\n- not_started: attendance has not yet begun\n- unfinished: attendance has begun but not completed\n- present: individual attended as expected\n- absent: individual did not attend\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "unknown",
          "not_started",
          "unfinished",
          "present",
          "absent"
        ],
        "example": "present"
      },
      "ProgrammeOfferingAssociationResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Result"
          },
          {
            "type": "object",
            "required": [
              "studyLoad"
            ],
            "properties": {
              "studyLoad": {
                "$ref": "#/components/schemas/StudyLoadDescriptor"
              }
            }
          }
        ]
      },
      "ProgrammeOfferingAssociationExternalMe": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AssociationId"
          },
          {
            "$ref": "#/components/schemas/AssociationProperties"
          },
          {
            "type": "object",
            "anyOf": [
              {
                "required": [
                  "programmeOfferingId"
                ]
              },
              {
                "title": "With expanded programme offering",
                "required": [
                  "programmeOffering"
                ]
              }
            ],
            "properties": {
              "result": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/ProgrammeOfferingAssociationResult"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "programmeOfferingId": {
                "description": "The identifier of the `programmeOffering` referenced here.\nWhen the client does not request expansion of `offering`, only this identifier is returned.\nThis field is [`expandable`](https://openonderwijsapi.nl/v6.0/#/technical/expanding-responses).\n",
                "$ref": "#/components/schemas/Identifier"
              },
              "programmeOffering": {
                "description": "The expanded programmeOffering object referenced here.\nWhen the client requests expansion of `offering`, the full expanded programmeOffering object MUST be returned here instead of only the identifier.\nIf no offering is defined, this value is `null`.\n",
                "type": [
                  "object",
                  "null"
                ],
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ProgrammeOffering"
                  }
                ]
              }
            }
          }
        ]
      },
      "personalNeed": {
        "type": "string",
        "description": "The personal needs required for this component by this specific candidate.\n\nThis list is a selection from the IMS Global Personal Needs and Preferences specification.\nFor the full reference, see:  \nhttps://www.imsglobal.org/sites/default/files/spec/afa/3p0/information_model/imsafa3p0pnp_v1p0_InfoModel.html\n\n- extra_time: Additional time allocated for completing the component beyond standard timing\n- spoken: Spoken output support (e.g. text-to-speech)\n- spell_checker_on_screen: On-screen spell checking tool enabled during writing tasks\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "extra_time",
          "spoken",
          "spell_checker_on_screen"
        ],
        "example": "extra_time"
      },
      "TestComponentOfferingAssociationResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Result"
          },
          {
            "type": "object",
            "properties": {
              "weight": {
                "type": "integer",
                "description": "The weight to 100 as total for this offering in the course",
                "format": "int32",
                "minimum": 0,
                "maximum": 100,
                "example": 100
              }
            }
          }
        ]
      },
      "attemptState": {
        "type": "string",
        "description": "Status of the fulfilment of the attempt. \nThe status typically progresses from pending to associated and then to finished. \n- pending: A student is associated to the offering, but has not yet been allocated a specific attempt.\n- cancelled: The attempt has been cancelled, for example by the student or the institution\n- associated: The attempt has been confirmed/accepted/processed, the student is enrolled for a specific test moment\n- finished: The attempt has ended, for example because the student has ended the test or the student has completed the test, or the deadline for handing in / finishing the test has expired.\n",
        "x-ooapi-extensible-enum": [
          "pending",
          "cancelled",
          "associated",
          "finished"
        ],
        "example": "associated"
      },
      "attendance": {
        "type": "string",
        "description": "The attendance status of an individual's association with an offering:\n- unknown: attendance status is unknown or unrecorded\n- not_started: attendance has not yet begun\n- unfinished: attendance has begun but not completed\n- present: individual attended as expected\n- absent: individual did not attend\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
        "x-ooapi-extensible-enum": [
          "unknown",
          "not_started",
          "unfinished",
          "present",
          "absent"
        ],
        "example": "present"
      },
      "TimelineOverrideProgramme": {
        "type": "object",
        "description": "A time-line override of the programme.",
        "required": [
          "validFrom",
          "programme"
        ],
        "properties": {
          "validFrom": {
            "type": "string",
            "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)",
            "format": "date-time",
            "example": "2025-09-01T08:30:00+01:00"
          },
          "validTo": {
            "type": [
              "string",
              "null"
            ],
            "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)",
            "format": "date-time",
            "example": "2025-11-30T08:30:00+01:00"
          },
          "programme": {
            "$ref": "#/components/schemas/ProgrammeProperties"
          }
        }
      },
      "ProgrammeExpanded": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Programme"
          },
          {
            "type": "object",
            "description": "These properties are only present when explicitly included. This allows for creating and displaying structures of programmes",
            "properties": {
              "timelineOverrides": {
                "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.",
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/TimelineOverrideProgramme"
                }
              }
            }
          }
        ]
      },
      "Url": {
        "type": "string",
        "description": "Url containing a web address.",
        "format": "uri",
        "maxLength": 2048,
        "example": "https://www.universiteitvanharderwijk.nl"
      },
      "TestComponentOfferingAssociationAttemptFull": {
        "allOf": [
          {
            "$ref": "#/components/schemas/TestComponentOfferingAssociationAttempt"
          },
          {
            "type": "object",
            "properties": {
              "courseOfferingAssociationId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The unique identifier of the student’s enrolment in a course offering to which the \ncurrent association relates.\n",
                "format": "uuid",
                "example": "123e4567-e89b-12d3-a456-426614174000"
              },
              "testComponentOfferingAssociationId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The associationId under which this attempt was made.\n",
                "format": "uuid",
                "example": "123e4567-e89b-12d3-a456-426614174000"
              }
            }
          }
        ]
      }
    },
    "responses": {
      "ErrorBadRequest": {
        "description": "Bad request",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "https://api.example.org/problems/invalid-parameter",
              "title": "Invalid request parameters",
              "status": 400,
              "detail": "The query parameter 'mode' must be one of: full, basic.",
              "instance": "https://api.example.org/courses?mode=invalid"
            }
          }
        }
      },
      "ErrorUnauthorized": {
        "description": "Unauthorized",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "https://api.example.org/problems/unauthorized",
              "title": "Unauthorized",
              "status": 401,
              "detail": "Authentication credentials were missing or invalid.",
              "instance": "https://api.example.org/student/12345"
            }
          }
        }
      },
      "ErrorForbidden": {
        "description": "Forbidden",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "https://api.example.org/problems/forbidden",
              "title": "Forbidden",
              "status": 403,
              "detail": "You do not have permission to access this resource.",
              "instance": "https://api.example.org/admin/enrolments"
            }
          }
        }
      },
      "ErrorNotFound": {
        "description": "Not Found.  \n\nReturned only when a specific resource identified by its identifier\ncannot be located. This applies to instance endpoints where a single,\nuniquely-addressable object is expected.  \n\nCollection endpoints should not return a 404. If no items match the request,\nthey must return an empty array. A 404 may still occur if the collection\nendpoint itself does not exist or is not accessible.\n",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "examples": {
              "instanceNotFound": {
                "summary": "Instance endpoint: resource not found",
                "value": {
                  "type": "https://api.example.org/problems/not-found",
                  "title": "Resource not found",
                  "status": 404,
                  "detail": "The course with id 'abc123' could not be found.",
                  "instance": "https://api.example.org/courses/abc123"
                }
              },
              "collectionEndpointNotFound": {
                "summary": "Collection endpoint unavailable",
                "value": {
                  "type": "https://api.example.org/problems/not-found",
                  "title": "Collection endpoint not found",
                  "status": 404,
                  "detail": "The collection endpoint '/course-offerings' does not exist or is not accessible.",
                  "instance": "https://api.example.org/course-offerings"
                }
              }
            }
          }
        }
      },
      "ErrorMethodNotAllowed": {
        "description": "Method not allowed",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "https://api.example.org/problems/method-not-allowed",
              "title": "Method not allowed",
              "status": 405,
              "detail": "The method POST is not supported for this endpoint.",
              "instance": "https://api.example.org/courses/abc123"
            }
          }
        }
      },
      "ErrorNotAcceptable": {
        "description": "Not Acceptable.\n\nReturned when the server cannot produce a representation in the\nrequested OOAPI or consumer version. The server may serve the\nrequested version or any lower compatible minor version.\n\nIf neither the requested version nor a lower minor version is\navailable, a 406 response is returned to indicate that no acceptable\nrepresentation can be produced.\n\nThis behaviour slightly deviates from strict HTTP semantics. Although\nno HTTP Accept header is used, the server performs an internal\nAccept-like version check after the HTTP layer, and returns 406 to\nsignal that the requested representation cannot be provided.\n\nThis approach improves clarity, implementation consistency and\ndebugging, because the requested and supported versions are explicit\nin both the request and the 406 response, avoiding ambiguity caused\nby full HTTP content negotiation or Accept-based parsing.\n\nIt also improves logging. Servers can log the requested and supported\nversions at the point of mismatch, allowing operators to detect\noutdated consumers, configuration issues or unexpected version drift.\n",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemVersionNotAcceptable"
            },
            "examples": {
              "unsupportedOoapiVersion": {
                "summary": "Requested OOAPI version is not supported",
                "description": "Example where the client requests OOAPI version 5.0 and the server\ncannot serve that version or a lower compatible minor version.\n",
                "value": {
                  "type": "https://api.example.org/problems/version-not-acceptable",
                  "title": "Version not acceptable",
                  "status": 406,
                  "detail": "The requested OOAPI version '5.0' cannot be served.",
                  "requestedVersion": "5.0",
                  "supportedVersions": [
                    "6.1",
                    "6.0"
                  ],
                  "instance": "https://api.example.org/courses"
                }
              },
              "unsupportedConsumerVersion": {
                "summary": "Requested consumer version is not supported",
                "description": "Example where the client requests consumer version 2.0 which is not\nsupported by the server and no lower compatible consumer version is\navailable.\n",
                "value": {
                  "type": "https://api.example.org/problems/version-not-acceptable",
                  "title": "Consumer version not acceptable",
                  "status": 406,
                  "detail": "The consumer version '2.0' is not supported.",
                  "requestedVersion": "2.0",
                  "supportedVersions": [
                    "1.0",
                    "0.94"
                  ],
                  "instance": "https://api.example.org/enrolments"
                }
              }
            }
          }
        }
      },
      "ErrorTooManyRequests": {
        "description": "Too many requests",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "https://api.example.org/problems/too-many-requests",
              "title": "Too many requests",
              "status": 429,
              "detail": "You have exceeded the rate limit of 100 requests per minute.",
              "instance": "https://api.example.org/courses"
            }
          }
        }
      },
      "ErrorInternalServerError": {
        "description": "Internal Server Error",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "https://api.example.org/problems/internal-server-error",
              "title": "Internal server error",
              "status": 500,
              "detail": "An unexpected error occurred while processing your request.",
              "instance": "https://api.example.org/enrolments/submit"
            }
          }
        }
      }
    },
    "parameters": {
      "primaryCode": {
        "name": "primaryCode",
        "in": "query",
        "description": "The primaryCode of the requested item. This is often the source identifier as defined by the institution.",
        "required": false,
        "schema": {
          "type": "string"
        }
      },
      "pageSize": {
        "name": "pageSize",
        "in": "query",
        "description": "The number of items per page",
        "required": false,
        "schema": {
          "type": "integer",
          "format": "int32",
          "default": 10,
          "enum": [
            10,
            20,
            50,
            100,
            250
          ]
        }
      },
      "pageNumber": {
        "name": "pageNumber",
        "in": "query",
        "description": "The page number to get. Page numbers start at 1.",
        "required": false,
        "schema": {
          "type": "integer",
          "format": "int32",
          "example": 1,
          "minimum": 1
        }
      },
      "consumer": {
        "name": "consumer",
        "in": "query",
        "description": "Request entities intended for a specific consumer. The `consumer` profile allows for adding additional data, or specific rules concerning the presentation of the data. A consumer can be selected based on the key of the consumer profile. An implementation of the OOAPI SHOULD always return the consumer information inside the consumer property of the object(s) that are requested. Further information regarding the use of consumers can be found in the [documentation](https://openonderwijsapi.nl/v6.0/#/technical/consumers-and-profiles/)",
        "required": false,
        "schema": {
          "type": "string"
        }
      },
      "filterQuery": {
        "name": "filter_query",
        "in": "query",
        "required": false,
        "style": "deepObject",
        "explode": true,
        "description": "Filter object serialised as `filter_query[field][operation]=value`.\nMultiple top-level fields are combined with AND. CSV is accepted where noted.\n\nInspired by Storyblok (https://www.storyblok.com/docs/api/content-delivery/v2/filter-queries)\n\nWildcards:\n- Prefer using only the asterisk `*` as a wildcard for partial matches (e.g., like and not_like).\n\nImplementation note:\n- The availability and behaviour of this query functionality are entirely determined by the organisation hosting\n  the API implementation. It is not mandatory for implementers to support this functionality, and it cannot be enforced \n  upon organisations that provide or consume OOAPI endpoints.\n- It is up to each implementer to decide whether to support this feature. It is **not** a requirement of the OOAPI \n  standard itself.\n- Consumers or working groups that wish to apply specific filtering mechanisms are encouraged to do so using \n  this approach for the sake of consistency across implementations.\n\nExamples:  \n- **Filter course offerings by programme, delivery, language and start date**  \n  `filter_query[programme.code][in]=B-IT-2025&filter_query[organisation.code][in]=RuG&filter_query[mode_of_delivery][in]=on_campus,hybrid&filter_query[language_of_instruction][in]=en-GB&filter_query[start_date][gt_date]=2025-09-01T00:00:00Z`  \n  \n- **Only offerings with email contact present**  \n  `filter_query[contacts.email][is]=not_empty`  \n",
        "schema": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "is": {
                "$ref": "#/components/schemas/filterPresence"
              },
              "in": {
                "type": "string",
                "description": "Exact match; multiple values allowed as CSV.",
                "example": "RuG"
              },
              "not_in": {
                "type": "string",
                "description": "Negated inclusion; multiple values as CSV.",
                "example": "UvA,VU"
              },
              "like": {
                "type": "string",
                "description": "Partial match using wildcards. Prefer `*` as the wildcard.\n",
                "example": "*Amsterdam*"
              },
              "not_like": {
                "type": "string",
                "description": "Negated partial match using wildcards. Prefer `*` as the wildcard.\n",
                "example": "*deprecated*"
              },
              "any_in_array": {
                "type": "string",
                "description": "Match if any of the CSV values occur.",
                "example": "evening,block_week"
              },
              "all_in_array": {
                "type": "string",
                "description": "Match if all CSV values occur.",
                "example": "evening,block_week"
              },
              "gt_int": {
                "type": "integer",
                "description": "Greater than (integer).",
                "example": 5
              },
              "lt_int": {
                "type": "integer",
                "description": "Less than (integer).",
                "example": 30
              },
              "gt_float": {
                "type": "number",
                "description": "Greater than (float).",
                "example": 5.5
              },
              "lt_float": {
                "type": "number",
                "description": "Less than (float).",
                "example": 12
              },
              "gt_date": {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 date-time.",
                "example": "2025-09-01T00:00:00Z"
              },
              "lt_date": {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 date-time.",
                "example": "2025-12-31T23:59:59Z"
              }
            }
          }
        }
      },
      "filterQueryOr": {
        "name": "filter_query[__or][]",
        "in": "query",
        "required": false,
        "style": "deepObject",
        "explode": true,
        "description": "OR blocks. Provide an array of single-field filter objects, each combined with OR.\nSerialises as `filter_query[__or][][field][operation]=value`.\n\nInspired by Storyblok (https://www.storyblok.com/docs/api/content-delivery/v2/filter-queries)\n\nWildcards:\n- Prefer using only the asterisk `*` as a wildcard for partial matches (e.g., like).\n\nImplementation note:\n- The availability and behaviour of this query functionality are entirely determined by the organisation hosting\n  the API implementation. It is not mandatory for implementers to support this functionality, and it cannot be enforced \n  upon organisations that provide or consume OOAPI endpoints.\n- It is up to each implementer to decide whether to support this feature. It is **not** a requirement of the OOAPI \n  standard itself.\n- Consumers or working groups that wish to apply specific filtering mechanisms are encouraged to do so using \n  this approach for the sake of consistency across implementations.\n\nExamples:  \n  - **Provider is Org A or Org B, OR campus city contains “Utrecht”**  \n    `?filter_query[__or][][organisation.id][in]=org-uu,org-hku&filter_query[__or][][campus.city][like]=*Utrecht*`  \n    \n  - **Start date after 1 Sept 2025 OR has evening/block_week tag**  \n    `?filter_query[__or][][start_date][gt_date]=2025-09-01T00:00:00Z&filter_query[__or][][tags][any_in_array]=evening,block_week`  \n",
        "schema": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "in": {
                  "type": "string",
                  "description": "Exact match; multiple values allowed as CSV.",
                  "example": "org-uu,org-hku"
                },
                "like": {
                  "type": "string",
                  "description": "Partial match using wildcards. Prefer `*` as the wildcard.\n",
                  "example": "*Utrecht*"
                },
                "any_in_array": {
                  "type": "string",
                  "description": "Match if any of the CSV values occur.",
                  "example": "evening,block_week"
                },
                "gt_date": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO 8601 / RFC 3339 date-time.",
                  "example": "2025-09-01T00:00:00Z"
                },
                "lt_date": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO 8601 / RFC 3339 date-time.",
                  "example": "2025-12-31T23:59:59Z"
                }
              }
            }
          }
        }
      },
      "fields": {
        "name": "fields",
        "in": "query",
        "required": false,
        "style": "form",
        "explode": false,
        "description": "Allows clients to indicate which fields should be included in the response.  \nThis parameter supports the principle of data minimisation and helps to optimise \ndata usage and performance by reducing unnecessary data transmission.\n\nThe `fields` parameter uses *nested field selection syntax* with parentheses for subfields, \nfor example: `programme(code)` or `campus(city)`.  \nMultiple fields can be grouped within parentheses, for example:  \n`fields=(id,title,ectsCredits,programme(code),campus(city))`.\n\nWhen omitted, the server returns all fields the client has access to.  \nUnknown field names SHOULD be ignored.  \nThe server MUST always include *mandatory fields* (e.g., identifiers such as `id`) \nthat are required for a valid or minimal response, even if not explicitly requested.\n\n*Important:* This is a **request hint**, not a **security feature**.  \nThe server MAY disregard the request for a restricted set of fields, and the final response \nstructure MAY depend on server logic and the client’s access rights.\n\n\nIf a client requests unauthorised fields, these MUST be silently omitted or redacted.\n",
        "schema": {
          "type": "string",
          "example": "(id,title,ectsCredits,programme(code),campus(city))"
        },
        "examples": {
          "minimal": {
            "summary": "Return a minimal fieldset for course offerings",
            "value": "(id,title,ectsCredits,languageOfInstruction)"
          },
          "nested": {
            "summary": "Include nested programme code and campus city",
            "value": "(id,title,programme(code),campus(city))"
          },
          "combined": {
            "summary": "Example using multiple nested fields",
            "value": "(id,title,ectsCredits,programme(code,name),campus(city,country))"
          }
        }
      },
      "search": {
        "name": "q",
        "in": "query",
        "description": "Filter by items having a name, abbreviation or description containing the given search term (exact partial match, case insensitive)",
        "required": false,
        "schema": {
          "type": "string"
        }
      },
      "teachingLanguage": {
        "name": "teachingLanguage",
        "in": "query",
        "description": "Filter by teachingLanguage, which is a string describing the main teaching language, should be at least a two-letter language code as specified by ISO 6467.",
        "required": false,
        "schema": {
          "type": "string",
          "pattern": "^([a-z]{2,3})(-([A-Z]{2}|[0-9]{3}))?(-([a-z]{4}))?(-([a-z]{2}|[0-9]{3}))*(-[a-z0-9]{2,8})*(-x(-[a-z0-9]{1,8})+)?$",
          "minLength": 2
        },
        "example": "nl"
      },
      "offeringState": {
        "name": "state",
        "in": "query",
        "description": "Filter by an Offering's `state`.",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/offeringState"
        }
      },
      "returnTimelineOverrides": {
        "name": "returnTimelineOverrides",
        "in": "query",
        "description": "Controls whether the attribute `timelineOverrides` is returned or not. The default is `false`, so this has to explicitly set to `true` if a client needs the timeline overrides.",
        "required": false,
        "schema": {
          "type": "boolean",
          "default": false
        }
      },
      "personSearch": {
        "name": "q",
        "in": "query",
        "description": "Filter by persons having a given name, surname prefix, surname, display name, initials, email\nor secondary email containing the given search term (exact partial match, case insensitive)\n",
        "required": false,
        "schema": {
          "type": "string"
        }
      }
    }
  },
  "x-tagGroups": [
    {
      "name": "Requests and responses",
      "tags": [
        "security",
        "service metadata",
        "academic sessions",
        "associations",
        "buildings",
        "courses",
        "course offerings",
        "course offering associations",
        "components",
        "documents",
        "groups",
        "learning components",
        "learning component offerings",
        "learning component offering associations",
        "learning outcomes",
        "news",
        "organisations",
        "persons",
        "programmes",
        "programme offerings",
        "programme offering associations",
        "rooms",
        "test components",
        "test component offerings",
        "test component offering associations",
        "test component offering association attempts"
      ]
    },
    {
      "name": "Models",
      "tags": [
        "data_model",
        "service_model",
        "learning_outcome_model",
        "academic_session_model",
        "building_model",
        "course_model",
        "course_offering_model",
        "course_offering_association_model",
        "document_model",
        "learning_component_model",
        "learning_component_offering_model",
        "learning_component_offering_association_model",
        "test_component_model",
        "test_component_offering_model",
        "test_component_offering_association_model",
        "test_component_offering_association_attempt_model",
        "group_model",
        "membership_model",
        "organisation_model",
        "person_model",
        "programme_model",
        "programme_offering_model",
        "programme_offering_association_model",
        "room_model"
      ]
    }
  ]
}