API

Naam
Catalogue
Versie
v2.0.0
Sector(en) P
PO VO MBO
Status P
Actief

Transactierollen P

Bron Afnemer

Endpoints

Beschikbare endpoints voor deze API.

4 endpoints

API-specificatie (YAML)

Volledige definitie uit het afsprakenstelsel.

openapi: 3.0.0
info:
  title: Catalogue API
  version: '2.0.0'
  description: |-
    The Catalogue API is implemented by the publisher or reseller of learning materials.

    The Catalogue API is the source of Product information and provides GET endpoints to receive the latest state.

    Two entities are available to Consumers of the Catalogue API:
    - **Product**: the full set of attributes including metadata, media, licensing, pricing, and payment information, especially useful for the `Overkoepelende leermiddelencatalogus`, `Selectieomgeving leermiddelen`, and `Bestelomgeving leermiddelen`.
    - **ProductInfo**: a smaller subset of attributes focused on displaying the product within a portal, especially useful for the `Leermiddelenportaal` and `Onderwijsleeromgeving`

    In a future version the Notifications API can be used to notify Consumers of the Catalogue API whenever a Product changes (new, update or delete).
  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: 2.0.0
    Product:
      title: Product
      type: object
      x-tags:
        - Product
      description: 'A product that is available for selection within a `Bestelomgeving leermiddelen`, `Selectieomgeving leermiddelen`, and `Overkoepelende leermiddelencatalogus`.
        This entity captures all information needed for presentation, selection and optionally sale.'
      properties:
        productId:
          $ref: '#/components/schemas/ProductID'
          description: 'The unique identifier for this product. For all products that are forSale an EAN or ISBN number is provided.
            For all other Products a uuid is generated by the provider of the product.'
        publisher:
          type: string
          description: 'Name of the organisation supplying and providing the product: the `Leermiddelenaanbieder`.'
        reseller:
          type: string
          description: |
            Name of the organisation reselling the product: the `Leermiddelenverkoper`.
            This field is only mandatory when this Catalogue API is provided by the reseller.
        type:
          type: string
          description: 'Type of product. In case the product consists of both physical and digital products, the value combi is chosen.'
          enum:
            - 'physical'
            - 'digital'
            - 'combi'
        status:
          type: string
          description: 'Lifecycle status of the product.'
          enum:
            - 'not-yet-available'
            - 'limited-available'
            - 'available'
            - 'temporary-not-available'
            - 'no-longer-available'
            - 'will-never-be-available'
            - 'not-available-or-usable'
        forSale:
          type: boolean
          description: |
            True if the product is forSale.
            False if the product is not for sale (e.g. for Demo products or Digital products that are only sold as a Combi or Set)
        saleUnitSize:
          type: integer
          description: |
            The number of units within this product.
            For example this value is 5 for a set of five physical books.
          minimum: 1
        isConsumptionProduct:
          type: boolean
          description: |
            True if the product is `verbruiksmateriaal`.
        name:
          type: string
          description: 'Name of the Product'
        productFamilyName:
          type: string
          description: 'Name of the Product Family this Product belongs to.'
        edition:
          type: string
          description: 'The issue (In Dutch: nummer) and version (In Dutch: Druk) of the product.'
          example: 'Nr + Druk'
        productUsages:
          type: array
          description: |
            The intended product usage.
            Values are in Dutch for backwards compatibility. This field is on the Edu-V backlog and will be revised and completed in a future version.
          items:
            type: string
            enum:
              - leerboek
              - werkboek
              - leerwerkboek
              - examenbundel
              - oefenmateriaal
              - naslagwerk
              - docentenmateriaal
              - toets
              - examen
              - anders
        intendedEndUserRole:
          type: string
          description: |
            The intended end users of the product, being one of:
            - student
            - educator (e.g. teachers, coaches or assistants)
            - administrator
          enum:
            - student
            - educator
            - administrator
        courseReferences:
          type: array
          description: 'Reference to this products course detailed description'
          items:
            $ref: '#/components/schemas/CourseReference'
        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'
        price:
          type: array
          description: |
            Public List price of the Product. It is possible to include historic and future prices for a product (e.g. for Indexation).
            When applicable, include the historic price (t-1), the current price (t) and the future price (t+1).
          items:
            type: object
            properties:
              priceExcl:
                type: number
                description: 'Price excluding VAT and rounded to 2 decimals'
              priceIncl:
                type: number
                description: 'Price including VAT and rounded to 2 decimals'
              priceCurrency:
                type: string
                description: 'The applicable currency according to ISO4217 currency codes, see: https://en.wikipedia.org/wiki/ISO_4217.'
                default: "EUR"
                pattern: "[A-Z]{3}$"
              validFrom:
                type: string
                format: date
                description: 'The date (incl.) from which this price is valid, format: YYYY-MM-DD (according to RFC3339)'
              priceType:
                type: string
                enum:
                  - standard
                  - tier
                  - schoolSize
                default: standard
                description: 'The type of pricing for this product.'
              schoolSizePricing:
                type: array
                description: 'Array of schoolSizePrice objects. Only applicable when priceType is `schoolSize`.'
                items:
                  $ref: '#/components/schemas/SchoolSizePrice'
              tierPricing:
                type: array
                description: 'Array of tierPrice objects. Only applicable when priceType is `tier`.'
                items:
                  $ref: '#/components/schemas/TierPrice'
            required:
              - priceExcl
              - priceIncl
              - priceCurrency
              - validFrom
        paymentModels:
          type: array
          description: 'The payment models applicable to this Product.'
          items:
            type: string
            enum:
              - 'pre-paid'
              - 'post-paid'
              - 'periodically-paid'
        licensePeriod:
          type: object
          description: 'Duration of the license period. Mandatory field for digital products'
          properties:
            licenseVariant:
              type: string
              description: |
                The variant of the the license period.

                - days: the expirationDate is set a specified number of days after the firstUsed (initial activation) date.
                - month: the expirationDate is set a month after the firstUsed (initial activation) date.
                - year: the expirationDate is set a year after the firstUsed (initial activation) date.
                - schoolyear: the expirationDate is set at 31st of July after the firstUsed (initial activation) date.
              enum:
                - 'days'
                - 'month'
                - 'year'
                - 'schoolyear'
            licenseDays:
              description: 'Number of days. Mandatory field for licenseVariant `days`.'
              type: integer
          required:
            - licenseVariant
        activationPeriod:
          type: object
          description: 'Prescribes the way the activationUntilDate can be calculated.'
          properties:
            activationVariant:
              type: string
              description: |
                The variant that should be applied to calculate the ActivationUntilDate.

                - days: number of days after the startDate of the activation period. Value activationDays is a mandatory field.
                - date: fixed activationDate for every entitlement. Value activationUntilDate is a mandatory field.
                - schoolyear: the activationUntilDate is set at 31st of July after the startDate.
              enum:
                - 'days'
                - 'date'
                - 'schoolyear'
            activationDays:
              description: 'Number of days. Mandatory field for activationDays `days`.'
              type: integer
            activationUntilDate:
              type: string
              format: date
              description: 'A fixed activationUntilDate for all entitlements, format: YYYY-MM-DD (according to RFC3339)'
          required:
            - activationVariant
        deliveryTypes:
          type: array
          description: 'The delivery variant available for this product.'
          items:
            type: string
            enum:
              - school-all
              - school-studies
              - school-subjects
              - school-groups
              - school-students
              - school-employees
              - school-activationcodes
              - customer-student
              - customer-activationcode
        trialAccessUrl:
          type: string
          description: 'Optional trial / preview URL.'
        defaultAccessUrl:
          type: string
          description: |
            The default Access Url used to access the product after selection or purchase.
            Mandatory field for combi and digital products.
            For sets of digital products and combi products a single Access URl is listed from which all underlying digital products can be activated.
        specificAccessUrls:
          type: array
          description: |
            list of fields where specific access links can be specified.
          items:
            type: object
            properties:
              accessUrl:
                type: string
                description: 'The URL of the access link.'
              accessUrlType:
                type: string
                description: 'The type URL of the access link in accessUrl.'
                enum:
                  - OIDC
                  - BP
                  - ENTREE
            required:
              - accessUrl
              - accessUrlType
        shortDescription:
          type: string
          description: 'Short description for display on search pages or other marketing blocks.'
          minLength: 1
          maxLength: 80
        longDescription:
          type: string
          description: 'Long description for display on a product page.'
        copyrightType:
          type: string
          description: |
            Indicator if copyright is applicable to the Product.
            The Creative Commons licenses are specified according to the [CreativeCommons version 4.0 specification](https://purl.edustandaard.nl/copyrightsandotherrestrictions_nllom_20131202).'
            In case, another type of copyright is applicable to the product, the value `yes` is used.
            If no copyright is applicable to the product, the value `no` is used.
          enum:
            - cc-by-40
            - cc-by-sa-40
            - cc-by-nc-40
            - cc-by-nc-sa-40
            - cc-by-nd-40
            - cc-by-nc-nd-40
            - cc-by-30
            - cc-by-sa-30
            - cc-by-nc-30
            - cc-by-nc-sa-30
            - cc-by-nd-30
            - cc-by-nc-nd-30
            - yes
            - no
        authors:
          type: object
          properties:
            individuals:
              type: array
              items:
                type: object
                properties:
                  givenName:
                    type: string
                  familyName:
                    type: string
                  familyNamePrefix:
                    type: string
                required:
                  - givenName
                  - familyName
            organisations:
              type: array
              items:
                type: string
                description: 'The name of the organisation.'
        media:
          type: object
          description: 'A collection of media for use in product pages.'
          properties:
            publisherThumbnailUrl:
              description: 'The logo of the publisher to show in a thumbnail.'
              $ref: '#/components/schemas/Media'
            mainThumbnailUrl:
              description: 'The main media item to show in a thumbnail.'
              $ref: '#/components/schemas/Media'
            resellerThumbnailUrl:
              description: |
                The logo of the reseller to show in a thumbnail.
                This field is only mandatory when this Catalogue API is provided by the reseller.
              $ref: '#/components/schemas/Media'
            productImageUrls:
              type: array
              description: 'A collection of image urls for a product.'
              items:
                $ref: '#/components/schemas/Media'
            productVideoUrls:
              type: array
              description: 'A collection of video urls for a product.'
              items:
                $ref: '#/components/schemas/Media'
            productDocUrls:
              type: array
              description: 'A collection of document urls for a product.'
              items:
                $ref: '#/components/schemas/Media'
          required:
            - publisherThumbnailUrl
        followUpProduct:
          description: 'productId of the product that succeeds this product.'
          $ref: '#/components/schemas/ProductID'
        relatedProducts:
          type: array
          description: 'An array of related product IDs (for display alongside the product within a product page).'
          items:
            $ref: '#/components/schemas/ProductID'
            description: 'productIds of the related products.'
        bundledProducts:
          type: array
          description: |
            In case this product is a combi product or set, all underlying products can be included and referred in this attribute.
            This field is mandatory for sets of digital products.
            This field is optional (but recommended) for combi products and sets of physical products.
          items:
            $ref: '#/components/schemas/ProductID'
            description: 'productIds of the products in the set or in the combi product.'
        firstPublishedDate:
          type: string
          format: date
          description: 'Date the product will be or is published on the market, format: YYYY-MM-DD (according to RFC3339)'
        deprecationDate:
          type: string
          description: 'Date when a follow-up product is available on the market, format: YYYY-MM-DD (according to RFC3339)'
          format: date
        supportedUntilDate:
          type: string
          description: 'Date after which the product can no longer be ordered or sold, format: YYYY-MM-DD (according to RFC3339). Mandatory field for the status: `no-longer-available` and `not-available-or-usable`.'
          format: date
        endOfLifeDate:
          type: string
          description: 'Date after which the product is no longer available, format: YYYY-MM-DD (according to RFC3339). Mandatory field for the status: `no-longer-available` and `not-available-or-usable`.'
          format: date
        dateCreated:
          type: string
          description: 'Indicates the date and time the object was first created. Format: Conform openapi in ZULU time zoals gespecificeerd in RFC 3339, section 5.6.'
          format: date-time
          example: "2017-07-21T17:32:28Z"
        dateLastModified:
          type: string
          description: 'Indicates the date and time the object was last modified. Format: Conform openapi in ZULU time zoals gespecificeerd in RFC 3339, section 5.6.'
          format: date-time
          example: "2022-08-11T15:31:12Z"
      required:
        - productId
        - publisher
        - type
        - status
        - forSale
        - saleUnitSize
        - name
        - studies
        - edition
        - subjects
        - shortDescription
        - copyrightType
        - media
        - firstPublishedDate
        - dateCreated
        - dateLastModified

    ProductInfo:
      title: ProductInfo
      type: object
      x-tags:
        - Product
      description: 'Product info for the `Leermiddelenportaal` and `Onderwijsleeromgeving`. This entity includes name, product lifecycle status and dates, media information, studies and subject metadata and the AccessUrl.'
      properties:
        productId:
          $ref: '#/components/schemas/ProductID'
          description: 'The unique identifier for this product. For all products that are forSale an EAN or ISBN number is provided.
            For all other Products a uuid is generated by the provider of the product.'
        publisher:
          type: string
          description: 'Name of the organisation supplying and providing the product: the `Leermiddelenaanbieder`.'
        type:
          type: string
          description: 'Type of product. In case the product consists of both physical and digital products, the value combi is chosen.'
          enum:
            - 'physical'
            - 'digital'
            - 'combi'
        status:
          type: string
          description: 'Lifecycle status of the product.'
          enum:
            - 'not-yet-available'
            - 'limited-available'
            - 'available'
            - 'temporary-not-available'
            - 'no-longer-available'
            - 'will-never-be-available'
            - 'not-available-or-usable'
        name:
          type: string
          description: 'Name of the Product'
        productFamilyName:
          type: string
          description: 'Name of the Product Family this Product belongs to. Required if the product is part of a method family.'
        courseReferences:
          type: array
          description: 'Reference to this products course detailed description'
          items:
            $ref: '#/components/schemas/CourseReference'
        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'
        infoLink:
          type: string
          description: 'URL to the information about the product.'
        trialAccessUrl:
          type: string
          description: 'Optional trial / preview URL.'
        defaultAccessUrl:
          type: string
          description: |
            The default Access Url used to access the product after selection or purchase.
            Mandatory field for combi and digital products.
            For sets of digital products and combi products a single Access URl is listed from which all underlying digital products can be activated.
        shortDescription:
          type: string
          description: 'Short description for display on search pages or other marketing blocks.'
        longDescription:
          type: string
          description: 'Long description for display on a product page.'
        media:
          type: object
          description: 'A collection of media for use in product pages.'
          properties:
            publisherThumbnailUrl:
              description: 'The logo of the publisher to show in a thumbnail.'
              $ref: '#/components/schemas/Media'
            mainThumbnailUrl:
              description: 'The main media item to show in a thumbnail.'
              $ref: '#/components/schemas/Media'
          required:
            - publisherThumbnailUrl
            - mainThumbnailUrl
        bundledProducts:
          type: array
          description: |
            In case this product is a combi product or set, all underlying products can be included and referred in this attribute.  
            This field is mandatory for sets of digital products.  
            This field is optional (but recommended) for combi products and sets of physical products.
          items:
            $ref: '#/components/schemas/ProductID'
            description: 'productIds of the products in the set or in the combi product.'
        firstPublishedDate:
          type: string
          format: date
          description: 'Date the product will be or is published on the market, format: YYYY-MM-DD (according to RFC3339)'
        deprecationDate:
          type: string
          description: 'Date when a follow-up product is available on the market, format: YYYY-MM-DD (according to RFC3339)'
          format: date
        supportedUntilDate:
          type: string
          description: 'Date after which the product can no longer be ordered or sold, format: YYYY-MM-DD (according to RFC3339). Mandatory field for the status: `no-longer-available` and `not-available-or-usable`.'
          format: date
        endOfLifeDate:
          type: string
          description: 'Date after which the product is no longer available, format: YYYY-MM-DD (according to RFC3339). Mandatory field for the status: `no-longer-available` and `not-available-or-usable`.'
          format: date
        dateCreated:
          type: string
          description: 'Indicates the date and time the object was first created. Format: Conform openapi in ZULU time zoals gespecificeerd in RFC 3339, section 5.6.'
          format: date-time
          example: "2017-07-21T17:32:28Z"
        dateLastModified:
          type: string
          description: 'Indicates the date and time the object was last modified. Format: Conform openapi in ZULU time zoals gespecificeerd in RFC 3339, section 5.6.'
          format: date-time
          example: "2022-08-11T15:31:12Z"
      required:
        - productId
        - publisher
        - type
        - status
        - name
        - studies
        - subjects
        - defaultAccessUrl
        - shortDescription
        - media
        - firstPublishedDate
        - dateCreated
        - dateLastModified

    CourseReference:
      title: CourseReference
      type: object
      x-tags:
        - Product
      properties:
        courseId:
          type: string
        title:
          type: string
        description:
          type: string
      description: |-
        A reference to the content of the products.
        The details of the content can be retrieved via the Course API.
        A product gives access to one or more courses. A course can be referenced by one or more Products.

    Study:
      title: Study
      type: object
      description: 'A study where this product is targeted at.'
      properties:
        studyName:
          type: string
          description: |
            Official 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 specified in [Register kwalificatiestructuur SBB](https://kwalificatie-mijn.s-bb.nl) is used.
        studyCode:
          type: string
          description: |
            Official code of the study.
            - primary education: the `opleidingseenheidcode` as specified in [Waardenlijst Opleidingseenheden po](https://www.edustandaard.nl/standaard_werkgroepen/beheergroep-waardenlijsten-rio/) is used.
            - secondary education: the `opleidingseenheidcode` as specified in [Waardenlijst Opleidingseenheden vo](https://www.edustandaard.nl/standaard_werkgroepen/beheergroep-waardenlijsten-rio/) is used.
            - vocational education: the `crebocode` as specified in [Register kwalificatiestructuur SBB](https://kwalificatie-mijn.s-bb.nl) is used.
        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

    SchoolSizePrice:
      type: object
      properties:
        qty:
          type: integer
          description: 'Minimum number of students from which this price applies.'
        priceExcl:
          type: number
          format: float
          description: 'Price excluding VAT.'
        priceIncl:
          type: number
          format: float
          description: 'Price including VAT.'

    TierPrice:
      type: object
      properties:
        qty:
          type: integer
          description: 'Minimum number of copies from which this price applies.'
        priceExcl:
          type: number
          format: float
          description: 'Price excluding VAT.'
        priceIncl:
          type: number
          format: float
          description: 'Price including VAT.'
    Media:
      title: Media
      type: object
      x-tags:
        - Product
      properties:
        url:
          type: string
          description: 'url to the media object.'
        description:
          type: string
          description: 'short description of the media object, which can be displayed as hover info.'
        width:
          type: integer
          description: 'width in pixels'
        height:
          type: integer
          description: 'height in pixels'
      description: 'A reference to a media object.'
      required:
        - url

    ProductID:
      title: ProductID
      x-tags:
        - Product
      anyOf:
        - type: string
          description: 'uuid'
          pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$'
          example: '3b951e8f-de9e-4d0a-be3e-0caea2467ec8'
        - type: string
          description: 'isbn'
          pattern: '^[0-9]{13}$'
          example: '9789402054958'
        - type: string
          description: 'ean'
          pattern: '^[0-9]{13}$'
          example: '4003994155486'

    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.catalogue: scope that allows a party to retrieve products from the catalogue
paths:

  /products:
    parameters:
      - schema:
          type: string
          format: date-time
        in: query
        name: since
        required: false
        description: |
          Request all products modified after the specified timestamp. Format: Conform openapi in ZULU time as specified in RFC 3339, section 5.6.  
          Clients are encouraged to use the since parameter above fetching the resource fully.  
          **Maximum age of the timestamp is 7 days in the past.**
        example: "2017-07-21T17:32:28Z"
    get:
      summary: Get All Products
      operationId: get-all-products
      x-tags:
        - Product
      tags:
        - Leveranciersspecifieke leermiddelencatalogus
      description: Get all products
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Product'
        '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.catalogue

  /products/{id}:
    parameters:
      - schema:
          type: string
        name: id
        in: path
        required: true
    get:
      summary: Get Product by ID
      operationId: get-product-by-id
      x-tags:
        - Product
      tags:
        - Leveranciersspecifieke leermiddelencatalogus
      description: Get a specific product by id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
        '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.catalogue

  /products/info:
    parameters:
      - schema:
          type: string
          format: date-time
        in: query
        name: since
        required: false
        description: |
          Request all products modified after the specified timestamp. Format: Conform openapi in ZULU time as specified in RFC 3339, section 5.6.  
          Clients are encouraged to use the since parameter above fetching the resource fully.  
          **Maximum age of the timestamp is 7 days in the past.**
        example: "2017-07-21T17:32:28Z"
    get:
      summary: Get All Products Info for Display In Portal
      operationId: get-all-products-info
      x-tags:
        - Product
      tags:
        - Leveranciersspecifieke leermiddelencatalogus
      description: Get all products info
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProductInfo'
        '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.catalogue

  /products/info/{id}:
    parameters:
      - schema:
          type: string
        name: id
        in: path
        required: true
    get:
      summary: Get Product Info by ID for Display in Portal
      operationId: get-product-info-by-id
      x-tags:
        - Product
      tags:
        - Leveranciersspecifieke leermiddelencatalogus
      description: Get a specific product info by id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductInfo'
        '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.catalogue
x-tags:
  - name: Product