Titel | Course API | ||||||||||||||||||||||
Status |
| ||||||||||||||||||||||
Versie | Documentatie: 0.0.34 | ||||||||||||||||||||||
schemaVersion: 0.0.34 | |||||||||||||||||||||||
Datum | 19 April 27 September 2024 | ||||||||||||||||||||||
Auteur | Werkgroep Combineren en arrangeren | ||||||||||||||||||||||
Acties |
|
...
Gegevensdienst | Leermaterialen |
Scopes |
|
Objecten | |
Bron |
|
Afnemers |
|
Endpoints | Leermaterialencatalogus
|
Notifications | De Notifications API kan gebruikt worden om als afnemer een notificatie te ontvangen bij een wijziging in de stand (nieuw/gewijzigd/verwijderde Course). Hiervoor dient zowel de bron als de afnemer dan de Berichteninfrastructuur en de Notifications API te hebben geïmplementeerd. |
...
Open api | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
openapi: 3.0.0 info: title: Course API version: '0.0.34' description: | This API enables an `Onderwijsleeromgeving` to get more information about the Learning Materials. In the Course API a supplier of learning materials can specify the structure of these Learning Materials in Courses, Blocks, and with Assignable Units. The Course API consists of metadata about the learning materials, and does not contain the content of the Learning materials itself. The Course API is based on [xAPI cmi5](https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/v1/CourseStructure.xsd). In the Catalogue API a reference is made to Learning materials in the Course API. This allows a `Onderwijsleeromgeving` to present detailed learning material information to Students or Teachers that are entitled (or licensed) to activate and use a Product. The Course API is also used within the Progress API te report learning progress on specific parts of a Course. The most detailed level being an Assignable Unit which defines a single piece of content within a Course. More information is available in the Documentation. contact: name: Edu-V url: www.edu-v.org/afsprakenstelsel email: info@edu-v.org components: schemas: schemaVersion: type: string description: | Schema version of this API using semantic versioning 2.0.0. The API version number is communicated in the header. The major version is communicated in the URI. For more information see the [Edu-V versioning guidelines](https://edu-v.atlassian.net/wiki/spaces/AFSPRAKENS/pages/9437200/Versiebeheer). default: 0.0.34 Course: title: Course type: object x-tags: - Course description: | The Course Object includes basic information about the Course. This basic info can be presented by a `Onderwijsleeromgeving` in a Portal to Students and/or Teachers. properties: courseId: type: string description: 'Unique identifier for this Course. This identifier equals the identifier of the corresponding CourseStructure.' xml: attribute: true tile: type: string description: 'Title of the Course, to be presented in the `Onderwijsleeromgeving`.' description: type: string description: 'Short description of the Course, to be presented in the `Onderwijsleeromgeving`.' lastPublishedVersion: type: string description: 'Last published version of this course. Version number is defined by the supplier. After every modification the version number levels up.' studies: type: array description: 'The studies and study years that this product is targeted at.' items: $ref: '#/components/schemas/Study' subjects: type: array description: 'The subjects that this product is targeted at.' items: $ref: '#/components/schemas/Subject' required: - courseId - tile - lastPublishedVersion - studies - subjects Study: title: Study type: object description: 'A study where this product is targeted at.' properties: studyName: type: string description: | Offical name of the study. - primary education: the `po-opleidingseenheden in RIO korte naam` name as specified in [Waardenlijst Opleidingseenheden po](https://www.edustandaard.nl/standaard_werkgroepen/beheergroep-waardenlijsten-rio/) is used. - secondary education: the `vo-opleidingseenheden in RIO korte naam` name as specified in [Waardenlijst Opleidingseenheden vo](https://www.edustandaard.nl/standaard_werkgroepen/beheergroep-waardenlijsten-rio/) is used. - vocational education: the `kwalificatienaam` as specfied in [Register kwalificatiestructuur SBB](https://kwalificatie-mijn.s-bb.nl) is used. studyCode: type: string description: | Offical code of the study. - primary education: the `erkendeopleidingscode` as specified in [Waardenlijst Opleidingseenheden po](https://www.edustandaard.nl/standaard_werkgroepen/beheergroep-waardenlijsten-rio/) is used. - secondary education: the `erkendeopleidingscode` as specified in [Waardenlijst Opleidingseenheden vo](https://www.edustandaard.nl/standaard_werkgroepen/beheergroep-waardenlijsten-rio/) is used. - vocational education: the `crebocode` as specfied in [Register kwalificatiestructuur SBB](https://kwalificatie-mijn.s-bb.nl) is used. minLength: 4 maxLength: 5 pattern: "^[0-9]*$" studyLevels: type: array description: | Official levels of the study. Primary and secondary education studyLevels are based on the `Niveau` as specified in [SLO curriculum](https://opendata.slo.nl/curriculum/2023/api/v1/niveau/) For Vocational Education Edu-V extended this list as documented on [Waardelijst onderwijsniveaus en leerjaren](https://edu-v.atlassian.net/wiki/spaces/AFSPRAKENS/pages/179470347/Waardelijst+onderwijsniveaus+en+leerjaren). items: type: object properties: studyLevelId: type: string description: 'The uuid of the level.' example: 'cb61531d-61eb-4412-a52f-ca065ca37e39/' pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' studyLevelPrefix: type: string description: 'The prefix of the level' example: 4205 minLength: 4 maxLength: 4 pattern: "^[0-9]*$" studyLevelName: type: string description: 'The name of the level.' example: 'havo 5' required: - studyLevelId - studyLevelPrefix - studyLevelName required: - studyName Subject: title: Subject type: object x-tags: - Product description: 'A subject where this product is targeted at.' properties: subjectPrefix: type: string description: | Prefix of the subject. - primary education: the `vakleergebied prefix` from [SLO curriculum](https://opendata.slo.nl/curriculum/2023/api/v1/vakleergebied/) - secondary education:the `vakleergebied prefix` from [SLO curriculum](https://opendata.slo.nl/curriculum/2023/api/v1/vakleergebied/) subjectName: type: string description: | Name of the subject. - primary education: the `vakleergebied name` from [SLO curriculum](https://opendata.slo.nl/curriculum/2023/api/v1/vakleergebied/) - secondary education:the `vakleergebied name` from [SLO curriculum](https://opendata.slo.nl/curriculum/2023/api/v1/vakleergebied/) required: - subjectName - subjectPrefix CMI5.CourseStructure: title: CMI5.CourseStructure type: object x-tags: - CourseStructure description: |- Course definition in CMI5 format. (see https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/v1/CourseStructure.xsd) The cmi5 course structure definition is extended with http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd fields. They are added in this spec with an xml namespace 'ecs'. If the API the xml version is defined. This cannot be fully defined in openAPI/JSON, but this is a close mapping for reference. Technical: In the xml the aus and blocks collections are not explicit available and are there implicit example: <courseStructure> <course...> </course> <au> details </au> <block> details </block> <block> details </block> <courseStructure> x-examples: example-1: course: title: - lang: string langstring: string description: - lang: string langstring: string image: string publicationdate: string publisher: string streamcode: string version: string streams: - id: string description: string objectives: string aus: - id: string activityType: string moveOn: string launchMethod: string title: - lang: string langstring: string objectives: - null url: string launchParameters: string image: string streamref: string blocks: - id: string title: - lang: string langstring: string description: - lang: string langstring: string blocks: - {} aus: - id: string activityType: string moveOn: string launchMethod: string title: - lang: string langstring: string objectives: - null url: string launchParameters: string image: string streamref: string image: string studyloadindicator: 0 properties: course: $ref: '#/components/schemas/CMI5.Course' objectives: type: array description: 'All (learning) objectives from this Course are defined at the highest level in this array. Within Assignable Units a reference can be made to the identifiers of these objectives.' items: $ref: '#/components/schemas/CMI5.Objective' aus: type: array description: 'If the course has no structure in Blocks then this list contains all the assignable units from the Course.' items: $ref: '#/components/schemas/CMI5.AU' blocks: type: array description: 'A Course consists of Blocks with underlying Blocks and/or Assignable Units. E.g. Blocks can be used to define chapters and paragraphs.' items: $ref: '#/components/schemas/CMI5.Block' required: - course CMI5.Course: title: CMI5.Course type: object x-tags: - CourseStructure description: |- Course definition as based on cmi5 course definition: (see https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/v1/CourseStructure.xsd) The cmi5 course structure definition is extended with http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd fields. They are added in this spec with an xml namespace 'ecs' x-examples: example-1: id: 39c50b7f-c0f6-499b-bd90-e673eace2be4 title: - lang: nl-NL langstring: Stepping Stones - 4 vwo K2 (5e Ed.) description: - lang: nl-NL langstring: A very nice course called Stepping Stones 5th edition for vwo 4 image: 'https://sem.noordhoff.nl/content/stepping-365839.png' publicationdate: 2020-02-04 publisher: Noordhoff BV streamcode: string version: 04-02-2020 streams: - id: string description: string properties: id: type: string xml: attribute: true description: the unique identifier of this version of the course title: $ref: '#/components/schemas/CMI5.TextType' description: $ref: '#/components/schemas/CMI5.TextType' image: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: 'Additional field: URI to the image to represent this course' publicationdate: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: 'Additional field: Date of the publication of this version of the course. Format: YYYY-MM-DD (according to RFC3339).' publisher: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: 'Additional field: name of the publisher of this course' streamcode: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: 'Additional: the course identifier (like steppingstone-5e-4vwo)' version: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: 'Additional field to specify a version of this course (like #1, #2 or a date 2022-03-14)' streams: type: array xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' minItems: 0 description: |- Additional: A list of used streams in this course. A stream is an extra metadata field for the au's to indicate optional material, core material or other types of material ('verdieping', etc.). It helps teachers to specify individual courses for each student items: $ref: '#/components/schemas/CMI5.Stream' required: - id - title - description CMI5.Objective: title: CMI5.Objective type: object x-tags: - CourseStructure description: 'A learning objective.' properties: id: type: string description: 'Unique identifier to this objective. This identifier can be used within Assignable Units to refer to this objective.' title: type: string description: 'Title of the objective.' description: type: string description: 'Short description explaining the objective.' required: - id CMI5.Block: title: CMI5.Block type: object x-tags: - CourseStructure description: | A block describes a chapter or paragraph of a course. It describes title, additional description, links to objectives and the assignable learning units (au) that are part of this chapter or paragraph. The structure is recursive, so each block can contain other blocks. In practice the number of levels in secondary education will be 2: chapters, followed by paragraphs, containing au's. the description field can be used to specify more information on the chapter or paragraph, for example filling it with learning goals so the teacher and student can see the bigger picture. there are 3 additional, optional fields: * instructions : additional instructions for the student, if any * study load indicator: an integer that gives a relative study load, with this you can specify that this block is expected to take a factor 2 or 3 more time to complete. this is a great help for planning. It is relative, not an absolute time in hours or days * image: an uri to an image that represents this chapter. x-examples: example-1: id: 'es:7DD56457-A9F5-44AD-9AA7-E791DE57C454' title: - lang: nl-NL langstring: England description: - lang: nl-NL langstring: '-' blocks: - id: 'es:AB8EB0CB-CF3D-4961-9E6C-BF6271CE7A3F' title: - lang: nl-NL langstring: Listening description: - lang: nl-NL langstring: 1. Je kunt de Engelse persoonlijke voornaamwoorden gebruiken. 2. Je kunt de Engelse bezittelijke voornaamwoorden gebruiken. 3. Je kent de betekenis van Engelse woorden rondom het thema 'School'. 4. Je kunt Engelse woorden rondom het thema 'School' gebruiken. aus: - id: 'es:EA9A53C6-44DD-46CE-A223-79FA33DD8282' activityType: Theorie launchMethod: AnyWindow moveOn: CompletedOrPassed title: - lang: Lesstof langstring: Lesstof description: - lang: nl-NL langstring: ... url: 'https://allright.secure.malmberg.nl/deeplink/paragraph-component/es:EA9A53C6-44DD-46CE-A223-79FA33DD8282' image: 'https://media.malmberg.nl/component/EA9A53C6-44DD-46CE-A223-79FA33DD8282.png' streamref: core instructions: - lang: nl-NL langstring: Lees de volgende paragraaf zorgvuldig door studyloadindicator: 3 instructions: - lang: nl-NL langstring: In deze paragraaf leer je weer heel veel image: 'https://media.malmberg.nl/images/Listening.png' studyloadindicator: 1 properties: id: type: string xml: attribute: true title: $ref: '#/components/schemas/CMI5.TextType' description: $ref: '#/components/schemas/CMI5.TextType' blocks: type: array description: 'A Block can contain Blocks and/or Assignable Units. The supplier is flexible to structure its content: e.g. A Chapter Block containing multiple Paragraph Blocks.' items: $ref: '#/components/schemas/CMI5.Block' aus: type: array description: 'A Block can contain Blocks and/or Assignable Units. The supplier is flexible to structure its content: e.g. Assignments and Content assignable units in a Paragraph block.' items: $ref: '#/components/schemas/CMI5.AU' instructions: $ref: '#/components/schemas/CMI5.TextType' image: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' studyloadindicator: type: integer xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' required: - id - title - description CMI5.AU: title: CMI5.AU type: object x-tags: - CourseStructure description: |- An assignable unit describes the smallest unit that is exchanged in the cmi5 format. Most of the time this is an instruction, a link to some content or exercise in the `Gebruiksomgeving digitaal leermateriaal` or `Digitaal toetssysteem` of the supplier. The CMI5/xAPi definition contains some meta data, an url (deep link) to start the activity and some information how to use the url. Important fields: ### activity type this describes how to represent or interpret the activity. In the standard this is a free field, with lots of examples how to use it. initially used values: * Oefening * Naslagwerk * Arrangement * Assignment * Test * Instructie * Theorie ### moveon This field is exchanged and mandatory but not used unless the full flow with progress is also implemented. Default value: _CompletedOrPassed_ ### launchmethod The launchmethod describes how the content should be presented. The exact support for using launch parameters etc is not yet defined in the specification, so currently this field is ignored. Default value: _AnyWindow_ ### launchParameters Optional information how to launch the url. The exact support for using launch parameters etc is not yet defined in the specification, so currently this field is ignored. Default value:empty or not present ## Additional fields there are 3 additional, optional fields: * image: an uri to an image that represents this unit of learning. x-examples: example-1: id: e19ffbe3-2411-4d1f-8aa6-14fc43c2142a activityType: ARRANGEMENT moveOn: CompletedOrPassed launchMethod: AnyWindow title: - lang: nl-NL langstring: Test Yourself objectives: [] url: 'https://toegang.noordhoff.nl/8717927999997?deepLinkId=e19ffbe3-2411-4d1f-8aa6-14fc43c2142a' launchParameters: '' image: '' streamref: core properties: id: type: string xml: attribute: true activityType: type: string xml: attribute: true launchMethod: type: string xml: attribute: true moveOn: type: string xml: attribute: true title: $ref: '#/components/schemas/CMI5.TextType' description: $ref: '#/components/schemas/CMI5.TextType' objectives: type: array items: type: string description: 'reference to an identifier of an objective as specified in the CourseStructure object.' url: type: string description: 'The url (Deeplink) to the learning material in the Assignable Unit. See Documentation for further restrictions on formats of Deeplinks.' launchParameters: type: string image: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' streamref: type: string xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: 'Additional field to point to a stream in the course object to indicate that this AU is for example core material or optional material, of for a higher level.' required: - id - activityType - launchMethod - moveOn - title - url CMI5.Stream: title: CMI5.Stream type: object x-tags: - CourseStructure description: 'A Stream gives a supplier the option to define the type of Assignable unit. This can be for example be core or additional material.' properties: id: type: string description: 'The id to be referenced in an Assignable Unit.' xml: attribute: true prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' description: type: string description: "Short description of the Stream." xml: prefix: ecs namespace: 'http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd' CMI5.TextType: title: CMI5.TextType type: array x-tags: - CourseStructure description: |- This is a representation of a translatable string. Effectively an Array of strings with an attribute which language the string is in. NOTE : In xml this should be represented as < langstring lang="nl-NL">Hallo< /langstring>, but that is not possible in the current openAPI3 spec (see https://github.com/OAI/OpenAPI-Specification/issues/630) items: type: object properties: lang: type: string xml: attribute: true langstring: type: string xml: wrapped: true x-examples: example-1: - lang: string langstring: string StatusResponse: title: StatusResponse type: object description: 'Functional status code and status message.' properties: status: type: integer description: 'See functional status codes within the Documentation.' statusMessage: type: string description: 'See functional status messages within the Documentation.' required: - status securitySchemes: OAuth2: type: oauth2 flows: clientCredentials: tokenUrl: https://api.example.com/oauth2/token refreshUrl: https://api.example.com/oauth2/token scopes: eduv.course: 'a scope to exchange metadata about learning materials' paths: /courses: parameters: - schema: type: integerstring nameformat: startdate-time in: query descriptionname: 'Startsince point for pagination of results, defaults to 0,' required: false examples: description: 'Request all Courses modified after the specified timestamp. defaultFormat: Conform openapi in ZULU time as specified in RFC 3339, section 5.6' value: 0 example: "2017-07-21T17:32:28Z" summaryget: The start point for pagination summary: Get All Courses - schema: operationId: get-all-courses typex-tags: integer maximum: 100 in: query name: limit description: 'Limit of number of results returned by page, defaults to 20 with max 100.' examples: default: value: 20 summary: The default value if none is provided max: value: 100 summary: The largest recommended page size get: summary: Get All Courses operationId: get-all-courses x-tags: - Course tags: - Leermaterialencatalogus description: Get all courses responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/Course' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/StatusResponse' security: - OAuth2: - eduv.course /courses/{id}: parameters: - schema: type: string name: id in: path required: true get: summary: Get Course by ID x-tags: - Course tags: - Leermaterialencatalogus responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Course' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/StatusResponse' operationId: get-course description: | Usually the Course is found via the catalog, each product has a list of Courses that is available for a student/teacher when that product is bought. This call is used to get more information about these Courses. Moreover the call can also be used to see if there are any new versions of this Course published. The response is a Course object with basic information about the Course. security: - OAuth2: - eduv.course /courses/{id}/cmi5e: parameters: - schema: type: string name: id in: path required: true get: summary: Get CourseStructure by ID in CMI5e Format x-tags: - CourseStructure tags: - Leermaterialencatalogus responses: '200': description: OK content: application/xml: schema: $ref: '#/components/schemas/CMI5.CourseStructure' examples: example-1: value: course: title: - lang: string langstring: string description: - lang: string langstring: string image: string publicationdate: string publisher: string streamcode: string version: string streams: - id: string description: string objectives: - id: string title: string description: string aus: - id: string activityType: string moveOn: string launchMethod: string title: - lang: string langstring: string objectives: - string url: string launchParameters: string image: string streamref: string blocks: - id: string title: - lang: string langstring: string description: - lang: string langstring: string blocks: - {} aus: - id: string activityType: string moveOn: string launchMethod: string title: - lang: string langstring: string objectives: - string url: string launchParameters: string image: string streamref: string instructions: - lang: string langstring: string image: string studyloadindicator: 0 '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/StatusResponse' operationId: get-coursestructure-by-id security: - OAuth2: - eduv.course description: | The CourseStructure contains information about the course, including which chapters, paragraphs and assignable units are available, including deeplinks to the publishers playing environment so the student start that unit. The format of the response is based on the international [xAPI CMI5 CourseDefinition standard](https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/v1/CourseStructure.xsd) and the [Sanoma extension](http://www.sanoma.com/cmi5/ExtendedCourseStructureExtension.xsd). This format is XML based. The response is a full CMI5 Extended Course XML (CMI5e). If we decide to make a JSON version then this definition would do fine, as it contains the same fields/information. This cannot be fully defined in openAPI/JSON in the same format as the xml version, but this is a close mapping for reference. See remarks at the CMI5.CourseStructure schema. The CMI5 standard also provides a protocol to launch assignable units in a browser and get progress on these assignable units. This is not part of the specification. The format is used to exchange meta information, not to enforce runtime. For the moment it is expected that the url's in the content work without a need to setup sessions etc. Each publisher is responsible for creating url's in such a way that single sign-on is enforced. See Documentation for guidelines for formatting of deeplinks. x-tags: - name: Course - name: CourseStructure |
...
0.0.1: Eerste draft van de API op basis van bestaande documentatie.
0.0.2: De volgende wijzigingen zijn gedaan:
Conform wijziging in architectuur de schemaVersion als attribuut verwijderd uit de objecten.
Het object Course is bijgewerkt met de attributen studies en subjects conform dezelfde opzet als een Product uit de Catalogue API.
0.0.3: Typo’s in the YAML.
0.0.4: Wijzigingen naar aanleiding van RFC’s:
Op basis van RFC002 is de scope aangepast met een prefix
eduv.
. Dit stelt leveranciers in staat om onderscheid te maken tussen gegevensuitwisselingen met leveranciers binnen en buiten het Edu-V afsprakenstelsel.De parameters voor paginering zijn uit de koppelvlakspecificatie verwijderd. Binnen het afsprakenstelsel zijn de afspraken hierover beschreven op de pagina paginering, sorteren en rate limiting.