openapi: 3.2.0 info: version: 6.0-rc.3 title: Open Education course offerings API description: OpenAPI (fka Swagger) specification for the Open Education API. license: name: EUPL-1.2 url: https://github.com/open-education-api/specification/blob/release/6.0/LICENSE.md contact: name: OEAPI Working Group / SURF url: https://oeapi.eu email: info@oeapi.eu x-logo: url: ./logo.png href: ./docs.html servers: - url: https://demo01.eduapi.nl/v6 description: SURF demo implementation security: [] tags: - name: course offerings description: 'The offerings API provides information about offerings which have a global timeframe, e.g. a period to which students can enrol.' paths: /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/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=`). 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/vnd.oeapi+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' /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/vnd.oeapi+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/vnd.oeapi+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' '409': $ref: '#/components/responses/ErrorConflict' '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/vnd.oeapi+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' '409': $ref: '#/components/responses/ErrorConflict' '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/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=`). 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/vnd.oeapi+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}/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/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=`). 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/vnd.oeapi+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' components: parameters: 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 OEAPI 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://oeapi.eu/v6.0/#/technical/consumers-and-profiles/) 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' 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 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 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 filterQuery: name: filter_query in: query required: false x-lint-ignore: - camel-case-properties 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\nOR 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 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 OEAPI endpoints.\n- It is up to each implementer to decide whether to support this feature. It is **not** a requirement of the OEAPI \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\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: object properties: __or: 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. # Quotes are required here because YAML interprets unquoted * as an alias reference. ' 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' 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. ' example: '*Amsterdam*' not_like: type: string description: 'Negated partial match using wildcards. Prefer `*` as the wildcard. ' 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' 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)) schemas: 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 triggered by an unsupported OEAPI version. If populated with a Consumer object, the 406 was caused by a consumer-specific version that did not match any supported version. This field MAY contain a full Consumer object or be null. ' 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' Language: description: 'The language used in the described entity. The value **must be a language tag that conforms to RFC 5646** (Tags for Identifying Languages, BCP 47): https://www.rfc-editor.org/rfc/rfc5646.html A tag consists of the following components, in this exact order: 1. **language** – two‑ to three‑letter codes (ISO 639‑1/‑2) **or** four‑letter codes (ISO 639‑5) **or** five‑ to eight‑letter registered language subtags. 2. **script** – optional, four letters in Title‑Case (e.g. `Latn`, `Hant`). 3. **region** – optional, either two uppercase letters (ISO 3166‑1) **or** three digits (UN M.49). 4. **variant** – zero or more subtags, each either five‑ to eight‑alphanumerics or a digit followed by three alphanumerics (e.g. `1901`, `oxendict`). 5. **extension** – zero or more extensions. Each extension starts with a *singleton* (a single alphanumeric character except `x`) followed by one or more subtags of two‑ to eight‑alphanumerics (e.g. `u‑co‑phonebk`). 6. **private‑use** – optional, the letter `x` followed by one or more subtags of one‑ to eight‑alphanumerics (e.g. `x‑private`). The most common form is a two‑letter language code (ISO 639‑1) optionally followed by a hyphen and a two‑letter country code (ISO 3166‑1), for example `en` or `en‑GB`. More specific tags are also valid, for instance `zh‑Hant‑TW` (Traditional Chinese as used in Taiwan). For sign languages two conventions are recognised: * `sgn` – e.g. `nl‑sgn‑NL` (Dutch Sign Language) * `s` – e.g. `nl‑s‑NL` (Dutch Sign Language) ' type: string minLength: 2 pattern: ^(?:(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,2}|[A-Za-z]{4}|[A-Za-z]{5,8})(?:-[A-Za-z]{4})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*?(?:-(?:[A-WY-Za-wy-z0-9](?:-[A-Za-z0-9]{2,8})+))*?(?:-x(?:-[A-Za-z0-9]{1,8})+)?|x(?:-[A-Za-z0-9]{1,8})+)$ example: en-GB Consumer: type: object description: The additional elements of a consumer that may be provided, see the [documentation on support for specific consumers](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/) for further information about this mechanism. required: - consumerKey properties: consumerKey: description: The key of the consumer (destination) for which this information is intended. See the [consumer registry](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/). This key is used to select the additional data to be presented in the request. type: string example: test-consumer exampleProperty: description: An example of an additional property type: - string - 'null' example: value-of-example-property additionalProperties: true 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 OEAPI endpoints.\n- It is up to each implementer to decide whether to support this feature. It is **not** a requirement of the OEAPI \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 codeType: type: string description: 'The type of code or identifier. The predefined values are: | Code | Description | |---------------------------|-------------------------------------------------------------------| | `account_id` | Identifier for an account. | | `bag_id` | Identifier for a building in the Dutch Building and Address | | | Registry (BAG). | | `building_id` | Identifier for a building. | | `component_code` | Identifier for a component (part of a course). | | `eckid` | Identifier assigned within the Dutch *Educatieve ContentKeten iD* | | | framework. It enables persistent identification and exchange of | | | digital learning resources within the Dutch educational sector for| | | EQF levels 1, 2, 3 and 4. Comparable international approaches | | | include LRMI, DOI and Handle | | | identifiers for learning resources. | | `email_address` | An email address. | | `esi` | European Student Identifier. | | `group_code` | Identifier for a group of people. | | `group_type_code` | Identifier for the type of group. | | `identifier` | Generic identifier. | | `institution_code` | Registration number of an educational institution. In the | | | Netherlands, the former BRIN code has been replaced by the | | | institution code, issued by the Ministry of Education, Culture | | | and Science (OCW). | | `isbn` | International Standard Book Number (for books). | | `issn` | International Standard Serial Number (for periodicals). | | `kvk_organisation_id` | Identifier for a KvK (Dutch Chamber of Commerce) registered | | | organisation. | | `kvk_establishment_id` | Identifier for a specific establishment of a KvK | | | (Dutch Chamber of Commerce) registered organisation. | | `leerbedrijf_id` | Dutch registration/accreditation id for organisations offering | | | internships for vocational education students. | | `national_identity_number`| Government-assigned personal identifier (e.g. NI number in the UK,| | | or *personnummer* in Sweden). | | `offering_code` | Identifier for a specific offering (programme, course or | | | component). | | `organisation_id` | Identifier for an organisation. | | `orcid` | Open Researcher and Contributor ID. | | `product_id` | Identifier for a product. | | `programme_code` | Identifier of a programme (a recognised collection of courses). | | | In the Netherlands, the former CREBO and CROHO codes have been | | | replaced by the programme code as registered in RIO, under the | | | authority of OCW. | | `room_code` | Identifier for a room. | | `schac_home` | Home organisation represented by its domain name. | | `student_number` | Identifier for a student. | | `studielink_number` | Identifier assigned to a student by Studielink (Dutch central | | | enrolment system). | | `system_id` | Identifier used within a specific system. | | `username` | User login name. | | `uuid` | Universally unique identifier. | This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' 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 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 Problem: type: object description: 'A problem details object, conforming to RFC 7807 (Problem Details for HTTP APIs). See https://datatracker.ietf.org/doc/html/rfc7807. It provides a machine-readable format for error conditions, including a type URI, title, status code, and optional detail and instance fields. This ensures consistent handling of error responses across the API. ' 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 ' 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. ' 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 resultValueType: type: string description: 'The result value type for this offering. - pass_or_fail: A simple pass or fail result. - insufficient_satisfactory_good: A result with three levels (insufficient, satisfactory and good). - us_letter: A result in the US letter grading system (A, B, C, D, F). - uk_letter: A result in the UK letter grading system (A, B, C, D, E, U). - de_grade: A result in the German grading system (1, 2, 3, 4, 5, 6). - grade_0_100: A result in the 0–100 grading system. - grade_0_10: A result in the 0–10 grading system (no decimals allowed). - grade_0_10_one_decimal: A result in the 0–10 grading system (with one decimal place). - reference_level_europass: A result in the Europass reference level grading system (A1, A2, B1, B2, C1, C2). - other: Any other grading system not specified above. This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' 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 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. Offerings MAY be linked to a specific AcademicSession to indicate that the specified Offering takes place during the AcademicSession, however this is not mandatory. ' 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 term 20xx where the current session is week 40). When the client does not request expansion of `parent`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' parent: description: 'The expanded parent academicSession object of this session (e.g. Autumn term 20xx where the current session is week 40). When the client requests expansion of `parent`, the full expanded academicSession object MUST be returned here instead of only the identifier. If no parent is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/AcademicSession' - type: 'null' 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://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n" type: - array - 'null' items: $ref: '#/components/schemas/Identifier' children: description: 'The expanded child academicSession objects of this session (e.g. all academic sessions in Autumn term 20xx). When the client requests expansion of `children`, the full expanded academicSession objects MUST be returned here instead of only the identifiers. If no child sessions are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/AcademicSession' yearId: description: 'The identifier of the top-level academicSession year for this session (e.g. 20xx where the current session is week 40 of a semester). When the client does not request expansion of `year`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' year: description: 'The expanded top-level academicSession year object for this session (e.g. 20xx where the current session is week 40 of a semester). When the client requests expansion of `year`, the full expanded academicSession object MUST be returned here instead of only the identifier. If no top-level year is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/AcademicSession' - 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' consumer: oneOf: - $ref: '#/components/schemas/Consumer' - type: 'null' 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 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 Ext: type: object description: Object for additional non-standard attributes 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: | Code | Description | |-----------------------------|------------------------------------------------| | `certificate` | A formal recognition of participation or | | | achievement | | `diploma` | An official qualification awarded upon | | | graduation | | `micro_credential_certificate` | Formal certification specifically | | | documenting the award of a micro-credential | | `school_advice` | Educational recommendation or guidance issued | | | by the school | | `testimonial` | A written statement confirming attendance or | | | performance | | `no_official_document` | No official document is issued | This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - certificate - diploma - micro_credential_certificate - school_advice - testimonial - no_official_document example: diploma 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' 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 supplementaryType: type: string description: 'The fundamental media form of the supplementary content. The selected `type` determines how the associated `value` MUST be interpreted. It defines the technical representation of the content, independent of its semantic role. The `type` specifies the underlying media form, such as text_plain, text_md, text_http, image, video or uri. The `role` defines the semantic intent of the item and MUST NOT duplicate the technical media form defined by `type`. | Code | Description | |-------------|--------------------------------------------------------------------------| | `image` | Visual media referenced via a URI (for example photographs or artwork) | | `text_http` | HTTP-encoded textual content | | `text_md` | Markdown-formatted text content. | | `text_plain`| Plain text content. | | `uri` | A URI linking to an external resource | | `video` | Video media referenced via a URI (for example recordings or trailers) | This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - image - text_http - text_md - text_plain - uri - video example: text_plain EnrolmentPeriods: type: object description: 'An enrolment period describes the moment at which an offering is available for enrolment. The 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. ' 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. ' 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' studyloadUnit: type: string description: 'The unit in which the study load is specified: - contact_time: Amount of time spent in scheduled classroom or contact hours. - ects: European Credit Transfer and Accumulation System (ECTS credits), typically 1 ECTS = 28 study hours. - sbu: Student workload hours, representing the total estimated effort. - sp: Study points used in some national systems (e.g. studiepunt in Flanders or the Netherlands). - hour: Plain number of hours, regardless of context (e.g. used for informal or modular learning units). This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - contact_time - ects - sbu - sp - hour example: ects ICERelationType: type: string description: 'The type of relationship between the person and their In Case of Emergency (ICE) contact: - partner: Spouse or life partner - parent: Biological, adoptive, or legal parent - other: Any other type of relationship (e.g. sibling, friend, neighbour) This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - partner - parent - other example: partner 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 level: type: string description: 'The level of this course (ECTS year of study if applicable): - pre_vocational: Pre-vocational education, preparatory stage prior to vocational training, typically before secondary vocational education (Dutch: mbo) level - secondary_vocational_education: Secondary vocational education (Dutch: mbo) - secondary_vocational_education_1: Secondary vocational education level 1, corresponds to levelOfQualification 1 (Dutch: mbo 1) - secondary_vocational_education_2: Secondary vocational education level 2, corresponds to levelOfQualification 2 (Dutch: mbo 2) - secondary_vocational_education_3: Secondary vocational education level 3, corresponds to levelOfQualification 3 (Dutch: mbo 3) - secondary_vocational_education_4: Secondary vocational education level 4, corresponds to levelOfQualification 4 (Dutch: mbo 4) - associate_degree: Associate degree, corresponds to levelOfQualification 5 - bachelor: Bachelor degree, corresponds to levelOfQualification 6 - master: Master degree, corresponds to levelOfQualification 7 - doctoral: Doctoral level, corresponds to levelOfQualification 8 - post_doctoral: Post-doctoral level, advanced academic or professional qualification beyond the doctoral level - undefined: The level is not specified - undivided: Integrated programme not divided into bachelor and master phases - nt2_1: Dutch as a second language, Programme I, intended for vocational training (CEFR level A2–B1) - nt2_2: Dutch as a second language, Programme II, intended for higher education or professional purposes (CEFR level B2) This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' 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 offeringState: type: string description: 'The state of this offering: - concept: The offering is still in development and not yet available for students - cancelled: The offering has been cancelled and is no longer available - active: The offering is currently available for students to enrol in and participate - inactive: The offering is not currently available for students, but may be available in the future This is an extensible enumeration. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - concept - cancelled - active - inactive example: active 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 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. ' 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. ' example: ANHH 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://oeapi.eu/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. When the client does not request expansion of `learningOutcomes`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' learningOutcomes: description: 'The expanded learning outcome objects related to this programme. When the client requests expansion of `learningOutcomes`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers. If no learning outcomes are defined, this value is `null`. ' 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. When the client does not request expansion of `parent`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' parent: description: 'The expanded parent programme of which the current programme is a child. When the client requests expansion of `parent`, the full expanded programme object MUST be returned here instead of only the identifier. If no parent is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Programme' - type: 'null' 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://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n" type: - array - 'null' items: $ref: '#/components/schemas/Identifier' children: description: 'The expanded programme objects which are a part of this programme (e.g. specialisations). When the client requests expansion of `children`, the full expanded programme objects MUST be returned here instead of only the identifiers. If no children are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/Programme' coordinatorIds: description: 'The identifiers of the persons responsible for this programme. When the client does not request expansion of `coordinators`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' coordinators: description: 'The expanded person objects responsible for this programme. When the client requests expansion of `coordinators`, the full expanded person objects MUST be returned here instead of only the identifiers. If no coordinators are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/Person' instructorIds: description: 'The identifiers of the persons teaching or delivering this programme. When the client does not request expansion of `instructors`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' instructors: description: 'The expanded person objects teaching or delivering this programme. When the client requests expansion of `instructors`, the full expanded person objects MUST be returned here instead of only the identifiers. If no instructors are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/Person' organisationId: description: 'The identifier of the organisation providing this programme. When the client does not request expansion of `organisation`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' organisation: description: 'The expanded organisation object providing this programme. When the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier. If no organisation is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Organisation' - type: 'null' supplementaryInformation: $ref: '#/components/schemas/SupplementaryInformation' consumer: oneOf: - $ref: '#/components/schemas/Consumer' - type: 'null' ext: oneOf: - $ref: '#/components/schemas/Ext' - type: 'null' 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`), a semantic purpose (`role`), and an array of `value` entries. Together these fields define both how the content MUST be interpreted (`type`) and why it is provided (`role`). The `type` specifies the underlying media form (text, image, video or http) and determines how each `value` item MUST be handled. The `role` describes the intent or purpose of the supplementary item (for example announcement, badge, marketing or promotional teaser) and MUST NOT duplicate or encode the media form defined by `type`. The separation between `type` and `role` ensures that the same media form can serve multiple purposes, and that the semantic meaning remains independent from the technical representation of the content. The `value` array contains one or more language-typed strings, allowing the same content item to be expressed in multiple languages or alternative textual variants. ' 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 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 PersonId: type: object properties: personId: type: string description: Unique id of this person format: uuid example: 123e4567-e89b-12d3-a456-426614174000 required: - personId Person: allOf: - $ref: '#/components/schemas/PersonId' - $ref: '#/components/schemas/PersonProperties' 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 supplementaryRole: type: string description: 'The fundamental semantic purpose of the supplementary content. The selected `role` describes the intent or function of the item (for example, badge, teaser or promotional highlight). The `role` MUST NOT duplicate or encode the technical media form defined by `type`. The `type` specifies the underlying media form (such as text, image, video or http), whereas the `role` clarifies how that media is intended to be interpreted or used. | Code | Description | |----------------|-----------------------------------------------------| | `announcement` | General-purpose announcement or notice | | `badge` | A visual label or achievement marker | | `marketing` | Promotional or marketing-related content | | `promo` | A short promotional highlight or teaser | This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - announcement - badge - marketing - promo example: badge 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. ' 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). Implementations should refrain from using the original ISO 3166-1 code for such a country since country codes can be reassigned to new countries once the original country code is officially declared obsolete. ' example: ANHH 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. ' 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. When the client does not request expansion of `parents`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' parents: description: 'The expanded learning outcome objects which are the parents of this learning outcome. When the client requests expansion of `parents`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers. If no parents are defined, this value is `null`. ' type: - array - 'null' items: oneOf: - $ref: '#/components/schemas/LearningOutcome' - type: 'null' childIds: description: "The identifiers of all learning outcomes for which this learning outcome is the parent.\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n" type: - array - 'null' items: $ref: '#/components/schemas/Identifier' children: description: 'The expanded learning outcome objects for which this learning outcome is the parent. When the client requests expansion of `children`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers. If no children are defined, this value is `null`. ' type: - array - 'null' items: oneOf: - $ref: '#/components/schemas/LearningOutcome' - type: 'null' fieldsOfStudy: type: - string - 'null' description: "Field(s) of study (e.g. ISCED-F) (https://unesdoc.unesco.org/ark:/48223/pf0000228085.locale=en). \nISCED-F categorizes the fields of study 2 digits at root level and further subdivision as more digits are added.\nPreferably fieldsOfStudy contains at least 4 digits.\nISCEDF2013vSOI2021 currently allows for 6 digits max (https://www.cbs.nl/-/media/cbs/onze-diensten/methoden/classificaties/documents/2025/pubsoi2021_ed2425.pdf).\n07 Engineering, manufacturing and construction\n073 Architecture and construction\n0731 Architecture and town planning\n073101 Town planning\n" minLength: 2 maxLength: 6 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' academicSessionType: type: string description: 'The type of this academic session. This is an *extensible enumeration*. - academic_year: Academic year - semester: Semester, typically comprising two terms per academic year - trimester: Trimester, typically comprising three terms per academic year - quarter: Quarter, typically comprising four terms per academic year - testing_period: A period during which tests take place - period: Any other period within an academic year Implementations may add further values beyond those listed above, provided they do not overlap in definition with existing values. ' x-ooapi-extensible-enum: - academic_year - semester - trimester - quarter - testing_period - period example: semester qualificationAwarded: type: string description: 'Type of qualification that can be obtained upon completing the programme: - diploma - vocational_diploma - certificate - associate_degree: Associate degree — short-cycle higher education qualification (EQF level 5) - bachelor: Bachelor — undergraduate degree (EQF level 6) - master: Master — postgraduate degree (EQF level 7) - doctoral: Doctoral degree — research-based doctoral degree (EQF level 8) - none: No formal qualification is awarded for this programme In case of a degree (for example bachelor or master), the type of degree can be specified using `qualificationDesignations`. ' x-ooapi-extensible-enum: - diploma - vocational_diploma - certificate - associate_degree - bachelor - master - doctoral - none example: none gender: type: string description: 'The gender of this person, based on international standards for education and data interoperability. The values follow practices from agencies such as: - European Commission (EULF, INSPIRE, GeoDCAT-AP) - Edustandaard, EUNIS - m: male - f: female - x: non-binary or gender-diverse, officially registered - o: other gender identity, not officially classified as m/f/x - u: unknown or not registered - n: not applicable, e.g. for non-person entities or gender-irrelevant use cases ' x-ooapi-extensible-enum: - m - f - x - o - u - n example: f 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' 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 enrolled to begin their participation at different moments without missing essential content. This attribute MUST be used in combination with `flexibleEntryPeriodEndDateTime`. ' 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 various moments without missing anything, use this attribute in combination with `flexibleEntryPeriodStartDateTime`. ' 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. When the client does not request expansion of `programme`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' programme: description: 'The expanded programme object that is offered in this programmeOffering. When the client requests expansion of `programme`, the full expanded programme object MUST be returned here instead of only the identifier. If no programme is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Programme' - type: 'null' organisationId: description: 'The identifier of the organisation that manages this programmeOffering. When the client does not request expansion of `organisation`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' organisation: description: 'The expanded organisation object that manages this programmeOffering. When the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier. If no organisation is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Organisation' - type: 'null' 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 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' personAffiliation: type: string description: 'The affiliations of this person — the roles or relationships a person has with the organisation providing this endpoint: - student: Enrolled learner or participant in educational offerings - employee: Staff member employed by the organisation (e.g. teacher, administrator) - guest: External person temporarily affiliated, without formal student or employee status This is an extensible enumeration. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - student - employee - guest example: student modeOfStudy: type: string description: 'Indicates the mode of study: full-time, part-time, dual or self-paced. - full_time: Standard daytime study schedule - part_time: Study scheduled outside regular working hours, such as evenings and weekends - dual_training: Combination of workplace learning and academic study - self_paced: Student sets their own pace and timing for study This is an *extensible enumeration*. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - full_time - part_time - dual_training - self_paced example: full_time 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 times on the academic session should indicate in what timeframe the offering will or should have been available. ' 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 enrolled to begin their participation at different moments without missing essential content. This attribute MUST be used in combination with `flexibleEntryPeriodEndDateTime`. ' 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 start at various moments without missing any essential content, use this attribute in combination with `flexibleEntryPeriodStartDateTime`. ' 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' courseId: description: 'The identifier of the course that is offered in this course offering. When the client does not request expansion of `course`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' course: description: 'The expanded course object that is offered in this course offering. When the client requests expansion of `course`, the full expanded course object MUST be returned here instead of only the identifier. If no course is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Course' - type: 'null' programmeOfferingIds: description: 'An array of 0 or more identifiers of programmeOfferings that this course offering is related to. When the client does not request expansion of `programmeOfferings`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' programmeOfferings: description: 'An array of 0 or more expanded programmeOffering objects that this course offering is related to. When the client requests expansion of `programmeOfferings`, the full expanded programmeOffering objects MUST be returned here instead of only the identifiers. If no programmeOfferings are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/ProgrammeOffering' organisationId: description: 'The identifier of the organisation that manages this course offering. When the client does not request expansion of `organisation`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' organisation: description: 'The expanded organisation object that manages this course offering. When the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier. If no organisation is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Organisation' - 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 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 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 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' 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 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. When the client does not request expansion of `learningOutcomes`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' learningOutcomes: description: 'The expanded learning outcome objects related to this course. When the client requests expansion of `learningOutcomes`, the full expanded learning outcome objects MUST be returned here instead of only the identifiers. If no learning outcomes are defined, this value is `null`. ' 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://oeapi.eu/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. This array is used because a course can belong to multiple programmes, for example in alliances. When the client does not request expansion of `programmes`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' 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. This array is used because a course can belong to multiple programmes, for example in alliances. When the client requests expansion of `programmes`, the full expanded programme objects MUST be returned here instead of only the identifiers. If no programmes are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/Programme' coordinatorIds: description: 'The identifiers of the persons responsible for this course. When the client does not request expansion of `coordinators`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' coordinators: description: 'The expanded person objects responsible for this course. When the client requests expansion of `coordinators`, the full expanded person objects MUST be returned here instead of only the identifiers. If no coordinators are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/Person' instructorIds: description: 'The identifiers of the persons teaching or delivering this course. When the client does not request expansion of `instructors`, only these identifiers are returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' type: - array - 'null' items: $ref: '#/components/schemas/Identifier' instructors: description: 'The expanded person objects teaching or delivering this course. When the client requests expansion of `instructors`, the full expanded person objects MUST be returned here instead of only the identifiers. If no instructors are defined, this value is `null`. ' type: - array - 'null' items: $ref: '#/components/schemas/Person' organisationId: description: 'The identifier of the organisation that manages this course. When the client does not request expansion of `organisation`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' organisation: description: 'The expanded organisation object that manages this course. When the client requests expansion of `organisation`, the full expanded organisation object MUST be returned here instead of only the identifier. If no organisation is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Organisation' - type: 'null' consumer: oneOf: - $ref: '#/components/schemas/Consumer' - type: 'null' ext: oneOf: - $ref: '#/components/schemas/Ext' - type: 'null' title: type: string description: A short, human-readable summary of the problem type example: Resource not found programmeType: type: string description: 'The type of this programme: - programme: A full formal programme of study leading to a qualification or degree - minor: A smaller, complementary programme that broadens or deepens the main field of study - honours: An honours programme, typically with additional academic requirements or distinction - specialisation: A focused area of study within a broader programme or degree - track: A structured learning path within a programme, often thematically or methodologically defined - specification: A further defined variant or subset of a track or specialisation This is an extensible enumeration. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - programme - minor - honours - specialisation - track - specification example: programme 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 Identifier: type: string description: An identifier of another resource. format: uuid example: 123e4567-e89b-12d3-a456-426614174000 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. When the client does not request expansion of `root`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' root: description: 'The expanded organisation object which is the root organisation of this organisation. When the client requests expansion of `root`, the full expanded organisation object MUST be returned here instead of only the identifier. If no root organisation is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Organisation' - type: 'null' parentId: description: 'The identifier of the organisational unit which is the parent of this organisation. When the client does not request expansion of `parent`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' parent: description: 'The expanded organisation object which is the parent of this organisation. When the client requests expansion of `parent`, the full expanded organisation object MUST be returned here instead of only the identifier. If no parent organisation is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/Organisation' - type: 'null' 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://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n" type: - array - 'null' items: $ref: '#/components/schemas/Identifier' children: description: 'The expanded organisational unit objects for which this organisation is the parent. When the client requests expansion of `children`, the full expanded organisation objects MUST be returned here instead of only the identifiers. If no children are defined, this value is `null`. ' type: - array - 'null' items: oneOf: - $ref: '#/components/schemas/Organisation' - type: 'null' 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. - root: The top-level organisation, representing the organisation itself - institute: A subdivision of the root organisation, typically focused on a broad field of study - department: An organisational unit within an organisation or one of the subdivisions of an organisation, focused on a specific discipline - faculty: A major academic division within an institution, often overseeing multiple departments - branch: A geographically separate location or campus of an organisation - academy: A specialised academic unit, often focused on applied or artistic disciplines - school: An organisational unit typically used in primary, secondary, or specialised higher education contexts This is an extensible enumeration. Use the prefix `x-` for custom values. ' x-ooapi-extensible-enum: - root - institute - department - faculty - branch - academy - school example: root 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. ' oneOf: - type: array items: $ref: '#/components/schemas/Identifier' - type: 'null' academicSessionId: description: 'The identifier of the academicSession during which this courseOffering takes place. When the client does not request expansion of `academicSession`, only this identifier is returned. This field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses). ' oneOf: - $ref: '#/components/schemas/Identifier' - type: 'null' academicSession: description: 'The expanded academicSession object during which this courseOffering takes place. When the client requests expansion of `academicSession`, the full expanded academicSession object MUST be returned here instead of only the identifier. If no academicSession is defined, this value is `null`. ' oneOf: - $ref: '#/components/schemas/AcademicSession' - type: 'null' 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: 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 Prove in writing 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)'' ' 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' responses: 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 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 ErrorNotAcceptable: description: 'Not Acceptable. Returned when the server cannot produce a representation in the requested OEAPI or consumer version. The server may serve the requested version or any lower compatible minor version. If neither the requested version nor a lower minor version is available, a 406 response is returned to indicate that no acceptable representation can be produced. This behaviour slightly deviates from strict HTTP semantics. The client requests exactly one OEAPI version and at most one consumer with one consumer version using the HTTP Accept header. Standard HTTP content negotiation is not applied. The server performs an internal Accept-like version check after the HTTP layer. If the request can be satisfied, the server returns a compatible version. A compatible version is any version within the same major version, with a higher or lower minor version. If no compatible version can be provided, the server returns 406 to signal that the requested representation cannot be provided. This approach improves clarity, implementation consistency and debugging, because the requested and supported versions are explicit in both the request and the 406 response, avoiding ambiguity caused by full HTTP content negotiation or Accept-based parsing. It also improves logging. Servers can log the requested and supported versions at the point of mismatch, allowing operators to detect outdated consumers, configuration issues or unexpected version drift. ' content: application/problem+json: schema: $ref: '#/components/schemas/ProblemVersionNotAcceptable' examples: unsupportedOoapiVersion: summary: Requested OEAPI version is not supported description: 'Example where the client requests OEAPI version 5.0 and the server cannot serve that version or a lower compatible minor version. ' value: type: https://api.example.org/problems/version-not-acceptable title: Version not acceptable status: 406 detail: The requested OEAPI 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 supported by the server and no lower compatible consumer version is available. ' value: type: https://api.example.org/problems/version-not-acceptable title: Version not acceptable status: 406 detail: The consumer version '2.0' is not supported. consumer: consumerKey: mbo-oke-roster-service requestedVersion: '2.0' supportedVersions: - '1.0' - '0.94' instance: https://api.example.org/enrolments 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 ErrorConflict: description: Conflict content: application/problem+json: schema: $ref: '#/components/schemas/Problem' example: type: https://api.example.org/problems/conflict title: Conflict status: 409 detail: The request could not be completed due to a conflict with the current state of the resource. instance: https://api.example.org/courses 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 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 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 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 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